SmileBASIC中打高尔夫球的技巧


11

SmileBASIC值得更多关注。我在这里只看到3个用户(包括我自己!)提供SB答案,虽然这并不令我感到惊讶,但令我感到失望。它既是一种付费语言,又是一种BASIC方言,无疑会使人们失望,但是对于拥有它的人来说,它实际上是相当灵活的,而且令人惊讶的是,它可以打高尔夫球。我以为自己会打开此提示线程,然后看看会发生什么。

我希望12Me21可以经常访问:)

Answers:


11

替换string!=""string>""

SB允许您根据字符串的代码点对字符串进行更多/更少的比较。但是,空字符串被认为是最小的字符串。

因此,在string!=""每种情况下都可以使用string>""""<string,因为每个字符串都大于""""小于每个字符串。取决于您使用<还是>取决于语句是否需要在有效语法之前或之后使用空格,这也可以节省字节。

例如:

WHILE S$!=""

可以变成

WHILE S$>""

并进一步打高尔夫球

WHILE""<S$

所有的字符串都是真实的。甚至是空的。
snail_ '17

啊好吧。说得通。
Rɪᴋᴇʀ

6

使用?.@,和未闭合的字符串

BASIC支持?打印的许多方言,SB也不例外。具有极短的文本输出功能是一个很大的优势。

在SmileBASIC中,.将其评估为0.0,因此可以代替0以节省空间。例如: SPSET 0,21可以是SPSET.,21,节省1个字节。(SPSET0,21是无效的,因为它SPSET0可能是用户定义的函数) EXEC.是永久使程序循环的极短方法(但它会重置所有变量,因此并不总是可用的)

标签(用于GOTOGOSUB和读出DATA)被表示为@LABEL在SmileBASIC。在表达式中使用时,它们实际上被视为字符串。例如,BGMPLAY"@305C"可以写成BGMPLAY@305C

字符串在一行的末尾(或程序的末尾)自动关闭。?"Hello, World!"可以写成?"Hello, World!。这也可以用于制造通过拆分它们成多行程序的可读性,而不改变长度:?"Meow"BEEP 69

?"Meow
BEEP 69

哇,使用标签启动MML很疯狂。尽管它确实会限制您的字符集,但永远不会想到这一点。
snail_

我用过的另一个地方是检查十六进制数字是数字还是字母:@A<POP(H$)短于"@"<POP(H$)A没关系,它只检查第一个字符,因为它永远不会相同)
12Me21

3

使用字符串索引而不是 MID$

MID$函数是许多BASIC中的常用函数,用于从字符串中间的某个位置获取子字符串。但是,如果只需要在某个索引处获取字符,则使用字符串索引的时间要短得多。例如:

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

这两种打印C.字符串均基于字符支持类似数组的索引,因此,如果您一次只需要检查一个字符,则这是最好的方法。


您应该讨论如何以这种方式修改字符串。A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
17Me21年

我可能会写出一系列关于字符串基本上是字符数组的答案,但甚至更好,因为将它们全部组合在一起是一项艰巨的任务。
snail_

...或者您可以写一些;)
snail_

我对其他语言的工作方式不是很熟悉。
17Me21年

2

何时使用:(或不使用)

:字符在SB中用作语句破坏器。基本上,您可以使用它在一行上堆积语句,如下所示:

PRINT "HELLO!":PRINT "GOODBYE!"

否则,您的平均语句将被换行符打破:

PRINT "HELLO!"
PRINT "GOODBYE!"

实际上,您通常根本不需要使用冒号。只要可以将语句分解为语法上有效的标记,解析器就趋向于找出一个结束和另一个开始的时间。空格通常也是如此。

PRINT"HELLO!"PRINT"GOODBYE!"

当然,这并不总是有效。总是有模棱两可的情况和无效的语法,您必须显式地中断语句。举个例子:

PRINT "HELLO";END

分号表示PRINT期望打印出另一个表达式,除非该语句在此处中断(我们使用悬挂的分号来禁止换行。)在此,它假定END尽管是关键字,但仍假定是一个值,并尝试打印它,结果错误。因此,无论是冒号还是换行符,我们都必须明确地打破该声明。

通常,如果某些东西看起来模棱两可,请尝试一下是否可行。如果不是,请中断该语句。此外,如12Me21所述,任何会产生无效语法的内容都不会正确突出显示。


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>


1

避免使用MOD运算符

模数运算符确实很长,应尽可能避免使用。

如果要从字符串中获取字符,则可以重复该字符串:

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

有时,您可以使用保存1个字符AND

X MOD 4
3AND X

0

省略OUT返回值

一种OUT形式的功能是一个具有多个返回; 您可以指定变量以接受OUT关键字后的返回值。使用示例DTREAD

DTREAD OUT yearVar,monthVar,dayVar

但是,如果您只想要一个值,例如当月,该怎么办?您只需不编写任何变量名称就可以“忽略”其余值!但是,您确实必须保留逗号(除了偶尔的可选返回)。

DTREAD OUT ,monthVar,

可以进一步打高尔夫球

DTREAD OUT,M,

0

利用 LAST()

现在SmileBASIC 4已在日本上市,我们可以检查一下一些潜在的高尔夫节省。立即跳到我头的是新LAST()函数,它返回数组或字符串的最后一个索引。您可以保存一个字节。

LEN(v)-1 'old way
LAST(v)  'new way
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.