¿Dónde están los ceros de Champernowne?

23

Considere la cadena infinita de todos los enteros decimales no negativos concatenados juntos en orden (similar a la constante de Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Escriba un programa o función que tome un entero no negativo que indexe (basado en 0) en esta cadena infinita. Genera un valor verdadero si el dígito indexado es 0, de lo contrario, genera un valor falso si el dígito es 1-9.

El código más corto en bytes gana.

Las primeras 25 entradas que producen verdad son:

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

Felicitaciones si su programa es eficiente en memoria, pero esto no es un requisito.

Pasatiempos de Calvin
fuente
99
oeis.org/A031287
Martin Ender
¿No es mejor que ese programa o esa función devuelvan el dígito de esa matriz de su índice [no solo si es 0 o no]?
RosLuP
Relacionado: Fila de números naturales
Dennis
No puedo entender lo que esta pregunta está haciendo jajaja, ¿alguien puede explicarlo
Shaun Wild

Respuestas:

12

Haskell, 25 bytes

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

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

nimi
fuente
7

05AB1E , 5 bytes

Código:

ÝJ¹è_

Explicación:

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

Utiliza la codificación CP-1252 . Pruébalo en línea!

Adnan
fuente
7

Mathematica, 42 40 bytes

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

Función anónima. Toma un número como entrada y devuelve o Trueo Falsecomo salida. Una solución más larga pero más eficiente (?):

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

CJam, 9 bytes

{_),s=~!}

Este es un bloque (función) sin nombre que toma un número entero y devuelve 0 o 1 en consecuencia.

Explicación:

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

Intérprete en línea . Tenga en cuenta que ~evalúa un bloque. Alternativamente, puede ejecutar este conjunto de pruebas que utiliza ,para filtrar los primeros 1000 números para valores verdaderos.

Sp3000
fuente
4

MATL, 11 bytes

Qt:qVXzw)U~

Pruébalo en línea!

Explicacion :

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

Brachylog , 10 8 bytes

2 bytes gracias a Fatalize.

y@ec:?m0

Pruébalo en línea!

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.
Monja permeable
fuente
@evectoriza así y@ec:?m0funciona, para guardar 2 bytes.
Fatalize
@Fatalize ¿Cuántos otros operadores vectorizan?
Leaky Nun
Sólo #0, #1, #+, #_, #>y #<vectorizar como@e lo hace. Algunos de los predicados que vectorizan, como +o *no vectorizan recursivamente al nivel de lista más bajo, y no realizan lo mismo dependiendo de la estructura de la entrada.
Fatalize
4

Perl 6 , 26 25 bytes

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

Una lambda que toma un número como entrada y devuelve un TrueoFalse .

Memoria eficiente.

Cómo funciona

  1. 0..* - Construir el rango de 0 a infinito.
  2. map(|*.comb, )- Repita perezosamente el rango, reemplazando cada número con los caracteres de su representación de cadena y devolviendo una nueva secuencia perezosa. El |mantiene la nueva secuencia aplanada.
  3. [$_]- Tome el elemento en el índice definido por el parámetro lambda (declarado implícitamente) $_.
  4. +- Obligarlo a un número. (Este paso es necesario porque coaccionar una cadena directamente a un valor booleano siempre da True a menos que la cadena esté vacía).
  5. ! - Obligarlo a un booleano y negarlo.

( pruébalo en línea )

EDITAR: -1 byte gracias a b2gills.

smls
fuente
Puedes acortar la tuya a la {!+map(|*.comb,0..*)[$_]}que se me ocurrió {!+({|($++).comb}...*)[$_]}antes de mirar para ver si ya había una respuesta P6. !+puede ser reemplazado por1>
Brad Gilbert b2gills
4

Jalea , 6 bytes

RDF⁸ị¬

Pruébalo en línea!o verificar todos los casos de prueba .

Cómo funciona

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

Python 3.5, 40 bytes

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

Probarlo en repl.it .

Cómo funciona

Para la entrada n , '%d'*-~nrepite la cadena de formato n + 1 veces.

(*range(n),n)desempaqueta el rango [0, ..., n - 1] y produce la tupla (0, ..., n) .

...%...reemplaza cada aparición de % d con el número entero correspondiente en el rango, produciendo la cadena 01234567891011 ... n .

(...)[n]<'1'selecciona el carácter en el índice ny prueba si es menor que el carácter 1 .

Dennis
fuente
3

Python 3, 44 bytes

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

Una función anónima que toma datos a través de argumentos y devuelve TrueoFalse según corresponda

Cómo funciona

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

Pruébalo en Ideone

TheBikingViking
fuente
3

Pyth, 8 7 bytes

Gracias a @LeakyNun por -1 byte

!s@jkUh

Este es mi primer intento de jugar golf en Pyth.

Un programa completo que imprime Trueo Falsesegún corresponda.

Pruébalo en línea

Primeras 25 entradas verdaderas

Cómo funciona

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

Pruébalo en línea!

Utiliza solo 5 enteros, máxima eficiencia de memoria \ o /

Explicación

Generamos tantos dígitos como la entrada en la constante de Champernowne.

En el bucle principal, hacemos lo siguiente:

  • Encuentre la longitud del número actual dividiendo el piso por 10 repetidamente hasta que llegue a 0, y luego cuente el número de divisiones utilizadas.
  • En lugar de almacenar el número de divisiones, almacenamos 10 en ese número de potencia.
  • Iterar a través de cada dígito como tal: el 100dígito s de 1234se obtiene por (1234/10)%10donde /es la división del piso.
  • Para cada dígito generado, tome 1 de la entrada, mientras verifica si la entrada llegó a cero.
  • Si la entrada llega a cero, verifique si el dígito actual es 0 y luego se detiene.
Monja permeable
fuente
3

JavaScript (ES6), 45 bytes + Kudos

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

Mi mejor versión no Kudos fue de 34 bytes:

n=>!+(g=s=>s[n]||g(s+i++))('',i=0)
Neil
fuente
1
Pensé que Kudos era una biblioteca hasta que me di cuenta de que había desafíos en el desafío: P
Conor O'Brien
1

JavaScript (ES6), 47 bytes

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

cPu1
fuente
1

Javascript (ES6), 42 33 bytes

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

Ejemplo:

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

Groovy, 56 bytes

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

Nada lujoso, pero estoy probando algunas cosas nuevas.

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

Perl, 24 bytes

Incluye +1 para -p

Ejecutar con entrada en STDIN:

zero.pl <<< 31

imprima 1 por cero, nada de lo contrario

zero.pl

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

PHP, 36 bytes

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

Imprima 1si el argumento Champernowne-th decimal es 0, de lo contrario imprima '' (cadena vacía).

Cripto
fuente
1

Ruby, 35 23 bytes

Esta es una función anónima que concatena [0..n], toma el níndice th y comprueba si ese carácter es "0"(menor que "1"). Sugerencias de golf bienvenidas.

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

En realidad, 9 8 bytes

Esta respuesta concatena el rango [0..n], toma el níndice th y comprueba si ese carácter es "0". Sugerencias de golf bienvenidas. Pruébalo en línea!

;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
fuente
1

Bash, 31 28 bytes

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

La salida es no vacía (verdad) o vacía (falsedad). Pruébalo en Ideone .

Dennis
fuente
1

R, 61 57 bytes

Gracias a @plannapus por 4 bytes.

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

Crea un vector de números 0: n (para indexación 0), crea una cadena de ellos, extrae el enésimo valor de la cadena (ajustando para indexación 0). Convierte a numérico y prueba si es 0.

usuario5957401
fuente
0

GolfScript, 12 bytes

~.),""*\=48=

Explicación:

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

¡Pruébelo en línea o verifique todos los casos de prueba!

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

la función que calcula el valor es f (n, 0,0,0) donde n es el índice de entrada. puede calcular a partir del índice cambiando "return! c" en "return c" el valor de la matriz en ese índice ... no entiendo cómo pero parece funcionar bien ...

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

Javascript (ES5): 61 60 bytes

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

Sin golf:

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

Antiguo:

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

Viejo sin golf:

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
fuente
¿Qué tal en !s[n]lugar de s[n]==0?
Conor O'Brien
@ ConorO'Brien no funciona para mí. Mi función a devuelve a (31) = verdadero, mientras que la suya ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) devuelve a (31) = falso.
Paul Schmitz
hm. mi error.
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
fuente
0

zsh, 31 bytes

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

exit 0 es cierto en zsh

izabera
fuente
0

C #, 71 bytes

Al principio pensé que era corto, pero luego tuve que agregar n+=11para evitar que arrojara un System.IndexOutOfRangeExceptioncuando se ingresaron números por debajo de 11

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