Cyfrowe automaty komórkowe

17

Napisz program lub funkcję, która przyjmuje nieparzystą dodatnią liczbę całkowitą N i ciąg cyfr dziesiętnych ( 0123456789). Ciąg reprezentuje dziesięciostanowy jednowymiarowy automat komórkowy . Każda cyfra zajmuje jedną komórkę, a reguła aktualizacji z jednej generacji do następnej mówi, że każda komórka staje się cyfrą wynikającą z sumy komórek N wyśrodkowanych na komórce, modulo 10.

Pierwsza i ostatnia komórka otaczają się, jakby były sąsiadami, więc komórki zawsze mogą mieć na środku komórki N. Zauważ, że N może być większy niż długość łańcucha, co oznacza, że ​​może się owijać wiele razy, a niektóre cyfry będą odpowiednio sumy wiele razy.

Na przykład, jeśli N to 7, a ciąg to 038, aby wizualizować komórki do zsumowania, możemy pisać 038powtarzając nieskończenie w obu kierunkach

...038038038038038...

to cyfra, na którą się 0zmieni, jest sumą 7 cyfr wyśrodkowanych wokół dowolnego 0, modulo 10:

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

To jest to (0+3+8+0+3+8+0)%10, co jest2 .

Podobnie cyfry 3i 8zamień na są zdefiniowane odpowiednio przez (3+8+0+3+8+0+3)%10= 5i (8+0+3+8+0+3+8)%10= 0.

Zatem generacja po 038następuje, 250gdy N ma 7.

Twój program lub funkcja musi wydrukować lub zwrócić ciąg cyfr następnej generacji ciągu cyfr wejściowych. tj. zastosuj regułę aktualizacji raz do każdej komórki i podaj wynik. Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

[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
Hobby Calvina
źródło
@ LegionMammal978 Pozwala zachować go jako ciąg.
Calvin's Hobbies
@ LegionMammal978 Nie. Przyznaję, że mogłem początkowo na to zezwolić, ale zrobienie tego teraz wpłynęłoby niesprawiedliwie na istniejące odpowiedzi, które używają ciągów znaków.
Calvin's Hobbies
Dzięki za prawie dwukrotne zwiększenie mojej odpowiedzi ...
LegionMammal978,

Odpowiedzi:

10

CJam, 21 bajtów

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

Sprawdź to tutaj.

Wyjaśnienie

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.
Martin Ender
źródło
5

Mathematica, 85 bajtów

""<>ToString/@CellularAutomaton[{Tr@#~Mod~10&,{},#/2-1/2},FromDigits/@Characters@#2]&
LegionMammal978
źródło
Czy możesz użyć .5zamiast 1/2?
mbomb007,
@ mbomb007 Nie, musi to być liczba całkowita.
LegionMammal978,
4

Python 3, 114 92 86 80 bajtów

Odebrał 6 bajtów dzięki Sp3000 i kolejne 6 bajtów dzięki 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)

Definiuje nazwaną funkcję, aktóra przyjmuje Ni Djako parametry ciąg N i cyfry zdefiniowane w wyzwaniu.

Wyjaśnienie

W Pythonie 3 andmiędzy dwoma łańcuchami będzie ten drugi. Stąd D[i:]and ...zwarcia, gdy wszystkie pozycje środkowe zostaną iterowane, ponieważ D[i:]będzie to pusty ciąg, a zatem fałsz. (D*N)[(i-N//2)%len(D):][:N]duplikuje ciąg cyfr kilka razy, a następnie kroi go w odpowiednie miejsca, aby otrzymać podłańcuch z prawidłową cyfrą jako środkiem. Przypomnijmy na chwilę, że suma cyfr modulo liczby podstawowej 10 jest taka sama, jak sama liczba modulo 9. str(int(...,10)%10)traktuje wynikowy ciąg liczbowy tak, jakby to była baza 11 i otrzymuje resztę modulo 10, a następnie konwertuje z powrotem na strunowy. Wreszcie a(N,D,i+1)przechodzi do następnej pozycji środkowej. Ze względu na to +, że po zakończeniu rekurencji wszystkie wynikowe cyfry są łączone w całość i zwracane.

El'endia Starman
źródło
3

Haskell, 92 bajty

W Haskell konwersja sznurków jest naprawdę droga ...

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

Definiuje to funkcję infix !, używaną w następujący sposób:

> "1234"!3
"7698"

Wyjaśnienie

Po prawej stronie mamy [div(1-n)2`mod`length x..], która jest nieskończoną listą liczb całkowitych zaczynających się od (1-n)/2modulo length(x)(bierzemy moduł, ponieważ chcemy, aby pierwszy element był nieujemny). Odpowiadają one wskaźnikom początkowym dzielnic CA. Zapinamy na zamekx aby uzyskać listę o właściwej długości.

Funkcja <$>jest wersją niepoprawną map, a jej lewy argument to skład funkcji odczytywany od prawej do lewej. Tak więc dla każdej liczby całkowitej z powyższej listy (wyodrębnionej za pomocą fst) upuszczamy tyle znaków z cycle x(co stanowi połączenie nieskończenie wielu kopii x), pobieramy nznaki z reszty, konwertujemy je na ciągi, a następnie liczby całkowite z read.pure, bierzmy ich sumę, zamień to na string za pomocą showi weź ostatni znak tego, który odpowiada reszcie mod 10.

Zgarb
źródło
2

NARS2000 APL, 37 znaków (72 bajty)

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

Wyjaśnienie:

  ⎕←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
Oberon
źródło
Czy APL nie ma jednego bajtu na znak, ponieważ kodowanie nie jest UTF-8? APL używa strony kodowej APL .
mbomb007,
@ mbomb007 NARS2000 nie obsługuje strony kodowej APL, o ile mi wiadomo, a ..prymityw jest niestandardowy i dlatego nie jest „przenośny”.
Oberon,
Czy użycie Dyalog APL może być krótsze?
mbomb007,
1

Oktawa, 64 bajty

@(s,n)["" mod(sum(bsxfun(@shift,s'-48,(1:n)-ceil(n/2))'),10)+48]
alephalpha
źródło
1

J, 41 bajtów

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

Okazało się dłużej niż się spodziewałem. Powinien być golfowy.

Generujemy macierz z elementami w rzędzie pokazującymi pozycje, których wartości należy dodać (mod 10), aby uzyskać sumę dla pozycji.

Stosowanie:

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

Wypróbuj online tutaj.

randomra
źródło