Wo sind Champernownes Nullen?

23

Betrachten Sie die unendliche Folge aller nichtnegativen Dezimalzahlen, die nacheinander verkettet sind (ähnlich der Champernowne-Konstante ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Schreiben Sie ein Programm oder eine Funktion, die eine nicht negative Ganzzahl enthält, die (0-basiert) in diese unendliche Zeichenfolge indiziert. Geben Sie einen Wahrheitswert aus , wenn die indizierte Ziffer 0 ist, andernfalls einen falschen Wert, wenn die Ziffer 1-9 ist.

Der kürzeste Code in Bytes gewinnt.

Die ersten 25 wahrheitsgemäßen Eingaben sind:

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

Ein großes Lob, wenn Ihr Programm speichereffizient ist, dies ist jedoch keine Voraussetzung.

Calvins Hobbys
quelle
9
oeis.org/A031287
Martin Ender
Ist es nicht besser, dass das Programm oder die Funktion die Ziffer dieses Arrays aus dem Index zurückgibt (nicht nur, wenn dies 0 ist oder nicht)?
RosLuP
Siehe auch: Reihe natürlicher Zahlen
Dennis
Ich kann nicht verstehen, was diese Frage überhaupt stellt. Kann mir jemand erklären
Shaun Wild

Antworten:

12

Haskell, 25 Bytes

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

Anwendungsbeispiel: (<'1').((show=<<[0..])!!) 312->True

nimi
quelle
7

05AB1E , 5 Bytes

Code:

ÝJ¹è_

Erläuterung:

Ý      # 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).

Verwendet die CP-1252- Codierung. Probieren Sie es online!

Adnan
quelle
7

Mathematica, 42 40 Bytes

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

Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt entweder Trueoder Falseals Ausgabe zurück. Eine längere und dennoch effizientere (?) Lösung:

RealDigits[ChampernowneNumber[],10,1,-#][[1,1]]<1&
LegionMammal978
quelle
5

CJam, 9 Bytes

{_),s=~!}

Dies ist ein unbenannter Block (Funktion), der eine Ganzzahl aufnimmt und dementsprechend 0 oder 1 zurückgibt.

Erläuterung:

{       }        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

Online-Dolmetscher . Beachten Sie, dass ~ein Block ausgewertet wird. Alternativ können Sie diese Testsuite ausführen , mit ,der die ersten 1000 Zahlen nach Wahrheitswerten gefiltert werden.

Sp3000
quelle
4

MATL, 11 Bytes

Qt:qVXzw)U~

Probieren Sie es online!

Erklärung :

    % 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
quelle
4

Brachylog , 10 8 Bytes

2 Bytes dank Fatalize.

y@ec:?m0

Probieren Sie es 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.
Undichte Nonne
quelle
@evektorisiert so y@ec:?m0funktioniert, um 2 Bytes zu sparen.
Fatalize
@Fatalize Wie viele andere Operatoren vektorisieren?
Undichte Nonne
Nur #0, #1, #+, #_, #>und #<vectorize wie der @eFall ist. Einige der vektorisierenden Prädikate, z. B. +oder *nicht rekursiv auf die niedrigste Listenebene, führen je nach Struktur der Eingabe nicht dasselbe aus.
Fatalize
4

Perl 6 , 26 25 Bytes

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

Ein Lambda, das eine Zahl als Eingabe annimmt und ein Trueoder zurückgibt False.

Speichereffizient.

Wie es funktioniert

  1. 0..* - Konstruieren Sie den Bereich von 0 bis unendlich.
  2. map(|*.comb, )- Durchlaufen Sie den Bereich langsam, indem Sie jede Zahl durch die Zeichen ihrer Zeichenfolgendarstellung ersetzen und eine neue Lazy-Sequenz zurückgeben. Das |hält die neue Sequenz abgeflacht.
  3. [$_]- Nehmen Sie das Element an den Index, der durch den (implizit deklarierten) Lambda-Parameter definiert ist $_.
  4. +- Erzwinge es zu einer Nummer. (Dieser Schritt ist erforderlich, da das Erzwingen einer Zeichenfolge direkt in einen Booleschen Wert immer True ergibt, sofern die Zeichenfolge nicht leer ist.)
  5. ! - Erzwinge es zu einem Booleschen und negiere es.

( online ausprobieren )

BEARBEITEN: -1 Byte dank b2gills.

smls
quelle
Sie können Ihre verkürzen, bis {!+map(|*.comb,0..*)[$_]}ich sie gefunden habe, {!+({|($++).comb}...*)[$_]}bevor Sie nachsehen, ob es bereits eine P6-Antwort gibt. !+kann ersetzt werden durch1>
Brad Gilbert b2gills
4

Gelee , 6 Bytes

RDF⁸ị¬

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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
quelle
4

Python 3.5, 40 Bytes

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

Testen Sie es auf repl.it .

Wie es funktioniert

Bei Eingabe von n wird '%d'*-~ndie Formatzeichenfolge n + 1 Mal wiederholt .

(*range(n),n)packt den Bereich [0, ..., n - 1] aus und liefert das Tupel (0, ..., n) .

...%...Ersetzt jedes Vorkommen von % d durch die entsprechende Ganzzahl im Bereich und ergibt die Zeichenfolge 01234567891011 ... n .

(...)[n]<'1'Wählt das Zeichen am Index n aus und prüft, ob es kleiner als das Zeichen 1 ist .

Dennis
quelle
3

Python 3, 44 Bytes

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

Eine anonyme Funktion , die Eingabe über Argument und gibt nimmt Trueoder Falseals angemessen.

Wie es funktioniert

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

Probieren Sie es auf Ideone

TheBikingViking
quelle
3

Pyth, 8 7 Bytes

Vielen Dank an @LeakyNun für -1 Byte

!s@jkUh

Dies ist mein erster Versuch, in Pyth Golf zu spielen.

Ein vollständiges Programm, das druckt Trueoder Falseentsprechend.

Probieren Sie es online aus

Erste 25 wahrheitsgemäße Eingaben

Wie es funktioniert

!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
quelle
3

SILOS , 141 Bytes

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

Probieren Sie es online!

Verwendet nur 5 Ganzzahlen, maximale Speichereffizienz \ o /

Erläuterung

Wir generieren so viele Ziffern wie die Eingabe in der Champernowne-Konstante.

In der Hauptschleife machen wir Folgendes:

  • Ermitteln Sie die Länge der aktuellen Zahl, indem Sie floor_ wiederholt durch 10 dividieren, bis 0 erreicht ist, und zählen Sie dann die Anzahl der verwendeten Unterteilungen.
  • Anstatt die Anzahl der Unterteilungen zu speichern, speichern wir stattdessen 10 nach dieser Potenz.
  • Iterieren jede Ziffer als solche: die 100s Ziffer 1234wird erhalten durch (1234/10)%10wobei /ist Boden Division.
  • Nehmen Sie für jede generierte Ziffer eine 1 von der Eingabe und prüfen Sie, ob die Eingabe Null erreicht hat.
  • Wenn der Eingang Null erreicht, prüfen Sie, ob die aktuelle Ziffer 0 ist, und halten Sie dann an.
Undichte Nonne
quelle
3

JavaScript (ES6), 45 Bytes + Kudos

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

Meine beste Nicht-Kudos-Version war 34 Bytes:

n=>!+(g=s=>s[n]||g(s+i++))('',i=0)
Neil
quelle
1
Ich dachte, Kudos wären eine Bibliothek, bis mir klar wurde, dass es ein großes Lob für die Herausforderung gibt: P
Conor O'Brien
1

JavaScript (ES6), 47 Byte

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

cPu1
quelle
1

Javascript (ES6), 42 33 Bytes

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

Beispiel:

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
quelle
1

Groovy, 56 Bytes

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

Nichts Besonderes, aber ich probiere ein paar neue Dinge aus.

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 
}
lealand
quelle
1

Perl, 24 Bytes

Beinhaltet +1 für -p

Mit Eingabe auf STDIN ausführen:

zero.pl <<< 31

Drucke 1 für Null, sonst nichts

zero.pl

$_=!(map/./g,0..$_)[$_]
Tonne Hospel
quelle
1

PHP, 36 Bytes

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

Gibt aus, 1ob das Champernowne-Argument die Dezimalstelle ist 0, andernfalls wird '' (leere Zeichenfolge) ausgegeben.

Krypto
quelle
1

Ruby, 35 23 Bytes

Dies ist eine anonyme Funktion, die verkettet [0..n], den nth-Index nimmt und prüft, ob dieses Zeichen "0"(kleiner als "1") ist. Golfvorschläge sind willkommen.

->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
quelle
1

Tatsächlich, 9 8 Bytes

Diese Antwort verkettet den Bereich [0..n], nimmt den nth-Index und prüft, ob das Zeichen ist "0". Golfvorschläge sind willkommen. Probieren Sie es 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
quelle
1

Bash, 31 28 Bytes

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

Die Ausgabe ist nicht leer (wahr) oder leer (falsch). Teste es auf Ideone .

Dennis
quelle
1

Julia, 21-20 Bytes

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

Vielen Dank an @LuisMendo für das Golfen ab 1 Byte!

Probieren Sie es online!

Dennis
quelle
1

R, 61 57 Bytes

Danke an @plannapus für 4 Bytes.

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

Erstellt einen Vektor mit den Zahlen 0: n (für die Indizierung von 0), erstellt eine Zeichenfolge von ihnen und zieht den n-ten Wert aus der Zeichenfolge (Anpassung für die Indizierung von 0). Konvertiert nach numerisch und prüft, ob es 0 ist.

user5957401
quelle
0

GolfScript, 12 Bytes

~.),""*\=48=

Erläuterung:

~             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?

Probieren Sie es online aus oder überprüfen Sie alle Testfälle!

Loovjo
quelle
0

C 154 Bytes

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;}

Die Funktion, die den Wert berechnet, ist f (n, 0,0,0), wobei n der Eingabeindex ist. es kann aus dem Index berechnet werden, indem "return! c" in "return c" der Wert des Arrays in diesem Index geändert wird ... ich verstehe nicht, wie, aber es scheint in Ordnung zu funktionieren ...

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
quelle
0

Javascript (ES5): 61 bis 60 Byte

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

Ungolfed:

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

Alt:

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

Ungolfed alt:

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
quelle
Wie wäre es !s[n]statt s[n]==0?
Conor O'Brien
@ ConorO'Brien Funktioniert bei mir nicht. Meine Funktion a gibt a (31) = true zurück, während yours ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) a (31) = false zurückgibt.
Paul Schmitz
Hm. mein Fehler.
Conor O'Brien
0

CoffeeScript, 56 Bytes

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
quelle
0

zsh, 31 Bytes

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

exit 0 ist wahr in zsh

Izabera
quelle
0

C #, 71 Bytes

Zuerst dachte ich, es sei kurz, aber dann musste ich hinzufügen n+=11, um zu verhindern, dass es ein wirft, System.IndexOutOfRangeExceptionwenn Zahlen unter 11 eingegeben werden

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