Kiat untuk bermain golf di ruang putih

14

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.

Loovjo
sumber
82
Hapus spasi yang tidak perlu.
KSFT
1
s / [^ [: space:]] // g
Digital Trauma

Jawaban:

11

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.

theonlygusti
sumber
6

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.

theonlygusti
sumber
5

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)

Ephphatha
sumber
+1. Perhatikan bahwa ini hanya berlaku untuk heap-address non-negatif. Jadi jika bagian atas tumpukan adalah bilangan bulat negatif, Anda tidak dapat menggunakannya sebagai heap-address.
Kevin Cruijssen
5

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 )

Ephphatha
sumber
5

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 .

( STNdigunakan 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' adalah SSSTTTTSTSN). 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):

  1. Tekan semua nilai untuk karakter (minus jumlah tetap 100) dalam urutan terbalik
  2. NSSN (Buat Label_0; pada dasarnya memulai loop)
    1. SSSTTSSTSSN (Dorong jumlah tetap 100)
    2. TSSS (Tambahkan dua nilai teratas tumpukan bersama-sama)
    3. TNSS (Pop dan cetak nilai sekarang benar sebagai karakter)
    4. 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 (seperti ldalam Hello), atau menyalin nilai dari posisi lain masih dapat digunakan selain untuk golf lebih banyak byte.

Kevin Cruijssen
sumber
4

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

Ephphatha
sumber
4

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.

Ephphatha
sumber
0

Menyalin bilangan bulat sebelumnya bisa lebih pendek daripada membuat yang baru

( STNdigunakan 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 .)

Kevin Cruijssen
sumber