Kiat bermain golf dalam bahasa 2D

18

Apa tip umum yang Anda miliki untuk bermain golf dalam bahasa pemrograman 2 dimensi? Saya mencari kiat yang dapat diterapkan untuk masalah kode-golf dan khusus untuk bahasa pemrograman 2D, tetapi tidak khusus untuk satu bahasa (Respons seperti "hapus komentar" dan "gunakan Moperasi" bukan jawaban).

Silakan kirim satu tip per jawaban.

Wisaya Gandum
sumber
Bukankah seharusnya pertanyaan ini ada di Meta?
Mr Lister
2
Ada meta pertanyaan terkait di sini: apa adalah ukuran program 2D? Area yang tertutup? Luas lambung cembung? Luas sumbu persegi yang berisi persegi panjang? Semua mungkin ukuran yang lebih baik daripada beberapa bentuk ukuran ASCII.
MSalters
@MrLister Tips pertanyaan ada di topik untuk situs utama. Jika Anda melihatnya, Anda dapat melihat bahwa kami memiliki banyak pertanyaan di bawah tag tips.
Wheat Wizard
@MSalters Sama seperti setiap panjang bahasa pemrograman lainnya diukur dalam byte. Beberapa perancang bahasa memungkinkan ada bahasa 2D untuk diatur dengan cara yang berbeda, seperti Hexagony atau Cubix, dan itu terserah mereka.
Wheat Wizard

Jawaban:

19

Hindari celah horisontal

Seringkali, kode akan meninggalkan banyak ruang kosong ke sisi kiri program, seperti itu.

abc
  d
  e

Ini menambahkan 4 byte, ketika ini bisa dihindari dengan menyelaraskan ke kiri.

cde
b
a

Jika Anda perlu menggunakan celah besar spasi putih, cobalah membuatnya vertikal, bukan horizontal.

########
#      #
#      #
#      #

vs.

####
#
#
#
#
#
#
####
ATaco
sumber
11

Gunakan satu dimensi bila memungkinkan

Biasanya, program yang lebih sederhana dapat ditulis dalam satu baris. Misalnya, program kucing klasik bisa berupa:

>iv
^o<

Tetapi orang dapat menyalahgunakan perilaku membungkus dan membuat ini:

io

Atau, dalam bahasa tanpa perilaku pembungkusan seperti itu:

> ?oi<

(Dengan asumsi ?tidak muncul.) Dalam kasus bahasa non-pembungkus, loop eksplisit seringkali lebih baik.

Dengan perintah lompat

Dalam bahasa 2D dengan lompatan dan perintah lompatan bersyarat, sebuah program bisa terlihat seperti ini:

abc >de?v;
    ^hgf<

Ini juga bisa:

abc de?!;hgf04&

(Jika !trampolin, dan &melompat ke posisi)

Conor O'Brien
sumber
Bukankah contoh ketiga Anda lakukan ioiioiioidll?
ASCII
@ ASCII-only Memang benar. Ups.
Conor O'Brien
1
Anda mungkin harus menyatakan apa yang dilakukan beberapa perintah yang kurang teratur. Misalnya saya tidak tahu apa yang io;harus dilakukan, dan yang saya tahu adalah itu ?tidak muncul. Sepertinya ini adalah perintah ikan, tetapi saya tidak berpikir mereka sangat standar.
Wheat Wizard
2
Dalam beberapa bahasa 2D tanpa perintah skipping bersyarat (seperti Labyrinth) Anda juga dapat sering menulis perulangan program-program tunggal dengan secara kondisional mengakhiri program dengan pembagian dengan nol.
Martin Ender
10

Pengembalian Carriage Apakah Juga Bytes

Semakin sedikit 2D yang dapat Anda buat, semakin baik. Pengembalian carriage adalah larangan lain. Tanpa mengabaikan tips dari @ATaco dan @ ASCII saja, coba dan jaga dimensi Y sekecil mungkin.

Ini

###
####
########

lebih baik dari

###
###
###
##
#
#
#
#
MickyT
sumber
Pengembalian kereta tidak selalu byte. \n(umpan baris) adalah akhir baris yang secara teratur digunakan dalam teks rata kiri pada sistem POSIX, meskipun Windows dan Mac OS (pra-macOS) menggunakan kombinasi \n(umpan baris) dan \r(carriage-return).
wizzwizz4
9

KERING (Jangan Ulangi Diri Sendiri)

Walaupun abstrak dengan fungsi biasanya lebih lama di Code Golf, itu bisa sangat membantu untuk bahasa 2D. Coba ulang kode Anda sehingga dapat menggunakan kembali potongan yang sama, memasukkan / keluar dengan dua cabang eksekusi yang berbeda.

Cyoce
sumber
8

Jalur interleave

Biasanya dalam bahasa 2D ada IP yang bergerak sesuai dengan perintah arah. Karena spasi adalah byte yang terbuang, hampir selalu lebih efisien untuk mengatur ulang program sehingga bergerak lebih dekat ke kiri sesering mungkin, menghemat kebutuhan ruang pengisi yang tidak perlu.

Khusus ASCII
sumber
2

Gunakan cermin

Cermin kadang-kadang dapat digunakan dalam dua jalur pada saat yang sama (setiap jalur memantul dari satu sisi cermin). Ini mungkin tampaknya tidak membantu, tetapi mungkin memungkinkan Anda untuk mengatur ulang program Anda, atau jika Anda memiliki banyak jika perubahan arah mereka mungkin dapat diganti dengan mirror yang lebih sedikit.

Khusus ASCII
sumber
2

Hafalkan idiom

Berikut adalah beberapa "idiom" yang melakukan hal-hal tertentu, tergantung pada sifat bahasa.

Kode pseudo-linear

Jika pembuatan kode dinamis diperlukan, mungkin berguna untuk menggunakan model kode pseudo-linear:

v
\"line 1"
\"line 2"
.
.
\"line N"

Dengan asumsi \dan vmaksud apa yang biasanya mereka lakukan.

Loop tak terbatas

Di hampir semua bahasa 2D, ><adalah loop tak terbatas dan tidak dapat dipecahkan. Jika, karena alasan tertentu, Anda perlu melakukan ini, ini adalah cara terbaik, meskipun betapa baiknya ini terlihat:

>v
^<

Bahkan, jika Anda membuat kode Anda 1-liner , Anda bisa menggunakan ^atau v, dengan demikian:

i?vo;

Ini vakan mengirim IP ke dirinya sendiri, membungkus. Anda mungkin masih dapat menggunakan pendekatan ini dalam keadaan apa pun di mana perintah arah menunjuk ke serangkaian no-op (relatif).

Kerangka quine

Biasanya, bahasa dengan kerangka string / kutipan dapat memiliki quine seperti ini:

<quote><generate "><output stack><terminate>

Untuk> <>, ini akan terlihat seperti:

":1-r>o<#

Kecuali yang ini keluar dengan kesalahan sebagai penghentian. Ini mungkin yang terpendek > <> quine , atau, paling tidak, yang terpendek yang saya temukan.

Conor O'Brien
sumber
Ini sepertinya bukan tip.
Wheat Wizard
@WheatWizard Saya menyimpannya bersama karena membaginya menjadi kurang masuk akal bagi saya, karena semuanya adalah idiom tata letak program yang umum.
Conor O'Brien
Mengapa Anda memiliki <quine di> <>?
Jo King
@JoKing Saya tidak begitu yakin lol
Conor O'Brien
Juga, "ujung - ujungnya berada di sisi yang salah. Kiatnya bagus jika tidak, saya telah menggunakan kerangka umum itu dalam banyak jawaban saya
Jo King