Sekwencja cyfr pisanych

17

Oto dość trywialna sekwencja, której nie ma w internetowej encyklopedii sekwencji liczb całkowitych .

Zacznij od pustej sekwencji, a następnie zdefiniuj każdy termin jako liczbę znaków wymaganych do wypisania, w języku angielskim, wszystkich dotychczasowych cyfr sekwencji bez spacji. *

W celach informacyjnych liczba znaków wszystkich (dziesięciu podstawowych) cyfr w języku angielskim to:

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

(Który jest początkiem zarówno A52360, jak i A5589 .)

To sprawia, że ​​pierwszy wpis a(0)=0 ponieważ w pustej sekwencji występuje zero cyfr.

To sprawia, że ​​drugi wpis to ponieważ do zapisania „zero”, jedynej dotychczasowej cyfry, potrzeba czterech znaków.a(1)=4

To sprawia, że ​​trzeci wpis ponieważ potrzeba czterech dodatkowych znaków, aby napisać „cztery”, w sumie osiem, aby napisać „zero”.a(2)=8

To sprawia, że ​​czwarty wpis ponieważ potrzeba pięciu kolejnych znaków, aby napisać „osiem”, a w sumie trzynaście, aby napisać „zeroofoureight”.a(3)=13

To czyni piąty wpis ponieważ potrzeba ośmiu kolejnych znaków, aby napisać „onethree”, w sumie dwadzieścia jeden, aby napisać „zeroofoureightonethree”.a(4)=21

...i tak dalej. Oto pierwszych 100 wpisów:

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

* Możemy zdefiniować to dla innych języków i / lub innych baz lub oczywiście ze spacjami

Wyzwanie

Biorąc pod uwagę danych wyjściowych, w jak najmniejszej liczbie bajtów kodu, dowolny z:n

  • Pierwsze elementów sekwencji (powinno działać dla liczb całkowitych nieujemnych)n
  • Wartość a(n) (powinna działać dla nieujemnych liczb całkowitych)
  • n p określenie sekwencji (powinny działać dodatnich liczb całkowitych - czyli wartość ( n - 1 ) )a(n1)

To jest więc najkrótsza odpowiedź w bajtach wygrywa dla każdego języka, a najkrótsza odpowiedź w bajtach wygrywa. Nie pozwól, aby języki gry w golfa powstrzymały Cię przed wejściem w ulubiony język, zarówno praktyczny, jak i ezoteryczny!

Jonathan Allan
źródło
Czy przez pierwszą opcję rozumiesz, że 1) 1powinno generować [0]i 0powinno generować, []czy 2) 0powinno generować [0](jak w mojej poprzedniej odpowiedzi)?
Erik the Outgolfer
@EriktheOutgolfer Mam na myśli (1), ponieważ powinien zwrócić pierwsze n warunków. To znaczy, opcje to: „wypisz sekwencję do, ale nie włączając a (n)”, „wypisz a (n)” lub „wypisz a (n-1)”.
Jonathan Allan
Zatem a (x) = a (x-1) + f (a (x-1)) gdzie f (x) jest liczbą znaków potrzebną do napisania x?
FireCubez
@FireCubez tak, jeśli a (0) = 0 if (x) to znaki spacji do zapisania cyfr x
Jonathan Allan

Odpowiedzi:

12

Perl 6 , 45 bajtów

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

Wypróbuj online!

Nie ma potrzeby modnego modulowania, gdy można bezpośrednio uzyskać nazwę cyfry! Anonimowy blok kodu, który zwraca n-tą wartość sekwencji, lub możesz przekazać w zakresie, aby uzyskać listę wartości

Wyjaśnienie:

{(                                     )[$_]}  # 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
Jo King
źródło
@JonathanAllan Ach, założyłem, że zezwoliłeś na nieskończoną sekwencję jako powrót, przepraszam. Naprawię to
Jo King,
Fajnie, to dobrze :)
Jonathan Allan
Ładny! »jest jeden bajt, prawda? Ponadto, [+]może być ładniejsza i wskazówkę, w jaki sposób ops binarne mogą stać reduktory ale sumtakże trzy bajty i zgodnie z resztą roztworu, który może nie być najkrótsza, ale na pewno jest najbardziej elegancki golf imo.
raiph
@raiph »ma dwa bajty, więc jest wymienny.
Jo King
Może to oszustwo, ale czy Rakudo nie obsługuje poprawnie kodu źródłowego Latin1? Jeśli tak, zwróć uwagę, że say '»'.encode('latin1').bytes wyświetla się 1. :)
raiph
8

JavaScript (ES6), 69 68 61 58 bajtów

Zwraca a(n) .

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

Wypróbuj online!

W jaki sposób?

Cyfra d jest konwertowana na liczbę n liter za pomocą:

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

Ponieważ liczba jest podzielona na znaki cyfrowe, możemy przetworzyć d×100+10 po prostu dodając 10 (jako konkatenację ciągu).

Arnauld
źródło
7

Stax , 14 13 bajtów

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

Uruchom i debuguj

Kluczową kwestią jest to, że cyfra dwymaga ((4 - 2 * d) // 3) % 3 + 3liter do literowania. (To podział na liczbę całkowitą w pythonie i moduł nieujemny w stylu python)

rekurencyjny
źródło
5

Pip , 21 bajtów

Lai+:$+4335443554@^Pi

nn

Wyjaśnienie

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
źródło
2
Przeczytałem to jako large constant to the power of pii byłem pod wielkim wrażeniem. (To wciąż imponujące, ale moja początkowa interpretacja była po prostu ... więcej)
Οurous
4

Wolfram Language (Mathematica) , 57 bajtów

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

Wypróbuj online!

Tr@StringLength@IntegerName@IntegerDigits@#&wyświetla cyfry #, konwertuje każdą z nich na angielską nazwę, liczy długość i sumuje wyniki. Wiele rzeczy przewija się przez listy, to bardzo ekscytujące. Następnie po prostu iteracyjnie stosujemy definicję.

TIO skarży się, że nie ma połączenia z Internetem, ale nie jestem pewien, dlaczego, ponieważ i tak wymyśla właściwą odpowiedź. Może sprawdza aktualizacje nazw liczb całkowitych?

za(n)za(0),za(1),,za(n)NestNestList

Misza Ławrow
źródło
4

Czysty , 82 bajty

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

Wypróbuj online!

Obrzydliwe
źródło
4

05AB1E , 15 14 bajtów

ÎFD•16\|/•sSèOO

Wypróbuj online!

Wyjaśnienie

Î                # 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
źródło
4

APL (Dyalog Unicode) , 29 28 bajtów

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

Wypróbuj online!

fa(janput)

Podziękowania dla chłopaków @The APL Orchard za pomoc w tym:

@ngn dla 2 bajtów; @ H.PWiz dla 3 4 bajtów.

Teraz używamy formuły @ recursive.

W jaki sposób:

{{⍵++/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é
źródło
3

Python 2 , 61 bajtów

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

Wypróbuj online!

Wykorzystuje mapowanie liczby rekurencyjnych .


Python 2 , 63 bajty

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

Wypróbuj online!

Wersja funkcji rekurencyjnej. Uruchomienie zajmuje wykładniczy czas, ponieważ ma dwa rekurencyjne wywołania do f(n-1).

xnor
źródło
Ładny! Jestem ciekawy, czy skrypt służący do wyszukiwania wyrażeń, o którym wspomniałeś wcześniej, znajduje to wyrażenie (a może nawet krótszy?)
Lynn
@ Lynn Uruchomiłem skrypt, ale nie znalazłem lepszego. 13 znaków to za dużo dla pełnego wyszukiwania i nie znalazłem nic co najwyżej 9 znaków. Kiedy odciąłem +3i ograniczyłem do operatorów arytmetycznych (bez bitów) i liczb <= 4, znalazłem to rozwiązanie, ale nic krótszego lub nawet tej samej długości, z wyjątkiem ekwiwalentów.
xnor
3

Python 2 , 71 bajtów

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

Wypróbuj online!

ovs
źródło
f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or kto ta sama liczba, ale unika tworzenia załączonej listy.
Jonathan Allan
Wygląda na to, że algorytm rekurencyjny z odpowiedzi Staxx zaoszczędziłby 2 bajty. Lubię to!
Jonathan Allan
3

MathGolf , 17 bajtów

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

Wypróbuj online!

To używa metody Arnaulda . Wysyła n-ty element sekwencji. Jeśli pusty ciąg znaków jest w porządku a(0), możemy usunąć 0\na początku.

Wyjaśnienie:

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
Jo King
źródło
3

Pyth , 21 bajtów

u+Gs@L+L3jC\᯻3jGTQ0

Wypróbuj online tutaj .

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
źródło
najprawdopodobniej nie ma ani jednego bajtu na stronie kodowej Pytha. (Myślę, że używa UTF-8, w którym to przypadku ma 3 bajty i j7163 3ma tę samą długość; ale tio.run mówi, że Pyth ma SBCS. Tajemniczy!)
Lynn
@ Lynn Masz całkowitą rację, zapomniałem o liczbie bajtów, mój zły. Zostawię obecny kod i zaktualizuję liczbę bajtów
Sok
2

Java (JDK) , 95 bajtów

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

Wypróbuj online!

Olivier Grégoire
źródło
1

Galaretka , 13 bajtów

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

Wypróbuj online!

0-indeksowane.

Pełny program; pobiera dane wejściowe z STDIN.

Erik the Outgolfer
źródło
1

Czerwony , 99 95 bajtów

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

Wypróbuj online!

Po prostu proste rozwiązanie.

Galen Iwanow
źródło
1

J , 37 bajtów

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

Wypróbuj online!

Wykorzystuje metodę Arnaulda

Wyjaśnienie:

Argumentem jest 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 Iwanow
źródło
1

Edytowane po 1 komentarzu.

Drukuje wszystkie warunki

Scala, 76 bajtów

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

Wypróbuj online!

Drukuje n- ty termin

Scala, 72 bajty

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

Scala, 69 bajtów

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

Scala, 67 bajtów

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

Scala, 67 bajtów

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

Wypróbuj online!

Dr Y Wit
źródło
1
Nie znam Scali, ale myślę, że nie jest to ani program, ani funkcja, ale raczej fragment kodu (tzn. Działa on na REPL po nzdefiniowaniu). Jeśli znasz Scalę, prawdopodobnie łatwo ją naprawić. Należy również pamiętać, że w pytaniu o Scali znajdują się wskazówki dotyczące gry w golfa, które mogą pomóc. Wreszcie miło jest opublikować link do tłumacza online, TIO ma Scalę i jest używany przez wielu członków PPCG.
Jonathan Allan
1
@JonathanAllan, dziękuję, to było bardzo pomocne.
Dr Y Wit