Dicas para jogar golfe no SmileBASIC

11

SmileBASIC merece mais atenção. Eu só vi três usuários aqui (incluindo eu!) Fornecendo respostas do SB e, embora isso não me surpreenda, me decepciona. Ser um idioma pago, além de ser um dialeto BASIC certamente desativa as pessoas, mas para quem o possui , é realmente bastante flexível e, surpreendentemente, jogável. Eu pensei em abrir esse tópico de dicas e ver o que aparece.

Espero 12Me21 para visitar com freqüência :)

Caracol_
fonte

Respostas:

11

Substitua string!=""porstring>""

O SB permite que você faça comparações maiores / menores em cadeias, com base em seus pontos de código. No entanto, a cadeia vazia é considerada a menor cadeia existente.

Portanto, nas situações em que string!=""você utiliza, você pode usar um string>""ou ""<string, uma vez que cada string é maior que ""e ""menor que cada string. Dependendo se você usa <ou >depende se a instrução precisa de espaço em branco antes ou depois da sintaxe válida, o que também pode economizar bytes.

Por exemplo:

WHILE S$!=""

pode ser transformado em

WHILE S$>""

e ainda jogou golfe para

WHILE""<S$
Caracol_
fonte
Todas as strings são verdadeiras. Mesmo os vazios.
7297
Ah ok. Faz sentido.
Rɪᴋᴇʀ
6

Usando ?, ., @, e as cordas não fechadas

Muitos dialetos do BASIC suportam ?impressão, e o SB não é exceção. Ter uma função de saída de texto extremamente curta é uma grande vantagem.

No SmileBASIC, .é avaliado como 0.0, portanto, pode ser usado no lugar de 0 para economizar espaço. Por exemplo: SPSET 0,21pode ser SPSET.,21, economizando 1 byte. ( SPSET0,21é inválido porque SPSET0poderia ser uma função definida pelo usuário) EXEC.é uma maneira extremamente curta de fazer um loop de programa para sempre (mas redefine todas as suas variáveis, portanto nem sempre é utilizável)

Os rótulos (usados ​​para GOTO, GOSUBe leitura DATA) são representados como @LABELno SmileBASIC. Quando usados ​​em uma expressão, eles são realmente tratados como seqüências de caracteres. Por exemplo, BGMPLAY"@305C"pode ser escrito comoBGMPLAY@305C

As strings são fechadas automaticamente no final de uma linha (ou no final do programa). ?"Hello, World!"pode ser escrito como ?"Hello, World!. Isso também pode ser usado para tornar os programas mais legíveis, dividindo-os em várias linhas sem alterar o comprimento: ?"Meow"BEEP 69pode ser

?"Meow
BEEP 69
12Me21
fonte
Uau, usar rótulos para iniciar o MML é uma loucura. Nunca teria pensado nisso, apesar de limitar o seu conjunto de caracteres.
7297
Outro lugar que eu usei foi para verificar se um dígito hexadecimal era um número ou uma letra: @A<POP(H$)é menor que "@"<POP(H$)(o Aque não importa, ele só verifica o primeiro caractere, pois nunca será o mesmo)
12Me21
3

Use indexação de string em vez de MID$

A MID$função é uma função comum em muitos BASICs para obter uma substring de algum lugar no meio de uma string. No entanto, se você só precisa obter o caractere em algum índice, o uso da indexação de string é muito menor. Por exemplo:

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

Ambas imprimem C. As seqüências de caracteres suportam a indexação de matriz em caracteres, portanto, se você precisar apenas verificar um caractere de cada vez, esta é a melhor maneira de fazê-lo.

Caracol_
fonte
Você deve falar sobre como as strings podem ser modificadas dessa maneira. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12Me21
Provavelmente vou escrever um conjunto de respostas sobre como as strings são basicamente matrizes de caracteres, mas ainda melhor, porque colocar tudo em uma é uma tarefa e tanto.
724717
... ou você pode escrever alguma;)
snail_
Não estou muito familiarizado com o funcionamento em outros idiomas.
12Me21
2

Quando usar :(ou não)

O :personagem é usado como um quebrador de declarações no SB. Basicamente, você o usa para empilhar instruções em uma linha da seguinte maneira:

PRINT "HELLO!":PRINT "GOODBYE!"

Caso contrário, sua declaração média será quebrada por uma nova linha:

PRINT "HELLO!"
PRINT "GOODBYE!"

Na realidade, muitas vezes você não precisa usar o cólon. Desde que as instruções possam ser divididas em tokens sintaticamente válidos, o analisador tende a descobrir quando uma termina e a outra inicia. O mesmo vale para o espaço em branco.

PRINT"HELLO!"PRINT"GOODBYE!"

Claro, isso nem sempre funciona. Sempre há casos ambíguos e sintaxes inválidas em que você precisa quebrar explicitamente as instruções. Considere por exemplo:

PRINT "HELLO";END

O meio ponto e vírgula que PRINTestá esperando uma outra expressão para imprimir, a menos que as quebras de instrução lá (usamos pendurado ponto e vírgula para suprimir a nova linha.) Aqui ele assume ENDé suposto ser um valor, apesar de ser uma palavra-chave, e tenta imprimi-lo, resultando com erro. Portanto, temos que quebrar explicitamente essa afirmação, seja o cólon ou a nova linha.

Em geral, se algo parecer ambíguo, tente ver se funciona. Caso contrário, quebre a declaração. Além disso, qualquer coisa que produza sintaxe inválida não é destacada corretamente como o 12Me21 mencionado.

Caracol_
fonte
2

Use o marcador de sintaxe!

O editor de código do SmileBASIC possui um marcador de sintaxe embutido, que pode ser usado para determinar se o código funcionará ou não. Por exemplo, se você tentar fazer BEEP0, ele não será destacado, porque precisa haver um espaço entre uma função e um dígito. No entanto BEEP.funciona, porque. não é um dígito.

Normalmente, o código like X=7BEEPé válido, já que as funções não podem começar com um número, então o SB assume isso 7e BEEPé separado. Contudo. X=7ENDNÃO é permitido (e não realçado), porque tenta interpretar 7E...como um número, mas como não há dígito após o E, ele falha, causando um erro. Normalmente, isso seria muito difícil de entender, mas com um marcador de sintaxe muito confiável, é muito mais fácil dizer o que você pode ou não fazer.

Meu marcador de sintaxe SmileBASIC foi projetado para (espero) corresponder perfeitamente ao comportamento do SB, para que você possa usá-lo para verificar se o código é válido.

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

Evite o operador MOD

O operador do módulo é realmente longo e deve ser evitado, se possível.

Se você estiver obtendo caracteres de uma sequência, basta repeti-la:

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

Às vezes, você pode salvar 1 caractere em ANDvez disso:

X MOD 4
3AND X
12Me21
fonte
0

Omitindo OUTvalores de retorno

Uma OUTfunção de formulário é aquela com múltiplos retornos; você especifica as variáveis ​​para aceitar os valores de retorno após a OUTpalavra - chave. Um exemplo usando DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

Mas e se você quiser apenas um dos valores, como o mês atual? Você pode "ignorar" o restante dos valores simplesmente não escrevendo nenhum nome de variável para aceitá-los! No entanto, você precisa sair entre vírgulas (além do retorno opcional ocasional).

DTREAD OUT ,monthVar,

Que pode ser ainda mais jogado para

DTREAD OUT,M,
Caracol_
fonte
0

Usar LAST()

Agora que o SmileBASIC 4 está no Japão, podemos conferir algumas das economias em potencial em golfe. Uma que imediatamente me salta é a nova LAST()função, que retorna o último índice de uma matriz ou string. Você pode salvar um byte.

LEN(v)-1 'old way
LAST(v)  'new way
Caracol_
fonte