¿Qué es este número de inicio construido?

14

Varios lenguajes de programación construyen enteros grandes mediante la 'concatenación' del dígito al final del número existente. Por ejemplo, Labyrinth o Adapt . Al concatenar el dígito hasta el final, quiero decir que, si el número existente es 45 y el dígito es 7 7 , el número resultante es 457(45×10+7 7) .

Un número construido es un número que se puede construir de esta manera mediante el uso de múltiplos de números de un solo dígito: 1,2,3,4 4,5 5,6 6,7 7,8,9 9 AKA un elemento en una de estas 9 secuencias:

1,12,123,1234,12345,...
2,24,246,2468,24690,...
3,36,369,3702,37035,...
4 4,48,492,4936,49380,...
5 5,60 60,615,6170,61725,...
6 6,72,738,7404,74070,...
7 7,84,861,8638,86415,...
8,96,984,9872,98760,...
9 9,108,1107,11106,111105,...

Para proporcionar un ejemplo de cómo se construyen las secuencias, así es como se construye la secuencia para un=3 :

tu1=un=3=3tu2=10×tu1+2×un=30+6 6=36tu3=10×tu2+3×un=360+9 9=369tu4 4=10×tu3+4 4×un=3690+12=3702tu5 5=10×tu4 4+5 5×un=37020+15=37035tu6 6=10×tu5 5+6 6×un=370350+18 años=370368
tu33=10×tu32+33×un=37...260+99=37...359tu34=10×tu33+34×un=37...359+102=37...3692

tu33 incluyen u 33 ytu34 para demostrar cuándonorte×un100 . Unmontónde dígitos punteados por espacio.

Puede que aún no esté claro cómo se construyen estas secuencias, por lo que aquí hay dos formas diferentes de entenderlas:

  • Cada secuencia comienza desde el único dígito. El siguiente término se encuentra tomando el siguiente múltiplo de ese dígito, multiplicando el término anterior por10 y sumando el múltiplo. En términos de secuencia:

    tunorte=10×tunorte-1+norte×un,tu1=un

    donde un es un solo dígito ( 1 a 9 9 )


  • Cada uno de los 9 9 elementos en cualquier punto de la secuencia (tome norte=3 por ejemplo) son los múltiplos de 123... del 1 al 9 , donde 123 se construye por un+1=10×un+n (1,12,123,,123456789,1234567900,12345679011,)

    Entonces, los primeros valores son 1×1,2,3,,8,9 , los segundos son 12×1,2,3,,8,9 , los terceros 123×1,2,3,...,8,9 9 , etc.

Su tarea es tomar un número construido como entrada y generar el dígito inicial utilizado para construirlo. Puede suponer que la entrada siempre será un número construido y será mayor que 0 0 . Puede ser un solo dígito, que se asigna a sí mismo.

Puede tomar datos de cualquier manera razonable, incluso como una lista de dígitos, como una cadena, etc. Es aceptable (aunque no recomendado) tomar los datos de manera individual o en cualquier otra base de su elección.

Este es un por lo que gana el código más corto.

Casos de prueba

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

o como dos listas:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

Cuando publiqué este desafío, no me di cuenta de que podría simplificarse tanto por el método utilizado en la respuesta de Grimy , por lo que estaría muy interesado en respuestas que tengan un enfoque más matemático para resolver esto, en lugar de un 'dígito' truco (Obviamente, todas las respuestas válidas son igualmente válidas, justo lo que me gustaría ver).

caird coinheringaahing
fuente
Puesto de sandbox . Tengo una solución de 9 bytes en Jelly, si alguien quiere desafiar eso.
caird coinheringaahing

Respuestas:

26

05AB1E , 7 5 4 bytes

>9*н

Pruébalo en línea!

>            # input + 1
 9*          # * 9
   н         # take the first digit
Mugriento
fuente
66
Hmm, eso no es un buen augurio para este desafío si se puede simplificar tan fácilmente
caird coinheringaahing
99
Tiene aproximadamente 1 byte de código para 800 bytes de explicación de desafío. : p
Arnauld
1
¿Cómo se te ocurre la solución y por qué es correcta?
Joel
77
@Joel el término (n-1) de la secuencia que comienza con a es a * (((10**n - 1) / 9 - n) / 9). Multiplique eso por 9 y agregue a*n, y obtendrá a * ((10**n - 1) / 9), también conocido como el dígito, repetidamente n veces. Resulta sumar 9 en lugar de a*ntrabajos para n = 1, y para n más grande la diferencia constante es insignificante junto al crecimiento exponencial.
Grimmy
3
@ Grimy Muchas gracias por la explicación. Tal vez puedas ponerlo en tu publicación.
Joel
3

MathGolf , 6 bytes

)9*▒├Þ

Pruébalo en línea!

Desafortunadamente, no hay ninguna headoperación en MathGolf, así que tengo que conformarme con ▒├Þconvertir a cadena, hacer pop desde la izquierda y descartar todo menos la parte superior de la pila.

Jo King
fuente
2

Carbón de leña , 7 bytes

§I×⁹⊕N⁰

Pruébalo en línea! El enlace es a la versión detallada del código. El método de @ Grimy, por supuesto. Aquí hay un enfoque matemático de 27 bytes:

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

Pruébalo en línea! El enlace es a la versión detallada del código. Se bloquea en entradas no válidas. Explicación:

Nθ

Ingrese el número construido.

W¬№Eχ×κ↨υχθ

Interprete la lista como un número en la base 10, multiplique por todos los números desde 0hasta 9y vea si aparece el número construido.

⊞υLυ

Empuje la longitud de la lista a sí misma. La lista por lo tanto se hace de la forma [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Recrea los números construidos pero esta vez encuentra y genera el índice en el que apareció el número de entrada.

Neil
fuente
2

Espacio en blanco , 108 bytes

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

Se agregaron letras S(espacio), T(tabulación) y N(nueva línea) solo como resaltado.
[..._some_action]agregado solo como explicación.

Puerto de @Grimy respuesta 05AB1E 's , excepto que no tengo una orden interna para obtener el primer dígito. ;)

Pruébelo en línea (solo con espacios en bruto, pestañas y nuevas líneas).

Explicación en pseudocódigo:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT
Kevin Cruijssen
fuente
2

Python 3 , 22 bytes

lambda i:str(-~i*9)[0]

Pruébalo en línea!

La respuesta 05AB1E del puerto de Grimy


Python 3 , 74 bytes

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

Pruébalo en línea!

Explicación

Función recursiva. Itera sobre la secuencia de cada dígito l, comenzando en 1. Si la entrada ies igual a la iteración actual j, lse devuelve el dígito correspondiente . De lo contrario, si el valor actual jen la secuencia excede el valor de entrada i, incrementará el dígito ly comenzará de nuevo. El argumento kse usa para incrementar el factor de multiplicación.

Jitse
fuente
1

JavaScript (ES6),  16  15 bytes

Gracias a @Grimy por levantar la restricción de 32 bits que tenía con la versión anterior.

Usando el encantamiento mágico de Grimy . Toma la entrada como una cadena.

n=>(n*9+9+n)[0]

Pruébalo en línea!


JavaScript (ES6), 53 bytes

Enfoque ingenuo de la fuerza bruta.

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

Pruébalo en línea!

Arnauld
fuente
-~n*9puede ser n*9+9, que es el mismo bytecount pero debería deshacerse de la limitación de 32 bits si lo entendí correctamente.
Grimmy
la fuerza bruta funciona para un> = 10, como14808
Nahuel Fouilleul
1
@NahuelFouilleul si consideramos a> = 10, la respuesta ya no es única (14808 podría ser el cuarto término de a = 12 o el primer término de a = 14808). Si la salida de cualquiera de esos está permitida, n=>nfunciona para todas las entradas.
Grimmy
1

Java 8, 23 bytes

n->(n*9+9+"").charAt(0)

Puerto de @Grimy 's respuesta 05AB1E , así que asegúrese de que le upvote!

Pruébalo en línea.

Pero debido a que me siento un poco mal por @cairdCoinheringaahing , aquí un enfoque de fuerza bruta con un poco más de precio ( 83 bytes ):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

Pruébalo en línea.

Explicación:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result
Kevin Cruijssen
fuente
0

Jalea , 8 bytes

RRḌ÷@fⱮ9

Pruébalo en línea!

Un programa completo que toma un número entero e imprime el dígito de inicio. ¡No usa el método inteligente de Grimy! Terriblemente ineficiente para una entrada mayor. La siguiente versión maneja todos los casos de prueba pero es un byte más largo:

Jalea , 9 bytes

DJRḌ÷@fⱮ9

Pruébalo en línea!

Nick Kennedy
fuente
0

Barril -rr , 4 bytes

⑨9*÷

Pruébalo en línea!

Por supuesto, utiliza el mismo enfoque que la respuesta 05AB1E. También usa el nuevo-rr bandera (revertir e imprimir sin formato).

Transpiles a:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)
Lyxal
fuente