SmileBASICでのゴルフのヒント


11

SmileBASICはもっと注目に値します。私はここで3人のユーザー(自分自身を含む)だけがSBの回答を提供しているのを見たことがありますが、それは驚くことではありませんが、残念です。BASICの方言であるだけでなく、有料の言語であることは確かに人々をオフにしますが、それを所有している人にとっては実際にかなり柔軟で、驚くほどゴルフに適しています。私はこのヒントスレッドを開いて、何が起こるか見てみました。

私は12Me21が頻繁に訪れることを期待しています:)

回答:


11

交換するstring!=""string>""

SBを使用すると、コードポイントに基づいて、文字列の大小比較を行うことができます。ただし、空の文字列は最小の文字列と見なされます。

だから、あなたがない状況のためstring!=""、あなたがいずれかを使用することができますstring>""または""<stringすべての文字列がより大きいので、""そして""すべての文字列よりも小さいです。あなたが使用しているかどうかに応じて、<または>文はあなたがバイトも節約することができる有効な構文であるとの前または後に空白が必要な場合に依存します。

例えば:

WHILE S$!=""

に変えることができます

WHILE S$>""

そしてさらにゴルフ

WHILE""<S$

すべての文字列は真実です。空のものでも。
snail_

うん、いいよ。理にかなっています。
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を出力します。文字列は、文字ベースで配列のようなインデックス付けをサポートします。したがって、一度に1文字しかチェックする必要がない場合、これが最善の方法です。


この方法で文字列を変更する方法について説明する必要があります。A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12Me21

文字列が基本的に文字配列である方法についての一連の答えを書きますが、1つにすべてを配置するのはかなりの作業なので、さらに良いでしょう。
snail_

...または、いくつか書くことができます;)
snail_

他の言語でどのように機能するかについてはあまり詳しくありません。
12Me21

2

使用する場合:(または使用しない場合)

この:文字は、SBでステートメントブレーカーとして使用されます。基本的に、次のようにステートメントを1行にスタックするために使用します。

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はそれ7BEEP別のものと見なします。しかしながら。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)

時々、AND代わりに1文字を保存できます:

X MOD 4
3AND X

0

OUT戻り値を省略する

OUTフォームの機能は、複数の戻りを有するものです。OUTキーワードの後に戻り値を受け入れる変数を指定します。を使用した例DTREAD

DTREAD OUT yearVar,monthVar,dayVar

しかし、今月のように値の1つだけが必要な場合はどうでしょうか。受け入れる変数名を単に記述しないことで、残りの値を「無視」できます!ただし、コンマを使用する必要があります(オプションの戻りを除く)。

DTREAD OUT ,monthVar,

さらにゴルフすることができます

DTREAD OUT,M,

0

使用する LAST()

SmileBASIC 4が日本で発売されたので、ゴルフの節約の可能性の一部を確認できます。すぐに私に飛び出すのLAST()は、配列または文字列の最後のインデックスを返す新しい関数です。1バイト節約できます。

LEN(v)-1 'old way
LAST(v)  'new way
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.