Jadi, saya menulis sendiri satu garis yang mencetak ular di konsol. Ini sedikit menyenangkan, dan saya bertanya-tanya bagaimana saya bisa menyingkat kode saya ...
Berikut ini adalah contoh output (pendek):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Berikut spesifikasinya:
- Di setiap baris, satu karakter non-spasi putih (mana pun yang Anda suka) dicetak ke konsol, awalnya dengan 29 hingga 31 spasi padding di sebelah kiri itu.
- Setiap iterasi, keputusan acak dibuat antara tiga tindakan ini
- Jumlah padding berkurang sebesar 1
- Jumlah padding tetap sama
- Jumlah bantalan meningkat sebesar 1
Lakukan ini 30 kali, untuk mencetak 30 segmen ular panjang ke konsol.
Jawaban terpendek dalam byte menang.
Jawaban:
05AB1E ,
1514 byteCobalah online!
Penggunaan
0
.Penjelasan
sumber
Random Brainfuck ,
123 122121 byteCobalah online!
Random Brainfuck adalah perpanjangan dari brainfuck, dengan tambahan
?
perintah yang membantu, yang mengatur sel saat ini menjadi byte acak. Ini mencetak ular yang terbuat dari!
s, yang lebih mirip langkah kaki daripada seekor ular yang lucu.Bagaimana itu bekerja:
Solusi lain yang melekat pada surat pertanyaan, daripada semangat.
87 byte
Cobalah online!
Yang ini sangat bias menuju meninggalkan padding sendirian, tetapi menambah atau mengurangi padding keduanya sama-sama mungkin. Masing-masing memiliki sedikit kurang dari 1 dalam 256 kesempatan untuk terjadi.
sumber
?
perintah itu. +1?
hanya tersedia dalam Random Brainfuck , bukan brainfuck klasikC (gcc) ,
615856 byteJawaban diedit untuk mencerminkan perubahan aturan ...
Cobalah online!
sumber
s+=1-rand()%3
ke fungsi printf.i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Retina , 24 byte
Cobalah online!
Penjelasan
Inisialisasi string yang berfungsi ke baris pertama, yaitu 30 spasi dan a
+
.Ada ruang di baris kedua.
-29{
membungkus sisa program dalam satu lingkaran, yang dijalankan 29 kali.¶<
mencetak string yang bekerja di awal setiap iterasi loop dengan linefeed baris tambahan. Tahap atom itu sendiri menyisipkan spasi di awal string (ide dasarnya adalah menyisipkan satu spasi, dan kemudian secara acak menghapus 0-2 ruang, karena itu satu byte lebih pendek daripada secara acak memilih antara penghapusan, menyisipkan, dan tidak ada op).Ini cocok dengan regex kosong terhadap input, yang memberi kami setiap posisi di antara karakter (dan awal dan akhir string). Kemudian
,2
simpan hanya tiga pertandingan pertama, yaitu pertandingan setelah nol, satu dan dua spasi.@
memilih satu dari tiga pertandingan yang acak. Kemudian tahap pemisahan (S
) membagi input di sekitar kecocokan itu. Dan1
mengatakan itu untuk menjaga hanya bagian kedua dari perpecahan. Dengan kata lain, kami membuang semuanya hingga pertandingan acak kami.Baris ke-30, yang merupakan hasil dari iterasi loop terakhir, dicetak secara implisit di akhir program.
sumber
VBA,
605949 BytesRekatkan di jendela Segera dan tekan enter. (Pastikan deklarasi eksplisit dimatikan!)
Jauh lebih mungkin untuk bergerak daripada tetap di garis (yaitu tindakan tidak sama-sama berbobot) tetapi itu bukan persyaratan yang ditentukan (Untungnya!)
{EDIT} Disimpan 1 byte dengan menghapus spasi antara
=1
danTo
{EDIT2} Disimpan 10 byte berkat komentar remoel
Versi lama:
sumber
String(i," ")
keSpc(30+i)
menghapus kemudiani=30:
. Atau -1 byte dengan menghapus&
. :)C # (.NET Core),
1121101061009998 byte-1 byte terima kasih kepada @raznagul .
-1 byte terima kasih kepada @auhmaan .
Penjelasan:
Cobalah online.
sumber
new Random().Next()
beberapa kali secara lokal (.net Framework Version 4.6.1) saya selalu mendapatkan hasil yang sama. Saya perlu menambahkanThread.Sleep(10)
antara panggilan untuk secara andal mendapatkan hasil yang berbeda. Dengan waktu tidur kurang dari 10ms saya terkadang masih mendapatkan hasil yang sama. Jadi .net-Framework dan TIO (.net-Core) memiliki PRNG yang berbeda atau setidaknya menggunakan benih yang berbeda. Jika saya mengganti program Anda di TIO ke C # -mono saya mendapatkan perilaku yang sama seperti yang saya dapatkan secara lokal di .net-Framework.new Random()
menggunakan waktu sebagai seed sehingga dalam loop yang ketat waktunya sama dan hasilnya sama.Thread.Sleep(10)
andal mendapatkan hasil yang berbeda danThread.Sleep(1)
atau bahkan 9ms tidak cukup.C, 56 byte
Cobalah online!
Penjelasan:
C (gcc) , 55 byte
Bergantung pada f "mengembalikan" nilai yang ditetapkan ke n dalam fungsi, yang merupakan perilaku tidak terdefinisi, tetapi bekerja secara konsisten dengan gcc ketika tidak ada optimasi yang diaktifkan.
Cobalah online!
sumber
JavaScript (ES8),
636260 byteTermasuk baris baru yang tertinggal.
*2-1
dapat diganti dengan-.5
untuk penghematan 1 byte tetapi kemungkinan setiap baris sama panjangnya dengan baris sebelumnya akan sangat meningkat. Tentu saja, karena "acak" tidak didefinisikan dalam tantangan, RNG dapat diganti dengannew Date%3-1
jumlah byte total 55 .Menyimpan satu byte, terima kasih kepada seseorang yang menghapus komentar mereka sebelum saya dapat menangkap namanya. Saya benar-benar mencobanya dengan cara ini
repeat
danpadStart
tetapi tidak berpikir untuk mencobapadEnd
- tidak tahu mengapa!Tampilkan cuplikan kode
Bonus
Untuk jumlah byte yang sama, inilah versi yang menggunakan jumlah spasi awal & iterasi sebagai input.
Tampilkan cuplikan kode
sumber
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``
lebih pendek satu byte. (Catatan: Karena SO tidak mengizinkan jeda baris dalam komentar, saya harus mengetik \ n daripada benar-benar menggunakan jeda baris.)y=31
, akan ada kemungkinan baris pertama terlalu pendek. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…Java 8,
8987 byteGolf pertama, saya yakin itu bisa menjadi jauh lebih baik ..
Sunting: Memperbaiki saluran pertama berkat Steadybox .
Cobalah online!
sumber
Python 2 ,
836564 bytePendekatan langsung:
Cobalah online!
Terima kasih kepada @Rod karena telah menghemat beberapa byte! Terima kasih kepada @ovs untuk -1 byte!
Edit: mengubah nama variabel dan string keluaran menjadi huruf 's'
Lebih banyak output seperti ular untuk 88 byte:
sumber
APL (Dyalog) , 20 byte
1 byte disimpan berkat ngn
Cobalah online!
sumber
¯2+
--->2-
Arang , 14 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Akan hanya 10 byte jika tidak ada persyaratan indentasi awal.
sumber
PHP, 61 byte
Cobalah online!
sumber
$i<30;$i++
bisa$i++<30;
untuk menghemat 2 byte.for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');
(\n
dihitung sebagai 1 char, dan harus diganti dengan baris baru yang sebenarnya)for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Java 8,
131129127 127126119108101 bytePenjelasan:
Cobalah online.
Jawaban lama 119 byte:
Penjelasan:
Cobalah online.
sumber
R ,
726967 byteTerima kasih kepada Zahiro Mor untuk 2 byte tambahan!
Cobalah online!
sumber
sample(3,29,T)-2
kerunif(29,-1,1)
akan mengurangi jumlah byte sebesar 2 tetapi bergerak tidak lagi sama mungkin. Dan bisakah Anda juga beralih ke ataupaste("%"
bukannyapaste0("% "
saya melewatkan sesuatu di sini?% 30 s
bukan% 30s
. Seperti yang Anda katakanrunif
akan mengacaukan kemungkinan.sprintf("%30s")
,sprintf("% 30s")
dansprintf("% 30 s")
kembalikan hasil yang sama untuk saya. Tetapi pada TIO hanya dua yang pertama memiliki hasil yang identik, jadipaste0("%"
harus menyimpan byte. Dan tidak ada persyaratan bahwa setiap gerakan memiliki probabilitas yang sama.Japt , 13 byte
Mengembalikan array garis.
Menguji
Penjelasan
Bonus
Untuk kurang dari 2 byte , inilah versi yang menggunakan jumlah spasi awal & iterasi sebagai input.
Cobalah
RNG alternatif
4 byte terakhir dapat diganti dengan yang berikut ini:
sumber
-1
dikembalikan oleh RNG pada iterasi pertama, kita akan berakhir dengan panjang garis total29
kapan seharusnya30
,31
atau32
.30
dan kemudian menambahkan-1
,0
atau1
memberi kita29
,30
atau31
- menambahkan"
dan yang memberi kita total panjang30
,31
atau32
untuk baris pertama.Swift , 101 byte
Penjelasan
Program lengkap. Ini menggunakan trik yang agak aneh:
arc4random()
adalah anggotaDarwin
modul, tetapiUIKit
juga dilengkapi dengan fungsi ini diinstal, sehingga menghemat satu byte :) Juga menggunakan salah satu tips bermain golf Swift saya untuk mengulangi string beberapa kali secara acak.sumber
for _ in 0 ... g
menjalankan blok kode 29 kali sekarang, bukan 30 (loop dari 0 ke 29 (eksklusif))?0...g
menghasilkan semua bilangan bulat di [0; g] . Buruk saya, tetap penjelasan.0..<g
akan menghasilkan bilangan bulat di [0; g) : P[0; g)
Anda edit[0; g]
memang membingungkan saya. :) Hmm, tetapi apakah tidak mungkin untuk memulai padag=30
dan loop[1; g]
dalam kasus itu?[0; g)
atau[1; g]
pasti akan mungkin jika saya memilihg=30
sebagai gantinya, tetapi kemudianprint(...,0)
perlu diubahprint(...+"0")
, karena ruang tambahan (asing) akan ditambahkan sebelum 0 jika tidak. Either way, jumlah byte tetap sama.Perl, 36 byte
sumber
say
untuk pengurangan. Apakah saya benar dalam berpikir itu tidak mengubah jumlah berjalan ketika$#a
bertambah karena itu bukan referensi?map
yang pertama kali meletakkan elemen pada stack.for
tidak dan akan memiliki panjang loop yang tidak dapat diprediksiperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'
, tetapi kadang-kadang (tidak setiap waktu) mengakibatkan kesalahan segmentasi. Mungkinkah itu bug di perl v5.22.1 dan v5.16.3?R,
5453 byteIde yang sama seperti di atas , tetapi dengan
sprintf
kode yang lebih pendek dan karakter string string yang lebih pendek. Alih-alih\n
(dua byte) saya menggunakan istirahat garis literal (satu byte).Try it online!
sumber
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number.
Saya telah menggunakansprintf
selama bertahun-tahun dan entah bagaimana selalu melewatkan bagian itu ... Terima kasih atas pengingatnya!Ruby ,
4539 byteCobalah online!
Memodifikasi
x
selama loop tidak mempengaruhi penghitung loop. Saya memilih S sebagai karakter keluaran seperti ular.-6 byte: Gunakan
rand(3)-1
sebagai ganti[-1,0,1].sample
. Terima kasih, Eric Duminil !sumber
x.map
alih - alihx.times
(setara karena Anda tidak menggunakan nilai pengembalian)rand -1..1
lima byte lebih pendek dari[-1,0,1].sample
rand(3)-1
kurang dari 6 byte.(x=30).times{puts' '*x+?+;x+=rand(3)-1}
(ukuran yang sama) akan mencetak tepat 30 ruang untuk kepala ular seperti yang diminta oleh tantanganSenseTalk ,
237198 BytesIni adalah bahasa yang saya kenal dan sukai sekitar satu dekade yang lalu. Ini adalah bahasa scripting yang menggerakkan alat pengujian otomatis Eggplant Functional . Saya adalah pengguna berat alat ini selama bertahun-tahun sebelum bergabung dengan perusahaan untuk sementara waktu. Ini bukan bahasa yang paling mampu golf, tapi saya merasa sangat menyenangkan untuk menulis. Golf di dalamnya sebenarnya cukup menantang karena bahasa itu dimaksudkan untuk menjadi kata kerja dan seperti bahasa Inggris ... butuh waktu cukup lama untuk menyelesaikannya hingga 237 byte.
Tidak Terikat / Penjelasan
Sunting: Disimpan 36 byte berkat @mustachemoses
sumber
J , 23 byte
Cobalah online!
sumber
PowerShell , 42 byte
Cobalah online!
Loop dari
1
ke$l=30
. Setiap iterasi kita menempatkan$l
spasi ditambahx
ke pipa sebagai string, maka+=
salah satu dari-1, 0, 1
berdasarkanGet-Random
ke$l
untuk loop berikutnya. String-string itu dikumpulkan dari pipeline dan sebuah implisitWrite-Output
memberi kita daftar yang dipisahkan baris baru secara gratis.sumber
Bash, 53
Cobalah online .
sumber
p+=RANDOM%3-1
bekerja juga.Jeli , 18 byte
Cobalah online!
Karakter yang dipilih adalah 0 . Jika mengembalikan daftar daftar karakter diperbolehkan, maka
Y
dapat dijatuhkan dan pengiriman dapat diubah menjadi rantai niladic selama 17 byte . Alternatif .Bagaimana itu bekerja
Jelly , 16 byte
Menggabungkan solusi saya, solusi Erik dan Jonathan, kita dapat melakukan ini hingga 16 byte. Karakter yang dipilih adalah 1 .
Cobalah online!
Terima kasih kepada Jonathan Allan untuk up-on (on
Ṭ€o⁶
).sumber
Ṭ€o⁶
sebagai pengganti⁶ẋ;€0
byter 18 saya dan turun ke 17.Oktaf ,
53 51 5049 byteCobalah online!
Disimpan 1 byte dengan tidak lagi melakukan pengulangan. Disimpan lain seperti Oktaf
printf
jugafprintf
.Kode baru ini menciptakan array 30 bilangan bulat acak dalam rentang
-1:1
. Kemudian secara kumulatif menjumlahkan array dan menambahkan 30, yang memberikan urutan yang diinginkan.Hasilnya dicetak menggunakan
fprintf
format yang mengatakan "Angka desimal, diisi dengan lebar yang ditentukan, diikuti oleh baris baru. Lebar akan menjadi input nilai pertama, dan angka desimal akan menjadi input nilai kedua. Jika nomor tersebut dari nilai input lebih dari ini, Oktaf akan terus mengulangi cetakan secara otomatis untuk mendapatkan hasil yang diinginkan.Untuk mencapai looping, kita hanya perlu interleave nol antara array urutan sehingga
fprintf
fungsi menggunakan setiap nilai dalam urutan sebagai lebar, dan masing-masing nol sebagai digit yang akan dicetak.Mencetak keluaran seperti:
Kode di atas tidak selalu mencetak tepat 30 spasi di baris pertama. Pilihannya adalah 29, 30, atau 31. Untuk memperbaikinya, Anda akan menggunakan versi 53 byte ini:
sumber
x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Lua,
8175 byteDi
for i=1,n ...
dalam to_expn
dievaluasi hanya sekali sebelum memasuki loop, menyimpan satu byte.-6 terima kasih kepada @ user202729
Cobalah online!
sumber
Python 3.6 ,
847369 byteBerkat @WheatWizard untuk -11 byte. Berkat @ JoKing untuk -4 byte.
sumber
i
Anda dapat menggunakannyafor i in[1]*30
untuk menghemat byte.from random import*
sehingga Anda tidak membutuhkannyarandom.
nanti. Dan Anda dapat menghapus ruang baris baru setelah Anda:
.30
ke29
yang"+".rjust(x)
bisa diganti dengan" "*x+"+"
.[1]*30
menjadi[1]*x
karena satu byte lebih pendek.ES5,
979581 byteES5,
11298 byte jika format fungsi diperlukan:sumber
_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
join(" ")
denganjoin` `
Merah , 54 byte
Cobalah online!
sumber