Suggerimenti per giocare a golf in SmileBASIC


11

SmileBASIC merita più attenzione. Ho visto solo 3 utenti qui (incluso me stesso!) Fornire risposte SB, e sebbene ciò non mi sorprenda, mi delude. Essendo una lingua pagata, oltre ad essere un dialetto BASIC, sicuramente le persone si allontanano, ma per chi lo possiede è in realtà piuttosto flessibile e, sorprendentemente, golfabile. Ho pensato di aprire questo thread di suggerimenti e vedere cosa succede.

Mi aspetto che 12Me21 visiti frequentemente :)

Risposte:


11

Sostituisci string!=""constring>""

SB ti consente di fare confronti maggiori / minori sulle stringhe, in base ai loro punti di codice. Tuttavia, la stringa vuota è considerata la stringa più piccola che ci sia.

Quindi, per le situazioni in cui lo fai string!=""puoi usare uno string>""o ""<string, poiché ogni stringa è maggiore di ""ed ""è minore di ogni stringa. A seconda che si usi <o >dipende dal fatto che l'istruzione abbia bisogno di spazi prima o dopo per essere sintassi valida, che può anche salvare byte.

Per esempio:

WHILE S$!=""

può essere trasformato in

WHILE S$>""

e ulteriormente giocato a

WHILE""<S$

Tutte le stringhe sono veritiere. Anche quelli vuoti.
lumaca_

Ah ok. Ha senso.
Rɪᴋᴇʀ

6

Usando ?, ., @, e archi non chiusi

Molti dialetti del supporto BASIC ?per la stampa e SB non fanno eccezione. Avere una funzione di output del testo estremamente breve è un grande vantaggio.

In SmileBASIC .viene valutato 0.0, quindi può essere utilizzato al posto di 0 per risparmiare spazio. Ad esempio: SPSET 0,21può essere SPSET.,21, salvando 1 byte. ( SPSET0,21non è valido perché SPSET0potrebbe essere una funzione definita dall'utente) EXEC.è un modo estremamente breve per rendere un ciclo del programma per sempre (ma reimposta tutte le variabili, quindi non è sempre utilizzabile)

Le etichette (usate per GOTO, GOSUBe leggere DATA) sono rappresentate come @LABELin SmileBASIC. Se utilizzati in un'espressione, vengono in realtà trattati come stringhe. Ad esempio, BGMPLAY"@305C"può essere scritto comeBGMPLAY@305C

Le stringhe vengono automaticamente chiuse alla fine di una riga (o alla fine del programma). ?"Hello, World!"può essere scritto come ?"Hello, World!. Questo può anche essere usato per rendere i programmi più leggibili suddividendoli in più righe senza cambiare la lunghezza: ?"Meow"BEEP 69può essere

?"Meow
BEEP 69

Caspita, usare le etichette per avviare MML è folle. Non ci avrei mai pensato, anche se limita il tuo set di caratteri.
lumaca_

Un altro posto in cui l'ho usato è stato per verificare se una cifra esadecimale era un numero o una lettera: @A<POP(H$)è più corta di "@"<POP(H$)( Anon importa, controlla sempre e solo il primo carattere poiché non sarà mai più la stessa)
12Me21

3

Utilizzare l'indicizzazione di stringa anziché MID$

La MID$funzione è una funzione comune in molti BASIC per ottenere una sottostringa da qualche parte nel mezzo di una stringa. Tuttavia, se hai solo bisogno di ottenere il carattere in qualche indice, l'utilizzo dell'indicizzazione delle stringhe è molto più breve. Per esempio:

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

Entrambe queste stringhe di stampa C. supportano l'indicizzazione simile a matrice in base a un carattere, quindi se devi solo controllare un carattere alla volta, questo è il modo migliore per farlo.


Dovresti parlare di come le stringhe possono essere modificate in questo modo. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
Mee

Probabilmente scriverò una serie di risposte su come le stringhe sono sostanzialmente array di caratteri ma anche meglio, perché mettere tutto in uno è piuttosto un compito.
snail_7

... o potresti scriverne un po ';)
snail_

Non ho molta familiarità con come funziona in altre lingue.
Mee

2

Quando usare :(o no)

Il :personaggio è usato come spezzatore di istruzioni in SB. Fondamentalmente, lo usi per impilare le istruzioni su una riga in questo modo:

PRINT "HELLO!":PRINT "GOODBYE!"

Altrimenti, la tua affermazione media viene interrotta da una nuova riga:

PRINT "HELLO!"
PRINT "GOODBYE!"

In realtà, spesso non è necessario utilizzare i due punti. Finché le istruzioni possono essere suddivise in token sintatticamente validi, il parser tende a capire quando uno finisce e l'altro inizia. Lo stesso vale spesso per gli spazi bianchi.

PRINT"HELLO!"PRINT"GOODBYE!"

Certo, questo non funziona sempre. Ci sono sempre casi ambigui e sintassi non valide in cui è necessario rompere esplicitamente le istruzioni. Prendi ad esempio:

PRINT "HELLO";END

Il punto e virgola indica che PRINTsi aspetta che venga stampata un'altra espressione, a meno che non venga interrotta l'istruzione (usiamo punto e virgola penzolanti per sopprimere la nuova riga.) Qui assume che ENDsi supponga che sia un valore, nonostante sia una parola chiave, e prova a stamparla, risultando in un errore. Quindi, dobbiamo rompere esplicitamente questa affermazione, sia i due punti che la nuova linea.

In generale, se qualcosa sembra ambiguo, provalo per vedere se funziona. In caso contrario, rompere l'affermazione. Inoltre, tutto ciò che produrrebbe una sintassi non valida non viene evidenziato correttamente come indicato in 12Me21.


2

Usa l'evidenziatore della sintassi!

L'editor di codice di SmileBASIC ha un evidenziatore di sintassi incorporato, che può essere utilizzato per determinare se il codice funzionerà o meno. Ad esempio, se si tenta di farlo BEEP0, non lo evidenzierà, perché deve esserci uno spazio tra una funzione e una cifra. Tuttavia BEEP.funziona, perché. non è una cifra.

Normalmente il codice come X=7BEEPè valido, poiché le funzioni non possono iniziare con un numero, quindi SB lo assume 7e BEEPsono separate. Però. X=7ENDNON è consentito (e non evidenziato), perché cerca di interpretare 7E...come un numero, ma poiché non c'è una cifra dopo la E, fallisce, causando un errore. Normalmente questo sarebbe piuttosto difficile da capire, ma con un evidenziatore di sintassi molto affidabile, è molto più facile dire cosa puoi e cosa non puoi fare.

Il mio evidenziatore di sintassi SmileBASIC è progettato per (si spera) corrispondere perfettamente al comportamento di SB, quindi puoi usarlo per verificare se il codice è valido.

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


1

Evitare l'operatore MOD

L'operatore del modulo è molto lungo e, se possibile, dovrebbe essere evitato.

Se ricevi caratteri da una stringa, puoi semplicemente ripetere la stringa:

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

A volte puoi salvare 1 carattere con ANDinvece:

X MOD 4
3AND X

0

Omettere i OUTvalori di ritorno

Una OUTfunzione di modulo è una con più ritorni; si specificano le variabili per accettare i valori restituiti dopo la OUTparola chiave. Un esempio usando DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

E se volessi solo uno dei valori, come il mese corrente? Puoi "ignorare" il resto dei valori semplicemente non scrivendo alcun nome di variabile per accettarli! Tuttavia, devi lasciare tra le virgole (a parte il ritorno facoltativo occasionale).

DTREAD OUT ,monthVar,

Che può essere ulteriormente golfato

DTREAD OUT,M,

0

Uso LAST()

Ora che SmileBASIC 4 è uscito in Giappone, possiamo verificare alcuni dei potenziali risparmi sul golf. Uno che salta immediatamente fuori da me è la nuova LAST()funzione, che restituisce l'ultimo indice di una matrice o stringa. È possibile salvare un byte.

LEN(v)-1 'old way
LAST(v)  'new way
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.