La secuencia de dígitos escritos


17

Aquí hay una secuencia razonablemente trivial que no está en la Enciclopedia en línea de secuencias enteras .

Comience con una secuencia vacía y luego defina cada término como la cantidad de caracteres necesarios para escribir, en inglés, todos los dígitos de la secuencia hasta ahora sin espacios. *

Como referencia, el número de caracteres de todos los dígitos (base diez) en inglés son:

zero   one    two    three  four   five   six    seven  eight  nine
4      3      3      5      4      4      3      5      5      4

(Que es el comienzo de A52360 y A5589 ).

Esto hace que la primera entrada un(0 0)=0 0 ya que hay cero dígitos presentes en la secuencia vacía.

Esto hace que la segunda entrada sea ya que se necesitan cuatro caracteres para escribir "cero", el único dígito presente hasta ahora.un(1)=4 4

Esto hace que la tercera entrada sea ya que se necesitan cuatro caracteres más para escribir los "cuatro" para un total de ocho para escribir "zerofour".un(2)=8

Esto hace que la cuarta entrada sea ya que se necesitan cinco caracteres más para escribir "ocho" para un total de trece para escribir "zerofoureight".a(3)=13

Esto hace que la quinta entrada sea ya que se necesitan ocho caracteres más para escribir "onethree" para un total de veintiuno para escribir "zerofoureightonethree".a(4)=21

...y así. Aquí están las primeras 100 entradas:

0, 4, 8, 13, 21, 27, 35, 44, 52, 59, 67, 75, 84, 93, 102, 112, 121, 130, 142, 152, 162, 171, 182, 193, 205, 216, 225, 235, 247, 259, 270, 282, 293, 305, 318, 331, 344, 357, 371, 384, 398, 412, 422, 432, 444, 456, 467, 479, 492, 503, 516, 526, 536, 548, 561, 571, 583, 597, 610, 620, 630, 642, 652, 662, 671, 682, 693, 705, 718, 731, 744, 757, 771, 784, 798, 812, 823, 836, 849, 862, 873, 888, 903, 916, 926, 936, 948, 961, 971, 983, 997, 1010, 1024, 1038, 1055, 1070, 1086, 1101, 1114, 1127

* Podríamos definirlo para otros idiomas y / u otras bases o con espacios, por supuesto.

El reto

Dada salida, en la menor cantidad de bytes de código posible, cualquiera de:n

  • Los primeros términos de la secuencia (deberían funcionar para enteros no negativos)n
  • El valor de (debería funcionar para enteros no negativos)a(n)
  • El º término de la secuencia (debería funcionar para números enteros positivos - es decir, valor de un ( n - 1 ) )na(n1)

Este es el por lo que la respuesta más corta en bytes gana para cada idioma, y ​​la respuesta más corta en bytes gana. ¡No permita que los idiomas de golf le impidan ingresar a su idioma favorito, ya sea práctico o esotérico!


Con la primera opción, ¿quiere decir que 1) 1debería generar [0]y 0debería generar []o 2) 0debería generar [0](como en mi respuesta anterior)?
Erik the Outgolfer

@EriktheOutgolfer quiero decir (1) ya que debería devolver los primeros n términos. Es decir, las opciones son "generar la secuencia hasta pero sin incluir un (n)", "generar un (n)" o "generar un (n-1)".
Jonathan Allan

Entonces, a (x) = a (x-1) + f (a (x-1)) donde f (x) es la cantidad de caracteres necesarios para escribir x?
FireCubez

@FireCubez sí, si a (0) = 0 yf (x) son caracteres no espaciales para escribir los dígitos de x
Jonathan Allan

Respuestas:


12

Perl 6 , 45 bytes

{({[+] @_.join.uninames>>.comb X-6}...*)[$_]}

Pruébalo en línea!

¡No es necesario realizar una modulación elegante cuando puede obtener el nombre del dígito directamente! Bloque de código anónimo que devuelve el enésimo valor de la secuencia, o puede pasar en un rango para obtener una lista de valores

Explicación:

{(                                     )[$_]}  # Index input into:
  {                               }...*        # An infinite sequence
                                               # Where each element is
   [+]   # The sum of
       @_.join  # All previous elements joined together
              .uninames  # The unicode names for each character
                         # These are names in the form "DIGIT ONE"
                       >>.comb  # Split each to lists of characters
                               X-6  # Subtract 6 from each

@ JonathanAllan Ah, supuse que habías permitido una secuencia infinita como retorno, lo siento. Arreglaré esto
Jo King el

Bien, eso es bueno :)
Jonathan Allan

¡Agradable! »es un byte, ¿verdad? Además, [+]podría ser más lindo e insinuar cómo las operaciones binarias pueden convertirse en reductores, pero sumtambién es de tres bytes y, de acuerdo con el resto de la solución, que podría no ser la más corta pero segura, es la forma más elegante de golf.
raiph

@raiph »tiene dos bytes, por lo que es intercambiable.
Jo King

Tal vez esto es una trampa, pero ¿Rakudo no maneja el código fuente Latin1 correctamente? Si es así, tenga en cuenta que se say '»'.encode('latin1').bytes muestra 1. :)
raiph

8

JavaScript (ES6), 69 68 61 58 bytes

Devuelve un(norte) .

f=(n,s=0)=>n?f(n-1,[...s+''].map(d=>s+=(d+10)%23%3+3)|s):s

Pruébalo en línea!

¿Cómo?

Un dígito re se convierte en un número norte de letras con:

n=(((d×100+10)mod23)mod3)+3

 d | *100 | +10 | MOD 23 | MOD 3 | +3 | word
---+------+-----+--------+-------+----+-------
 0 |    0 |  10 |   10   |   1   |  4 | zero
 1 |  100 | 110 |   18   |   0   |  3 | one
 2 |  200 | 210 |    3   |   0   |  3 | two
 3 |  300 | 310 |   11   |   2   |  5 | three
 4 |  400 | 410 |   19   |   1   |  4 | four
 5 |  500 | 510 |    4   |   1   |  4 | five
 6 |  600 | 610 |   12   |   0   |  3 | six
 7 |  700 | 710 |   20   |   2   |  5 | seven
 8 |  800 | 810 |    5   |   2   |  5 | eight
 9 |  900 | 910 |   13   |   1   |  4 | nine

Debido a que el número se divide en caracteres de dígitos, podemos procesar re×100+10 simplemente agregando 10 (como una concatenación de cadenas).


7

Stax , 14 13 bytes

┴♥7[╘⌂←─üTJ‼√

Ejecutar y depurarlo

La idea clave aquí es que el dígito drequiere ((4 - 2 * d) // 3) % 3 + 3letras para deletrear. (Esa es la división de enteros de Python y el módulo no negativo de estilo Python)


5

Pip , 21 bytes

Lai+:$+4335443554@^Pi

nortenorte

Explicación

Lai+:$+4335443554@^Pi
                       a is 1st cmdline arg; i is 0 (implicit)
La                     Loop (a) times:
                   Pi   Print i
                  ^     Split it into a list of characters (i.e. digits)
       4335443554@      Use each digit to index into this number, giving the length of the
                        name of the digit (0 -> 4, 1 -> 3, etc.)
     $+                 Sum the results
  i+:                   Increment i by that amount

2
Leí esto como large constant to the power of piy me impresionó monumentalmente. (Sigue siendo impresionante, pero mi interpretación inicial fue ... más)
Octurous

4

Wolfram Language (Mathematica) , 57 bytes

Nest[#+Tr@StringLength@IntegerName@IntegerDigits@#&,0,#]&

Pruébalo en línea!

Tr@StringLength@IntegerName@IntegerDigits@#&enumera los dígitos de #, convierte cada uno de ellos en un nombre en inglés, cuenta la longitud y suma los resultados. Muchas cosas pasan por las listas, es muy emocionante. Luego solo aplicamos iterativamente la definición.

TIO se queja de que no tiene conexión a Internet, pero no estoy seguro de por qué, porque de todos modos descubre la respuesta correcta. ¿Quizás está buscando actualizaciones para los nombres de los enteros?

un(norte)un(0 0),un(1),...,un(norte)NestNestList



4

05AB1E , 15 14 bytes

ÎFD•16\|/•sSèOO

Pruébalo en línea!

Explicación

Î                # initialize stack with 0 and input
 F               # input times do:
  D              # duplicate the current number
         sSè     # and use one copy to index into
   •Qb₁ñ•        # 433544355
            OO   # sum digits and sum the stack

4

APL (Dyalog Unicode) , 29 28 bytes

{{⍵++/3+3|⌊3÷⍨4-2×⍎¨⍕⍵}⍣⍵⊢0}

Pruébalo en línea!

F(yonortepagtut)

Gracias a los muchachos @The APL Orchard por ayudar con este:

@ngn para 2 bytes; @ H.PWiz para 3 4 bytes.

Ahora usando la fórmula de @ recursive.

Cómo:

{{⍵++/3+3|⌊3÷⍨4-2×⍎¨⍕⍵}⍣⍵⊢0}  Main fn

 {                     }⍣⍵⊢0  Starting with 0, repeat (⍣) the inner fn input times
      3+3|⌊3÷⍨4-2×⍎¨⍕⍵       @recursive's formula
  ⍵++/                       ⍝ Sum with the input.

3

Python 2 , 61 bytes

n=0
exec"for c in`n`:n+=(4-2*int(c))/3%3+3\n"*input()
print n

Pruébalo en línea!

Utiliza el mapeo recursivo de recuento de dígitos .


Python 2 , 63 bytes

f=lambda n:n and f(n-1)+sum((4-2*int(c))/3%3+3for c in`f(n-1)`)

Pruébalo en línea!

Una versión de función recursiva. Se tarda un tiempo exponencial en ejecutarse porque tiene dos llamadas recursivas a f(n-1).


¡Agradable! Tengo curiosidad por saber si la secuencia de comandos de búsqueda de expresiones que mencionaste antes encuentra esta expresión (¿o tal vez una más corta?)
Lynn

@ Lynn Ejecuté el script pero no encontré uno mejor. 13 caracteres es demasiado para una búsqueda completa, y no encontró nada a lo sumo 9 caracteres de largo. Cuando corté +3y lo limité a operadores aritméticos (no bit a bit) y números <= 4, encontré esta solución pero nada más corto o incluso la misma longitud, excepto equivalentes.
xnor

3

Python 2 , 71 bytes

f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or k

Pruébalo en línea!


f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or kes el mismo recuento pero evita generar una lista adjunta.
Jonathan Allan

Parece que el algoritmo recursivo de su respuesta staxx ahorraría 2 bytes. ¡Aunque me gusta esto!
Jonathan Allan

3

MathGolf , 17 bytes

0\{_▒♀*♂+L%3%3+Σ+

Pruébalo en línea!

Esto usa el método de Arnauld . Emite el enésimo elemento de la secuencia. Si la cadena vacía está bien a(0), entonces podríamos eliminar el0\ al principio.

Explicación:

0\                 Setup 0 as the counter
  {                Loop input times
   _▒              Duplicate counter and split to list of digits
     ♀*            Multiply each element by 100
       ♂+          Add 10
         L%        Modulo by 23
           3%      Modulo by 3
             3+    Add 3
               Σ   Sum list
                +  And add to counter

3

Pyth , 21 bytes

u+Gs@L+L3jC\᯻3jGTQ0

Pruébelo en línea aquí .

u+Gs@L+L3jC\᯻3jGTQ0   Implicit: Q=eval(input()), T=10

u                Q0   Starting at 0, repeat the following Q times, with current value as G:
          C\᯻           Get character code 7163
         j   3          Convert the above to base 3, yields [1, 0, 0, 2, 1, 1, 0, 2, 2]
      +L3               Add 3 to each to generate digit length dictionary
              jGT       Get digits of G (convert to base 10)
    @L                  Lookup each value in the above in the dictionary, modular indexing
   s                    Take the sum
 +G                     Add G to the above

muy probablemente no sea un solo byte en la página de códigos de Pyth. (Creo que usa UTF-8, en cuyo caso es de 3 bytes y j7163 3tiene la misma longitud; pero tio.run dice que Pyth tiene un SBCS. ¡Misterioso!)
Lynn

@ Lynn Tienes toda la razón, me había olvidado del recuento de bytes, mi mal. Dejaré el código tal como está por ahora y actualizaré el recuento de bytes
Sok,






1

J , 37 bytes

(+1#.|(3+3|23|10+100*]),.&.":)@]^:[&0

Pruébalo en línea!

Utiliza el método de Arnauld

Explicación:

El argumento es n

                                 ^:    - apply the verb on the left hand site
                                   [   - n times
                                    &0 - to a starting value 0
 (                             )@]     - calculate for the current value of the argument
                         ,.&.":        - convert to string and then each char to digit
        (3+3|23|10+100*])              - map each digit to its word length
       |                               - a filler for the fork
    1#.                                - sum the lengths 
   +                                   - add them to the current value

1

Editado después del primer comentario.

Imprime todos los términos

Scala, 76 bytes

def^(n:Int)=(1 to n).scanLeft(0)((y,_)=>y+(y+"").map(x=>(x*9+1)%13%3+3).sum)

Pruébalo en línea!

Impresiones n th término

Scala, 72 bytes

def^(n:Int)=Stream.iterate(0)(x=>x+(x+"").map(x=>(x*9+1)%13%3+3).sum)(n)

Scala, 69 bytes

def^(n:Int)=(0/:(1 to n))((y,_)=>y+(y+"").map(x=>(x*9+1)%13%3+3).sum)

Scala, 67 bytes

def s(b:Int):Stream[Int]=b#::s(b+(b+"").map(x=>(x*9+1)%13%3+3).sum)

Scala, 67 bytes

val s:Stream[Int]=0#::s.map(x=>x+(x+"").map(x=>(x*9+1)%13%3+3).sum)

Pruébalo en línea!


1
No conozco Scala, pero creo que esto no es ni un programa ni una función, sino un fragmento (es decir, se ejecuta en REPL una vez que nestá definido). Si conoces Scala, probablemente sea fácil de arreglar. También tenga en cuenta que hay consejos para jugar al golf en la pregunta Scala que pueden ayudar. Por último, es bueno publicar un enlace a un intérprete en línea, TIO tiene Scala y es utilizado por muchos miembros de PPCG.
Jonathan Allan

1
@ JonathanAllan, gracias, fue muy útil.
Dr. Y Wit
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.