デジタルセルオートマトン


17

奇数の正の整数Nと10進数の文字列(0123456789)を取り込むプログラムまたは関数を作成します。文字列は、10状態の1次元セルオートマトンを表します。各桁は1つのセルを占有し、世代から世代への更新規則は、すべてのセルが、10を法とするセルを中心とするN個のセルの合計から生じる桁になることです。

最初と最後のセルは隣接セルのように折り返されるため、セルは常にN個のセルを中央に配置できます。Nは文字列の長さよりも大きい場合があることに注意してください。これは、Nが複数回折り返される可能性があり、それに応じていくつかの桁が複数回合計されることを意味します。

例として、Nが7で文字列がの038場合、合計するセルを視覚化するため038に、両方向に無限に繰り返すことができます

...038038038038038...

0変更される数字は、010を法としてanyを中心とした7桁の合計です。

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

これは(0+3+8+0+3+8+0)%10、です2

同様の数字38変化によって定義さに(3+8+0+3+8+0+3)%10= 5及び(8+0+3+8+0+3+8)%10= 0それぞれ。

したがって、後の世代038250Nが7のときです。

プログラムまたは関数は、次世代の入力数字列の数字列を印刷または返す必要があります。すなわち、各セルに更新ルールを1回適用し、出力を提供します。バイト単位の最短コードが優先されます。

テストケース

[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いいえ。元々許可することはできましたが、そうすると、文字列を使用する既存の回答に不当に影響することになります。
カルビンの趣味

まあ、私の答えのサイズをほぼ2倍にしてくれてありがとう
...-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

Mathematica、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バイト

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と数字の文字列として挑戦で定義されています。

説明

Python 3ではand、2つの文字列の間が後者になります。したがって、空の文字列となるため、D[i:]and ...すべての中心位置がD[i:]繰り返されると短絡します。(D*N)[(i-N//2)%len(D):][:N]数字列を何回も複製し、適切な場所でスライスして、正しい数字を中心とする部分文字列を提供します。9を法とする基数10の数字の合計が9を法とする数自体と同じであることを思い出してください。結果の数列をstr(int(...,10)%10)基数11として扱い、10を法とする剰余を取得してから、ストリング。最後a(N,D,i+1)に、次の中央位置に移動します。のため+、再帰が完了すると、結果の数字はすべてまとめて返されます。


3

Haskell、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)(最初の要素を非負にしたいので、モジュラスを取ります)。これらは、CA近傍の開始インデックスに対応しています。zipで圧縮します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コードページをサポートしていません。また、..プリミティブは非標準であるため、「ポータブル」ではありません。
オベロン

Dyalog APLを使用する方が短いでしょうか?
mbomb007


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.