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

@ 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.


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.


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.


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

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]

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.