디지털 셀룰러 오토마타


17

홀수 양의 정수 N과 10 진수 문자열 ( 0123456789) 을 취하는 프로그램 또는 함수를 작성하십시오 . 스트링은 10- 상태 1 차원 셀룰러 오토 마톤을 나타낸다 . 각 숫자는 하나의 셀을 차지하며 한 세대에서 다음 세대로의 업데이트 규칙은 모든 셀이 셀 중심의 모듈러스 10의 합에서 나온 숫자가된다는 것입니다.

첫 번째 셀과 마지막 셀은 이웃처럼 랩핑되므로 셀은 항상 N 셀을 중심으로 할 수 있습니다. N은 문자열의 길이보다 클 수 있습니다. 즉, 여러 번 감쌀 수 있으며 일부 숫자는 여러 번 합산됩니다.

예를 들어, N이 7이고 문자열이 038인 경우 셀을 합계로 시각화하여 038양방향으로 무한 반복 을 쓸 수 있습니다.

...038038038038038...

다음 0으로 바뀌는 숫자 0는 모듈로 10을 중심으로 한 7 자리수의 합입니다 .

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

이다 (0+3+8+0+3+8+0)%102.

마찬가지로 숫자 38변경 숫자는 각각 (3+8+0+3+8+0+3)%10= 5(8+0+3+8+0+3+8)%10= 로 정의됩니다 0.

따라서, 생성 후 038이고 250N이 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 문자열로 유지할 수 있습니다.
Calvin 's Hobbies

@ LegionMammal978 아니요. 원래 허용 할 수는 있었지만 이제는 문자열을 사용하는 기존 답변에 부당하게 영향을 미칩니다.
Calvin 's Hobbies

글쎄, 내 대답의 크기를 거의 두 배로 해주셔서 감사합니다 ...
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.


4

파이썬 3, 114 92 86 80 바이트

Sp3000 덕분에 6 바이트를, xnor 덕분에 6 바이트를 추가했습니다 !

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얻어 ND파라미터는 N 및 자리 문자열로 도전로 정의한다.

설명

파이썬 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

이것은 !다음과 같이 사용되는 infix 함수를 정의 합니다.

> "1234"!3
"7698"

설명

오른쪽에 우리는 모듈로 [div(1-n)2`mod`length x..]에서 시작하는 무한한 정수 목록입니다 (첫 번째 요소가 음이 아닌 것을 원하기 때문에 모듈러스를 취합니다). 이것은 CA 이웃의 시작 지수에 해당합니다. 올바른 길이의 목록을 얻기 위해 압축합니다 .(1-n)/2length(x)x

이 함수 <$>는의 접두사 버전이며 map왼쪽 인수는 오른쪽에서 왼쪽으로 읽는 함수 구성입니다. 따라서 위의 목록 (으로 추출 fst) 의 각 정수에 대해 많은 문자를 삭제합니다 cycle x(무한 수의 사본을 연결할 수 있음 x), n나머지 문자를 가져 와서 문자열로 변환 한 다음 read.pure, 로 문자열로 변환하고 show그 마지막 문자를 취하십시오. 이는 나머지 mod 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

인코딩이 UTF-8이 아니기 때문에 APL이 문자 당 1 바이트가 아닙니까? APL은 APL 코드 페이지를 사용합니다 .
mbomb007

@ mbomb007 NARS2000은 내가 아는 한 APL 코드 페이지를 지원하지 않으므로 ..프리미티브는 비표준이므로 "휴대용"이 아닙니다.
Oberon

Dyalog APL을 사용하는 것이 더 짧을까요?
mbomb007

1

옥타브, 64 바이트

@(s,n)["" mod(sum(bsxfun(@shift,s'-48,(1:n)-ceil(n/2))'),10)+48]

1

J, 41 바이트

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

내가 예상했던 것보다 더 길었다. 골프를 타야합니다.

위치에 대한 합계를 얻기 위해 값을 추가해야하는 위치 (mod 10)를 나타내는 행에 요소가있는 행렬을 생성합니다.

용법:

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

여기에서 온라인으로 사용해보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.