Kiat bermain golf di INTERCAL

10

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...

Baconaro
sumber
Sebagian besar bahasa tidak memiliki atau memerlukan tag sendiri di sini, karena tantangan khusus bahasa umumnya tidak disarankan.
Alex A.
9
Sebuah petunjuk bahwa ini mungkin bukan bahasa golf terbaik, dari halaman wikipedia-nya:Despite the language's intentionally obtuse and wordy syntax,
isaacg

Jawaban:

2

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 NOTada dua token, tetapi dapat ditulis DONOTtanpa pengurai parser (dalam hampir semua implementasi banyak digunakan). (Tentu saja, Anda juga bisa menulis DON'T, tetapi itu tidak terser. Namun, mungkin lebih mudah dibaca. PLEASEN'TMungkin lebih sulit untuk dibaca daripada PLEASE 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 dari DO READ OUTmemberi yang dapat membingungkan beberapa parser INTERCAL yang lebih lama karena tertanamDOREADOUTDO(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
2

Fokus pada melakukan sebanyak mungkin pekerjaan dalam satu pernyataan

Pengidentifikasi pernyataan INTERCAL agak bertele-tele; DOadalah dua karakter derau pada setiap pernyataan, nama pernyataan itu sendiri juga cenderung cukup panjang, dan Anda harus melemparkan PLEASEsetiap sekarang dan kemudian untuk membuat pengurai bahagia. (Yang terbaik yang dapat Anda lakukan adalah rasio empat banding DOsatu PLEASE, 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 #1ke .1dan #2untuk .2, alih-alih melakukannya dengan cara INTERCAL-72 yang jelas:

DO.1<-#1DO.2<-#2

itu sangat berharga mempertimbangkan overloading variabel acak untuk memungkinkan Anda menetapkan keduanya sekaligus:

DO:1<-#1$#2

(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 .1dan .2lebih dari sekali.

Bukan hanya menghitung perintah di mana trik ini bekerja. Jika Anda perlu menyimpan variabel dua kali, jangan lakukan ini seperti ini:

DOSTASH.1DOSTASH.1

tapi seperti ini:

DOSTASH.1+.1

( +Notasi berfungsi untuk sebagian besar perintah di mana secara konseptual masuk akal.)


sumber
2

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 NEXTdua kali dan kemudian melakukan perhitungan RESUME. (Dalam kode modern, sering kali yang dihitung COME FROMakan lebih baik, tetapi tip ini menganggap kode Anda lebih disukai NEXT.) Anda hampir pasti harus membayar byte untuk yang pertama NEXT, karena ia melompat dari satu cabang "jika" ke yang lain. Berbagi yang kedua NEXTjuga nontrivial, kecuali jika Anda memiliki banyak pernyataan "jika" yang pergi ke tempat yang sama setelah melihat a #1. Namun, RESUMEbisa 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 RESUMEkemungkinan waran nomor baris satu digit, sehingga NEXTpernyataan kedua Anda bisa sesingkat mungkin. Jika memungkinkan, cobalah untuk membuatnya menjadi komputasi RESUMEyang secara alami akan terjadi dalam kode Anda (memang, ini sulit, karena jarang bagi mereka muncul dalam "aliran normal" kode daripada NEXTdisunting ke); kemudian, satu-satunya biaya adalah nomor baris. Anda harus menggunakan variabel boolean tunggal untuk semua ini NEXT; 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 RESUMEsangat 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 dapat NEXTlangsung ke internal perpustakaan standar jika Anda ingin, dan khususnya, dapat NEXTuntuk 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):

(1001) DO RESUME .5

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

(9)DO(1001)NEXT

yang hanya sedikit lebih lama dari

(9)DORESUME.5

dan memiliki manfaat yang menjadi boolean #2dan #3(yang lebih sulit dibaca, tetapi biasanya lebih mudah untuk menghasilkan). Sebenarnya, bahkan mungkin ada baiknya memasukkan kode tambahan untuk menangani #0dan #1jika Anda akan banyak iffing (tapi dihitung COME FROMmungkin akan bekerja lebih baik dalam kasus ini kecuali persyaratan Anda sangat aneh).


sumber
2

INTERCAL tidak menentukan prioritas, tetapi juga tidak kesalahan pada prioritas yang mendua

Ekspresi suka

#1$#2~#3

ambigu, dan bisa berarti

'#1$#2'~#3

atau

#1$'#2~#3'

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
2

Dalam C-INTERCAL, pertimbangkan menyingkat menggunakan kode CREATE

The CREATEpernyataan 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