Conseils pour jouer au golf à SmileBASIC

11

SmileBASIC mérite plus d'attention. Je n'ai vu que 3 utilisateurs ici (moi y compris!) Fournir des réponses SB, et même si cela ne me surprend pas, cela me déçoit. C'est une langue payée et un dialecte BASIC qui découragent certainement les gens, mais pour ceux qui le possèdent, c'est en fait assez flexible et, étonnamment, jouable au golf. J'ai pensé que j'ouvrirais ce fil de conseils pour voir ce qui se passerait.

Je m'attends à ce que 12Me21 visite fréquemment :)

escargot_
la source

Réponses:

11

Remplacez string!=""parstring>""

SB vous permet de faire des comparaisons plus / moins importantes sur les chaînes, en fonction de leurs points de code. Cependant, la chaîne vide est considérée comme la plus petite chaîne qui existe.

Donc, pour les situations où vous le faites, string!=""vous pouvez utiliser soit string>""ou ""<string, car chaque chaîne est supérieure ""et ""inférieure à chaque chaîne. Selon que vous utilisez <ou >dépend si l'instruction a besoin d'espaces avant ou après pour être une syntaxe valide, ce qui peut également vous faire économiser des octets.

Par exemple:

WHILE S$!=""

peut être transformé en

WHILE S$>""

et a continué à jouer au golf

WHILE""<S$
escargot_
la source
Toutes les chaînes sont véridiques. Même vides.
snail_
Ah ok. Logique.
Rɪᴋᴇʀ
6

En utilisant ?, ., @et les chaînes non fermées

De nombreux dialectes de base prennent en charge l' ?impression, et SB ne fait pas exception. Avoir une fonction de sortie de texte extrêmement courte est un gros avantage.

Dans SmileBASIC, .est évalué à 0.0, il peut donc être utilisé à la place de 0 pour économiser de l'espace. Par exemple: SPSET 0,21peut être SPSET.,21, en économisant 1 octet. ( SPSET0,21n'est pas valide car SPSET0pourrait être une fonction définie par l'utilisateur) EXEC.est un moyen extrêmement court de faire une boucle de programme pour toujours (mais il réinitialise toutes vos variables, il n'est donc pas toujours utilisable)

Les étiquettes (utilisées pour GOTO, GOSUBet la lecture DATA) sont représentées comme @LABELdans SmileBASIC. Lorsqu'elles sont utilisées dans une expression, elles sont en fait traitées comme des chaînes. Par exemple, BGMPLAY"@305C"peut être écrit commeBGMPLAY@305C

Les chaînes sont automatiquement fermées à la fin d'une ligne (ou à la fin du programme). ?"Hello, World!"peut être écrit comme ?"Hello, World!. Cela peut également être utilisé pour rendre les programmes plus lisibles en les divisant en plusieurs lignes sans changer la longueur: ?"Meow"BEEP 69peut être

?"Meow
BEEP 69
12Me21
la source
Wow, utiliser des étiquettes pour démarrer MML est fou. N'aurais jamais pensé à cela, même si cela limite votre jeu de caractères.
snail_
Un autre endroit où je l'ai utilisé était de vérifier si un chiffre hexadécimal était un chiffre ou une lettre: @A<POP(H$)est plus court que "@"<POP(H$)(cela An'a pas d'importance, il ne vérifie que le premier caractère car il ne sera jamais le même)
12Me21
3

Utilisez l'indexation de chaînes au lieu de MID$

La MID$fonction est une fonction courante dans de nombreux BASIC pour obtenir une sous-chaîne quelque part au milieu d'une chaîne. Cependant, si vous avez juste besoin d'obtenir le caractère à un index, l'utilisation de l'indexation de chaîne est beaucoup plus courte. Par exemple:

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

Ces deux chaînes C. d'impression prennent en charge l'indexation de type tableau sur une base de caractères, donc si vous n'avez besoin de vérifier qu'un caractère à la fois, c'est la meilleure façon de le faire.

escargot_
la source
Vous devriez parler de la façon dont les chaînes peuvent être modifiées de cette façon. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12Me21
J'écrirai probablement un ensemble de réponses sur la façon dont les chaînes sont essentiellement des tableaux de caractères, mais encore mieux, car tout mettre en un est une tâche assez difficile.
snail_
... ou vous pourriez en écrire;)
snail_
Je ne connais pas très bien son fonctionnement dans d'autres langues.
12Me21
2

Quand utiliser :(ou non)

Le :caractère est utilisé comme séparateur d'instructions dans SB. Fondamentalement, vous l'utilisez pour empiler des instructions sur une ligne comme suit:

PRINT "HELLO!":PRINT "GOODBYE!"

Sinon, votre déclaration moyenne est interrompue par une nouvelle ligne:

PRINT "HELLO!"
PRINT "GOODBYE!"

En réalité, vous n'avez souvent pas besoin du tout d'utiliser le côlon. Tant que les instructions peuvent être divisées en jetons syntaxiquement valides, l'analyseur a tendance à déterminer quand l'une se termine et l'autre commence. Il en va souvent de même pour les espaces blancs.

PRINT"HELLO!"PRINT"GOODBYE!"

Bien sûr, cela ne fonctionne pas toujours. Il existe toujours des cas ambigus et des syntaxes invalides où vous devez rompre explicitement les instructions. Prends pour exemple:

PRINT "HELLO";END

Le point-virgule signifie que l' PRINTon s'attend à ce qu'une autre expression s'imprime, à moins que l'instruction ne s'y casse (nous utilisons des points-virgules pendantes pour supprimer le retour à la ligne.) Ici, il suppose que ENDc'est censé être une valeur, bien qu'il s'agisse d'un mot-clé, et essaie de l'imprimer, résultant dans une erreur. Ainsi, nous devons rompre explicitement cette déclaration, que ce soit les deux-points ou la nouvelle ligne.

En général, si quelque chose semble ambigu, essayez-le pour voir si cela fonctionne. Si ce n'est pas le cas, cassez la déclaration. De plus, tout ce qui produirait une syntaxe non valide n'est pas mis en surbrillance correctement comme 12Me21 l'a mentionné.

escargot_
la source
2

Utilisez le surligneur de syntaxe!

L'éditeur de code de SmileBASIC a un surligneur de syntaxe intégré, qui peut être utilisé pour déterminer si le code fonctionnera ou non. Par exemple, si vous essayez de le faire BEEP0, il ne le mettra pas en surbrillance, car il doit y avoir un espace entre une fonction et un chiffre. Fonctionne cependant BEEP., car. n'est pas un chiffre.

Normalement, le code comme X=7BEEPest valide, car les fonctions ne peuvent pas commencer par un nombre, donc SB suppose cela 7et BEEPest séparé. Pourtant. X=7ENDn'est PAS autorisé (et n'est pas mis en surbrillance), car il essaie d'interpréter 7E...comme un nombre, mais comme il n'y a pas de chiffre après le E, il échoue, provoquant une erreur. Normalement, cela serait assez difficile à comprendre, mais avec un surligneur de syntaxe très fiable, il est beaucoup plus facile de dire ce que vous pouvez et ne pouvez pas faire.

Mon surligneur de syntaxe SmileBASIC est conçu pour (espérons-le) correspondre parfaitement au comportement de SB, vous pouvez donc l'utiliser pour vérifier si le code est valide.

<!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
la source
1

Évitez l'opérateur MOD

L'opérateur de module est vraiment long et doit être évité si possible.

Si vous obtenez des caractères d'une chaîne, vous pouvez simplement répéter la chaîne à la place:

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

Parfois, vous pouvez enregistrer 1 caractère avec à la ANDplace:

X MOD 4
3AND X
12Me21
la source
0

Omettre les OUTvaleurs de retour

Une OUTfonction de formulaire est une fonction avec plusieurs retours; vous spécifiez les variables pour accepter les valeurs de retour après le OUTmot - clé. Un exemple utilisant DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

Mais que se passe-t-il si vous ne voulez qu'une des valeurs, comme le mois en cours? Vous pouvez "ignorer" le reste des valeurs en n'écrivant simplement aucun nom de variable pour les accepter! Vous devez cependant laisser des virgules (à part le retour facultatif occasionnel).

DTREAD OUT ,monthVar,

Qui peut être encore joué au golf

DTREAD OUT,M,
escargot_
la source
0

Utilisation LAST()

Maintenant que SmileBASIC 4 est sorti au Japon, nous pouvons vérifier certaines des économies potentielles sur le golf. L'une qui me saute immédiatement aux yeux est la nouvelle LAST()fonction, qui renvoie le dernier index d'un tableau ou d'une chaîne. Vous pouvez enregistrer un octet.

LEN(v)-1 'old way
LAST(v)  'new way
escargot_
la source