Tulis program terpendek untuk mengubah setiap karya seni ASCII menjadi adegan salju animasi yang mulai terbentuk dari salju yang turun ( contoh JavaScript non-golf terakhir diperbarui 2011-12-19).
Spesifikasi input : Program Anda harus menerima kombinasi spasi, tanda bintang, dan baris baru yang berubah-ubah. Input akan berisi paling banyak 23 baris dan 80 karakter per baris. Tidak akan ada baris kosong, namun baris mungkin hanya terdiri dari spasi putih. Satu baris baru yang tertinggal akan dimasukkan dan harus diabaikan.
Keluaran : Keluaran karakter ASCII (spasi, tanda bintang) dan kode kontrol (carriage return, linefeeds, ANSI escape code, dll.) Untuk konsol teks atau emulator terminal sistem operasi Anda sampai pengguna secara manual menghentikan program. Anda dapat menganggap jendela terminal adalah 80x24 karakter jika sistem operasi Anda mengizinkan pengaturan itu.
Aturan :
- Animasi harus halus dan cepat (lebih disukai 15 fps).
- Kepadatan salju harus antara 5% dan 15%.
- Tidak lebih dari satu layar salju dapat menggulir per detik. (Itu berarti tidak lebih dari 24 baris salju baru dapat ditambahkan dalam periode waktu satu detik.)
- Salju tidak boleh menampilkan pola yang jelas saat memasuki bagian atas layar; itu harus terlihat acak.
- Program harus mengisi semua baris layar dengan salju secepat mungkin saat dimulai; pengisian awal baris individual layar tidak harus jelas bagi pemirsa.
- Sudut kiri bawah seni input ASCII harus di sudut kiri bawah layar (Gambar 1 untuk klarifikasi lebih lanjut).
- Area di dalam atau di bawah seni ASCII tidak boleh diisi secara permanen dengan tanda bintang. Namun, tanda bintang mungkin (tetapi tidak diharuskan) menggulir melalui area ini.
- Salju tidak boleh menumpuk di bagian bawah layar atau di atas salju yang ada kecuali seperti yang ditunjukkan pada input.
- Ruang yang lebih rendah harus diisi sebelum yang atas, karena mengisi ruang dalam urutan yang berlawanan membuat animasi pohon Natal terlihat sangat berbeda dari output kode asli saya. (ditambahkan 2011-12-20)
Selamat berlibur!
Gambar 1: area berlabel layar 80x24
---------------------------New snow added on this line--------------------------
|
|
----------------------------------------------------------+ |
**** | |
Snow MUST fall Snow MAY fall ----------------> **** | |
through this through these **** **** | Snow MUST fall |
area. areas of a **** **** | through this |
completed \---------> **** ****| area. |
ASCII art scene. \ *** **** ****| |
area \ \ ******* **** ****| |
\ \ ******** *** ***| (ALL CAPS terms |
(located in \ \--> ********* *** | have standard |
lower left \ ******* ****** MAY | RFC 2119 |
corner of \ ************* ** fall | meanings.) |
screen) \ *********** here | |
*** +---> **** *** | |
*** | **************** *** | |
| Snow MUST fall *** | **************** *** | |
| through this *** +---> *** | |
| area. *** | **************** *** | |
--+---------------------+*** +---> ***+----+------------------+--
| Snow MUST NOT |****************************| Snow MUST NOT |
V accumulate here. |****************************| accumulate here. V
Contoh input
Banner Golf Kode
****** ******* ******** ******** ****** ******* ** ********
** ** ** ** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** ** **
** ** ** ** ** ****** ** **** ** ** ** ******
** ** ** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** ** ** ** **
****** ******* ******** ******** ****** ******* ******** **
Logo Stack Overflow
****
****
**** ****
**** ****
**** ****
*** **** ****
******* **** ****
******** *** ***
********* ***
******* ******
************* **
***********
*** **** ***
*** **************** ***
*** **************** ***
*** ***
*** **************** ***
*** ***
****************************
****************************
Pohon Natal
*
*** *
* ***** ***
*** ******* * *****
***** ********* *** *
* *********** *****
* ************* *******
* *** *************** * *
*** ***** ***************** ***
***** ******* ******************* *****
******* * ********************* *******
********* * *********
* *
Jawaban:
Perl, 196/239 karakter
Solusi ini berbeda dari contoh JS Anda bahwa polanya diisi dari atas ke bawah dan bukan dari bawah ke atas, tetapi saya berasumsi tidak apa-apa karena Anda tidak mengatakan apa-apa tentang hal itu dalam aturan.
Pengurangan 1-char sepele dapat diperoleh dengan mengganti
\e
dengan karakter ESC literal, tetapi itu membuat kode lebih sulit untuk dibaca dan diedit.Update: Saya melakukan berhasil datang dengan versi yang mengisi pola dari bawah ke atas, dan tidak memungkinkan salju jatuh melalui bagian diisi dari pola, seperti pada contoh implementasi JS, pada biaya 43 chars ekstra:
Mengganti
($s[$_]&=~$f[$_])
dengan hanya$s[$_]
akan menghemat 11 karakter dengan membiarkan salju yang jatuh melewati bagian-bagian pola yang terisi (yang cocok dengan spek, tetapi bukan contoh implementasi).Oke, karena saya tampaknya masih memimpin balapan setelah seminggu, saya kira saya harus menjelaskan bagaimana solusi saya bekerja untuk mendorong lebih banyak kompetisi. (Catatan: Penjelasan ini untuk versi pengisian top-down char-196. Saya dapat mengubahnya untuk menyertakan versi lain nanti.)
Pertama-tama, satu trik besar yang menjadi dasar solusi saya adalah bahwa, karena cara kode karakter ASCII diatur, 1-bit dalam kode ASCII untuk suatu ruang kebetulan merupakan subset dari mereka yang ada dalam kode untuk suatu asterisk.
Dengan demikian, ungkapan berikut ini benar:
" " & "*" eq " "
dan" " | "*" eq "*"
. Inilah yang memungkinkan saya menggunakan operasi string bitwise untuk menggabungkan bagian statis dan bergerak dari adegan tanpa harus mengulang karakter individu.Jadi, dengan itu, mari kita bahas kodenya. Ini versi de-golf-nya:
Baris pertama mengatur array
@f
(untuk "fix") dan@p
(untuk "pattern").@f
akan membentuk bagian tetap dari tampilan, dan mulai berisi hanya ruang, sementara@p
, yang tidak ditampilkan secara langsung, berisi pola input; saat animasi berlanjut, kami akan menambahkan lebih banyak tanda bintang@f
hingga terlihat seperti@p
.Secara khusus,
@f = ($" x 80) x 23
set@f
ke 24 string masing-masing 80 spasi. ($"
adalah variabel Perl khusus yang nilai default-nya kebetulan adalah spasi.) Kami kemudian mengambil daftar ini, menambahkan baris input ke dalamnya menggunakan operator readline<>
, ambil 24 baris terakhir dari daftar gabungan ini dan tetapkan ke@p
: ini adalah cara kompak untuk pad@p
dengan garis-garis kosong sehingga muncul pola di mana seharusnya. Akhirnya, kamichomp
memasukkan baris input@p
untuk menghapus baris baru yang tertinggal agar tidak menyebabkan masalah di lain waktu.Sekarang, mari kita lihat loop utama. Ternyata itu
{...;redo}
adalah cara yang lebih singkat untuk menulis infinite loop daripadawhile(1){...}
atau bahkanfor(;;){...}
, terutama jika kita bisa menghilangkan tanda titik koma sebelumnyaredo
karena itu segera mengikutiif
blok.Baris pertama dari loop utama memperkenalkan array
@s
(untuk "salju", tentu saja), di mana ia menambahkan string 80-karakter acak dari 90% spasi dan tanda bintang 10% pada setiap iterasi. (Untuk menyimpan beberapa karakter, saya tidak pernah benar-benar menghapus garis tambahan dari akhir@s
array, sehingga terus bertambah lama. Akhirnya hal itu akan membuat program terhenti karena array menjadi terlalu panjang untuk masuk dalam memori, tapi itu akan memakan waktu lebih lama daripada kebanyakan orang untuk menonton animasi ini. Menambahkanpop@s;
pernyataan sebelumselect
akan memperbaikinya dengan biaya tujuh karakter.)Sisa dari loop utama dibungkus dalam sebuah
if
blok, sehingga hanya berjalan setelah@s
array mengandung setidaknya 24 baris. Ini adalah cara sederhana untuk mematuhi spesifikasi, yang mengharuskan seluruh tampilan diisi dengan salju yang turun sejak awal, dan juga menyederhanakan operasi bitwise sedikit.Selanjutnya muncul satu
foreach
loop, yang dalam versi golf sebenarnya adalah pernyataan tunggal denganfor 0..23
pengubah. Karena konten dari loop tersebut mungkin perlu penjelasan, saya akan membukanya lagi di bawah ini:Pertama-tama,
$_
adalah variabel penghitung loop default di Perl kecuali variabel lain ditentukan. Di sini ia berjalan dari 0 hingga 23, yaitu lebih dari 24 baris dalam bingkai tampilan.$foo[$_]
menunjukkan elemen yang diindeks oleh$_
dalam array@foo
.Pada baris pertama dari loop de-golf, kami mencetak baris baru (mudah diperoleh dari
$/
variabel khusus) atau, ketika$_
sama dengan 0, string"\e[H"
, di mana\e
menunjukkan karakter ESC. Ini adalah kode kontrol terminal ANSI yang menggerakkan kursor ke sudut kiri atas layar. Secara teknis, kita bisa menghilangkan itu jika kita mengasumsikan ukuran layar tertentu, tetapi saya menyimpannya dalam versi ini karena itu berarti saya tidak perlu mengubah ukuran terminal saya untuk menjalankan animasi.Di
$t = $f[$_]
telepon, kami hanya menyimpan nilai saat ini$f[$_]
dalam variabel "sementara" (karenanya$t
) sebelum berpotensi mengubahnya di baris berikutnya, di mana$s[$_] & $p[$_]
memberikan persimpangan (bitwise AND) dari salju yang jatuh dan pola input, dan|=
operator OR itu ke jalur output tetap$f[$_]
.Pada baris di bawahnya,
$t ^ $f[$_]
berikan XOR bitwise dari nilai sebelumnya dan saat ini$f[$_]
, yaitu daftar bit yang kita ubah pada baris sebelumnya, jika ada, dan meniadakan salah satu string input dengan~
meniadakan output. Jadi, yang kita dapatkan adalah bitmask dengan semua bit diatur ke 1 kecuali yang baru saja kita tambahkan$f[$_]
pada baris sebelumnya. DAN menggunakan bitmask itu untuk$s[$_]
menghapus bit-bit itu darinya; pada dasarnya, ini berarti bahwa ketika kepingan salju yang jatuh mengisi lubang pada pola yang telah ditetapkan, kepingan salju akan dikeluarkan dari susunan salju yang jatuh.Akhirnya,
print $f[$_] | $s[$_]
(yang dalam versi golf diimplementasikan dengan hanya ORing dua baris sebelumnya bersama-sama) hanya mencetak gabungan (bitwise OR) dari kepingan salju tetap dan bergerak pada baris saat ini.Satu hal lagi yang perlu dijelaskan adalah di
select '', '', '', 0.1
bawah lingkaran dalam. Ini hanya cara jelek untuk tidur 0,1 detik dalam Perl; untuk beberapa alasan sejarah yang konyol,sleep
perintah Perl standar memiliki resolusi satu detik, dan mengimpor yang lebih baiksleep
dariTime::HiRes
modul membutuhkan lebih banyak karakter daripada menyalahgunakan 4-argselect
.sumber
say
), dengan biaya 2 karakter tambahan. Saya pikir saya tidak bisa mengubah urutan pengisian dengan sangat mudah; implementasi saya agak mendasar terkait dengannya.HTML dan JavaScript, 436 karakter
Tambahkan ke input:
Lihat itu berjalan untuk setiap contoh: kode golf , logo Stack Overflow , pohon Natal . Pengguna Internet Explorer perlu menjalankan versi 9 dan mengatur "Mode Dokumen" ke "standar IE9" (menggunakan alat pengembang F12) agar pengiriman ini berfungsi dengan benar.
sumber
Python, 299 karakter
Ini harus sesuai dengan aturan, dengan asumsi baris baru termasuk dalam batas 80 karakter.
sumber
a
dan jadi mengacaukan pengindeksan. Saya baru saja mencobanya, dan sepertinya mengganti%e
dengan%e.rstrip()
jalur 6 memperbaiki masalah. (Tentu saja, mungkin ada perbaikan yang lebih pendek; Saya tidak pandai bermain golf Python.)Jawa, 625 karakter
Solusi sederhana di Jawa.
sumber
"\033[H"
harus melakukannya).