Apa tips umum yang Anda miliki untuk bermain golf di Whitespace? Saya mencari ide yang dapat diterapkan untuk masalah kode-golf dan yang juga setidaknya agak spesifik untuk Whitespace (mis. "Hapus komentar" bukan jawaban).
Silakan kirim satu tip per jawaban.
code-golf
tips
whitespace-language
Loovjo
sumber
sumber
Jawaban:
Saya tidak sepenuhnya yakin apakah ini pertanyaan lelucon atau tidak, jadi saya harap saya tidak diejek karena menganggapnya serius, tapi ...
Tip 1: Jangan Akhiri Program Anda
Spesifikasinya mengatakan bahwa suatu program harus diakhiri dengan tiga baris-feed, di
[LF][LF][LF]
mana yang pertama adalah kontrol aliran IMP, dan dua berikutnya adalah perintah berhenti, tetapi banyak penerjemah hanya akan menjalankan kode Anda tanpa akhir yang tepat. Menghemat 3 karakter dalam program apa pun.sumber
Tips 2: Gunakan Tumpukan Sesedikit Mungkin
Saya biasa menggunakan Heap banyak untuk menghitung loop saya dan semacamnya, tetapi menyadari itu sebenarnya sangat tidak efisien; pertama mendorong alamat, mendapatkan hitungan saat ini, mengambil / menambahkan satu, mendorong kembali alamat, dll.
Sekarang saya hanya mendorong nilai pada stack untuk bertindak sebagai loop counter, kemudian gunakan
[Space][LF][Tab]
perintah swap untuk kembali ke sana ketika saya membutuhkannya. Dibutuhkan banyak pekerjaan di / sekitar, tetapi ketika Anda mendapatkannya benar-benar dapat mengurangi jumlah char Anda.sumber
Gunakan alamat tumpukan sembarang
Banyak penerjemah memungkinkan Anda membaca / menulis ke alamat tumpukan sewenang-wenang alih-alih mulai dari 0 atau 1 dan menghitung. Anda dapat menduplikasi nilai stack yang ada (3 byte) untuk digunakan sebagai alamat alih-alih mendorong nilai baru (minimal 4 byte)
sumber
Urutan kosong adalah label yang valid
[LF][Space][Space][LF]
(Kontrol Aliran - Tandai dengan label '') membuat label kosong yang merupakan target yang valid untuk panggilan melompat atau subrutin. Ini menghemat satu byte saat mendeklarasikan label dan satu byte setiap kali namanya.( Diamati dalam jawaban spasi putih untuk mengimplementasikan mesin kebenaran )
sumber
Turunkan semua karakter dengan jumlah tetap dan tambahkan tepat sebelum mencetak dalam satu lingkaran
Penghargaan untuk @LukStorms , yang menggunakan pendekatan serupa dalam jawabannya untuk tantangan Hello World .
(
STN
digunakan untuk masing-masing Space, Tab, dan New-line.)Mendorong nilai untuk huruf selalu 11 byte (yaitu mendorong nilai 65 untuk karakter 'A'
SSSTSSSSSTN
; mendorong nilai 122 untuk karakter 'z' adalahSSSTTTTSTSN
). Bila Anda ingin menampilkan teks dalam jumlah besar, ini bisa mahal. Sebagai gantinya, Anda dapat menurunkan nilai semua karakter yang ingin Anda cetak dengan jumlah tetap, dan kemudian dalam lingkaran untuk mencetaknya tambahkan jumlah tetap ini.Ini dapat dilakukan dengan kode berikut (mari kita asumsikan nilainya tetap 100 dalam hal ini):
NSSN
(Buat Label_0; pada dasarnya memulai loop)SSSTTSSTSSN
(Dorong jumlah tetap 100)TSSS
(Tambahkan dua nilai teratas tumpukan bersama-sama)TNSS
(Pop dan cetak nilai sekarang benar sebagai karakter)NSNN
(Lompat ke Label_0; pergi ke iterasi loop berikutnya)Ini akan menghentikan program dengan kesalahan ( yang diizinkan sesuai dengan meta ) segera setelah mencoba melakukan Tambah (
TSSS
) dengan tidak lebih dari tumpukan. Saya telah menggunakan ini untuk golf jawaban saya ini (lihat item 5 dan 6 dari Hal - hal yang saya lakukan untuk menurunkan byte-count ).Apakah jumlah tetap 100 adalah pendekatan terpendek tergantung pada apa yang Anda cetak. @LukStorm misalnya menggunakan 107 dalam jawaban Hello World-nya.
Perhatikan bahwa menyalin nilai teratas (
SNS
) untuk dua karakter yang berdekatan yang sama (sepertil
dalamHello
), atau menyalin nilai dari posisi lain masih dapat digunakan selain untuk golf lebih banyak byte.sumber
Melompat ke label yang tidak terdefinisi mengakhiri program (pada beberapa penerjemah)
Ini mulai menerapkan perilaku spesifik, tetapi saya yakin ini diperbolehkan .
TIO (dan mungkin penerjemah lain? Setidaknya tidak bekerja pada ideone) akan menghentikan eksekusi ketika upaya dilakukan untuk melompat ke label yang tidak ada. Jika Anda perlu melakukan perbandingan untuk keluar dari loop ini memungkinkan Anda untuk menyimpan byte dengan tidak mendeklarasikan label istirahat. (Lihat komentar saya di Cetak Teks Yang Tak Terlihat sebagai contoh.)
sumber
Nilai 0 dapat dideklarasikan sebagai angka tanpa digit biner
Tutorial spasi putih menyebutkan bahwa angka dapat berupa jumlah bit / angka biner yang lebar. Ini berarti angka tanpa bit (di luar bit tanda yang diperlukan) adalah representasi valid dari nilai 0.
[Space][Space][Space][LF]
dan[Space][Space][Space][Space][LF]
keduanya mendorong nilai 0 ke stack tetapi yang pertama lebih pendek satu byte.sumber
Menyalin bilangan bulat sebelumnya bisa lebih pendek daripada membuat yang baru
(
STN
digunakan untuk masing-masing Space, Tab, dan New-line.)STS
+ Argumen Nomor dapat digunakan untuk Salin n th item pada stack (diberikan oleh argumen) ke atas tumpukan . Ini dalam beberapa kasus dapat digunakan untuk menyimpan byte.Sebagai contoh, dalam jawaban saya ini saya jelaskan pada item ke-4 Hal yang saya lakukan untuk menurunkan byte-count bagaimana menyalin nilai 1 (0-diindeks) (
STSSTN
) lebih pendek daripada mendorong 12 untuk membuat karakter 'p' (SSSTTSSN
) di bagian"pop"
output. (CATATAN: Saya menggunakan nilai 12 alih-alih 112 untuk karakter 'p', karena saya telah menerapkan tip lain ini untuk menurunkan semua nilai dengan jumlah tetap, yang kami tambahkan sebelum mencetak karakter dalam loop .)sumber