A sequência de dígitos escritos

17

Aqui está uma sequência razoavelmente trivial que não está na Enciclopédia Online de Sequências Inteiras .

Comece com uma sequência vazia e defina cada termo como o número de caracteres necessários para escrever, em inglês, todos os dígitos da sequência até agora sem espaços. *

Para referência, o número de caracteres de todos os dígitos (base dez) em inglês é:

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

(Que é o início do A52360 e do A5589 .)

Isso torna a primeira entrada uma vez que existem zero dígitos presentes na sequência vazia.uma(0 0)=0 0

Isso torna a segunda entrada pois são necessários quatro caracteres para escrever "zero", o único dígito presente até o momento.uma(1)=4

Isso torna a terceira entrada pois são necessários mais quatro caracteres para escrever o "quatro", para um total de oito escrever "zerofour".uma(2)=8

Isso torna a quarta entrada pois são necessários mais cinco caracteres para escrever "oito" e um total de treze para escrever "zerofoureight".uma(3)=13

Isso faz com que a quinta entrada seja pois são necessários mais oito caracteres para escrever "onethree", para um total de vinte e um para escrever "zerofoureightonethree".uma(4)=21

...e assim por diante. Aqui estão as primeiras 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

* Poderíamos defini-lo para outras línguas e / ou outras bases ou com espaços, é claro

O desafio

Dada a saída , com o menor número possível de bytes de código, qualquer um dos seguintes:n

  • Os primeiros termos da sequência (devem funcionar para números inteiros não negativos)n
  • O valor de (deve funcionar para números inteiros não negativos)uma(n)
  • O th termo da sequência (deve funcionar para inteiros positivos - ou seja, o valor de )na ( n - 1 )uma(n-1)

Isso é e a resposta mais curta em bytes vence para cada idioma, e a resposta mais curta em bytes vence. Não deixe que os idiomas do golfe o impeçam de entrar no seu idioma favorito, seja ele prático ou esotérico!

Jonathan Allan
fonte
Pela primeira opção, você quer dizer que 1) 1deve produzir [0]e 0deve produzir []ou 2) 0deve produzir [0](como na minha resposta anterior)?
Erik the Outgolfer
@EriktheOutgolfer Quero dizer (1), pois deve retornar os primeiros n termos. Ou seja, as opções são "produzir a sequência até, mas sem incluir a (n)", "produzir a (n)" ou "produzir a (n-1)".
Jonathan Allan
Então, a (x) = a (x-1) + f (a (x-1)) onde f (x) é a quantidade de caracteres necessários para escrever x?
23918 FireCubez
@FireCubez sim, se um (0) = 0 e f (x) é caracteres não-espaço para escrever os dígitos de x
Jonathan Allan

Respostas:

12

Perl 6 , 45 bytes

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

Experimente online!

Não há necessidade de modulação sofisticada quando você pode obter o nome do dígito diretamente! Bloco de código anônimo que retorna o enésimo valor da sequência ou você pode passar um intervalo para obter uma lista de valores

Explicação:

{(                                     )[$_]}  # 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
Brincadeira
fonte
@ JonathanAllan Ah, eu tinha assumido que você tinha permitido uma sequência infinita como retorno, desculpe. Vou consertar isso
Jo King
Bom, isso é bom :)
Jonathan Allan
Agradável! »é um byte, certo? Além disso, [+]pode ser mais bonito e sugerir como as operações binárias podem se tornar redutoras, mas sumtambém tem três bytes e está de acordo com o restante da solução, que pode não ser a mais curta, mas com certeza é a mais elegante do golfe.
raiph
@raiph »tem dois bytes, portanto é intercambiável.
Jo rei
Talvez isso seja trapaça, mas o Rakudo não lida com o código-fonte Latin1 corretamente? Nesse caso, observe que é say '»'.encode('latin1').bytes exibido 1. :)
raiph
8

JavaScript (ES6), 69 68 61 58 bytes

Retorna uma(n) .

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

Experimente online!

Quão?

Um dígito d é convertido em um número n de letras com:

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

Como o número é dividido em caracteres de dígito, podemos processar adicionando apenas (como uma concatenação de string).d×100+1010

Arnauld
fonte
7

Stax , 14 13 bytes

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

Execute e depure

O principal insight aqui é que o dígito dexige que as ((4 - 2 * d) // 3) % 3 + 3letras sejam digitadas. (Isso é divisão inteira python e módulo não negativo no estilo python)

recursivo
fonte
5

Pip , 21 bytes

Lai+:$+4335443554@^Pi

nn

Explicação

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
DLosc
fonte
2
Eu li isso como large constant to the power of pie fiquei monumentalmente impressionado. (Ainda é impressionante, mas a minha interpretação inicial era apenas mais ..)
Οurous
4

Wolfram Language (Mathematica) , 57 bytes

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

Experimente online!

Tr@StringLength@IntegerName@IntegerDigits@#&lista os dígitos de #, converte cada um deles em um nome em inglês, conta o comprimento e soma os resultados. Muitas coisas enfileiram listas, é muito emocionante. Em seguida, aplicamos iterativamente a definição.

O TIO reclama que não tem uma conexão com a Internet, mas não sei por que, porque descobre a resposta certa de qualquer maneira. Talvez esteja procurando atualizações nos nomes dos números inteiros?

uma(n)uma(0 0),uma(1),...,uma(n)NestNestList

Misha Lavrov
fonte
4

Limpo , 82 bytes

import StdEnv,Text
$a=iter a(\n=n+sum[3+indexOf{c}" 9810324765"rem 3\\c<-:""<+n])0

Experimente online!

Furioso
fonte
4

05AB1E , 15 14 bytes

ÎFD•16\|/•sSèOO

Experimente online!

Explicação

Î                # 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
Emigna
fonte
4

APL (Dyalog Unicode) , 29 28 bytes

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

Experimente online!

f(Eunpvocêt)

Obrigado aos caras do @ The APL Orchard por ajudarem com este:

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

Agora, usando a fórmula do @ recursive.

Quão:

{{⍵++/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.
J. Sallé
fonte
3

Python 2 , 61 bytes

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

Experimente online!

Usa o mapeamento de contagem de dígitos recursivos .


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)`)

Experimente online!

Uma versão de função recursiva. Leva um tempo exponencial para ser executado porque há duas chamadas recursivas para f(n-1).

xnor
fonte
Agradável! Estou curioso para saber se o script de apuramento de expressão que você mencionou usando antes descobertas esta expressão (ou talvez um ainda mais curto?)
Lynn
@ Lynn Eu tinha executado o script, mas não encontrei um melhor. 13 caracteres é demais para uma pesquisa completa e não encontrou nada no máximo com 9 caracteres. Quando cortei +3e o limitei a operadores aritméticos (sem bit a bit) e números <= 4, encontrei essa solução, mas nada mais curto ou mesmo o mesmo comprimento, exceto os 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

Experimente online!

ovs
fonte
f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or ké a mesma contagem, mas evita a saída de uma lista anexa.
Jonathan Allan
Parece que o algoritmo recursivo de sua resposta staxx economizaria 2 bytes. Eu gosto disso!
Jonathan Allan
3

MathGolf , 17 bytes

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

Experimente online!

Isso usa o método de Arnauld . Gera o enésimo elemento da sequência. Se a string vazia estiver correta a(0), poderíamos removê-la 0\no início.

Explicação:

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
Brincadeira
fonte
3

Pitão , 21 bytes

u+Gs@L+L3jC\᯻3jGTQ0

Experimente online aqui .

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
Sok
fonte
muito provavelmente não é um único byte na página de códigos de Pyth. (Eu acho que ele usa UTF-8, caso em que é 3 bytes, e j7163 3tem o mesmo comprimento, mas tio.run diz Pyth tem um SBCS Misterioso.!)
Lynn
@ Lynn Você está absolutamente certo, eu tinha esquecido a contagem de bytes, meu mal. Vou deixar o código como é para agora e atualizar a contagem de bytes
Sok
2

Java (JDK) , 95 bytes

n->{int l=0;while(n-->0)l+=(""+l).chars().map(x->"4335443554".charAt(x-48)-48).sum();return l;}

Experimente online!

Olivier Grégoire
fonte
1

Gelatina , 13 bytes

ṃ“vẋç’ḃ5¤S+Ɗ¡

Experimente online!

Indexado a 0.

Programa completo; recebe entrada de STDIN.

Erik, o Outgolfer
fonte
1

Vermelho , 99 95 bytes

func[n][d:"4335443554"s: 0 repeat i n[print s foreach c form s[s: s - 48 + do d/(-47 + do c)]]]

Experimente online!

Apenas uma solução direta.

Galen Ivanov
fonte
1

J , 37 bytes

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

Experimente online!

Usa o método de Arnauld

Explicação:

O argumento é 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
Galen Ivanov
fonte
1

Editado após o 1º comentário.

Imprime todos os termos

Scala, 76 bytes

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

Experimente online!

Imprime o enésimo termo

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)

Experimente online!

Dr. Y Wit
fonte
1
Não conheço o Scala, mas acho que isso não é um programa ou uma função, mas um fragmento (ou seja, ele roda no REPL uma vez ndefinido). Se você conhece o Scala, provavelmente é fácil de corrigir. Observe também que há dicas para jogar golfe na questão Scala, que podem ajudar. Por fim, é bom postar um link para um intérprete on-line, o TIO possui o Scala e é usado por muitos membros do PPCG.
Jonathan Allan
1
@ JonathanAllan, obrigado, foi muito útil.
Dr. Y Wit