Dove sono gli zero di Champernowne?


23

Considera la stringa infinita di tutti gli interi decimali non negativi concatenati insieme in ordine (simile alla costante di Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Scrivi un programma o una funzione che accetta un numero intero non negativo che indicizza (basato su 0) in questa stringa infinita. Emette un valore di verità se la cifra indicizzata è 0, altrimenti emette un valore di falsa se la cifra è 1-9.

Vince il codice più breve in byte.

I primi 25 input che producono verità sono:

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

Complimenti se il tuo programma è efficiente in termini di memoria, ma questo non è un requisito.



non è meglio che quel programma o quella funzione restituiscano la cifra di quell'array dal suo indice [non solo se è 0 o no]?
RosLuP,


Non riesco a capire che cosa si stia ponendo questa domanda. Qualcuno può spiegarlo
Shaun Wild,

Risposte:


12

Haskell, 25 byte

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

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


7

05AB1E , 5 byte

Codice:

ÝJ¹è_

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online!


7

Mathematica, 42 40 byte

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

Funzione anonima. Prende un numero come input e restituisce Trueo Falsecome output. Una soluzione più lunga, ma più efficiente (?):

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

5

CJam, 9 byte

{_),s=~!}

Questo è un blocco senza nome (funzione) che accetta un numero intero e restituisce 0 o 1 di conseguenza.

Spiegazione:

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

Interprete online . Si noti che ~valuta un blocco. In alternativa, è possibile eseguire questa suite di test che utilizza ,per filtrare i primi 1000 numeri per i valori di verità.


4

MATL, 11 byte

Qt:qVXzw)U~

Provalo online!

Spiegazione :

    % 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 byte

2 byte grazie a Fatalize.

y@ec:?m0

Provalo 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.

@evettorializza così y@ec:?m0funziona, per salvare 2 byte.
Fatalizza il

@Fatalize Quanti altri operatori vectorizzano?
Leaky Nun,

Solo #0, #1, #+, #_, #>e #<vectorize come @elo fa. Alcuni predicati che vettorializzano come +o *non vettorializzano ricorsivamente al livello di elenco più basso e non eseguono la stessa cosa a seconda della struttura dell'input.
Fatalizza il

4

Perl 6 , 26 25 byte

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

Un lambda che prende un numero come input e restituisce una Trueo False.

Memory-efficiente.

Come funziona

  1. 0..* - Costruisci l'intervallo da 0 a infinito.
  2. map(|*.comb, )- Ierate pigramente l'intervallo, sostituendo ogni numero con i caratteri della sua rappresentazione di stringa e restituendo una nuova sequenza pigra. La |mantiene la nuova sequenza appiattito.
  3. [$_]- Prendi l'elemento nell'indice definito dal parametro lambda (implicitamente dichiarato) $_.
  4. +- Costringilo a un numero. (Questo passaggio è necessario perché forzare una stringa direttamente su un valore booleano dà sempre True a meno che la stringa non sia vuota.)
  5. ! - Costringilo a un valore booleano e negalo.

( provalo online )

EDIT: -1 byte grazie a b2gills.


Puoi abbreviare il tuo a cui {!+map(|*.comb,0..*)[$_]}ho pensato {!+({|($++).comb}...*)[$_]}prima di vedere se c'era già una risposta P6. !+può essere sostituito da1>
Brad Gilbert b2gills il

4

Gelatina , 6 byte

RDF⁸ị¬

Provalo online! o verifica tutti i casi di test .

Come funziona

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.

4

Python 3.5, 40 byte

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

Testarlo su repl.it .

Come funziona

Per l'ingresso n , '%d'*-~nripete la stringa di formato n + 1 volte.

(*range(n),n)decomprime l'intervallo [0, ..., n - 1] e restituisce la tupla (0, ..., n) .

...%...sostituisce ogni occorrenza di % d con il numero intero corrispondente nell'intervallo, producendo la stringa 01234567891011 ... n .

(...)[n]<'1'seleziona il carattere nell'indice n e verifica se è inferiore al carattere 1 .


3

Python 3, 44 byte

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

Una funzione anonima che accetta input tramite argomento e restituisce Trueo Falsecome appropriato.

Come funziona

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

Provalo su Ideone


3

Pyth, 8 7 byte

Grazie a @LeakyNun per -1 byte

!s@jkUh

Questo è il mio primo tentativo di giocare a golf in Pyth.

Un programma completo che stampa Trueo Falsecome appropriato.

Provalo online

Primi 25 input veritieri

Come funziona

!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 byte

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

Provalo online!

Utilizza solo 5 numeri interi, massima efficienza della memoria \ o /

Spiegazione

Generiamo tante cifre quanti sono gli input nella costante di Champernowne.

Nel ciclo principale, facciamo quanto segue:

  • Trova la lunghezza del numero corrente da floor_dividendolo ripetutamente per 10 fino a raggiungere 0, quindi conta il numero di divisioni utilizzate.
  • Invece di memorizzare il numero di divisioni, memorizziamo invece 10 in quella potenza numerica.
  • Scorrere ogni cifra in quanto tale: la 100cifra di s 1234è ottenuta da (1234/10)%10dove /è la divisione del pavimento.
  • Per ogni cifra generata, prendi 1 dall'ingresso, controllando se l'ingresso ha raggiunto lo zero.
  • Se l'ingresso raggiunge lo zero, verificare se la cifra corrente è 0 e quindi si ferma.

3

JavaScript (ES6), 45 byte + Kudos

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

La mia migliore versione non Kudos era di 34 byte:

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

1
Pensavo che i kudos fossero una biblioteca fino a quando non mi sono reso conto che c'era un kudos sulla sfida: P
Conor O'Brien,

1

JavaScript (ES6), 47 byte

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


1

Javascript (ES6), 42 33 byte

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

Esempio:

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 byte

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

Niente di speciale, ma sto provando alcune cose nuove.

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 byte

Include +1 per -p

Esegui con input su STDIN:

zero.pl <<< 31

stampa 1 per zero, nient'altro

zero.pl

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

1

PHP, 36 byte

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

Stampa 1se l'argomento Champernowne-th decimale è 0, altrimenti stampa '' (stringa vuota).


1

Rubino, 35 23 byte

Questa è una funzione anonima che concatena [0..n], prende l' nindice th e controlla se quel carattere è "0"(minore di "1"). Suggerimenti di golf benvenuti.

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

In realtà, 9 8 byte

Questa risposta concatena l'intervallo [0..n], prende l' nindice th e controlla se quel carattere lo è "0". Suggerimenti di golf benvenuti. Provalo 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 byte

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

L'output è non vuoto (verità) o vuoto (falsa). Provalo su Ideone .



1

R, 61 57 byte

Grazie a @plannapus per 4 byte.

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

Crea un vettore di numeri 0: n (per l'indicizzazione 0), crea una stringa di essi, estrae l'ennesimo valore dalla stringa (regolando per l'indicizzazione 0). Converte in numerico e verifica se è 0.


0

GolfScript, 12 byte

~.),""*\=48=

Spiegazione:

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

Provalo online o verifica tutti i casi di test!


0

C, 154 byte

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

la funzione che calcola il valore è f (n, 0,0,0) dove n è l'indice di input. può calcolare dall'indice cambiando "return! c" in "return c" il valore dell'array in quell'indice ... non capisco come ma sembra funzionare bene ....

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

Vecchio:

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

Ungolfed old:

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
}

Che ne dici !s[n]invece di s[n]==0?
Conor O'Brien,

@ ConorO'Brien Non funziona per me. La mia funzione a restituisce a (31) = true, mentre la tua ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) restituisce a (31) = false.
Paul Schmitz,

hm. errore mio.
Conor O'Brien,

0

CoffeeScript, 56 byte

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 byte

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

exit 0 è vero in zsh


0

C #, 71 byte

E all'inizio ho pensato che fosse breve, ma poi ho dovuto aggiungere n+=11per evitare che lanciasse un System.IndexOutOfRangeExceptionnumero quando sono stati inseriti numeri inferiori a 11

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.