Tamagotchi dan Giga Pets adalah perangkat elektronik kecil yang disimulasikan sebagai hewan peliharaan virtual kecil. Hewan peliharaan ini memiliki beberapa statistik, seperti kesehatan, kelaparan, dll.
Saya baru-baru ini menulis contoh ini:
import msvcrt,os,sys;d=m=100;h=s=t=p=0;f=10
while 1:
os.system('cls'if os.name=='nt'else'clear');print("health:",d,"\nhunger:",h,"\nsleep:",s,"\nfood:",f,"\npotions:",p,"\nmoney:",m);t+=1
if msvcrt.kbhit():
k=ord(msvcrt.getch())
if k==102 and h>8 and f:f-=1;h-=9
if k==115:s=0
if k==112 and p:p-=1;d+=9
if k==98 and m>8:m-=9;p+=1
if k==116 and m>8:m-=9;f+=1
if t>99:
t=0;h+=1;s+=1
if s>80:s=0;h+=9
if h>80:d-=1
if d<1:sys.exit(0)
if d>79:m+=1
Ini adalah hewan peliharaan virtual tanpa tulang dalam 467 byte! Saya kemudian bertanya-tanya seberapa bagus pro golf code bisa melakukannya, jadi sekarang, tantangannya.
Tantangan
Buat program yang melacak 6 statistik hewan peliharaan virtual, dan perbarui dari waktu ke waktu dan sebagai respons terhadap input pengguna. Statistiknya adalah: kesehatan dan uang (mulai dari 100), makanan (mulai dari 10), dan kelaparan, tidur, dan ramuan (mulai dari 0).
Program harus memperbarui nilai sebagai respons terhadap peristiwa berikut:
Ketika program tidak menerima input, program harus melakukan pembaruan secara berkala (interval antara pembaruan tidak boleh lebih pendek dari setengah detik atau lebih lama dari satu detik). Setiap pembaruan melakukan hal berikut:
- Lapar dan Tidur masing-masing bertambah 1.
- Jika Kelaparan 80 atau lebih, Kesehatan berkurang 1.
- Jika Sleep adalah 80 atau lebih, itu diatur ulang ke 0, dan Hunger bertambah dengan tambahan 9.
- Jika Kesehatan 80 atau lebih, Uang bertambah 1.
- Jika Health adalah 0, program keluar.
Program juga harus segera merespons penekanan tombol berikut oleh pengguna (ini berarti Anda harus menggunakan fitur bahasa atau pustaka yang dapat mendeteksi kunci yang ditekan dan meresponsnya segera, daripada hanya membaca dari input standar), melakukan tindakan berikut:
f
: Jika Kelaparan lebih besar dari 8 dan Makanan bukan nol, maka Makanan berkurang 1 dan Kelaparan menurun 9.s
: Tidur diatur ulang ke 0.p
: Jika Ramuan lebih besar dari nol, Ramuan berkurang 1 dan Kesehatan meningkat 9.b
: Jika Uang lebih besar dari 8, maka Uang berkurang 9 dan Ramuan bertambah 1.t
: Jika Uang lebih besar dari 8, maka Uang berkurang 9, dan Makanan meningkat sebesar 1.
Setiap kali nilai statistik berubah, mereka harus ditampilkan di layar dalam formulir . Keenam statistik harus ditampilkan setiap kali ada perubahan; dan statistik dalam tampilan harus dipisahkan dengan koma atau baris baru.Stat: value
Tantangan ini mengikuti aturan kode-golf normal : program terpendek yang memenuhi spesifikasi menang di atas. (Perhatikan bahwa seperti biasa, jika bahasa lebih baru daripada kompetisi, pengajuan harus ditandai sebagai tidak bersaing.)
Jawaban:
C,
424406386357 byteSaya menghargai perlunya input mentah dan pembaruan asinkron dalam spec masalah. Meskipun itu memerlukan beberapa overhead dari pengaturan ncurses dan penangan sinyal, senang memiliki tantangan sesekali yang (semoga) tidak akan otomatis dimenangkan oleh salah satu bahasa golf khusus.
Anda tidak menentukan secara pasti bagaimana permainan berakhir ditunjukkan, jadi yang ini lenyap dengan tangisan kematian Tamagotchi tradisional dari "Pengecualian titik mengambang (inti dibuang)".
Tidak disatukan
sumber
PHP,
396413 byte(Sial, entri golf kode pertama saya yang harus saya edit dalam hitungan byte. Diedit untuk menghapus sleep () panggilan, karena tidak benar-benar mematuhi aturan yang dimaksudkan.)
Membutuhkan OS unix-ish untuk STDIN non-blocking. Anehnya, menggunakan switch / case versus cascading jika / yang lain menghasilkan kode sumber yang lebih pendek, tetapi versi terkompresi berikutnya lebih lama.
Tidak Disatukan:
sumber
sleep(1)
kembali sebelum memproses input. Meskipun itu memproses perintah yang antri sebelum melakukan pembaruan berikutnya, jadi mungkin baik-baik saja.Mathematica, 374 byte
Jeda baris penting karena mereka adalah karakter baris baru dalam string sehingga saya bisa menggunakannya
Row
sebagai gantiColumn
. Jika Anda mengevaluasi ini di buku catatan Mathematica, Anda akan melihat sesuatu seperti ini:Anda harus mengklik di bidang input dan dengan cepat (kurang dari satu detik) mengetik karakter Anda sebelum
Dynamic
menyebabkan bidang input diperbarui. Sakit kepala ini dapat dihindari sepenuhnya jikaEventHandler
berada di selnya sendiri daripada menjadi elemenRow
, tetapi itu akan membutuhkan menyimpan program sebagai file .nb yang akan sangat meningkatkan jumlah byte.sumber
CurrentValue[EvaluationNotebook[], NotebookEventActions] = {"KeyDown" :> Switch[CurrentValue@"EventKey", "f", If[g > 8 && f > 0, f--; g -= 9], "s", s = 0, "p", If[p > 0, p--; h += 9], "b", If[m > 8, m -= 9; p++], "t", If[m > 8, m -= 9; f++]]};
... ini harus membiarkan Anda menghindari kebutuhan untuk mengklik di kolom input. Menambahkan opsi, PassEventsDown -> True
pada bagian akhir kode itu akan memungkinkan Anda terus mengedit buku catatan, tetapi dapat dihapus di bagian paling akhir untuk penghematan byte :)C # 6,
567563 byteTidak Disatukan:
sumber
Clojure,
1224702 byteV2
Membuat semua atom kehilangan variabel bukannya berada di dalam objek negara. Itu saja menyingkirkan banyak kode. Saya juga membuat fungsi pintas
a!
dans!
untuk menambah dan mengurangi dari yangatoms
lebih mudah (pada dasarnya bertindak sebagai+=
dan-=
, karena Clojure tidak memiliki operator tersebut).Saya menyadari bahwa saya mungkin dapat menghapus dengan
atom
s jika saya berhasil mengintegrasikan input kunci ke dalamloop
. Saya harus melihat.Tidak Disatukan:
V1
Ohdeargod. Pasti ruang untuk perbaikan di sini. Masalah seperti ini paling mudah dilakukan dengan efek samping, dan Clojure fungsional, jadi saya mencoba menyalahgunakan
atom
untuk mengurangi jumlah kode yang diperlukan. Sayangnya, saya tidak masuk dengan rencana, jadi agak serampangan sekarang. Saya sudah mendapatkan beberapa ide untuk menyusut.Ini adalah program lengkap. Itu bisa dijalankan dengan menjalankan
-main
.Tidak Disatukan:
sumber
applying-rules
danhandle-keypress
murni. Saya sedang menulis versi "screw-it" sekarang.