Encontre o número na constante Champernowne


35

Introdução

Na base 10, a constante Champernowne é definida concatenando representações de números inteiros sucessivos. Na base 10: 0.1234567891011121314151617...e assim por diante.

Você pode ver que a primeira aparição de 15começa no 20thdecimal:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

A primeira aparição de 45começa no 4thdecimal:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

Então, a tarefa é fácil. Dado um número inteiro não negativo, imprima a posição do número inteiro na constante Champernowne.

Regras

  • Você pode fornecer uma função ou um programa
  • Isso é , então a submissão com a menor quantidade de bytes ganha!

Casos de teste

Input: 20
Output: 30

Input: 333
Output: 56

Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)

Input: 2930
Output: 48

Qual é a posição mais alta em que precisamos trabalhar? Por exemplo, o número será 987654321123456877654234354675.
Morgan Thrapp

@MorganThrapp Provavelmente testarei números inteiros no intervalo 0 <= x <= 99, mas teoricamente deve funcionar para números inteiros maiores que 99.
Adnan

Respostas:



10

LabVIEW, 29 primitivas do LabVIEW

Isso usa seqüências de caracteres por enquanto. Ele corresponde à entrada como um padrão e gera o deslocamento - (comprimento da entrada -1).


6

Javascript, 57 bytes

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Guardado 1 byte graças a Conor O'Brien.


Eu acho que você pode mover a y=peça para o y=b=" "; incrementar um espaço é como incrementar zero. ( a=prompt(y=b=" ");...)
Conor O'Brien

11
@ CᴏɴᴏʀO'Bʀɪᴇɴ Bom achado.
SuperJedi224

4

Haskell, 62 bytes

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

Exemplo de uso: (#(show=<<[1..])).show $ 2930-> 48.

Como funciona: a # bencontra a posição de adentro de b: se aé o prefixo de bretorno 1, caso contrário, adicione 1a uma chamada recursiva com a # tail b. A função pointfree (#(show=<<[1..])).showespera um argumento (sem nome) ne chama show n # show=<<[1..].

A função subIndextambém faria o trabalho de #, mas o necessário import Data.List.Utilsnão compensa.


Eu não acho que você precisa do.show
Wheat Wizard


4

Ruby, 28

->n{[*0..n+10]*''=~/\B#{n}/}

Inclui um 0 no início, para que as correspondências sejam indexadas em 1, mas \Bexige que a correspondência não seja no início da sequência.


4

Japonês, 11 bytes

Isso foi originalmente superado por Pyth, mas aparentemente não funcionou como entrada 0.

1+1oU+B ¬bU

Experimente online!

Como funciona

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression

Por que a seção "Como funciona" contém um qno código e não o símbolo de negação lógica ¬?
Fatalize

@Fatalize ¬é um atalho para (isto é, qcom um espaço a seguir). Isso geralmente parece ser um ponto de confusão, então alinhei a versão mais curta com a versão completa.
ETHproductions

3

Lua, 54 bytes

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

Nota: Atualmente, este programa imprime a primeira ocorrência do primeiro caractere da sequência e o ponto em que termina. Se isso não for permitido, custará mais alguns bytes. Gostaria de solicitar um bônus, porque meu programa imprime a primeira e a última posição do número de entrada.


11
Você quer dizer os índices inicial e final da primeira ocorrência do número? Porque teoricamente o número estaria lá uma quantidade infinita de vezes.
Rɪᴋᴇʀ

Sim, comece e termine para a primeira ocorrência.
Nikolai97

3

MATL , 22 bytes

it10+:Yst' '=~)wYsXf1)

Pegue a entrada ( i), faça o vetor 1 para inserir + 10 ( 10+:), converta o vetor em uma string ( Ys) e remova os espaços, o que é doloroso, ( t' '=~)). Em seguida, converta a entrada em uma string ( Ys), encontre onde a string de entrada está na string de números ( Xf) e pegue o primeiro local ( 1)). Os t'e w' estão manipulando a pilha (duplicados e trocados, respectivamente).


3

PowerShell, 39 44 bytes

[Editar: minha suposição não se sustenta, a construção de uma matriz de 1-0 não encontra 0 no lugar 11. Em vez disso, construa de 1-x + 10 para lidar com 0 também, agora com 44 bytes]

param($i)(1..($i+10)-join'').IndexOf("$i")+1

Você sempre encontrará x ao criar uma sequência da constante Champernowne no ponto mais recente ao adicionar x ao final, portanto, uma matriz de 1-x sempre terá a resposta. A questão passa a ser "ocorre mais cedo do que isso?" . Este código

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

gera um intervalo de números, converte-o em uma sequência e procura o parâmetro dentro dele. Como o PowerShell é um shell orientado a objetos, o parâmetro é realmente um [int]tipo, portanto, tentar salvar dois caracteres .IndexOf($i)pesquisaria na seqüência um número inteiro e não encontraria nada. É por isso que eu uso a interpolação de strings "$i".


11
Maneira inteligente de fazê-lo. Frustrante que .IndexOf()aparentemente tenha maior preferência operacional do que unário, -joinforçando as parênteses e as cotações. : - /
AdmBorkBork

3

MATL (versão 1.0.1), 22 bytes

iXK10+:"@Ys]N$hKYsXf1)

Exemplo

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

Explicação

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL (versão 20.8.0), 16 bytes (desafio de pós-datas do idioma)

Os nossos agradecimentos a @ Giuseppe por esta versão do programa (ligeiramente modificada)

10+:"@V]&hGVXf1)

Experimente online!

Explicação

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

Eu não acho que isso lida com 0 :( #
David David

@ David Agora faz. Obrigado por perceber! Custou apenas 3 bytes :-) #
18715 Luis Mendo

agora que a área de transferência Gcontém a entrada (e a entrada implícita), acho que essa resposta pode ser bastante reduzida, e toda a Ysnecessidade de mudar de Vqualquer maneira; Eu vim com 10+:"@Vv]!GVXf1)16 bytes.
Giuseppe

@ Giuseppe Obrigado pelo alerta! Atualizado, com o devido crédito (e com uma nota "é posterior da língua challange", eu não sou um grande fã da nova regra )
Luis Mendo

Não me importo tanto com essa regra (as bandeiras que alguém me deixa louco); Eu estava principalmente comentando aqui desde que notei que Ysprecisava mudar Vpara usar na versão mais atualizada do intérprete. Fico sempre impressionado com o quanto a linguagem melhorou!
Giuseppe

2

PowerShell, 54 50 bytes

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

Agradecemos a TessellatingHeckler pela ideia de trocar o whileloop por um forloop.

Executa através de um forloop. Como em outros idiomas, a primeira instrução do loop pode construir variáveis ​​e atribuições, portanto, isso começa com $cigual apenas à string vazia, ''para que tenhamos uma indexação zero da string alinhada com a indexação decimal do desafio. Estamos então em um loop que verifica se $chá um número inteiro de entrada ( $args) em algum lugar (ou seja, como .IndexOf()retorna -1se a string não for encontrada, adicionamos um a that ( 0) e não ele ( $TRUE) para continuar o loop). Se não for encontrado, adicionamos nossa $ivariável pré-incrementada e , em seguida, verifique novamente a sequência. Quando a string for encontrada, .IndexOf()retornará um valor positivo, o qual não será$FALSE, saindo do circuito. Finalmente, produzimos o índice com $x.


Ideal para um forloop clássico ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xe salve 1 caractere. Como a maioria das chamadas IndexOf retornará -1, adicione uma e booleana! faça um teste mais curto. Mas você precisa de parênteses para fazer isso. Esvazie $ ce +1 em parênteses existentes, o bônus é mais curto. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 bytes. (mas eu publiquei meu de 39 bytes como resposta própria, porque é uma abordagem completamente diferente: P).
TessellatingHeckler

11
@TessellatingHeckler Ótima maneira de reescrever o loop - obrigado! Mudei a $cconcatenação para o circuito para jogar um ponto e vírgula. Agora às 50.
AdmBorkBork

2

JavaScript (ES6), 40 bytes

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

Usa a função recursiva fpara evitar loops. O método de pesquisa funciona da mesma forma indexOfque, exceto que é necessário um RegExp como parâmetro, o que é irrelevante para esse desafio.

A adição de a " "para o n=0caso (zero é falso em JS) força a +concatenação de string a executar em vez de adição e corrige a indexação baseada em zero.



1

CJam, 11 bytes

r_i),s\#Be|

Teste aqui.

Estou encontrando a posição de Nna string 01234...Npara explicar a indexação baseada em 1. Finalmente, eu corrijo 0aplicando OR lógico com 11.


1

Sério, 13 bytes

;≈9u+R`$`MΣí

Recebe a entrada como um número inteiro. Contém não imprimíveis, portanto, hexdump:

0c3bf739752b526024604de4a1

Experimente online

Explicação:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input


1

k4, 21 bytes

{*1+(,/$1+!10+x)ss$x}

O mesmo que todos os outros - concatenar [1..10+x]como strings, pesquisar x como string, converter em indexação baseada em uma, retornar o primeiro hit.

Verificando os casos de teste:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b

1

Mathematica, 101 bytes

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&

1

Haskell , 82 73 55 bytes

Migrado da duplicata

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

Experimente online!

Explicação

Primeiro nós definimos !. x!btrunca bpara a primeira aparição de x. Ele faz isso verificando se bcomeça com x( or$zipWith(==)x b) retornando xse o fizer e movendo um para baixo na sequência, caso contrário. Então definimos nossa função principal. Nossa função principal é uma função sem ponto que pega a constante ( show=<<[1..]) e a trunca para a primeira aparição de x. Isso leva xcomo uma string.



1

JavaScript (ES6), 50 39 38 bytes

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

Tente

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>





0

Perl 5 , 42 + 1 (-p) = 43 bytes

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

Experimente online!

Explicação

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer

0

Perl 6 / Rakudo 29 bytes

{$_~=$++until /(.+)$^a/;$0.chars}

Define uma função com uma entrada ($ ^ a). Ligue assim:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

Anexando $, uma variável anônima, incrementando $++até a entrada $^aser encontrada e, em seguida, contando o número de caracteres antes dela. Exigir pelo menos 1 caractere antes dele .+na regex exclui utilmente o caso 0-> 0


0

J, 30 bytes

{.I.(":E.[:}.' '-.~":@i.@+&11)

Provavelmente poderia ser um pouco mais complicado, especificamente na concatenação dos primeiros n + 10 números inteiros.

Explicação:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

Observe que esse índice é 0. Exemplos:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.