Encuentra el número en la constante Champernowne


35

Introducción

En la base 10, la constante Champernowne se define mediante la concatenación de representaciones de enteros sucesivos. En base 10: 0.1234567891011121314151617...y así sucesivamente.

Puede ver que la primera aparición de 15comienza en el 20thdecimal:

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

La primera aparición de 45comienza en el 4thdecimal:

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

Entonces, la tarea es fácil. Dado un entero no negativo, genera la posición del entero en la constante Champernowne.

Reglas

  • Puede proporcionar una función o un programa
  • Este es el , por lo que gana el envío con la menor cantidad de bytes.

Casos de prueba

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

¿Cuál es el puesto más alto para el que necesitamos trabajar? Por ejemplo, el número será 987654321123456877654234354675.
Morgan Thrapp

@MorganThrapp Probablemente probaré enteros en el rango 0 <= x <= 99, pero en teoría debería funcionar para enteros superiores a 99.
Adnan

Respuestas:



10

LabVIEW, 29 primitivas de LabVIEW

Esto usa cadenas por ahora. Coincide con la entrada como un patrón y genera el desplazamiento - (longitud de entrada -1).


6

Javascript, 57 bytes

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

Guardado 1 byte gracias a Conor O'Brien.


Creo que puedes mover la y=parte a la y=b=" "; Incrementar un espacio es como incrementar cero. ( a=prompt(y=b=" ");...)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Buen hallazgo.
SuperJedi224

4

Haskell, 62 bytes

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

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

Cómo funciona: a # bencuentra la posición de ainside b: si aes el prefijo de breturn 1, de lo contrario, agregue 1a una llamada recursiva con a # tail b. La función pointfree (#(show=<<[1..])).showespera un argumento (sin nombre) ny llamadas show n # show=<<[1..].

La función subIndextambién haría el trabajo de #, pero lo requerido import Data.List.Utilsno vale la pena.


No creo que necesites el.show
Wheat Wizard


4

Ruby, 28

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

Incluye un 0 al principio para que las coincidencias estén indexadas en 1, pero suele \Brequerir que la coincidencia no esté al principio de la cadena.


4

Japt, 11 bytes

Originalmente, esto estaba superando a Pyth, pero aparentemente no funcionó como entrada 0.

1+1oU+B ¬bU

Pruébalo en línea!

Cómo 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 qué su sección "Cómo funciona" contiene un qen el código y no el símbolo de negación lógica ¬?
Fatalize

@Fatalize ¬es un atajo para (que tiene qun espacio siguiente). Esto a menudo parece ser un punto de confusión, por lo que he alineado la versión más corta con la versión completa.
ETHproductions

3

Lua, 54 bytes

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

Nota: Actualmente, este programa imprime tanto la primera aparición del primer carácter de la cadena como el punto donde termina. Si esto no está permitido, costará unos pocos bytes más. Me gustaría solicitar una bonificación porque mi programa imprime tanto la primera posición como la última posición del número de entrada.


1
¿Te refieres a los índices de inicio y los índices finales para la primera aparición del número? Porque teóricamente el número estaría allí una cantidad infinita de veces.
Rɪᴋᴇʀ

Sí, comenzar y terminar por primera vez.
Nikolai97

3

MATL , 22 bytes

it10+:Yst' '=~)wYsXf1)

Tome la entrada ( i), haga que el vector 1 ingrese + 10 ( 10+:), convierta el vector en una cadena ( Ys) y elimine los espacios, lo cual es doloroso, ( t' '=~)). Luego, convierta la entrada en una cadena ( Ys), encuentre dónde está la cadena de entrada en la cadena de números ( Xf) y tome la primera ubicación ( 1)). Las t'sy w' están manipulando la pila (duplicar e intercambiar, respectivamente).


3

PowerShell, 39 44 bytes

[Editar: mi suposición no se cumple, construir una matriz de 1-0 no encuentra 0 en el lugar 11. En cambio, construir desde 1-x + 10 para manejar 0 también, ahora 44 bytes]

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

Siempre encontrará x cuando construya una cadena de la constante Champernowne en el último punto cuando agregue x al final, por lo que una matriz de 1-x siempre tendrá la respuesta. La pregunta se convierte en "¿ocurre antes de eso?" . Este código

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

e.g.

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

genera un rango de números, lo convierte en una cadena y busca el parámetro dentro de él. Debido a que PowerShell es un shell orientado a objetos, el parámetro es en realidad un [int]tipo, por lo que intentar guardar dos caracteres .IndexOf($i)buscaría un entero en la cadena y no encontraría nada. Es por eso que uso interpolación de cadenas "$i".


1
Manera inteligente de hacerlo. Frustrante que .IndexOf()aparentemente tiene mayor preferencia operativa que -joinobligar a los padres y cotizaciones unarias . : - /
AdmBorkBork

3

MATL (versión 1.0.1), 22 bytes

iXK10+:"@Ys]N$hKYsXf1)

Ejemplo

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

Explicación

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

MAT (versión 20.8.0), 16 bytes (es posterior desafío del lenguaje)

Crédito a @Giuseppe para esta versión del programa (ligeramente modificado)

10+:"@V]&hGVXf1)

Pruébalo en línea!

Explicación

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

No creo que esto maneje 0 :(
David

@David Ahora sí. ¡Gracias por notarlo! Solo costó 3 bytes :-)
Luis Mendo

ahora que el portapapeles Gcontiene la entrada (y la entrada implícita), supongo que esta respuesta puede acortarse bastante y toda la Ysnecesidad de cambiar de Vtodos modos; Se me ocurrieron 10+:"@Vv]!GVXf1)16 bytes.
Giuseppe

@Giuseppe ¡Gracias por el aviso! Actualizado, con el debido crédito (y con una nota de "desafío de idioma posterior a las fechas"; no soy un gran admirador de la nueva regla )
Luis Mendo

No me importa mucho esa regla ( sin embargo, las banderas me vuelven loco); La mayoría de las veces comentaba aquí, ya que noté que era Ysnecesario cambiarlo Vpara usarlo en la versión más actualizada del intérprete. ¡Siempre me impresiona cuánto ha mejorado el idioma!
Giuseppe

2

PowerShell, 54 50 bytes

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

Gracias a TessellatingHeckler por la idea de cambiar el whilebucle por un forbucle.

Se ejecuta a través de un forbucle. Al igual que con otros lenguajes, la primera instrucción en el bucle puede construir variables y asignaciones, por lo que esto comienza con $cuna cadena vacía igual para ''que podamos indexar a cero la cadena alineándose con la indexación decimal del desafío. Luego estamos en un bucle que verifica si $ctiene el entero de entrada ( $args) en algún lugar dentro de él (es decir, dado que .IndexOf()devuelve -1si no se encuentra la cadena, agregamos uno a eso ( 0) y no ( $TRUE) para continuar el bucle). Si no se encuentra, agregamos nuestra $ivariable de contador previamente incrementada , luego volvemos a verificar la cadena. Una vez que se encuentra la cadena, .IndexOf()devolverá un valor positivo, cuyo no será$FALSE, saliendo del bucle. Finalmente, sacamos el índice con $x.


Ideal para un forbucle clásico ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xy guardar 1 personaje. Como la mayoría de las llamadas IndexOf devolverán -1, agregue una y boolean! lanzarlo, para una prueba más corta. Pero necesitas padres para hacer eso. Vacíe $ c y +1 dentro de parens existentes, el bono es más corto. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 bytes. (pero publiqué mi byte uno de 39 como respuesta propia porque es un enfoque completamente diferente: P).
TessellatingHeckler

1
@TessellatingHeckler Buena manera de reescribir el ciclo, ¡gracias! $cMoví la concatenación en el bucle para jugar al golf un punto y coma. Ahora a los 50.
AdmBorkBork

2

JavaScript (ES6), 40 bytes

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

Utiliza la función recursiva fpara evitar bucles. El método de búsqueda funciona igual que, indexOfexcepto que toma un RegExp como parámetro, lo cual es irrelevante para este desafío.

Agregar un " "para el n=0caso (cero es falso en JS) obliga +a realizar la concatenación de cadenas en lugar de la suma, y ​​corrige la indexación basada en cero.



1

CJam, 11 bytes

r_i),s\#Be|

Pruébalo aquí.

Estoy encontrando la posición de Nen la cadena 01234...Npara dar cuenta de la indexación basada en 1. Finalmente lo arreglo 0aplicando OR lógico con 11.


1

En serio, 13 bytes

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

Toma la entrada como un entero. Contiene no imprimibles, por lo que hexdump:

0c3bf739752b526024604de4a1

Pruébalo en línea

Explicación:

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

Lo mismo que todos los demás: concatenar [1..10+x]como cadenas, buscar x como cadena, convertir a indexación basada en uno, devolver el primer hit.

Comprobación de los casos de prueba:

  &/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 desde el duplicado

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

Pruébalo en línea!

Explicación

Primero definimos !. x!btrunca ba la primera aparición de x. Lo hace comprobando si bcomienza con x( or$zipWith(==)x b) regresando xsi lo hace y moviendo uno hacia abajo de la cadena de lo contrario. Luego definimos nuestra función principal. Nuestra función principal es una función sin puntos que toma la constante ( show=<<[1..]) y la trunca a la primera aparición de x. Esto toma xcomo una cadena.



1

JavaScript (ES6), 50 39 38 bytes

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

Intentalo

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

Pruébalo en línea!

Explicación

(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 una función con una entrada ($ ^ a). Llame así:

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

Anexar $, una variable anónima, que se incrementa $++hasta que $^ase encuentra la entrada , y luego cuenta el número de caracteres antes. Requerir al menos 1 carácter antes de él .+en la expresión regular excluye útilmente el caso 0-> 0


0

J, 30 bytes

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

Probablemente podría jugar un poco más, específicamente en la concatenación de los primeros n + 10 enteros.

Explicación:

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

Tenga en cuenta que esto está indexado a 0. Ejemplos:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.