Onde estão os zeros de Champernowne?

23

Considere a sequência infinita de todos os números decimais não negativos concatenados juntos em ordem (semelhante à constante de Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Escreva um programa ou função que receba um número inteiro não negativo que indexa (com base em 0) nessa cadeia infinita. Mostra uma truthy valor se o dígito indexado é 0, caso contrário, a saída de um Falsas valor se o dígito é 1-9.

O código mais curto em bytes vence.

Os primeiros 25 insumos produtores de verdade são:

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

Parabéns se o seu programa tiver memória eficiente, mas isso não é um requisito.

Passatempos de Calvin
fonte
9
oeis.org/A031287
Martin Ender
não é melhor que o programa ou essa função retorne o dígito dessa matriz de seu índice [não apenas se for 0 ou não]?
RosLuP
Relacionado: Linha de números naturais
Dennis
Eu não consigo entender o que esta questão está pedindo a todos lol alguém pode explicar isso
Shaun selvagem

Respostas:

12

Haskell, 25 bytes

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

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

nimi
fonte
7

05AB1E , 5 bytes

Código:

ÝJ¹è_

Explicação:

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

Usa a codificação CP-1252 . Experimente online!

Adnan
fonte
7

Mathematica, 42 40 bytes

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

Função anônima. Pega um número como entrada e retorna uma Trueou Falsecomo saída. Uma solução mais longa, porém mais eficiente (?):

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

CJam, 9 bytes

{_),s=~!}

Este é um bloco (função) sem nome que recebe um número inteiro e retorna 0 ou 1 de acordo.

Explicação:

{       }        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 online . Observe que ~avalia um bloco. Como alternativa, você pode executar este conjunto de testes que utiliza ,para filtrar os primeiros 1000 números para obter valores de verdade.

Sp3000
fonte
4

MATL, 11 bytes

Qt:qVXzw)U~

Experimente Online!

Explicação :

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

Braquilog , 10 8 bytes

2 bytes graças a Fatalize.

y@ec:?m0

Experimente 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.
Freira Furada
fonte
@evetoriza assim y@ec:?m0funciona, para economizar 2 bytes.
Fatalize 28/08
@Fatalize Quantos outros operadores vectorizam?
Leaky Nun
Apenas #0, #1, #+, #_, #>e #<vectorize como @efaz. Alguns dos predicados vetorizados, como +ou *não, recursivamente ao nível mais baixo da lista e não executam a mesma coisa, dependendo da estrutura da entrada.
Fatalize 28/08/16
4

Perl 6 , 26 25 bytes

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

Um lambda que recebe um número como entrada e retorna um TrueouFalse .

Memória eficiente.

Como funciona

  1. 0..* - Construa o intervalo de 0 ao infinito.
  2. map(|*.comb, )- Repita preguiçosamente o intervalo, substituindo cada número pelos caracteres de sua representação de seqüência de caracteres e retornando uma nova sequência lenta. O |mantém a nova sequência achatada.
  3. [$_]- Pegue o elemento no índice definido pelo parâmetro lambda (declarado implicitamente) $_.
  4. +- Coerce para um número. (Esta etapa é necessária porque a coerção de uma string diretamente para um booleano sempre fornece True, a menos que a string esteja vazia.)
  5. ! - Coerce para um booleano e negue.

( experimente online )

EDIT: -1 byte graças a b2gills.

smls
fonte
Você pode diminuir o seu para que {!+map(|*.comb,0..*)[$_]}eu inventei {!+({|($++).comb}...*)[$_]}antes de olhar para ver se já havia uma resposta P6. !+pode ser substituído por1>
Brad Gilbert b2gills
4

Gelatina , 6 bytes

RDF⁸ị¬

Experimente online! ou verifique todos os casos de teste .

Como 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
fonte
4

Python 3.5, 40 bytes

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

Teste-o em repl.it .

Como funciona

Para a entrada n , '%d'*-~nrepete a sequência de formatação n + 1 vezes.

(*range(n),n)descompacta o intervalo [0, ..., n - 1] e produz a tupla (0, ..., n) .

...%...substitui cada ocorrência de % d pelo número inteiro correspondente no intervalo, produzindo a sequência 01234567891011 ... n .

(...)[n]<'1'seleciona o caractere no índice n e testa se é menor que o caractere 1 .

Dennis
fonte
3

Python 3, 44 bytes

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

Uma função anônima que recebe entrada por meio de argumento e retorna Trueou Falseconforme apropriado.

Como 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

Experimente no Ideone

TheBikingViking
fonte
3

Pitão, 8 7 bytes

Obrigado a @LeakyNun por -1 byte

!s@jkUh

Esta é a minha primeira tentativa de jogar golfe em Pyth.

Um programa completo que imprime Trueou Falseconforme apropriado.

Experimente online

Primeiras 25 entradas verdadeiras

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

Experimente online!

Usa apenas 5 números inteiros, eficiência máxima de memória \ o /

Explicação

Geramos tantos dígitos quanto a entrada na constante do Champernowne.

No loop principal, fazemos o seguinte:

  • Encontre o comprimento do número atual, dividindo-o por 10 repetidamente, até atingir 0 e, em seguida, conte o número de divisões usadas.
  • Em vez de armazenar o número de divisões, armazenamos 10 nesse número de potência.
  • Itere através de cada dígito como tal: o 100dígito s de 1234é obtido por (1234/10)%10onde /está a divisão do piso.
  • Para cada dígito gerado, pegue 1 da entrada, enquanto verifica se a entrada atingiu zero.
  • Se a entrada chegar a zero, verifique se o dígito atual é 0 e depois pára.
Freira Furada
fonte
3

JavaScript (ES6), 45 bytes + elogios

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

Minha melhor versão não-Kudos foi de 34 bytes:

n=>!+(g=s=>s[n]||g(s+i++))('',i=0)
Neil
fonte
1
Pensei elogios era uma biblioteca até que eu percebi que havia uma admiração sobre o desafio: P
Conor O'Brien
1

JavaScript (ES6), 47 bytes

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

cPu1
fonte
1

Javascript (ES6), 42 33 bytes

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

Exemplo:

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

Groovy, 56 bytes

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

Nada extravagante, mas estou tentando algumas coisas novas.

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 
}
Zelândia
fonte
1

Perl, 24 bytes

Inclui +1 para -p

Execute com entrada no STDIN:

zero.pl <<< 31

imprima 1 para zero, nada diferente

zero.pl

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

PHP, 36 bytes

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

Imprima 1se o argumento Champernowne-th decimal for 0, caso contrário, imprima '' (sequência vazia).

Crypto
fonte
1

Ruby, 35 23 bytes

Esta é uma função anônima que concatena [0..n], pega o nth index e verifica se esse caractere é "0"(menor que "1"). Sugestões de golfe são bem-vindas.

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

Na verdade, 9 8 bytes

Essa resposta concatena o intervalo [0..n], pega o nth index e verifica se esse caractere é "0". Sugestões de golfe são bem-vindas. Experimente 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
fonte
1

Bash, 31 28 bytes

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

A saída não está vazia (verdade) ou vazia (falsidade). Teste em Ideone .

Dennis
fonte
1

Julia, 21 20 bytes

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

Obrigado a @LuisMendo por jogar fora um byte!

Experimente online!

Dennis
fonte
1

R, 61 bytes 57

Obrigado a @plannapus por 4 bytes.

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

Cria um vetor de números 0: n (para indexação 0), cria uma sequência deles, extrai o enésimo valor da sequência (ajustando para a indexação 0). Converte em numérico e testa se é 0.

user5957401
fonte
0

GolfScript, 12 bytes

~.),""*\=48=

Explicação:

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

Experimente online ou verifique todos os casos de teste!

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

a função que calcula o valor é f (n, 0,0,0) onde n é o índice de entrada. ele pode calcular a partir da mudança de índice "return! c" em "return c" o valor da matriz nesse índice ... eu não entendo como, mas parece funcionar ok ....

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

Javascript (ES5): 61 60 bytes

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

Velho:

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

Velho não destruído:

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
fonte
Que tal em !s[n]vez de s[n]==0?
Conor O'Brien
@ ConorO'Brien Não funciona para mim. Minha função a retorna a (31) = true, enquanto a sua ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) retorna a (31) = false.
Paul Schmitz
hm. meu erro.
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
fonte
0

zsh, 31 bytes

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

exit 0 é verdade no zsh

izabera
fonte
0

C #, 71 bytes

E eu pensei que era curto no começo, mas então eu tive que adicionar n+=11para impedir que ele jogasse a System.IndexOutOfRangeExceptionquando números abaixo de 11 fossem inseridos

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