Bayangkan sebuah "kawat" yang memiliki n
spasi. Bayangkan lebih lanjut bahwa ada "elektron" di kawat itu. Elektron ini hanya hidup untuk satu unit waktu. Setiap ruang dalam kawat yang berdekatan dengan tepat satu elektron menjadi elektron. Dalam terminologi Game of Life, ini B1/S
.
Misalnya, ini adalah kawat dengan panjang 10, dengan periode 62.
Aturan
- Input,,
n
adalah bilangan bulat tunggal, positif. - Output harus berupa bilangan bulat tunggal yang menunjukkan periode panjang kawat n.
- Keadaan awal adalah elektron tunggal di salah satu ujung kawat.
- Periode tidak harus termasuk kondisi awal. Beberapa panjang tidak pernah kembali ke keadaan awal, tetapi semuanya bersifat periodik.
- Kawat statis (yaitu, satu tanpa elektron) memiliki periode 1.
- Kondisi batas tidak periodik. Artinya, kawat tidak toroidal dengan cara apa pun.
Uji kasus
Terima kasih khusus kepada orlp untuk membuat daftar ini. (Saya telah memverifikasi hingga n = 27.)
1 1
2 2
3 1
4 6
5 4
6 14
7 1
8 14
9 12
10 62
11 8
12 126
13 28
14 30
15 1
16 30
17 28
18 1022
19 24
20 126
21 124
22 4094
23 16
24 2046
25 252
26 1022
27 56
28 32766
29 60
30 62
31 1
32 62
33 60
34 8190
35 56
36 174762
37 2044
38 8190
39 48
40 2046
41 252
42 254
43 248
44 8190
45 8188
Anda dapat melihat kasus uji untuk n = 2 hingga 21 di sini dengan simulator Game-of-Life-esque saya: Variasi Kehidupan .
EDIT: urutan di sini telah diterbitkan sebagai A268754 !
code-golf
cellular-automata
El'endia Starman
sumber
sumber
2^n-1
, karena itulah jumlah kemungkinan status bukan nol dari "kawat"The period does not necessarily include the starting state. Some lengths never return to the starting state, but all of them are periodic.
Apakah kamu punya contoh?Jawaban:
Python 2,
14814287 byteMenggunakan algoritme deteksi siklus Brent , dan karenanya benar-benar berjalan cepat.
Saya juga menulis animasi dalam Python (keduanya 2 & 3 bekerja). Perlu
pyglet
dijalankan. Anda dapat melihat animasi dengan menjalankan:(Jangan ragu untuk mengunduh inti dan memeriksa kodenya sebelum menjalankan.) Anda dapat menekan tombol + dan - untuk menambah / mengurangi n yang sedang divisualisasikan.
Dan akhirnya, bagi mereka yang tertarik untuk mengeksplorasi urutan nomor ini lebih lanjut, ini adalah versi yang dapat dibaca (ini digunakan untuk menghasilkan kasus uji di atas):
sumber
Mathematica, 127 byte
Penjelasan
Aturan 18 :
Uji kasus
sumber
Python 2, 68 byte
Deteksi siklus bisa lebih baik, tetapi langkah berulang bagus.
Dengan merepresentasikan array sebagai angka biner
k
, pembaruan dapat dilakukan dengan mengambil XOR yangk
bergeser satu kiri dengan/2
dan yang kanan*2
, kemudian memotong menjadin
byte sebagai%2**n
.sumber
Python
32,134121118 bytePada dasarnya sama dengan jawaban Pyth saya , tetapi mengadaptasinya agak karena kurangnya fungsi built-in tertentu di Python.
Versi tidak disatukan:
sumber
Pyth,
3936 byteMenggunakan fungsi "titik tetap kumulatif" untuk beralih hingga sesaat sebelum konfigurasi berulang, dan mengembalikan semua konfigurasi menengah sebagai daftar daftar. Ini berfungsi karena aturan bersifat deterministik dan konfigurasi generasi berikutnya adalah fungsi dari konfigurasi saat ini. Ini berarti bahwa sekali konfigurasi yang sama muncul lagi automata telah menyelesaikan satu siklus.
Setelah mencapai itu (iterasi terakhir dari siklus), ia memanggil fungsi next-gen untuk terakhir kalinya pada elemen terakhir dari daftar "history", untuk mendapatkan konfigurasi berikutnya (yang merupakan konfigurasi awal dari sebuah siklus), dan temukan indeksnya dalam sejarah. Sekarang periode hanyalah panjang (1 + indeks akhir siklus) dikurangi indeks dimulainya siklus.
Dalam pseudocode pythonic:
Test suite membutuhkan terlalu banyak waktu sehingga server akan membunuhnya, jadi Anda harus menggunakan program reguler dan mengujinya satu per satu, atau menginstal Pyth (jika belum) dan menggunakan skrip untuk mengujinya.
sumber
Jelly,
191817 byteKode ini menghitung 2 n status pertama, jadi tidak terlalu cepat atau memori efisien ...
Cobalah online! atau verifikasi 16 kasus uji pertama .
Versi alternatif, 13 byte (tidak bersaing)
Versi Jelly yang mengunggah tantangan ini memiliki deteksi loop bawaan, memungkinkan solusi yang lebih pendek dan lebih efisien.
Ini menangani test case terakhir dengan mudah. Cobalah online!
Bagaimana itu bekerja
Perhatikan bahwa tautan helper diterapkan pada 2 n pada iterasi pertama, yang tidak menyandikan status yang valid. Namun, ((2 n ÷ 2) ^ (2 n × 2))% 2 n = (2 n - 1 + 2 n + 1 )% 2 n = 2 n - 1 , yang merupakan salah satu kondisi awal yang mungkin.
Karena kita mengulangi 2 n + 1 kali, kita dijamin akan menghadapi keadaan dua kali, membuat deteksi putaran berhasil.
sumber
CJam,
4134312725 byteTerima kasih kepada Dennis karena telah menghemat 3 byte. Meminjam ide dari jawaban Jeli menyimpan 4 lainnya.
Uji di sini.
Penjelasan
Saya mewakili kawat hanya sebagai bilangan bulat (yang bit menunjukkan posisi elektron) daripada menggunakan daftar bit yang sebenarnya. Status adalah pembaruan melalui perhitungan bitwise yang cukup sederhana.
Untuk menemukan periode, kami mengumpulkan semua hasil antara di tumpukan, menjalankan simulasi untuk langkah 2 n-1 +1, dan kemudian menentukan periode sebagai jumlah elemen sejak kemunculan terakhir dari keadaan akhir (ditambah 1).
Berikut ini rincian kode:
sumber
JavaScript (ES6) 99
104Uji
sumber
Haskell, 170 byte
x!p
memberikan elemen pada indeks p jika dalam batas, jika 0.n
menghitung langkah selanjutnya.g i
berikani
langkah th.c x
memberi titik, jika dimulai denganx
.f
membungkus semuanya.(Catatan: diposting dari ponsel yang memiliki penerjemah pelukan, yang tidak berfitur lengkap, jadi mungkin ada kesalahan ketik.)
sumber
MATL ,
38373635 byteIni menggunakan loop yang terus menghitung status baru sampai status baru sama dengan yang sebelumnya. Setiap negara adalah vektor nol dan satu. Vektor ini disimpan sebagai baris array 2D yang berkembang.
Perhitungan masing-masing negara baru dilakukan dengan menggabungkan keadaan saat ini dengan urutan
[1,0,1]
, hanya menjaga bagian tengah, dan pengaturan untuk0
setiap entri yang tidak1
.EDIT (13 Mei 2016) Kode di tautan berikut telah sedikit dimodifikasi sesuai dengan perubahan yang diperkenalkan dalam bahasa setelah jawaban ini ditulis
Cobalah online!
sumber
Perl 6, 81 byte
Mengembang dan sedikit berubah bentuk
Sedikit penjelasan:
[op]
mengurangi daftar menggunakan op. Misalnya[+] @list
akan dijumlahkan@list
R
adalah meta-op yang membalik argumen yang diberikan pada op. Misalnya1 R- 3
akan menghasilkan 2.sumber
C ++, 211 byte
Golf
Dengan spasi tambahan untuk keterbacaan
Praktik yang baik untuk bitet C ++; dan pembelajaran yang bagus tentang algoritma deteksi siklus Brent (seperti yang digunakan oleh @orlp)
sumber
Pyth, 95 byte
Anda dapat mencobanya di sini .
sumber
Pyth, 29 byte
Menggunakan algoritma
a(n+1) = ((a(n) << 1)^(a(n) >> 1)) % (2 ** N)
.sumber
Ruby, 72 byte
Fungsi anonim.
sumber