pengantar
Dalam tantangan ini, kami akan mensimulasikan otomat seluler probabilistik tertentu menggunakan nomor pseudorandom yang sangat buruk. Otomat seluler didefinisikan pada string biner dengan aturan lokal berikut. Misalkan tetangga kiri sel dan sel itu sendiri memiliki status a
dan b
.
- Jika
min(a,b) == 0
, maka keadaan barub
adalahmax(a,b)
. - Jika
min(a,b) == 1
, maka keadaan barub
dipilih secara acak{0,1}
.
Gambar berikut menunjukkan satu kemungkinan evolusi 10 langkah dari satu 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Perhatikan bagaimana dua 1
s yang berdekatan terkadang berevolusi menjadi 1
, dan terkadang ke 0
, dan bit-bit perbatasan selalu 1
s. Tugas Anda adalah menghasilkan evolusi otomat seluler dari bentuk ini.
Input
Input Anda adalah bilangan bulat positif n
, menunjukkan jumlah baris yang akan ditampilkan, dan daftar bit L
yang tidak kosong , yang kami gunakan sebagai sumber keacakan.
Keluaran
Output Anda adalah daftar daftar atau array 2D bit, menggambarkan evolusi tunggal 1
untuk n
langkah waktu, seperti pada gambar di atas. Anda dapat mengisi output dengan 0
s untuk mendapatkan baris dengan panjang yang sama, jika diinginkan, tetapi tidak boleh ada leading 0
.
Pilihan acak dalam otomat seluler harus diambil dari daftar L
, melompat kembali ke awal ketika habis. Secara lebih eksplisit, jika output dilintasi satu baris pada waktu membentuk atas ke bawah, kiri ke kanan, maka pilihan acak berturut-turut akan membentuk daftar L
diulang sebanyak yang diperlukan.
Contoh
Misalkan inputnya adalah n = 7
dan L = [0,1,0]
. Kemudian otomat seluler berkembang sebagai berikut selama 7 langkah, di mana kami telah menempatkan v
hak di atas setiap pilihan acak:
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
Jika kita membaca semua bit yang ditandai dengan v
, kita dapatkan 01001001
, yang L
diulang 2,66 kali. Bit acak berikutnya adalah 0
.
Aturan dan Penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan. Format input dan output yang tepat tidak penting (sesuai alasan).
Uji Kasus
Versi deterministik, setiap bit acak adalah 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Setiap bit acak adalah 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Versi pseudorandom:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
sumber
min(a,b)
dengana+b>1
danmax(a,b)
dengana+b
? Saya menyadari Anda mungkin harus melakukan sesuatu untuk menangani kasus pertama1
->11
(Saya pikir Anda bisa melakukannyaL=[1]+f()...
, atau menemukan beberapa cara untuk memasukkan 1 di depanL
karena itu akan selalu muncul 1 untuk baris kedua)r[x-1]&r[x] else
:)MATLAB,
146143138(Juga berfungsi pada Oktaf online, tetapi Anda harus masuk untuk menyimpan fungsi dalam file).
Fungsi mengambil input
n
danL
, dan mengembalikan arrayo
yang berisi output.Untuk nilai input,
n
adalah skalar, danL
merupakan vektor kolom, yang dapat ditentukan dalam format[;;;]
. Tidak cukup dengan apa yang Anda perlihatkan, tetapi Anda mengatakan itu fleksibel karena alasan dan sepertinya demikian.Output diformat sebagai
n x n
array yang berisi 0 dan 1.Dan sebuah penjelasan:
Pembaruan: Saya telah berhasil mengoptimalkan pernyataan if-else untuk menghemat beberapa byte. Format input sekali lagi diubah kembali ke vektor kolom.
sumber
Haskell,
153149 byte%
mengembalikan daftar daftar bit. Contoh penggunaan:Oh sayang! Membawa daftar acak di
L
sekitar adalah rasa sakit murni. Mari kita lihat apakah ini bisa lebih pendek.sumber
C #, 152 byte
Tidak ada yang istimewa di sini. Fungsi mengembalikan array 2D di mana peringkat pertama adalah baris dan yang kedua adalah kolom.
Diindentifikasi dan baris baru untuk kejelasan:
sumber
TI-BASIC,
10694878687 byteTI-BASIC tidak memiliki operator tambahan, bukan? Yah, itu semacam itu. Variabel persamaan
u
, biasanya digunakan dengan urutan, memiliki fitur yang tidak jelas: ketikau
dipanggil dengan argumen, variabel𝑛
diatur ke yang lebih besar dari argumen itu. Peningkatan bersyarat tergantung pada ini. (Saya sudah menunggu untuk menggunakannya dalam waktu yang lama.)Agar pengindeksan daftar berfungsi dengan baik,
𝑛
harus berupa nilai default 0, dan𝑛Min
harus merupakan default 1, jadi hapus RAM kalkulator Anda atau tetapkan nilai-nilai itu secara manual sebelum menjalankan ini.augment({0},Ans)+augment(Ans,{0
menghitung daftar jumlah dua elemen yang berdekatan, sehingga akan mengembalikan daftar 0s, 1s, dan 2s. Maka keajaiban ada di baris ini:Hasil dari baris ini adalah bahwa elemen daftar adalah 0 jika mereka adalah 0 atau jika mereka adalah 2 dan bit yang dibaca adalah 0.
Kasus cobaan:
sumber