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.

Hobby Calvina
źródło
9
oeis.org/A031287
Martin Ender
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,
Powiązane: Wiersz liczb naturalnych
Dennis
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

nimi
źródło
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!

Adnan
źródło
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&
LegionMammal978
źródło
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.

Sp3000
źródło
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
Suever
źródło
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.
Leaky Nun
źródło
@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.

smls
źródło
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

Galaretka , 6 bajtów

RDF⁸ị¬

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

RDF⁸ị¬  Main link. Argument: n

R       Range; yield [1, ..., n].
 D      Decimal; convert all integers in that range to base 10 arrays.
  F     Flatten the result.
   ⁸ị   Extract the digit at index n (1-based).
        This returns 0 if the array is empty (n = 0).
     ¬  Logical NOT; return 1 if the digit is 0, 0 if not.
Dennis
źródło
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 .

Dennis
źródło
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

TheBikingViking
źródło
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
TheBikingViking
źródło
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ę.
Leaky Nun
źródło
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)
Neil
źródło
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

cPu1
źródło
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(','));

Arnauld
źródło
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 
}
Zelandia
źródło
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..$_)[$_]
Ton Hospel
źródło
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).

Crypto
źródło
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").
Sherlock9
źródło
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.
Sherlock9
źródło
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 .

Dennis
źródło
1

Julia, 21 20 bajtów

!n=join(0:n)[n+1]<49

Dzięki @LuisMendo za grę w golfa na 1 bajcie!

Wypróbuj online!

Dennis
źródło
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.

użytkownik5957401
źródło
0

GolfScript, 12 bajtów

~.),""*\=48=

Wyjaśnienie:

~             Evaluate the input.
 .            Duplicate it
  )           Increment the duplicate.
   ,          Create an array from 0 to it.
    ""*       Join it with an empty string.
       \=     Get the n-th index of this string, where n is the input
         48=  Is it equal to 0?

Wypróbuj online lub sprawdź wszystkie przypadki testowe!

Loovjo
źródło
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|
*/
RosLuP
źródło
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
}
Paul Schmitz
źródło
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
Paul Schmitz
źródło
0

zsh, 31 bajtów

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

exit 0 jest prawdziwe w Zsh

izabera
źródło
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;
Daniel
źródło