Цифрові стільникові автомати


17

Напишіть програму або функцію, яка містить непарне додатне ціле число N та рядок десяткових цифр ( 0123456789). Рядок являє собою десятидержавний одновимірний стільниковий автомат . Кожна цифра займає одну клітинку, і правило оновлення від одного покоління до наступного полягає в тому, що кожна комірка стає цифрою, що виникає в результаті суми N комірок, зосереджених на комірці, модуль 10.

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

Наприклад, якщо N дорівнює 7, а рядок - 038для візуалізації комірок підсумовувати, ми можемо записувати 038повторення нескінченно в обох напрямках

...038038038038038...

то цифра, в яку 0буде змінюватися воля, - це сума 7 цифр, орієнтованих навколо будь-якого 0, за модулем 10:

...038038038038038...
      ^_____^
         |
    sum all these

Це (0+3+8+0+3+8+0)%10, що є 2.

Аналогічно цифри 3і 8зміни на визначаються відповідно (3+8+0+3+8+0+3)%10= 5і (8+0+3+8+0+3+8)%10= 0.

Таким чином, покоління після 038є, 250коли N дорівнює 7.

Вашій програмі або функції потрібно надрукувати або повернути цифровий рядок наступного наступного покоління вхідного цифрового рядка. тобто застосувати правило оновлення один раз до кожної комірки і дати вихід. Виграє найкоротший код у байтах.

Випробування

[digit string] -> [N = 1], [N = 3], [N = 5], [N = 7], [N = 9], [N = 43]
0 -> 0, 0, 0, 0, 0, 0
1 -> 1, 3, 5, 7, 9, 3
2 -> 2, 6, 0, 4, 8, 6
3 -> 3, 9, 5, 1, 7, 9
4 -> 4, 2, 0, 8, 6, 2
5 -> 5, 5, 5, 5, 5, 5
6 -> 6, 8, 0, 2, 4, 8
7 -> 7, 1, 5, 9, 3, 1
8 -> 8, 4, 0, 6, 2, 4
9 -> 9, 7, 5, 3, 1, 7
00 -> 00, 00, 00, 00, 00, 00
07 -> 07, 47, 41, 81, 85, 47
10 -> 10, 12, 32, 34, 54, 12
11 -> 11, 33, 55, 77, 99, 33
12 -> 12, 54, 78, 10, 34, 54
34 -> 34, 10, 78, 54, 12, 10
66 -> 66, 88, 00, 22, 44, 88
80 -> 80, 86, 46, 42, 02, 86
038 -> 038, 111, 294, 250, 333, 472
101 -> 101, 222, 343, 545, 666, 989
987 -> 987, 444, 901, 765, 222, 543
1234 -> 1234, 7698, 3412, 9876, 1234, 7698
26697 -> 26697, 54128, 00000, 56982, 84413, 54128
001002 -> 001002, 211122, 331332, 335334, 455544, 113112
129577020 -> 129577020, 326194923, 474081605, 961120291, 333333333, 183342413
6023845292173530 -> 6023845292173530, 6853571632015189, 1197228291289874, 9238433109901549, 0110956118726779, 1982123699138828

@ LegionMammal978 Дозволяє зберігати його як рядок.
— Захоплення Кальвіна

@ LegionMammal978 Ні. Я визнаю, я міг би це дозволити спочатку, але робити це зараз би несправедливо вплинуло на існуючі відповіді, що використовують рядки.
— Захоплення Кальвіна

Ну, дякую за те, що майже подвоївся розмір моєї відповіді ...
— LegionMammal978

Відповіді:



10

CJam, 21 байт

l~_,\2/f-l:~fm>:.+Af%

Тестуйте це тут.

Пояснення

l~   e# Read and evaluate N.
_,   e# Duplicate and turn into range [0 1 ... N-1]
\2/  e# Swap with other copy and (integer) divide by 2.
f-   e# Subtract this from each element in the range to get
     e# [-(N-1)/2 ... -1 0 1 ... (N-1)/2]
l:~  e# Read string and evaluate each digit separately.
fm>  e# Make one copy of the result for each element i in the range, shifting the array
     e# i cells to the right, cyclically.
:.+  e# Sum the columns of the resulting matrix.
Af%  e# Take each of those sums modulo 10.

5

Математика, 85 байт

""<>ToString/@CellularAutomaton[{Tr@#~Mod~10&,{},#/2-1/2},FromDigits/@Characters@#2]&

Можна використовувати .5замість 1/2?
— mbomb007

@ mbomb007 Ні, це повинно бути цілим числом.
— LegionMammal978

4

Python 3, 114 92 86 80 байт

Набрав 6 байт завдяки Sp3000 та ще 6 байт завдяки xnor !

a=lambda N,D,i=0:D[i:]and str(int((D*N)[(i-N//2)%len(D):][:N],11)%10)+a(N,D,i+1)

Визначає іменовану функцію, aяка приймає Nі Dяк параметри - N та цифру рядка, визначені в виклику.

Пояснення

У Python 3 andміж двома рядками в кінцевому підсумку буде остання. Отже, D[i:]and ...коротке замикання після повторення всіх центральних положень D[i:]буде порожнім рядком і, отже, помилковим. (D*N)[(i-N//2)%len(D):][:N]дублює цифровий рядок купу разів, а потім нарізає його в потрібних місцях, щоб дати підрядку, яка має правильну цифру як центр. Нагадуємо на мить, що сума цифр базового числа 10 за модулем 9 є такою ж, як і число самого модуля 9. str(int(...,10)%10)трактує отриманий числовий рядок так, як якщо б воно було базовим 11, і отримує залишок модуля 10, а потім перетворюється назад у рядок. Нарешті, a(N,D,i+1)переходить до наступного центрального положення. Через те +, що після проведення рекурсії всі отримані цифри збираються разом і повертаються.


3

Хаскелл, 92 байти

Перетворення рядків в Haskell дійсно дороге ...

x!n=last.show.sum.map(read.pure).take n.(`drop`cycle x).fst<$>zip[div(1-n)2`mod`length x..]x

Це визначає функцію інфіксації !, яка використовується наступним чином:

> "1234"!3
"7698"

Пояснення

Праворуч у нас [div(1-n)2`mod`length x..]є лише нескінченний список цілих чисел, починаючи з (1-n)/2модуля length(x)(ми беремо модуль, оскільки хочемо, щоб перший елемент був невід’ємним). Вони відповідають початковим показникам мікрорайонів ЦА. Ми застібруємо його xлише для отримання списку правильної довжини.

Функція <$>є інфіксованою версією map, а її лівий аргумент - композиція функції, що читається справа наліво. Таким чином, для кожного цілого числа у наведеному вище списку (витягнутий з fst) ми видаляємо, що багато символів з cycle x(що є конкатенацією нескінченних копій x), беруть nсимволи з залишку, перетворюють їх у рядки, а потім цілі числа read.pure, беруть їх суму, перетворіть це в рядок з showі візьміть останній символ того, що відповідає залишковому модулю 10.


2

NARS2000 APL, 37 символів (72 байти)

⎕←10⊥10∣+⌿⊃({⍵..-⍵}⌊⎕÷2)∘.⌽⊂49-⍨⎕AV⍳⍞

Пояснення:

  ⎕←10⊥10∣+⌿⊃({⍵..-⍵}⌊⎕÷2)∘.⌽⊂49-⍨⎕AV⍳⍞
⍝ ⎕←                                    output
⍝   10⊥                                 the base-10 digits in
⍝      10∣                              the modulo-10
⍝         +⌿                            column-wise sum of
⍝           ⊃                           the matrix version of
⍝                         ∘.⌽           the outer-product rotation of
⍝                            ⊂            the scalar version of
⍝                                 ⎕AV⍳    the index in the atomic vector of
⍝                                     ⍞   an input string
⍝                             49-⍨        minus 49 ('0' + 1)
⍝                                       by
⍝             {⍵..-⍵}                     the range ⍵ to -⍵, where ⍵ is
⍝                    ⌊                    the floor of
⍝                     ⎕                   an input integer
⍝                      ÷2                 divided by 2

Чи не APL один байт на символ, оскільки кодування не UTF-8? APL використовує кодову сторінку APL .
— mbomb007

@ mbomb007 NARS2000 не підтримує кодову сторінку APL, наскільки я знаю, і ..примітив нестандартний і, таким чином, не є "портативним".
— Оберон

Можливо, буде коротше використовувати Dyalog APL?
— mbomb007


1

J, 41 байт

"."0@]{~(1":10|+/@:)#@]|-:@<:@[-~(+/&i.#)

Вийшло довше, ніж я очікував. Повинно бути гофрованим.

Ми формуємо матрицю з елементами в рядку, що показує позиції, значення яких слід додати (мод 10), щоб отримати суму за позицію.

Використання:

   7 ("."0@]{~(1":10|+/@:)#@]|-:@<:@[-~(+/&i.#)) '038'
250

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

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