Apa tips umum yang Anda miliki untuk bermain golf di INTERCAL ? Saya sedang mencari ide yang dapat diterapkan pada tantangan golf kode dan juga setidaknya agak spesifik untuk INTERCAL (yaitu "hapus komentar" bukan jawaban yang berguna).
Saya tahu bahasa eksotis bisa sangat berguna untuk memenangkan kontes golf, tetapi saya tidak melihat banyak kode INTERCAL di sini. Apakah Anda memiliki saran yang dapat membantu orang mendapatkan ukuran kode kompetitif dengan INTERCAL? Mungkinkah bahasa ini kompetitif?
INTERCAL sangat kurang dimanfaatkan sehingga bahkan tidak memiliki tag. Sangat sedih...
Despite the language's intentionally obtuse and wordy syntax,
Jawaban:
Penghapusan spasi putih / "noise" bisa lebih jauh dari yang Anda harapkan
INTERCAL adalah bahasa yang tidak sensitif spasi putih. Namun, tidak seperti kebanyakan bahasa yang tidak sensitif spasi putih, ketidakpekaan berjalan lebih jauh dari yang Anda duga.
Sebagai contoh,
DO NOT
ada dua token, tetapi dapat ditulisDONOT
tanpa pengurai parser (dalam hampir semua implementasi banyak digunakan). (Tentu saja, Anda juga bisa menulisDON'T
, tetapi itu tidak terser. Namun, mungkin lebih mudah dibaca.PLEASEN'T
Mungkin lebih sulit untuk dibaca daripadaPLEASE NOT
.) Sebenarnya, ada beberapa perdebatan mengenai apakah ruang putih melakukan sesuatu sama sekali; setidaknya satu parser INTERCAL memungkinkannya bahkan di dalam konstanta numerik (bukan yang sangat berguna saat bermain golf). Satu hal yang perlu diingat adalah bahwa menghapus spasi dariDO READ OUT
memberi yang dapat membingungkan beberapa parser INTERCAL yang lebih lama karena tertanamDOREADOUT
DO
(walaupun penulis mereka umumnya menganggap ini sebagai bug, dan karenanya saat ini biasanya berfungsi dalam program yang valid, tidak disarankan untuk meletakkan kode seperti ini di sekitar kesalahan sintaks, karena mungkin akan lebih sulit untuk disambiguasi saat itu).Ingat juga bahwa Anda dapat melakukan overpunch karakter untuk menghemat ruang. Di ASCII, Anda hanya bisa melakukan ini dengan
'.
→!
, tetapi itu adalah trik yang sangat berguna. (Ketika Anda tidak menggunakan array, tidak ada kemungkinan ambiguitas berkilau bahkan ketika semua karakter pengelompokan Anda adalah sama, jadi untuk entri golf, disarankan untuk berpegang teguh hanya'
kecuali jika array subscript benar-benar membutuhkan"
.) Kutu buku bisa menjadi direpresentasikan dalam satu byte dengan menggunakan?
singkatan (C-INTERCAL) atau Latin-1 untuk¥
(CLC-INTERCAL), daripada tiga yang dibutuhkan INTERCAL-72.sumber
Fokus pada melakukan sebanyak mungkin pekerjaan dalam satu pernyataan
Pengidentifikasi pernyataan INTERCAL agak bertele-tele;
DO
adalah dua karakter derau pada setiap pernyataan, nama pernyataan itu sendiri juga cenderung cukup panjang, dan Anda harus melemparkanPLEASE
setiap sekarang dan kemudian untuk membuat pengurai bahagia. (Yang terbaik yang dapat Anda lakukan adalah rasio empat bandingDO
satuPLEASE
, artinya Anda menggunakan 14 karakter dalam pengidentifikasi untuk setiap 5 perintah.) Di sisi lain, sintaks ekspresi cukup singkat (konyol, tetapi singkat). Ini berarti bahwa sering kali layak memasukkan bagian dari program Anda ke dalam satu ekspresi bahkan ketika menggunakan banyak pernyataan akan menjadi cara yang lebih "alami" untuk melakukan sesuatu.Misalnya, jika Anda ingin menetapkan
#1
ke.1
dan#2
untuk.2
, alih-alih melakukannya dengan cara INTERCAL-72 yang jelas:itu sangat berharga mempertimbangkan overloading variabel acak untuk memungkinkan Anda menetapkan keduanya sekaligus:
(dengan
:1/!1$.2'
dilemparkan di suatu tempat sebelumnya dalam program; perhatikan bahwa notasi ini post-date INTERCAL-72 dengan cara yang cukup, jadi Anda harus menggunakan INTERCAL modern untuk ini untuk bekerja). Ini hanya sedikit lebih lama bahkan jika Anda mempertimbangkan pengaturan, dan menjadi lebih pendek jika Anda perlu, atau dapat mengatur, secara bersamaan ditugaskan ke.1
dan.2
lebih dari sekali.Bukan hanya menghitung perintah di mana trik ini bekerja. Jika Anda perlu menyimpan variabel dua kali, jangan lakukan ini seperti ini:
tapi seperti ini:
(
+
Notasi berfungsi untuk sebagian besar perintah di mana secara konseptual masuk akal.)sumber
Gunakan RESUME tunggal untuk semua gaya INTERCAL-72 jika dibuat
Jika Anda perlu menulis yang setara dengan pernyataan "jika", metode normal menggunakan kode INTERCAL-72 adalah
NEXT
dua kali dan kemudian melakukan perhitunganRESUME
. (Dalam kode modern, sering kali yang dihitungCOME FROM
akan lebih baik, tetapi tip ini menganggap kode Anda lebih disukaiNEXT
.) Anda hampir pasti harus membayar byte untuk yang pertamaNEXT
, karena ia melompat dari satu cabang "jika" ke yang lain. Berbagi yang keduaNEXT
juga nontrivial, kecuali jika Anda memiliki banyak pernyataan "jika" yang pergi ke tempat yang sama setelah melihat a#1
. Namun,RESUME
bisa di mana saja di dalam program (karena kontrol akan meninggalkannya langsung di mana saja).Ada dua cara untuk menangani ini. Jika Anda memiliki banyak pernyataan "jika", maka
RESUME
kemungkinan waran nomor baris satu digit, sehinggaNEXT
pernyataan kedua Anda bisa sesingkat mungkin. Jika memungkinkan, cobalah untuk membuatnya menjadi komputasiRESUME
yang secara alami akan terjadi dalam kode Anda (memang, ini sulit, karena jarang bagi mereka muncul dalam "aliran normal" kode daripadaNEXT
disunting ke); kemudian, satu-satunya biaya adalah nomor baris. Anda harus menggunakan variabel boolean tunggal untuk semua iniNEXT
; konsensus universal di sini adalah untuk digunakan.5
, sebagian besar karena itu adalah variabel yang digunakan perpustakaan standar untuk nilai pengembalian boolean.Atau, dimungkinkan untuk menggunakan fitur tidak terdokumentasi (secara teknis tidak terdokumentasi, karena saya memasukkan petunjuk ke dalam dokumentasi INTERCAL ketika saya perhatikan) dari pustaka standar. Karena lokasi pusat untuk suatu
RESUME
sangat berguna, perpustakaan standar menggunakannya secara internal. Nomor baris di INTERCAL yang global (dengan namespacing konvensi, namun yang dapat rusak jika Anda tahu apa yang Anda lakukan), sehingga Anda dapatNEXT
langsung ke internal perpustakaan standar jika Anda ingin, dan khususnya, dapatNEXT
untuk yang lokasi RESUME pusat . Ini cukup populer di kode INTERCAL yang ada sehingga penggantian perpustakaan standar cenderung harus menerapkannya untuk menghindari melanggar program yang ada.Baris yang dimaksud adalah (baik secara harfiah atau efektif, tergantung pada implementasinya):
Alasan utama untuk tidak menggunakan ini adalah nomornya yang panjang; jika Anda perlu melakukan banyak gaya INTERCAL-72 jika konstruksinya, akan lebih baik menggunakan gaya Anda sendiri untuk memberikan nomor yang lebih pendek.
Tentu saja, Anda dapat menggabungkan teknik, menulis sesuatu seperti
yang hanya sedikit lebih lama dari
dan memiliki manfaat yang menjadi boolean
#2
dan#3
(yang lebih sulit dibaca, tetapi biasanya lebih mudah untuk menghasilkan). Sebenarnya, bahkan mungkin ada baiknya memasukkan kode tambahan untuk menangani#0
dan#1
jika Anda akan banyak iffing (tapi dihitungCOME FROM
mungkin akan bekerja lebih baik dalam kasus ini kecuali persyaratan Anda sangat aneh).sumber
INTERCAL tidak menentukan prioritas, tetapi juga tidak kesalahan pada prioritas yang mendua
Ekspresi suka
ambigu, dan bisa berarti
atau
Spec INTERCAL sengaja membuatnya tidak jelas yang dimaksud, dan secara umum tidak ada standar (meskipun C-INTERCAL dan CLC-INTERCAL berusaha untuk mencocokkan satu sama lain dalam kasus yang lebih sederhana). Yang mengatakan, aslinya tidak salah ; ini ambigu dan saya tidak akan menyarankan menggunakannya dalam kode produksi (tapi kemudian, saya tidak akan menyarankan menggunakan INTERCAL sendiri dalam kode produksi), tetapi itu akan memiliki beberapa makna di sebagian besar kompiler.
Dengan kata lain, mungkin ada baiknya menghapus karakter pengelompokan dan berharap program Anda masih berfungsi. Kebanyakan penafsir akan menguraikan ekspresi ambigu yang diberikan secara konsisten, jadi untuk setiap pasangan karakter pengelompokan, ada peluang 1 banding 2 yang tidak perlu; yang bisa menambah penghematan. (Sayangnya, parser INTERCAL cenderung cukup membingungkan bahwa tidak ada yang sepenuhnya yakin apa aturan sebenarnya adalah , tapi biasanya dapat ditentukan dengan percobaan. Dalam kasus yang paling sederhana, operator cenderung semua memiliki didahulukan sama dan memiliki associativity konsisten.)
sumber
Dalam C-INTERCAL, pertimbangkan menyingkat menggunakan kode
CREATE
The
CREATE
pernyataan memungkinkan Anda untuk membuat sintaks baru. Ini sangat berguna dalam bermain golf karena memungkinkan Anda untuk memberikan pernyataan nama yang lebih pendek. Anda juga dapat menggunakannya untuk secara efektif "mendefinisikan fungsi" melalui pembuatan operator baru (yang memiliki keuntungan besar yang memungkinkan Anda memanggil fungsi di tengah ekspresi).Biaya setup di sini cukup tinggi, tetapi jika ada konstruksi yang banyak Anda gunakan, menciptakan sintaks yang lebih pendek untuk itu mungkin akan menjadi ide yang baik.
sumber