Sangat terinspirasi oleh tantangan ini Code Golf: Ular ASCII peliharaan Anda sendiri - Saya pikir membuatnya horizontal akan menambah lapisan kompleksitas tambahan.
Contoh ular horizontal:
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Dan aturannya adalah:
- Tepat 5 baris karakter dicetak
- Setiap baris persis 30 karakter panjangnya, terdiri dari kombinasi spasi dan karakter yang Anda pilih untuk menggambar ular Anda
- Ular Anda mulai pada baris 3
- Baris berikutnya yang akan digunakan untuk menggambar ular Anda harus dipilih secara acak dari garis Anda saat ini, satu baris di atas (jika Anda belum berada di baris 1) atau satu baris di bawah (jika Anda belum berada di baris 5).
- Pilihan-pilihan ini harus memiliki bobot yang sama. Jadi, jika Anda berada di jalur 1, Anda memiliki peluang 50% untuk tetap di jalur 1 dan 50% peluang untuk pindah ke jalur 2. Jika Anda berada di jalur 2, Anda memiliki peluang 33% untuk pindah ke jalur 1, sebuah 33% peluang untuk tetap di jalur 2 atau 33% peluang untuk pindah ke jalur 3
- Ular Anda tidak perlu mengunjungi setiap baris.
Jawaban:
JavaScript (ES6), 98 byte
Disimpan 7 byte berkat @KevinCruijssen
Mengembalikan array 5 string.
Cobalah online!
Berkomentar
sumber
d
dan menggunakan((y%4?3:2)|0)-(y>0)
-6 byte. Cobalah online.1
dinew Random(...)
implisit secara default tentu saja .. Cobalah secara online.!!y
Alih-alih(y>0)
menghemat 2 byte lagi.)Arang , 28 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Cetak beberapa pelapis untuk memaksa 5 garis output.
Ulangi 30 kali.
Cetak nol (dan gerakkan secara horizontal).
Jika koordinat Y adalah 2, naik secara acak dengan 0 atau 1.
Jika -2, pindah ke bawah secara acak dengan 0 atau 1.
Kalau tidak, turun secara acak dengan -1, 0 atau 1.
sumber
Perl, 68 byte
Ini tidak terasa optimal sama sekali.
sumber
Jelly , 24 byte
Cobalah online!
Penjelasan
sumber
R , 138 byte
Cobalah online!
Dengan mudah dikalahkan oleh plannapus
sumber
Python 3, 144 byte
@Ruts, @Turksarama, dan @mypetlion sangat membantu dalam mengurangi byte
Akan mencoba dan memperbaiki ini. Tantangan yang menyenangkan!
sumber
l+=random.randint(-1,1) l=0 if l<0 else l l=4 if l>4 else l
untukl+=random.randint(~-(l<1),l<4)
menyimpan 31 byte.m=[[' 'for x in R(w)]for y in R(h)]
kem=[list(' '*w)for y in R(h)]
untuk menyimpan 7 byte.boolean
subkelas dariint
. JadiFalse
bisa digunakan sebagai pengganti0
danTrue
bisa diganti1
. The~
adalah operator unary untuk bitwisenot
dan-
operator yang membalik tanda (kalikan dengan-1
). Jadi~-(False)
mengevaluasi ke-1
dan~-(True)
mengevaluasi ke 0.m[2][0]=0
hilang) dan 2 byte pada for loop (for i in R(1,30):
menjadifor i in R(30):
). Anda juga perlu menghitung ulang l setelah Anda menetapkan angka 0. Ini akan membawa Anda ke 144 byte.R ,
120114 byteTerima kasih kepada @Giuseppe untuk 6 byte tambahan!
Menggunakan tabel probabilitas sebagai berikut:
di mana setiap kolom sesuai dengan sebuah kasus, yaitu kolom 1 dipilih jika ular berada di baris 1, memberikan probabilitas 0, 1/2 dan 1/2 untuk memilih masing-masing -1 [turun], 0 [diam] dan 1 [ naik] (
sample
otomatis menormalkan probabilitas ke 1), kolom 2 untuk baris 2 memberikan probabilitas 1/3, 1/3 dan 1/3, dll ...Cobalah online!
sumber
SOGL V0.12 ,
2221 byteCoba Di Sini!
Penjelasan:
sumber
Japt,
3129 byteMengembalikan array garis.
Menguji
sumber
Japt , 26 byte
Uji secara online!
sumber
Python 2 , 127 byte
Cobalah online!
sumber
Paket Oktaf dengan Statistik, 99 byte
Ini juga berfungsi di MATLAB dengan Kotak Alat Statistik.
Cobalah online!
sumber
Japt , 28 byte
Disimpan 9 byte berkat produk ETH
Cobalah online!
sumber
SmileBASIC,
10710510389 byteJawaban ini lebih menarik daripada jawaban vertikal karena case edge (literal).
64 byte, tanpa ruang cetak:
Saya juga menemukan beberapa variasi baris 2 dengan panjang yang sama:
Divisi integer Y / 3 digunakan untuk memeriksa apakah Y berada di luar rentang yang valid, serta mendapatkan tanda.
sumber
Java 8,
177170 byte-7 byte terima kasih kepada @ OlivierGrégoire .
Penjelasan:
Cobalah online.
sumber
r+=Math.random()*(r%4>0?3:2)-(r>0?1:0)
untuk menyimpan beberapa byte.C (gcc) ,
134130 byteCobalah online!
sumber
Python 3 , 123 byte
Cobalah online!
Buat array bilangan bulat, lalu konversikan ke setiap baris.
Python 2 , 120 byte
Cobalah online!
Untuk Py2, parens redundan untuk
exec
danprint
dapat dihapus, tetapi sintaks pada baris ke-2 tidak valid.Mengungguli kedua pengiriman Py2 oleh Rod dan pengiriman Py3 oleh linemade .
sumber
Ruby ,
9877 byteCobalah online!
Seorang lambda mengembalikan deretan string.
Impuls awal saya adalah membuat kolom dan memindahkannya, tetapi jauh lebih mudah untuk menghindari langkah itu.
Saya akan menyukai untuk menginisialisasi
a
dengan[" "*30]*5
, tapi itu akan membuat salinan dangkal string, menghasilkan sangat gemuk, non-licin ular.Saya bisa menggunakan konstanta sepertiD
kenaikan (untuk jumlah byte yang sama), tetapi Ruby akan mengeluh setiap kali saya menugaskannya. Saya memutuskan saya lebih suka mengurangi keterbacaan dengan menggunakan kembalii
loop ke tengah untuk memiliki sekelompok peringatan Debug untuk diabaikan.Saya juga ingin menyimpan beberapa byte denganloop{x+=rand(3)-1;(0..4)===x&&break}
, tetapi itu akan menyebabkan bias di tepi: 1/3 kesempatan untuk kembali ke dalam, 1/3 kesempatan untuk tetap, dan 1/3 kesempatan untuk keluar batas untuk beberapa saat sebelum akhirnya berjalan secara acak kembali (yaitu, "tetap").-20 byte: Gunakan Ruby
Integer#[]
untuk membuat conditional kecil, memastikan bobot gerakan yang benar untuk semua 5 posisi. Ini menggantikan pola loop-break (dengan peluang nol untuk gagal berhenti) untuk penghematan besar. Terima kasih, Eric Duminil !-1 byte: Inisialisasi
a
dengan(0..4).map
bukan5.times
, terima kasih lagi kepada Eric Duminil .sumber
loop
. Anda dapat menghitung kenaikan denganrand(2+14[x])-30[x]
ataurand -(30[x])..15[x]
. Mungkin ada versi yang lebih pendek. Namun, -20 byte tidak buruk! Cobalah online!x,a=2,(0..4).map{" "*30}
. Cobalah online!30[x]
trik yang bagus! Terima kasih!Perl 6 , 85 byte
Cobalah online!
Ekspresi kurung panjang adalah urutan malas yang dihasilkan dari elemen awal
(' ', ' ', 0, ' ', ' ')
, strip vertikal pertama dari output. Setiap strip / daftar berturut-turut dihasilkan dari yang sebelumnya dengan memanggilrotate
metodenya, dengan offset dipilih secara acak dari set yang berisi0
,1
(jika elemen pertama adalah nol), dan-1
(jika elemen kelima adalah nol).Matriks strip horizontal ditransposisikan dengan
[Z]
operator, mengubahnya menjadi daftar strip vertikal, yang masing-masing kemudianjoin
diedarkan menjadi string tunggal dan output dengansay
.sumber
Scala, 207 Bytes
mencicipi:
degolfed:
Penemuan unik saya - yah, saya belum membaca solusi lain sejauh ini, adalah, untuk menghasilkan Random (6) yang secara implisit adalah dua Randoms, (2 * 3). Jika jauh dari perbatasan, saya menggunakan nilai r / 2 (0,1,2) dan → (-1,0,1) katakan padaku, untuk naik atau turun. Jika di perbatasan, saya dapat menghindari panggilan mahal karakter acak, dan hanya mengambil modulo (2), untuk memutuskan, haruskah saya tetap atau harus saya pergi.
Mari kita lihat solusi lain. :)
sumber
java
?try it
tautannya? Kevin Cruijssen tidak menyertakan beberapa boilerplate, diperlukan untuk mengkompilasi kode ini atau menjalankannya di JShell, tapi saya kira itu sesuai dengan pedoman - mungkin ada diskusi meta. Jika suka, Anda dapat mencoba mengurangi kode ini, dengan menggunakan array dua-redup juga. Gagasan kedua adalah, untuk mengurangi kode geser pada akhirnya. Beberapa metode peta? Println disembunyikan oleh Kevin. - Ya, Array memberikan peningkatan sebesar 8.Perl,
83101 byteBaru: Tanpa masalah probabilitas di perbatasan:
Tidak Terkumpul:
sumber
PowerShell , 133 byte
Cobalah online!
Membangun array 2D seluas 30 spasi dengan tinggi 5 garis. (NB - jika seseorang dapat menemukan cara efektif yang lebih baik untuk menginisialisasi array ini, saya akan <3 selamanya). Menetapkan variabel helper
$l
menjadi2
(ini digunakan untuk baris apa yang digunakan segmen ular sebelumnya). Kemudian loop dari0
ke29
.Setiap iterasi, kami mengatur elemen ular kami
0
. Kemudian kita indeks ke dalam array yang rumit denganGet-Random
yang memilih apakah kita naik atau turun atau tetap sama. Itu ditambahkan kembali ke$l
.Akhirnya, kita loop melalui lima elemen
$a
dan-join
elemen-elemen dalamnya masing-masing menjadi string tunggal. Kelima dawai tersebut dibiarkan di jalur pipa, dan yang tersiratWrite-Output
memberi kami baris baru secara gratis.sumber
Clojure, 123 byte
Inilah orangtua:
Versi tidak disatukan:
Buat daftar ketinggian berbeda dari tubuh ular, lalu iterate dari 0 hingga 4. Setiap kali ketinggian cocok dengan baris saat ini ia mencetak 0, jika tidak, kosong. Tidak membiarkan ketinggian melebihi batas benar-benar biaya byte. Juga mengenali kapan baris baru dalam urutan lebih intensif dari yang seharusnya. Orang bisa dengan mudah menulis satu
doseq
, membuat produk cartesian dari x dan y tetapi kemudian orang tidak tahu kapan harus mencetak baris baru.sumber
Python3 + numpy,
137132 byteBukan pengiriman python terpendek, bukan yang terpanjang, dan jelas bukan yang tercepat.
Perbarui menggunakan
numpy
perintah diff disimpan 5 byte untuk menguji apakah ular adalah pola yang valid, dibandingkan dengan menghitung perbedaan secara manual denganj[1:]-j[:-1]
.sumber
C (gcc),
80767271 byteCobalah online!
sumber
f(r)
daripadar;f()
R , 95 byte
Baris berikutnya
x
selalu dipilih dari baris yang tidak lebih dari 1 dari baris saat ini (l[abs(x-l)<2]
). Menggunakanreplicate
alih-alihfor
siklus menghemat beberapa byte yang diperlukan untuk inisialisasi dan manipulasi matriks dan membutuhkan penggunaan<<-
operator saat menetapkan ke variabel globalx
.Cobalah online!
sumber
05AB1E , 25 byte
Cobalah online!
Penjelasan
sumber