Kiat untuk bermain golf di SmileBASIC

11

SmileBASIC patut mendapat perhatian lebih. Saya hanya melihat 3 pengguna di sini (termasuk saya sendiri!) Memberikan jawaban SB, dan sementara itu tidak mengejutkan saya, itu mengecewakan saya. Ini menjadi bahasa berbayar serta menjadi dialek BASIC tentu saja mematikan orang, tetapi bagi mereka yang memilikinya sebenarnya cukup fleksibel dan, secara mengejutkan, dapat golf. Saya pikir saya akan membuka utas kiat ini dan melihat apa yang muncul.

Saya berharap 12Me21 untuk sering berkunjung :)

siput_
sumber

Jawaban:

11

Ganti string!=""denganstring>""

SB memungkinkan Anda untuk melakukan perbandingan string yang lebih besar / lebih sedikit, berdasarkan pada codepoint mereka. Namun, string kosong dianggap sebagai string terkecil yang ada.

Jadi untuk situasi di mana Anda melakukannya, string!=""Anda dapat menggunakan salah satu string>""atau ""<string, karena setiap string lebih besar dari ""dan ""lebih kecil dari setiap string. Bergantung pada apakah Anda menggunakan <atau >bergantung pada apakah pernyataan itu membutuhkan spasi putih sebelum atau sesudah menjadi sintaks yang valid, yang juga dapat menghemat byte Anda.

Sebagai contoh:

WHILE S$!=""

bisa diubah menjadi

WHILE S$>""

dan selanjutnya bermain golf

WHILE""<S$
siput_
sumber
Semua string itu benar. Bahkan yang kosong.
snail_
Ah, baiklah. Masuk akal.
Rɪᴋᴇʀ
6

Menggunakan ?, ., @, dan string tertutup

Banyak dialek dukungan BASIC ?untuk pencetakan, dan SB tidak terkecuali. Memiliki fungsi output teks yang sangat singkat adalah keuntungan besar.

Dalam SmileBASIC, .dievaluasi menjadi 0.0, sehingga dapat digunakan sebagai pengganti 0 untuk menghemat ruang. Misalnya: SPSET 0,21bisa SPSET.,21, hemat 1 byte. ( SPSET0,21tidak valid karena SPSET0bisa menjadi fungsi yang ditentukan pengguna) EXEC.adalah cara yang sangat singkat untuk membuat loop program selamanya (tapi itu me-reset semua variabel Anda, jadi itu tidak selalu dapat digunakan)

Label (digunakan untuk GOTO,, GOSUBdan membaca DATA) direpresentasikan seperti @LABELpada SmileBASIC. Ketika digunakan dalam ekspresi, mereka sebenarnya diperlakukan sebagai string. Sebagai contoh, BGMPLAY"@305C"dapat ditulis sebagaiBGMPLAY@305C

String secara otomatis ditutup pada akhir baris (atau akhir program). ?"Hello, World!"dapat ditulis sebagai ?"Hello, World!. Ini juga dapat digunakan untuk membuat program lebih mudah dibaca dengan memecahnya menjadi beberapa baris tanpa mengubah panjangnya: ?"Meow"BEEP 69bisa

?"Meow
BEEP 69
12Me21
sumber
Wow, menggunakan label untuk memulai MML adalah gila. Tidak akan pernah memikirkan itu, meskipun itu membatasi rangkaian karakter Anda.
snail_
Tempat lain yang saya gunakan adalah untuk memeriksa apakah digit heksadesimal adalah angka atau huruf: @A<POP(H$)lebih pendek dari "@"<POP(H$)( Atidak masalah, itu hanya memeriksa karakter pertama karena tidak akan pernah sama)
12Me21
3

Gunakan pengindeksan string sebagai ganti MID$

The MID$fungsi adalah fungsi umum di banyak dasar-dasar untuk mendapatkan substring dari suatu tempat di tengah-tengah string. Namun, jika Anda hanya perlu mendapatkan karakter di beberapa indeks, menggunakan pengindeksan string jauh lebih pendek. Sebagai contoh:

PRINT MID$("ABC",2,1)
PRINT "ABC"[2]

Kedua cetak ini C. Strings mendukung pengindeksan seperti array berdasarkan karakter, jadi jika Anda hanya perlu memeriksa satu karakter pada satu waktu, ini adalah cara terbaik untuk melakukannya.

siput_
sumber
Anda harus berbicara tentang bagaimana string dapat dimodifikasi dengan cara ini. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12Me21
Saya mungkin akan menulis seperangkat jawaban tentang bagaimana string pada dasarnya adalah array karakter tetapi lebih baik lagi, karena memasukkan semuanya ke dalam satu adalah tugas yang cukup.
snail_
... atau Anda dapat menulis beberapa;)
snail_
Saya tidak terlalu terbiasa dengan cara kerjanya dalam bahasa lain.
12Me21
2

Kapan harus menggunakan :(atau tidak)

The :karakter digunakan sebagai pernyataan-breaker di SB. Pada dasarnya, Anda menggunakannya untuk menumpuk pernyataan pada satu baris seperti:

PRINT "HELLO!":PRINT "GOODBYE!"

Jika tidak, pernyataan rata-rata Anda dipatahkan oleh baris baru:

PRINT "HELLO!"
PRINT "GOODBYE!"

Pada kenyataannya, Anda seringkali tidak perlu menggunakan usus besar sama sekali. Selama pernyataan dapat dipecah menjadi token yang valid secara sintaksis, parser cenderung mencari tahu ketika satu berakhir dan yang lainnya dimulai. Hal yang sama sering berlaku untuk spasi putih.

PRINT"HELLO!"PRINT"GOODBYE!"

Tentu saja, ini tidak selalu berhasil. Selalu ada kasus ambigu dan sintaks yang tidak valid di mana Anda harus secara eksplisit melanggar pernyataan. Ambil contoh:

PRINT "HELLO";END

Tanda titik koma berarti PRINTmengharapkan ekspresi lain untuk dicetak, kecuali jika pernyataan tersebut terputus di sana (kami menggunakan tanda titik koma untuk menekan baris baru.) Di sini diasumsikan ENDsebagai nilai, meskipun merupakan kata kunci, dan mencoba untuk mencetaknya, menghasilkan dalam kesalahan. Jadi, kita harus secara eksplisit mematahkan pernyataan ini, baik itu titik dua atau baris baru.

Secara umum, jika sesuatu tampak ambigu, cobalah untuk melihat apakah itu berfungsi. Jika tidak, hancurkan pernyataan itu. Selain itu, apa pun yang akan menghasilkan sintaks tidak valid tidak disorot dengan benar seperti yang disebutkan 12Me21.

siput_
sumber
2

Gunakan stabilo sintaksis!

Editor kode SmileBASIC memiliki stabilo sintaksis bawaan, yang dapat digunakan untuk menentukan apakah kode akan berfungsi atau tidak. Misalnya, jika Anda mencoba melakukannya BEEP0, itu tidak akan menyorotnya, karena harus ada ruang antara fungsi dan angka. Namun BEEP.berhasil, karena. bukan angka.

Biasanya kode like X=7BEEPadalah valid, karena fungsi tidak bisa dimulai dengan angka, jadi SB mengasumsikan itu 7dan BEEPterpisah. Namun. X=7ENDTIDAK diperbolehkan (dan tidak disorot), karena mencoba menafsirkan 7E...sebagai angka, tetapi karena tidak ada angka setelah E, gagal, menyebabkan kesalahan. Biasanya ini akan sangat sulit untuk diketahui, tetapi dengan stabilo sintaksis yang sangat andal, akan lebih mudah untuk mengatakan apa yang Anda bisa dan tidak bisa lakukan.

Highlighter sintaks SmileBASIC saya dirancang untuk (mudah-mudahan) cocok dengan perilaku SB, sehingga Anda dapat menggunakannya untuk memeriksa apakah kode itu valid.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<script src="https://12Me21.github.io/sbhighlight3/sbhighlight.js"></script>
		<link rel="stylesheet" type="text/css" href="https://12Me21.github.io/sbhighlight3/style.css">
		<link rel="stylesheet" type="text/css" href="https://12Me21.github.io/external/smilebasicfont.css">
		<script>
			function update(event){
				$code.textContent=$input.innerText;
				//must be innerText since contentedible and textContent are too dumb to understand linebreaks
				//contenteditable adds <br>s which textContent ignores
				//whyyyyy
				applySyntaxHighlighting($code,true);
			}
			
			function setCaretPosition(elem,caretPos){
				if(elem){
					if(elem.createTextRange) {
						var range=elem.createTextRange();
						range.move('character',caretPos);
						range.select();
					}else{
						if(elem.selectionStart){
							elem.focus();
							elem.setSelectionRange(caretPos,caretPos);
						}else
							elem.focus();
					}
				}
			}
		</script>
		<style>
			#editcontainer{
				position: absolute;
			}
			#editcontainer>pre{
				position: absolute;
				left: 0;
				top: 0;
				
			}
			pre.csssucks *{
				color:transparent !important;
				background-color:transparent !important;
				caret-color: white;
			}
			pre.csssucks {
				color:transparent !important;
				background-color:transparent !important;
				caret-color: white;
				border-color:transparent;
				padding-right: 50ch;
			}
		</style>
	</head>
	<body>
		Use SB font:<input type="checkbox" autocomplete="off" onchange="$code.dataset.sbfont=$input.dataset.sbfont=this.checked;update()"></input>
		<button onclick="update()">force update</button>
		<hr>
		<div id="editcontainer">
			<pre id="$code">test</pre>
			<pre id="$input" class="csssucks" contenteditable="true" spellcheck="false" onkeydown="setTimeout(function(){update(event)},2);">test</pre>
		</div>
	</body>
</html>

12Me21
sumber
1

Hindari operator MOD

Operator modulus sangat panjang, dan harus dihindari jika memungkinkan.

Jika Anda mendapatkan karakter dari string, Anda bisa mengulangi string:

"ABC"[X MOD 3]
("ABC"*9)[X] (assuming X will always be less than 27)

Terkadang Anda dapat menyimpan 1 karakter dengan AND:

X MOD 4
3AND X
12Me21
sumber
0

Menghilangkan OUTnilai kembali

Sebuah OUTfungsi bentuk adalah salah satu dengan beberapa hasil; Anda menentukan variabel untuk menerima nilai kembali setelah OUTkata kunci. Contoh menggunakan DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

Tetapi bagaimana jika Anda hanya menginginkan salah satu dari nilainya, seperti bulan ini? Anda dapat "mengabaikan" sisa nilai dengan hanya tidak menulis nama variabel apa pun untuk menerimanya! Namun, Anda harus meninggalkan koma (selain dari pengembalian opsional sesekali.)

DTREAD OUT ,monthVar,

Yang bisa lebih lanjut golf

DTREAD OUT,M,
siput_
sumber
0

Menggunakan LAST()

Sekarang SmileBASIC 4 keluar di Jepang, kita dapat memeriksa beberapa potensi penghematan golf. Salah satu yang langsung melompat ke saya adalah LAST()fungsi baru , yang mengembalikan indeks terakhir dari array atau string. Anda dapat menyimpan satu byte.

LEN(v)-1 'old way
LAST(v)  'new way
siput_
sumber