Konteks
Ini Hari Kasih Sayang. Satu-satunya yang kau cintai meninggalkanmu kemarin untuk pria yang selalu dia temukan "bodoh dan tidak menarik" . Dalam perjalanan pulang, Anda terjebak kemacetan, mendengarkan lagu-lagu lama di radio, hujan yang menerpa kaca depan mengguncang Anda. Setelah beberapa saat di mobil Anda, Anda menemukan diri Anda sendirian di apartemen kecil Anda karena tidak dapat memikirkan hal lain selain dia. Tidak ada cahaya dan Anda menatap melalui jendela, membiarkan kegelapan menyelimuti Anda. Tidak ada orang untuk diajak bicara, teman-teman Anda sudah lama pergi setelah memperingatkan Anda tentang gadis baru ini menghantui pikiran Anda. Anda menyalakan komputer Anda, karena itu satu-satunya hal yang dapat Anda lakukan, buka browser Anda dan posting teka-teki pemrograman baru ke stackexchange, dalam upaya untuk mengubah pikiran Anda.
Tantangan
Tulis sebuah program dalam bahasa pilihan Anda yang mensimulasikan hujan yang jatuh di tanah. Output dapat terdiri dari karakter ASCII atau 2D / 3D yang diberikan. Kamera sudah diperbaiki: Anda berada di atas dengan pandangan lurus ke tanah. Program Anda harus menyertakan beberapa jenis animasi seperti menyegarkan konsol atau halaman setiap kali Anda menghasilkan "bingkai" baru. Itu harus realistis, saya tahu ini agak subyektif tetapi katakanlah Anda tidak bisa hanya mengisi semua tanah hanya dengan satu tetes besar.
Outputnya tidak harus berupa gambar tetapi jika Anda menggunakan bahasa samar lebih baik untuk memberikan .gif untuk menggambarkan bagaimana itu terlihat dalam tindakan (tapi tentu saja, itu tidak akan mempengaruhi skor Anda jika Anda tidak).
Aturan
- Skor Anda adalah total byte yang digunakan
- -20 poin jika Anda menggunakan warna
- -50 jika kamu berhasil membuat semacam angin
- Skor terendah menang
Contoh
Contoh yang sangat mendasar tentang apa yang harus dirender:
Saya harap Anda akan melakukan yang lebih baik dan menikmati tantangan ini.
Maaf untuk bahasa Inggris saya, silakan edit posting saya jika Anda ingin memperbaiki beberapa kesalahan
Papan pemimpin
Jika nama Anda tidak tercantum, itu karena upaya Anda dianggap tidak sesuai dengan aturan.
Tobia - APL - 35
j6m8 - Processing.js - 38
The Guy with The Hat - Processing - 42
ace - Processing - 74
kelunik - JS/CSS - 89
Riot - Bash - 91
Michael - JS/jQuery - 105
Florent - HTML/JS - 123
David Carraher - Mathematica - 134
Doorknob - HTML/JS - 150
undergroundmonorail - Python - 175
Selamat untuk Tobia!
Jawaban:
APL, 105 karakter / byte * - 20 - 50 = 35 skor
*: Sebagian besar implementasi APL mendukung beberapa bentuk (byte) charset byte tunggal, yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan bermain golf, program yang hanya menggunakan karakter ASCII dan simbol APL dapat dinilai sebagai karakter = byte.
Saya mengujinya pada apl.js terbaru Nick di Node.js di terminal OS X. Tapi saya belum menggunakan sesuatu yang spesifik untuk dialeknya, jadi itu harus bekerja pada APL modern yang dapat dijalankan pada terminal ANSI dan mendukung d-funs
{...}
, penugasan untai(a b)←...
, dan perjalanan⍨
, seperti Dyalog untuk Linux atau untuk Raspberry PI ( dengan⎕IO←0
)The
␛
sejalan 1 adalah karakter escape literal (yang 1 byte). Anda dapat memasukkannya menggunakan Ctrl-V Escterminal Linux atau Vim, atau sesuatu seperti Alt-027di Windows. Juga, saya tidak dapat menemukan cara yang andal untuk menemukan ukuran terminal, jadi Anda mungkin ingin mengedit jumlah baris dan kolom di akhir baris terakhir.Saya mempertahankan bonus 50 dengan fakta bahwa setiap tetes hujan melewati bentuk-bentuk berikut:
⍟∘.
yang memberi kesan angin sedikit turun, mengingat bahwa pemandangan sedang dilihat dari atas. Bahkan, melihat gif di bawah ini, Anda harus mendapatkan kesan bahwa setiap tetes bergerak dengan lembut ke bawah dan ke kiri, sebelum menghilang di tanah.Versi tidak disatukan:
Keluaran:
APL, gaya yang berbeda
Keluar dari kompetisi.
Di sini tujuan saya adalah untuk memberi kesan air hujan jatuh dengan miring dan terakumulasi di tanah, sambil berusaha menjaga agar jumlah tetesan yang terlihat (jatuh atau berceceran) tetap konstan. Caranya adalah dengan membuat sejumlah tetes jatuh baru
/
di setiap siklus dan membuat tetes jatuh "menghapus" semua yang jatuh di mana-mana mereka bepergian.Hasilnya anehnya mengingatkan pada kode Matrix.
Output
(brengsek setiap 5 adalah gif looping)
sumber
Bash: 111 byte - 20 = 91 poin!
Gerimis lembut kontemplatif di terminal Anda. Sesuaikan angka 819 dan 41 masing-masing untuk tinggi dan lebar yang berbeda.
Bonus yang menyenangkan adalah cara kursor berayun-ayun melintasi area hujan.
Sunting: dipersingkat dari 140 byte menjadi 129 byte berkat saran @ manatwork. Sunting 2: memendek dari 129 byte menjadi 111 byte berkat saran @ manatwork dan @ Tobia, plus inspirasi tambahan - lihat komentar.
(Catatan: tangkapan layar menunjukkan versi kode sebelumnya yang kurang golf, yang secara fungsional identik)
sumber
echo
opsi; 2 karakter dengan menggunakan\e
alih-alih\033
; 3 karakter dengan menggunakan:
alih-alihtrue
; 5 karakter dengan menggunakan evaluasi aritmatika (((…))
):e='echo -ne \e';while :;do for i in {0..19};do for i in {0..40};do ((RANDOM<9))&&$e"[1;36m".||$e[1C;done;$e' ';done;$e[20A;done
.((RANDOM<9))
berfungsi juga. Juga, Anda bisa mencoba menyusutkan kode Anda dengan menggabungkan keduanya untuk{0..19}
dan{0..40}
menjadi satu untuk{0..819}
, menggunakan sesuatu seperti$((i%41))
di dalamnya.e='printf \e'
2 char lebih pendek darie='echo -ne \e'
!$e[C
Python, 312 byte - 50 (angin) = 262
Output sampel (loop 50 bingkai):
Playpack yang sebenarnya secara signifikan lebih cepat dari yang diperbolehkan gifs.
sumber
R=__import__("random").randint
alih-alihfrom random...
garis.HTML / JS, 170 karakter - 20 = 150 poin
(sidenote: bermain golf lebih jauh dengan mengirimkan string ke
setInterval
,,with
nama variabel ID otomatis ... rasanya sangat salah! bergetar )Itu hanya menggambar persegi panjang biru acak.
HTML / JS, 309 karakter - 20 - 50 = 239 poin
Sekarang dengan angin!
sumber
<canvas id=c /><script>d=400;with(c)width=height=d,t=getContext('2d');t.fillStyle='blue';setInterval("t.fillRect(Math.random()*d,Math.random()*d,5,5)",50)</script>
AAAHHH! Saya menggunakanwith
! Saya merasa lebih kotor daripada memberikan string kesetInterval
: pcanvas
tidak dapat menutup secara otomatis, tetapi selain itu berfungsi dengan baik! (Juga, menggunakan nama variabel ID otomatis terasa sangat kotor juga: D)onload
. Saya harus mengatakan saya suka cara @ Florent menghindari duplikatMath.random()
canvas
autoclose di Chrome! Jawaban saya dikembangkan / diuji di browser ini.JS + jQuery (172-20-50 = 102)
Salin / Rekatkan baris itu di konsol browser (umumnya tekan tombol F12):
Animasi hati merah hujan untuk hari Valentine!
sumber
Mathematica
134 - 20 = 114
2D
3D
Bentuk tetesan hujan dibuat melalui plot revolusi di sekitar sumbu z.
Awalnya, hujan dihasilkan untuk wilayah yang memanjang jauh di atas wilayah tampilan. Munculnya hujan turun dicapai dengan menggeser Sudut Pandang ke atas sepanjang sumbu z. (Ini lebih efisien daripada menghitung ulang posisi setiap tetes hujan.)
Dengan Angin
Ada banyak overhead untuk membuat hujan turun dengan angin. Tapi bagaimanapun saya termasuk di sini.
Lantai biru cukup banyak membuat {x, y} melihat wilayah terbatas pada bidang yang diminati. Ada beberapa gangguan, tapi, oh well,
Dari Langsung Di Atas
Tetesan hujan terdekat terpotong tapi saya akan mengabaikan itu.
sumber
HTML / JavaScript,
156123 (143 - 20)Versi beranotasi:
sumber
Smalltalk (Smalltalk / X)
dengan angin acak ;-)
output dalam tampilan:
sumber
Memproses, 94 - 20 = 74
(Baris baru ditambahkan agar mudah dibaca.)
Klik di sini untuk demo online.
sumber
Pesta
Saya tidak yakin ini harus menjadi kode golf karena tidak ada persyaratan ketat tentang seperti apa "hujan" itu.
EDIT: Jika Anda ingin terlihat seperti kamera menunjuk lurus ke bawah, gunakan ini:
sumber
while echo \ / / / / /;do echo / / / / /;done
(atau beberapa lagi dengan fungsi rekursif tapi itu akan dengan cepat meledakkan tumpukan). @undergroundmonorail Angin kencang, relatif diagonal ke kamera.while echo -e '\e[0;34m / / / / /';do echo / / / / /;done
dan turun ke -13 dengan bonus :)Python 2.7: 195 - 20 = 175
Saya yakin masih banyak yang bisa dilakukan di sini, tetapi inilah yang saya miliki untuk saat ini:
Saya akan memposting gif dari output ketika saya ingat bagaimana melakukan itu.
Ini berfungsi di linux. Mengganti
'clear'
dengan'cls'
membuatnya berfungsi pada windows, tapi kemudian warna ANSI tidak berfungsi dan saya kehilangan bonus.Saya memiliki array 2D string satu karakter, diinisialisasi ke
. Setiap 0,05 detik, salah satunya dipilih secara acak
.
, dan layar digambar ulang.from random import*
menghemat dua karakterimport os,time,random
dan menggunakanrandom.randint()
dua kali, meskipun saya tidak yakin itu cara terbaik untuk memilih sel. Saya ingin menggunakanrandom.choice()
tetapi saya tidak bisa memikirkan cara mengatasi string abadi yang tidak akan menyia-nyiakan lebih banyak karakter daripada menyimpannya.sumber
l=[i[:]for i in[[' ']*100]*50]
, sesuai stackoverflow.com/a/6688361/1114687 . 198 - 20 = 178l=[[' ']*100]*50
, tetapi itu hanya membuat 50 referensi ke daftar 100-elemen yang sama, jadi saya mencari cara terpendek yang mungkin untuk mengelak dan menemukan jawaban Stack Overflow yang ditautkan di atas.132 + 27 - 20 - 50 = 89
Javascript (132)
CSS (27)
Demo: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/
sumber
Memproses, 62 - 20 = 42
Menghasilkan piksel biru pada latar belakang putih. Peragaan dalam bahasa yang sangat mirip di sini: https://www.khanacademy.org/cs/rain2/6172053633761280
sumber
Processing.js, 86 - 20 = 66
... tetapi perlahan-lahan menghilang (tanah menyerap hujan, secara alami). Poin untuk itu?
Fitur bonus meliputi beragam antara kehijauan dan kebiruan (hujan 'kota' itu jelas kotor).
Juga, saya sangat senang bahwa saya harus menggunakan hack JavaScript di sini; Perhatikan itu, karena ini sedang diproses. js , Anda bisa melempar hal-hal seperti deklarasi tipless dari g = 99, atau alias
r
untukrandom
(alias lintas-bahasa!).Ada ide lain untuk dikecilkan?
Versi yang dapat dibaca:
Semuanya bisa dilihat di sini .
... ditambah versi lain tanpa pudar: 58 - 20 = 38
Jika Anda tidak suka memudar dan tidak keberatan dengan kotoran abu-abu:
sumber
Tcl / Tk, 139 - 20 = 119
Menggunakan kembali jawaban saya sendiri http://codegolf.stackexchange.com/a/143018/29325
Harus dijalankan di shell interaktif
Sayangnya, mengubah
expr int(rand()*
menjadiproc
membuat skrip memiliki satu byte lebih banyak!Untuk berhenti, seseorang hanya perlu mengklik tombol "X" yang tidak dapat dijelaskan.
sumber