Советы по игре в гольф в SmileBASIC

11

SmileBASIC заслуживает большего внимания. Я видел только 3 пользователей (включая меня!), Которые давали ответы SB, и хотя это меня не удивляет, меня это разочаровывает. Это время платного Ланга, а также будет BASIC диалектом , конечно , превращает человек прочь, но для тех , кто владеет его на самом деле это довольно гибкие и, что удивительно, golfable. Я решил, что открою эту ветку с советами и посмотрим, что получится.

Я ожидаю, что 12Me21 будет часто посещать :)

snail_
источник

Ответы:

11

Заменить string!=""наstring>""

SB позволяет выполнять большее / меньшее сравнение строк, основываясь на их кодовых точках. Однако пустая строка считается самой маленькой из существующих.

Таким образом , для ситуаций , когда вы делаете string!=""вы можете использовать либо string>""или ""<string, поскольку каждую строку больше ""и ""меньше каждую строку. В зависимости от того, используете ли вы <или >зависит от того, требуется ли оператору пробел до или после, чтобы иметь допустимый синтаксис, который также может сохранить ваши байты.

Например:

WHILE S$!=""

можно превратить в

WHILE S$>""

и дальше в гольф

WHILE""<S$
snail_
источник
Все строки правдивы. Даже пустые.
snail_
Ах хорошо. Имеет смысл.
17
6

Используя ?, ., @и незакрытые строки

Многие диалекты BASIC поддерживают ?печать, и SB не является исключением. Наличие чрезвычайно короткой функции вывода текста является большим преимуществом.

В SmileBASIC .оценивается 0.0, поэтому его можно использовать вместо 0 для экономии места. Например: SPSET 0,21может быть SPSET.,21, сохраняя 1 байт. ( SPSET0,21недопустимо, потому что это SPSET0может быть пользовательская функция) EXEC.- это чрезвычайно короткий способ сделать цикл программы навсегда (но он сбрасывает все ваши переменные, поэтому он не всегда может использоваться)

Этикетки (используются для GOTO, GOSUBи чтение DATA) представлены как @LABELв SmileBASIC. При использовании в выражении они фактически рассматриваются как строки. Например, BGMPLAY"@305C"можно записать какBGMPLAY@305C

Строки автоматически закрываются в конце строки (или в конце программы). ?"Hello, World!"можно записать как ?"Hello, World!. Это также можно использовать, чтобы сделать программы более читабельными, разбив их на несколько строк без изменения длины: ?"Meow"BEEP 69может быть

?"Meow
BEEP 69
12Me21
источник
Ничего себе, использование ярлыков для запуска MML безумие. Никогда бы не подумал об этом, хотя это ограничивает ваш набор символов.
улитка
В другом месте я использовал его, чтобы проверить, была ли шестнадцатеричная цифра цифрой или буквой: @A<POP(H$)короче "@"<POP(H$)( Aне имеет значения, он проверяет только первый символ, поскольку он никогда не будет прежним)
12Me21
3

Использовать индексирование строк вместо MID$

MID$Функция является общей функцией во многих основах для того чтобы подстрока из где - то в середине строки. Однако, если вам просто нужно получить символ по какому-либо индексу, использование индексации строк будет намного короче. Например:

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

Оба эти печатают C. Строки поддерживают индексирование, подобное массиву, на символьной основе, поэтому, если вам нужно проверять только один символ за раз, это лучший способ сделать это.

snail_
источник
Вы должны поговорить о том, как строки могут быть изменены таким образом. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12Me21
Я, вероятно, напишу ряд ответов о том, что строки в основном являются символьными массивами, но даже лучше, потому что объединить все это в одну задачу.
улитка
... или вы могли бы написать несколько;)
snail_
Я не очень знаком с тем, как это работает на других языках.
12Me21
2

Когда использовать :(или нет)

Символ :используется в качестве нарушителя утверждений в SB. По сути, вы используете его, чтобы сложить операторы в одну строку следующим образом:

PRINT "HELLO!":PRINT "GOODBYE!"

В противном случае ваше среднее утверждение будет прервано переводом строки:

PRINT "HELLO!"
PRINT "GOODBYE!"

На самом деле, вам часто не нужно использовать двоеточие вообще. До тех пор, пока операторы могут быть разбиты на синтаксически допустимые токены, синтаксический анализатор имеет тенденцию выяснять, когда один заканчивается, а другой начинается. То же самое часто происходит с пробелами.

PRINT"HELLO!"PRINT"GOODBYE!"

Конечно, это не всегда работает. Всегда есть неоднозначные случаи и недопустимые синтаксисы, где вы должны явно нарушать операторы. Взять, к примеру:

PRINT "HELLO";END

Точка с запятой означает, что PRINTожидает вывода другого выражения, если только оператор не прервется там (мы используем висячие точки с запятой для подавления новой строки.) Здесь предполагается, что ENDэто должно быть значение, несмотря на то, что он является ключевым словом, и пытается его напечатать, в результате чего в ошибке. Таким образом, мы должны явно нарушить это утверждение, будь то двоеточие или символ новой строки.

В общем, если что-то кажется неоднозначным, попробуйте, чтобы увидеть, работает ли оно. Если это не так, нарушите утверждение. Кроме того, все, что выдает неправильный синтаксис, не подсвечивается правильно, как упоминалось в 12Me21.

snail_
источник
2

Используйте подсветку синтаксиса!

Редактор кода SmileBASIC имеет встроенную подсветку синтаксиса, которую можно использовать для определения, будет ли работать код. Например, если вы попытаетесь это сделать BEEP0, он не будет выделен, потому что между функцией и цифрой должен быть пробел. Однако BEEP.работает, потому что. это не цифра.

Обычно подобный код X=7BEEPдействителен, поскольку функции не может начинаться с цифры, поэтому SB предполагает , что 7и BEEPотдельно. Однако. X=7ENDНЕ допускается (и не выделяется), потому что он пытается интерпретировать 7E...как число, но так как после E нет цифры, происходит сбой, вызывая ошибку. Обычно это было бы довольно сложно понять, но с очень надежной подсветкой синтаксиса гораздо проще сказать, что вы можете и не можете делать.

Моя подсветка синтаксиса SmileBASIC разработана (чтобы, мы надеемся) идеально соответствовала поведению SB, поэтому вы можете использовать его для проверки правильности кода.

<!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
источник
1

Избегайте оператора MOD

Оператор модуля действительно длинный, и его следует избегать, если это возможно.

Если вы получаете символы из строки, вы можете просто повторить строку:

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

Иногда вы можете сохранить 1 символ с помощью AND:

X MOD 4
3AND X
12Me21
источник
0

Пропуск OUTвозвращаемых значений

OUTФункция формы один с несколькими возвращается; Вы указываете переменные для принятия возвращаемых значений после OUTключевого слова. Пример использования DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

Но что, если вам нужно только одно из значений, например, текущий месяц? Вы можете «игнорировать» остальные значения, просто не записывая имя переменной, чтобы принять их! Вы, однако, должны оставить запятые (кроме случайного необязательного возврата.)

DTREAD OUT ,monthVar,

Который может быть дальше в гольф

DTREAD OUT,M,
snail_
источник
0

использование LAST()

Теперь, когда SmileBASIC 4 в Японии, мы можем проверить некоторые потенциальные сбережения в гольф. Одна из них, которая сразу же выскакивает, - это новая LAST()функция, которая возвращает последний индекс массива или строки. Вы можете сохранить один байт.

LEN(v)-1 'old way
LAST(v)  'new way
snail_
источник