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

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](как в моем предыдущем ответе)?
Эрик Outgolfer
@EriktheOutgolfer Я имею в виду (1), поскольку он должен вернуть первые n членов. То есть, варианты «вывести последовательность до, но не включая a (n)», «output 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также на три байта и в соответствии с остальной частью решения, которое может быть не самым коротким, но, несомненно, самым элегантным для гольфа.
Раиф
@raiph »- два байта, поэтому он взаимозаменяем.
Джо Кинг
Может быть, это обман, но Rakudo неправильно обрабатывает исходный код 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)модификация23)модификация3)+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 (как конкатенация строк).

Arnauld
источник
7

Stax , 14 13 байт

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

Запустите и отладьте его

Ключевым моментом здесь является то, что цифра dтребует ((4 - 2 * d) // 3) % 3 + 3букв для написания. (Это целочисленное деление Python и неотрицательный модуль в стиле Python)

рекурсивный
источник
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
DLosc
источник
2
Я прочитал это как large constant to the power of piи был монументально впечатлен. (Это все еще впечатляет, но моя первоначальная интерпретация была просто .. больше)
августа
4

Wolfram Language (Mathematica) , 57 байтов

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

Попробуйте онлайн!

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

TIO жалуется, что у него нет подключения к Интернету, но я не уверен, почему, потому что в любом случае он находит правильный ответ. Может быть, это проверка обновлений имен целых чисел?

a(N)a(0),a(1),...,a(N)NestNestList

Миша лавров
источник
4

05AB1E , 15 14 байтов

ÎFD•16\|/•sSèOO

Попробуйте онлайн!

объяснение

Î                # 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
источник
4

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

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

Попробуйте онлайн!

е(яNпUT)

Спасибо ребятам из The APL Orchard за помощь в этом:

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

Теперь, используя формулу @ recursive.

Как:

{{⍵++/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).

XNOR
источник
Ницца! Мне любопытно, если сценарий поиска выражений, который вы упомянули ранее, нашел это выражение (или, может быть, даже более короткое?)
Линн
@ Линн Я запустил скрипт, но не нашел лучшего. 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
Sok
источник
очень вероятно, что в кодовой странице Pyth нет ни одного байта. (Я думаю, что он использует UTF-8, в этом случае он имеет 3 байта и j7163 3имеет одинаковую длину; но tio.run говорит, что у Pyth есть SBCS. Таинственный!)
Линн
@ Линн Вы абсолютно правы, я забыл о количестве байтов, мой плохой. Я оставлю код как есть и обновлю счетчик байтов
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

Отредактировано после 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)

Скала, 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, спасибо, это было очень полезно.
Доктор У Вит