Gdzie są zera Champernowne?


23

Rozważ nieskończony ciąg wszystkich nieujemnych liczb całkowitych dziesiętnych połączonych razem w kolejności (podobnie do stałej Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Napisz program lub funkcję, która przyjmuje nieujemną liczbę całkowitą, która indeksuje (na podstawie 0) do tego nieskończonego ciągu. Wyprowadzać truthy wartość jeżeli cyfra indeksowany jest 0, w przeciwnym wypadku wyjście A falsy wartość jeżeli cyfra 1-9.

Najkrótszy kod w bajtach wygrywa.

Pierwsze 25 prawdomównych danych wejściowych to:

0
11
31
51
71
91
111
131
151
171
191
192
194
197
200
203
206
209
212
215
218
222
252
282
312

Uznanie, jeśli twój program jest efektywny pod względem pamięci, ale nie jest to wymagane.



czy nie jest lepsze, że program lub ta funkcja zwraca cyfrę tej tablicy ze swojego indeksu [nie tylko, czy jest to 0 czy nie]?
RosLuP,


Nie rozumiem, o co to pytanie w ogóle lol może ktoś to wyjaśnić
Shaun Wild,

Odpowiedzi:


12

Haskell, 25 bajtów

(<'1').((show=<<[0..])!!)

Przykład użycia: (<'1').((show=<<[0..])!!) 312->True


7

05AB1E , 5 bajtów

Kod:

ÝJ¹è_

Wyjaśnienie:

Ý      # Get the list [0 .. input].
 J     # Join the list.
  ¹    # Get the first input again.
   è   # Get the character on that index.
    _  # Logical negate (0 -> 1, everything else -> 0).

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!


7

Mathematica, 42 40 bajtów

(0@@Join@@IntegerDigits@Range@#)[[#]]<1&

Funkcja anonimowa. Podejmuje szereg jako wejścia i wraca albo Trueczy Falsejako wyjście. Dłuższe, ale bardziej wydajne (?) Rozwiązanie:

RealDigits[ChampernowneNumber[],10,1,-#][[1,1]]<1&

5

CJam, 9 bajtów

{_),s=~!}

Jest to nienazwany blok (funkcja), który przyjmuje liczbę całkowitą i odpowiednio zwraca 0 lub 1.

Wyjaśnienie:

{       }        Defines a block
 _               Copy input n
  ),             Increment n and take range
    s            Convert to string - for a list of numbers this concatenates
                 the digits
     =           Index, getting nth digit
      ~          Evaluate the digit character into a number
       !         Logical negation

Tłumacz online . Zauważ, że ~ocenia blok. Alternatywnie możesz uruchomić ten zestaw testów, który używa ,do filtrowania pierwszych 1000 liczb w celu uzyskania prawdziwych wartości.


4

MATL, 11 bajtów

Qt:qVXzw)U~

Wypróbuj online!

Objaśnienie :

    % Implicitly grab input as an integer (N)
Qt  % Add 1 and duplicate
:q  % Create an array from [0 ... N]
V   % Convert each entry to a string (places spaces between each number)
Xz  % Remove all whitespace
w)  % Get the N+1 element of the string (since MATL uses 1-based indexing natively)
U~  % Convert the result back to a number and negate which yields TRUE if it was '0' and
    % FALSE otherwise

4

Brachylog , 10 8 bajtów

2 bajty dzięki Fatalize.

y@ec:?m0

Wypróbuj online!

y@ec:?m0

y         range from 0 to Input, inclusive,
 @e       the digits of every number in that range,
   c      concatenated
    :?m   the Input-th digit
       0  is zero.

@ewektoryzacja y@ec:?m0działa, aby zaoszczędzić 2 bajty.
Fatalize

@Fatalize Ilu innych operatorów wektoryzuje?
Leaky Nun

Tylko #0, #1, #+, #_, #>i #<vectorize jak @erobi. Niektóre predykaty, które wektoryzują, np. Rekursywnie +lub *nie wektoryzują rekursywnie do najniższego poziomu listy, i nie wykonują tego samego w zależności od struktury danych wejściowych.
Fatalize

4

Perl 6 , 26 25 bajtów

{!+map(|*.comb,0..*)[$_]}

Lambda, która przyjmuje liczbę jako dane wejściowe i zwraca a Truelub False.

Wydajna pamięć.

Jak to działa

  1. 0..* - Zbuduj zakres od 0 do nieskończoności.
  2. map(|*.comb, )- Lazily iteruje zakres, zastępując każdą liczbę znakami reprezentującymi ciąg znaków i zwracając nową leniwą sekwencję. |Utrzymuje nowa sekwencja spłaszczone.
  3. [$_]- Weź element o indeksie zdefiniowanym przez (niejawnie zadeklarowany) parametr lambda $_.
  4. +- Przymusz to do liczby. (Ten krok jest potrzebny, ponieważ wymuszanie łańcucha bezpośrednio na wartość logiczną zawsze daje wartość True, chyba że łańcuch jest pusty.)
  5. ! - Przekształć go w wartość logiczną i zaneguj.

( spróbuj online )

EDYCJA: -1 bajt dzięki b2gills.


Możesz skrócić {!+map(|*.comb,0..*)[$_]}swój, {!+({|($++).comb}...*)[$_]}zanim wpadłem na pomysł, zanim sprawdzę, czy jest już odpowiedź P6. !+może być zastąpiona przez1>
Brad Gilbert b2gills


4

Python 3.5, 40 bajtów

lambda n:('%d'*-~n%(*range(n),n))[n]<'1'

Przetestować go na repl.it .

Jak to działa

Dla wejścia n , '%d'*-~npowtarza ciąg formatu n + 1 razy.

(*range(n),n)rozpakowuje zakres [0, ..., n - 1] i zwraca krotkę (0, ..., n) .

...%...zastępuje każde wystąpienie % d odpowiednią liczbą całkowitą w zakresie, uzyskując ciąg 01234567891011 ... n .

(...)[n]<'1'wybiera znak o indeksie n i sprawdza, czy jest on mniejszy niż znak 1 .


3

Python 3, 44 bajty

lambda n:''.join(map(str,range(n+1)))[n]<'1'

Anonimowa funkcja, która pobiera dane wejściowe za pomocą argumentów i zwraca Truelub Falsew razie potrzeby.

Jak to działa

lambda n      Anonymous function with input n
range(n+1)    Yield the range [0, n]...
map(str,...)  ...convert all elements to string...
''.join(..)   ...concatenate...
...[n]        ...yield nth character...
:...<'1'      ...return True if int(character)==0 else return False

Wypróbuj na Ideone


3

Pyth, 8 7 bajtów

Dzięki @LeakyNun za -1 bajt

!s@jkUh

To moja pierwsza próba gry w golfa w Pyth.

Pełny program, który drukuje Truelub Falseodpowiednio.

Wypróbuj online

Pierwsze 25 prawdziwych danych wejściowych

Jak to działa

!s@jkUh    Program. Input: Q
      hQ   Head. Yield Q+1
     U     Unary range. Yield [0, Q]
   jk      Join. Join on empty string
  @     Q  Index. Yield string[Q]
 s         Integer. Convert to integer
!          Logical negation. 0 -> True, all other digits -> False
           Print. Print result implicitly

3

SILOS , 141 bajtów

readIO
i+1
lblL
c=C
p=1
lblc
p*10
c/10
if c c
p/10
lbln
m=C
m/p
m%10
p/10
i-1
if i C
GOTO H
lblC
if p n
C+1
GOTO L
lblH
m/m
m-1
m|
printInt m

Wypróbuj online!

Wykorzystuje tylko 5 liczb całkowitych, maksymalna wydajność pamięci \ o /

Wyjaśnienie

Generujemy tyle cyfr, ile danych wejściowych w stałej Champernowne.

W głównej pętli wykonujemy następujące czynności:

  • Znajdź długość aktualnego numeru, piętro, dzieląc go kilkakrotnie, aż osiągnie wartość 0, a następnie policz liczbę użytych podziałów.
  • Zamiast przechowywać liczbę podziałów, zamiast tego przechowujemy 10 do tej liczby.
  • Iteruj przez każdą cyfrę jako taką: 100cyfra s 1234jest uzyskiwana przez (1234/10)%10gdzie /jest podział podłogi.
  • Dla każdej wygenerowanej cyfry weź 1 z wejścia, sprawdzając, czy wejście osiągnęło zero.
  • Jeśli sygnał wejściowy osiągnie zero, sprawdź, czy bieżąca cyfra wynosi 0, a następnie zatrzymuje się.

3

JavaScript (ES6), 45 bajtów + Kudos

f=(n,s='0')=>s[n]?!+s[n]:f(n-s.length,-~s+'')

Moja najlepsza wersja inna niż Kudos miała 34 bajty:

n=>!+(g=s=>s[n]||g(s+i++))('',i=0)

1
Myślałem, że kudos to biblioteka, dopóki nie zdałem sobie sprawy, że było wyzwanie: P
Conor O'Brien

1

JavaScript (ES6), 47 bajtów

n=>[...Array(n+1)].reduce((a,_,i)=>a+i,'')[n]<1


1

JavaScript (ES6), 42 33 bajty

n=>!+(r=i=>i>n?'':i+r(i+1))(0)[n]

Przykład:

let f =
n=>!+(r=i=>i>n?'':i+r(i+1))(0)[n]

// test all integers in [0, 312]
for(var n = 0, list = []; n <= 312; n++) {
  f(n) && list.push(n);
}
console.log(list.join(','));


1

Groovy, 56 bajtów

def f(n){def s=''<<'';(0..n).each{s<<it};!(s[n] as int)}

Nic szczególnego, ale próbuję nowych rzeczy.

def f(n) {
  def s = ''<<''           // declare a StringBuffer
  (0..n).each { s << it }
  !(s[n] as int)           // Groovy considers a non-null char truthy, so we have to cast 
}

1

Perl, 24 bajty

Obejmuje +1 dla -p

Uruchom z wejściem na STDIN:

zero.pl <<< 31

wypisz 1 dla zera, nic innego

zero.pl

$_=!(map/./g,0..$_)[$_]

1

PHP, 36 bajtów

<?=!join(range(0,$a=$argv[1]))[$a];

Drukuj, 1jeśli argument dziesiętny jest Champernowne, w przeciwnym razie wypisz 0'' (pusty ciąg).


1

Rubin, 35 23 bajtów

Jest to anonimowa funkcja, która konkatenuje [0..n], pobiera nindeks th i sprawdza, czy ten znak jest "0"(mniejszy niż "1"). Sugestie dotyczące gry w golfa mile widziane.

->n{([*0..n]*'')[n]<?1}

Ungolfing

->n{...}   # Create an anonymous function with parameter n.
[*0..n]    # Create an array of the range [0..n].
[...]*''   # Join the array using the empty string.
(...)[n]   # Take the char at the n-th index of the string.
<?1        # Check if the char is < "1" (that is, "0").

1

Właściwie 9 8 bajtów

Ta odpowiedź łączy zakres [0..n], pobiera nindeks th i sprawdza, czy ten znak jest "0". Sugestie dotyczące gry w golfa mile widziane. Wypróbuj online!

;urεjE≈Y

Ungolfing

;          Duplicate n
 ur        Increment the duplicate and create range [0..n].
   εj      Join the range with an empty string. Stack: <string> n
     E     Take the char at the n-th index.
      ≈    int(a)
       Y   Logical NOT. If the digit is 0, then return 1, else return 0.

1

Bash, 31 28 bajtów

seq -s "" 0 $1|egrep ^.{$1}0

Dane wyjściowe są niepuste (prawda) lub puste (fałsz). Przetestuj na Ideone .



1

R, 61 57 bajtów

Dzięki @plannapus za 4 bajty.

n=scan();strsplit(paste(0:n,collapse=""),"")[[1]][n+1]==0

Tworzy wektor liczb 0: n (dla 0 indeksowania), tworzy ich ciąg, pobiera n-tą wartość z łańcucha (dostosowując dla 0 indeksowania). Konwertuje na numeryczne i sprawdza, czy jest to 0.



0

C, 154 bajtów

s(n,v,k,z){for(k=1;(z=n%10,n/=10)&&!v||k<v;++k); return v?z:k;}
f(n,i,j,c){for(i=0,j=0;;++i){c=s(i,0,0,0);j+=c;if(j>n){c=s(i,j-n,c,0);break;}}return !c;}

funkcją obliczającą wartość jest f (n, 0,0,0), gdzie n jest indeksem wejściowym. może obliczyć na podstawie zmiany indeksu „return! c” w „return c” wartość tablicy w tym indeksie ... nie rozumiem jak, ale wydaje się, że działa dobrze ....

main()
{int   i,r;
 char  a[]="0123456789101112131415161718192021222324252627282930313233343536";

 for(i=0; i<1000; ++i) 
    if(r=f(i,0,0,0))  
        printf("%u|",i);
}
/*
 154
 0|11|31|51|71|91|111|131|151|171|191|192|194|197|200|203|206|209|212|215|218|222
|252|282|312|342|372|402|432|462|491|492|494|497|500|503|506|509|512|515|518|522|552
|582|612|642|672|702|732|762|791|792|794|797|800|803|806|809|812|815|818|822|852
|882|912|942|972|
*/

0

JavaScript (ES5): 61 60 bajtów

function(b){for(s="";s.length<b;)s+=s.length;return 0==s[b]}

Nie golfowany:

function a(b){
  for(var s="";s.length<b;)
    s+=s.length;
  }
  return (s[b]==0);
}

Stary:

function(n){s="";while(s.length<n)s+=s.length;return s[n]==0}

Niegolfowany stary:

function a(n){
  var str="";
  while(str.length<n)str+=str.length; //Create String as long as needed
  return str[n]==0 //Check for 0 and return
}

A może !s[n]zamiast s[n]==0?
Conor O'Brien

@ ConorO'Brien Nie działa dla mnie. Moja funkcja a zwraca a (31) = true, podczas gdy twoja ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) zwraca a (31) = false.
Paul Schmitz

hm. mój błąd.
Conor O'Brien

0

CoffeeScript, 56 bajtów

a=(b)->
 s=""
 while s.length<b #loop for building string with required length
  s+=s.length     #add number
 "0"==s[b]        #return, if the number at the position equals zero

0

zsh, 31 bajtów

exit ${${(j..):-{0..$1}}[$1+1]}

exit 0 jest prawdziwe w Zsh


0

C #, 71 bajtów

I początkowo myślałem, że jest krótki, ale potem musiałem dodać, n+=11aby zapobiec rzucaniu, System.IndexOutOfRangeExceptiongdy wprowadzane są liczby poniżej 11

return String.Join("",Enumerable.Range(0,n+=11).ToArray())[n]=='0'?1:0;

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.