Homestuck webcomic populer menggunakan bahasa pemrograman yang disebut ~ATH
untuk menghancurkan alam semesta. Walaupun tantangan golf kode ini bukan untuk menulis program untuk memusnahkan keberadaan kita, kita akan menghancurkan entitas yang lebih jinak (meskipun kurang menarik): variabel .
~ATH
(diucapkan "til death," perhatikan bagaimana ~ath
"tilde ath") bekerja dengan membuat variabel yang dipanggil THIS
, menjalankan perintah dengan EXECUTE
, dan menyelesaikan program dengan THIS.DIE()
. Halaman wiki untuk penggunaan bahasa di Homestuck dapat ditemukan di sini . Tujuan dari tantangan ini adalah menciptakan ~ATH
juru bahasa.
Demi tantangan, saya akan membuat beberapa detail ~ATH
yang tidak benar-benar ada tetapi membuatnya (agak) berguna.
- Bahasa hanya akan bekerja dengan bilangan bulat, yang dideklarasikan dengan
import <variable name>;
. Variabel akan secara otomatis ditetapkan ke nilai 0. Hanya satu variabel pada satu waktu yang dapat diimpor. - Suatu variabel
x
dapat disalin dengan menulisbifurcate x[y,z];
, yang akan menghapus variabelx
dan menggantinya dengan variabel yang identiky
danz
. Perhatikan bahwa itu tidak dapat membuat variabel dengan nama yang sama dengan yang dihapus. Pada dasarnya, variabel diubah namanya, kemudian salinan variabel dengan nama yang berbeda dibuat. Hal ini tampaknya seperti fitur bodoh, tapi kebodohan sangat mendalam tertanam di Homestuck. - Sintaks untuk menulis program yang mengeksekusi kode
x
adalah~ATH(x){EXECUTE(<code>)}
. Jika Anda ingin mengeksekusi kode pada dua variabel secara bersamaan, kode menjadi bersarang, seperti ini:~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Semua perintah di<code>
akan dieksekusi pada keduanyax
dany
. - Sekarang mari kita beralih ke perintah.
+
menambah variabel yang relevan dengan 1 dan-
menurunkannya dengan 1. Dan ... itu saja. - Fitur terakhir
~ATH
adalah bahwa ia membunuh apa pun yang bekerja dengannya. Variabel dicetak dalam format<name>=<value>
(diikuti oleh baris baru) pada perintah[<name>].DIE();
. Setelah itu, program mencetak kataDIE <name>
dan baris baru beberapa kali sama dengan nilai absolut dari nilai variabel. Ketika variabel terbunuh secara bersamaan dengan[<name1>,<name2>].DIE();
(Anda dapat memiliki banyak variabel terbunuh seperti yang Anda inginkan, selama mereka ada),DIE()
perintah dieksekusi pada variabel secara berurutan.
Contoh program
Program 1:
import sollux; //calls variable "sollux"
import eridan; //calls variable "eridan"
~ATH(sollux){EXECUTE(--)} //sets the value of "sollux" to -2
~ATH(eridan){EXECUTE(+++++)} //sets the value of "eridan" to 5
[sollux].DIE(); //kills "sollux", prints "DIE sollux" twice
~ATH(eridan){EXECUTE(+)} //sets the value of "eridan" to 6
[eridan].DIE(); //kills "eridan", prints "DIE eridan" 6 times
Keluaran:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Program 2:
import THIS; //calls variable "THIS"
~ATH(THIS){EXECUTE(++++)} //sets the value of "THIS" to 4
bifurcate THIS[THIS1,THIS2]; //deletes "THIS", creates variables "THIS1" and "THIS2" both equal to 4
~ATH(THIS1){EXECUTE(++)} //sets the value of "THIS1" to 6
[THIS1,THIS2].DIE(); //kills "THIS1" and "THIS2", prints "DIE THIS1" 6 times then "DIE THIS2" 4 times
import THAT; //calls variable "THAT"
bifurcate THAT[THESE,THOSE]; //deletes "THAT", creates variables "THESE" and "THOSE"
~ATH(THESE){~ATH(THOSE){EXECUTE(+++)}EXECUTE(++)} //sets the value of "THESE" and "THOSE" to 3, then sets the value of "THESE" to 5
[THESE,THOSE].DIE(); //kills "THESE" and "THOSE", prints "DIE THESE" 5 times then "DIE THOSE" 3 times
Keluaran:
THIS1=6
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
THIS2=4
DIE THIS2
DIE THIS2
DIE THIS2
DIE THIS2
THESE=5
DIE THESE
DIE THESE
DIE THESE
DIE THESE
DIE THESE
THOSE=3
DIE THOSE
DIE THOSE
DIE THOSE
Ini kode golf, jadi aturan standar berlaku. Kode terpendek dalam byte menang.
sumber
~ATH
menggunakan titik koma sebagai line-akhiran untukimport
,bifurcate
danDIE
perintah. Baik REPL dan file baik-baik saja. Sensitivitas kasus diperlukan baik dalam input maupun output (Saya mencoba mencocokkan yang sebenarnya~ATH
sebanyak mungkin).Jawaban:
Python 2.7.6,
1244130812651253107310721071106510641063 byteBaiklah, saya tidak memecahkan catatan apa pun di sini tapi ini tentang Python terkecil akan pergi sejauh membaca input sekaligus dari file daripada secara berurutan dari waktu ke waktu. Saya akan mencoba untuk memperbaruinya nanti dalam bahasa yang berbeda (dan penerjemah, bukan hanya pengurai). Sampai saat itu, nikmati keburukan mengerikan yang menjijikkan.
Catatan : membuka file yang disebut
t
di direktori kerja. Untuk membuatnya membuka argumen baris perintah, tambahkanimport sys
ke bagian atas file dan ubah't'
kesys.argv[1]
sumber
Python 2,
447475463443 byteTernyata zip dan pengkodean program base64 masih menyimpan byte lebih dari versi normal. Sebagai perbandingan, inilah yang normal:
Pada dasarnya solusi "tongkat sihir sihir" yang diinginkan. Membaca seluruh program dari stdin sebagai string tunggal, menggantikan ~ ATH ekspresi dengan ekspresi Python yang melakukan semantik yang dijelaskan, dan exec () adalah string yang dihasilkan.
Untuk melihat apa yang dilakukannya, lihat program python yang program uji yang disediakan kedua diterjemahkan ke:
Itu hal yang baik bahwa
00 == 0
: PJelas, beberapa byte bisa diselamatkan dengan mengeksploitasi ambiguitas dalam aturan. Misalnya, tidak dikatakan apa yang harus terjadi jika seseorang mencoba
DIE()
variabel yang belumimport
diedit, atau yang sudahbifurcate
d. Dugaan saya berdasarkan deskripsi adalah bahwa harus ada kesalahan. Jika tidak ada kesalahan yang diperlukan, saya bisa menghapusdel
pernyataan itu.EDIT: Memperbaiki bug yang tidak diuji oleh test case. Yaitu, seperti itu, setiap
~ATH
blok mereset variabel ke nol sebelum menambahkannya. Harganya 28 byte untuk memperbaikinya. Jika ada yang melihat cara yang lebih baik untuk mengganti~ATH
balok, saya ingin mengetahuinya.EDIT 2: Menyimpan 12 byte dengan membuka gulungan loop regex, menjadikan semuanya subns dan membiarkan kompresi menangani pengulangan.
EDIT 3: Menyimpan 20 byte lebih banyak dengan mengganti
for
loop dalam dengan perkalian string.sumber
import sys,re
daripadaimport sys;import re
python ~ath.py < program.~ath