Cellata Automata benar-benar menarik. Yang biasanya dibicarakan adalah yang biner, yaitu yang diwakili oleh angka. Namun, menurut saya, itu sudah dilakukan sampai mati. CA ternary lebih menarik, tetapi kita memiliki semua ASCII untuk dipertimbangkan! Betapa menyenangkannya itu!
Alih-alih memutuskan aturan untuk setiap karakter, saya akan menggunakan aturan memutuskan sederhana yang akan saya bicarakan segera. Untuk memutuskan generasi berikutnya, kita melihat tiga sel "atas", mirip seperti automata seluler. Perhatikan sebuah contoh:
QWERTY
X Y Z
"Atas" Y
adalah WER
, menjadi sel-sel di atas-dan-kanan, di atas, dan di atas-dan kiri. Y akan menjadi hasil dari fungsi yang akan saya definisikan, yang merupakan fungsi pada string tiga-char. Bagian "atas" X
adalah QW
, atau ruang yang mengisi sel yang tidak ada / hilang .
Sekarang, untuk fungsi yang menyenangkan ! Saya menyebut urutan ini urutan XOROR karena suatu alasan. Biarkan A
menjadi charcode sel kiri atas, B
menjadi charcode sel di atas, dan C
menjadi charcode sel kanan atas. Lalu, sel yang dihasilkan adalah karakter yang karakternya adalah (A XOR B) OR C
, yaitu (A^B)|C
,. (Jika nilai yang dihasilkan lebih besar dari 126, maka diatur ke (CHARCODE % 127) + 32
. Tidak ada yang dilakukan jika nilai kurang dari 32.) Berikut adalah contoh dari seed Hello, World!
:
S: Hello, World!
0: mmmo/c_ z}~)e
m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
etc.
1: mmo/c_< +wl
2: mo/c_<c< + |;
3: o/c_<c ?+ g
4: oc_<c c??4+gg
5: 0_<c c 4+ o
6: _<c ccc4??ooo
7: c ccc4 ?o o
8: ccccc4w? pooo
9: cccc4w h o
A: ccc4wc hh ooo
B: cc4wc4kh ooo
C: c4wc4 #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo
F: w4wwc4oo oo o
G: wwwc4 oo oo
H: wwc4w4 oo oo
I: w4wwc4oooo oo
J: wwwc4 oo oo
K: wwc4w4oo oo o
L: wc4wwo oo oo
M: w4wwo8ooo oo
N: wwwo8 o oo o
O: wwo8w8oooo oo
Dan kita bisa melanjutkan untuk sementara waktu selanjutnya. Modifikasi string ini disebut urutan XOROR.
Tujuan Anda menulis program atau fungsi yang melakukan salah satu dari tugas-tugas berikut:
- Diberikan string
s
dan angkan >= 0
, mengeluarkann
string th pada urutan XOROR dengan seeds
, dengann = 0
menjadi transformasi pertama string. - Diberikan string
s
, output (untuk program) atau menghasilkan (untuk fungsi / generator) aliran tak terbatas dari urutan XOROR dengan seeds
. Anda dapat memilih untuk berhenti jika urutannya berulang, tetapi ini tidak perlu.
s
akan selalu hanya terdiri dari karakter ASCII yang dapat dicetak, dari ruang hingga tilde plus tab (tidak ada baris baru.)
Ini adalah kode-golf , sehingga program terpendek dalam byte menang.
sumber
o
itu membuatnya terlihat seperti terburu-buru zerg .127%127+32==32
.n=0
bukan string asli?(d^!)|(space)
. Sedangkan untuk Anda pertanyaan kedua, Anda tampil(CHAR%127)+32
setelah XOROR dilakukan.Jawaban:
MATL ,
3331 byteIni berfungsi di rilis 13.1.0 dari bahasa / kompiler, yang mendahului tantangan.
Input pertama adalah nomor, yang kedua adalah string.
Cobalah online!
sumber
Mathematica, 133 byte
Akan lebih baik untuk membuat
CellularAutomaton[]
solusi bekerja, tetapi saya terus berdiskusi. Siapa saja?Sunting: beberapa gambar cantik (klik untuk memperbesar)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:sumber
CellularAutomaton
fungsi pembaruan Anda saja? (Angka aturan aktual dengan 127 negara bagian yang valid akan menjadi gila.)Jawa,
193185 byteKarena jawa
-8 byte dengan beralih ke perulangan daripada berulang untuk menjadikannya fungsi anonim
Mengembalikan iterasi ke-XOR pada tanggal s.
Versi yang dapat dibaca:
Cukup banyak implementasi spesifikasi secara literal, dengan loop rekursif untuk menerapkan operasi n kali. Namun, beberapa byte telah disimpan, dengan pengamatan saya bahwa klausa CHARCODE> 126 hanya akan terjadi dengan CHARCODE == 127, yang menghasilkan penghematan
SPACE
alih-alihDEL
.Saya menjalankan kode saya pada beberapa string yang dipilih secara sewenang-wenang dan menemukan siklus yang luar biasa ini:
sumber
ok
!CJam, 38 byte
Uji di sini.
Penjelasan
sumber
lri){2S*\*3ew{)\:^|}%127c' er}*
karena operasi pra-modulo karakter tidak pernah melebihi 127Haskell, 123 byte
Ini mengembalikan aliran infinite urutan XOROR. Contoh penggunaan (cetak 5 elemen pertama benih
"Hello, World!"
):Bagaimana itu bekerja:
sumber
PHP, 186 byte (dengan n) | 177 byte (tak terbatas)
Ternyata pencetakan tanpa batas lebih pendek ...
Tidak digabungkan dengan n:
Tak Terbatas tak berbatu:
sumber
function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}
panjangnya 141 byte (-36 byte).C ++
Nth-Sequence (212)
Tidak Golf
Nth-Sequence menggunakan sintaks pointer daripada sintaks array untuk membuat ini semakin membingungkan: (231)
Tidak Golf
Fungsi Debug (Untuk Bersenang-senang)
sumber
JAVA 240/280 Bytes
Versi Java yang populer pada saat saya menulis ini diklaim sebagai 185 byte, tetapi ada dua poin fudge yang signifikan. Pertama, pengukuran mungkin hanya untuk fungsi, bukan untuk sumber kerja yang lengkap. Mungkin bukan masalah seperti itu. Kedua, ia menggunakan BiFunction tanpa impor atau nama yang sepenuhnya memenuhi syarat. Menambahkan bit yang diperlukan untuk menjalankannya apa adanya (lalu meminimalkannya, secara wajar) membawanya ke 348 byte. Menambahkan hanya nama yang berkualifikasi penuh dari kelas BiFunction yang membawanya ke 248 byte.
Sebaliknya, saya percaya saya adalah 240 byte ketika bermain dengan aturan yang sama (tidak ada kelas, tidak ada output aktual, hanya daging). Kelas runnable penuh adalah 280 byte, dan terlihat seperti ini (tidak ditambang):
Atau, diperkecil:
sumber
Perl, 47 byte
Termasuk +2 untuk
-lp
Jalankan dengan input pada STDIN, mis
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Ini berfungsi sebagaimana adanya, tetapi ganti
\x7f
dengan nilai biner yang sesuai untuk mendapatkan skor yang diberikansumber
Swift: 273 Karakter
Wow, Swift lebih buruk dari Jawa! (Semua API dengan nama panjang!: P)
Tidak Disatukan:
Terima kasih kepada @ CAD97 untuk menyebutkan bahwa (A ^ B) | C hanya bisa lebih besar dari 126 ketika 127.
Saya juga menyadari bahwa Anda tidak perlu tanda kurung di sekitar A ^ B | C karena XORing dilakukan sebelum ORing, sehingga menyelamatkan saya beberapa byte.
sumber