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


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.