Послідовність написаних цифр


17

Ось досить тривіальна послідовність, якої немає в Інтернет-енциклопедії цілих послідовностей .

Почніть з порожньої послідовності, а потім визначте кожен термін як кількість символів, необхідних для виписання англійською мовою, усіх цифр послідовності, поки що без пробілів. *

Для довідки кількість символів усіх (базових десяти) цифр англійською мовою:

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

(Що є початком як для A52360, так і для A5589 .)

Це робить перший запис a(0)=0 оскільки в порожній послідовності є нульові цифри.

Це робить другий запис a(1)=4 оскільки для запису "нуля" потрібно чотири символи - єдина присутнім цифра поки що.

Це робить третій запис a(2)=8 оскільки для написання "чотири" потрібно всього чотири символи на загальну вісім, щоб написати "zerofour".

Це робить четвертий запис a(3)=13 оскільки для написання "zerofoureight" потрібно ще п'ять символів "восьмерка", в цілому тринадцять.

Це робить п'ятий запис a(4)=21 оскільки потрібно ще вісім символів, щоб написати "onethree", в цілому двадцять один, щоб написати "zerofoureightonethree".

...і так далі. Ось перші 100 записів:

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

* Ми могли б визначити це для інших мов та / або інших баз або з пробілами, звичайно

Змагання

З урахуванням n виводу в якомога менше байтах коду, будь-який з:

  • Перші n доданків послідовності (повинні працювати для невід’ємних цілих чисел)
  • Значення a(n) (повинен працювати для невід'ємних цілих чисел)
  • n - й член послідовності (повинен працювати для позитивних цілих чисел - тобто значення ( п - 1 ) )a(n1)

Це тому найкоротша відповідь у байтах виграє для кожної мови, а найкоротша відповідь у байтах - виграє. Не дозволяйте гольф-мовам не заважати вам вводити свою улюблену мову, будь то практична чи езотерична!


Під першим варіантом ви маєте на увазі, що 1) 1повинен виводити [0]і 0повинен виводити []або 2) 0повинен виводити [0](як у моїй попередній відповіді)?
Ерік Атголфер

@EriktheOutgolfer Я маю на увазі (1), оскільки він повинен повернути перші n доданків. Тобто опціями є "вивести послідовність до, але не включаючи (n)", "вихід a (n)" або "output a (n-1)".
Джонатан Аллан

Отже, a (x) = a (x-1) + f (a (x-1)), де f (x) - кількість символів, необхідних для написання x?
FireCubez

@FireCubez так, якщо a (0) = 0 і f (x) - це не пробільні символи, щоб записати цифри x
Джонатан Аллан

Відповіді:


12

Perl 6 , 45 байт

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

Спробуйте в Інтернеті!

Немає необхідності в фантазійному модулюванні, коли ви можете отримати ім’я цифри безпосередньо! Блок анонімного коду, який повертає 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 Ах, я припускав, що ти дозволив нескінченну послідовність як повернення, вибач. Я це виправлю
Джо Кінг,

Приємно, це добре :)
Джонатан Аллан

Приємно! »це один байт, правда? Крім того, [+]може бути кутер і натяк на те, як бінарні операційні системи можуть стати редукторами, але sumце також три байти і відповідає решті рішення, яке може бути не найкоротшим, але, безумовно, є найелегантнішим гольфом imo.
Райф

@raiph »- два байти, тож це взаємозамінна.
Джо Кінг

Можливо, це обман, але чи правильно Ракудо не обробляє вихідний код Latin1? Якщо так, зверніть увагу, що say '»'.encode('latin1').bytes відображається 1. :)
raiph

8

JavaScript (ES6), 69 68 61 58 байт

Повертає a(n) .

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

Спробуйте в Інтернеті!

Як?

Цифра d перетворюється в число n літер за допомогою:

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

Оскільки число розбито на знакові символи, ми можемо обробити d×100+10 , просто додавши10 (як об'єднання рядків).



5

Піп , 21 байт

Lai+:$+4335443554@^Pi

nn

Пояснення

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
Я прочитав це як large constant to the power of piі був монументально вражений. (Це все ще вражає, але моя початкова інтерпретація була просто .. більше)
Οurous

4

Мова Вольфрама (Mathematica) , 57 байт

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

Спробуйте в Інтернеті!

Tr@StringLength@IntegerName@IntegerDigits@#& перелічує цифри # , перетворює кожну з них на англійську назву, підраховує довжину та підсумовує результати. Дуже багато речей перелічено на списки, це дуже захоплююче. Тоді ми просто ітеративно застосовуємо визначення.

TIO скаржиться, що у нього немає підключення до Інтернету, але я не впевнений, чому, оскільки все-таки з'ясовує правильну відповідь. Може бути, це перевірка на оновлення імен цілих чисел?

a(n)a(0),a(1),,a(n)NestNestList




4

APL (Dyalog Unicode) , 29 28 байт

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

Спробуйте в Інтернеті!

f(iнpут)

Дякую хлопцям @The APL Orchard за допомогу в цьому:

@ngn на 2 байти; @ H.PWiz для 3 4 байти.

Тепер використовуємо формулу @ рекурсивний.

Як:

{{⍵++/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 байт

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

Спробуйте в Інтернеті!

Використовує рекурсивне відображення числа цифр .


Python 2 , 63 байти

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

Спробуйте в Інтернеті!

Рекурсивна версія функції. Для запуску потрібен експоненційний час, оскільки він має два рекурсивні дзвінки f(n-1).


Приємно! Мені цікаво, якщо скрипт пошуку виразів, який ви згадали, використовуючи до цього, знайде цей вираз (чи, можливо, ще коротший?)
Лінн

@Lynn Я запустив сценарій, але не знайшов кращого. 13 символів - це занадто багато для повного пошуку, і не знайшли нічого, щонайбільше 9 символів. Коли я відрізав +3та обмежив це арифметичними операторами (без побітових розрядів) та чисел <= 4, я знайшов це рішення, але нічого коротшого або навіть такої ж довжини, крім еквівалентів.
xnor

3

Python 2 , 71 байт

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

Спробуйте в Інтернеті!


f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or kце той самий підрахунок, але уникає виходу вкладеного списку.
Джонатан Аллан

Схоже, алгоритм рекурсивної відповіді на їх staxx відповів би на 2 байти. Мені це подобається, хоча!
Джонатан Аллан

3

MathGolf , 17 байт

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

Спробуйте в Інтернеті!

Для цього використовується метод Арнальда . Виводить n-й елемент послідовності. Якщо порожній рядок буде добре a(0), тоді ми можемо видалити0\ на початку.

Пояснення:

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 байт

u+Gs@L+L3jC\᯻3jGTQ0

Спробуйте його онлайн тут .

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

дуже ймовірно, що це не один байт на сторінці коду Pyth. (Я думаю, він використовує UTF-8; в цьому випадку це 3 байти і j7163 3має однакову довжину; але tio.run каже, що Pyth має SBCS. Таємничий!)
Lynn

@Lynn Ти абсолютно прав, я забув про кількість байтів, моє погано. Я залишу код, як зараз, і оновлю кількість байтів
Sok






1

J , 37 байт

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

Спробуйте в Інтернеті!

Використовує метод Арнальда

Пояснення:

Аргумент є 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

Відредаговано після першого коментаря.

Друкує всі умови

Скала, 76 байт

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

Спробуйте в Інтернеті!

Друкує n- й термін

Scala, 72 байти

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

Scala, 69 байт

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

Скала, 67 байт

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

Скала, 67 байт

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

Спробуйте в Інтернеті!


1
Я не знаю Scala, але я думаю, що це не є ні програмою, ні функцією, а скоріше фрагментом (тобто він працює на REPL, коли nбуде визначено). Якщо ви знаєте Scala, це, ймовірно, легко виправити. Також зауважте, що у Scala питання є поради щодо гольфу, які можуть допомогти. Нарешті, приємно розмістити посилання на онлайн-перекладача, TIO має Scala і використовується багатьма членами PPCG.
Джонатан Аллан

1
@JonathanAllan, дякую, це було дуже корисно.
Доктор Y Віт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.