SmileBASIC에서의 골프 팁


11

SmileBASIC 은 더 많은주의를 기울여야합니다. SB 답변을 제공하는 3 명의 사용자 (자신을 포함하여!) 만 보았지만 놀라지 않지만 실망합니다. 유료 언어 일뿐 만 아니라 기본 방언이기도하면 사람들을 확실히 끌 수 있지만 소유 한 사람들에게는 실제로 유연하고 놀랍게도 골프를 칠 수 있습니다. 이 팁 스레드를 열어서 무엇이 나오는지 알았습니다.

나는 12Me21이 자주 방문 할 것으로 예상한다 :)

답변:


11

교체 string!=""string>""

SB를 사용하면 코드 포인트를 기준으로 문자열을 더 크게 /보다 적게 비교할 수 있습니다. 그러나 빈 문자열은 가장 작은 문자열 로 간주됩니다 .

그래서 당신이 상황에서 string!=""당신이 중 하나를 사용할 수 있습니다 string>""또는 ""<string모든 문자열보다 크기 때문에, ""그리고 ""적은 모든 문자열보다. 사용 여부에 따라 <또는 >에 따라 이전 또는 이후에하는 수는 또한 바이트 저장 올바른 구문 될 공백 문 필요로하는 경우.

예를 들면 다음과 같습니다.

WHILE S$!=""

로 변할 수있다

WHILE S$>""

그리고 더 골프

WHILE""<S$

모든 줄은 진실합니다. 심지어 비어있는 것.
snail_

아, 알았어요 말이된다.
Rɪᴋᴇʀ

6

사용하여 ?, ., @, 및 닫히지 않은 문자열

BASIC의 많은 방언이 ?인쇄를 지원 하며 SB도 예외는 아닙니다. 텍스트 출력 기능이 매우 짧은 것이 큰 장점입니다.

SmileBASIC에서는 .로 평가 0.0되므로 공간을 절약하기 위해 0 대신 사용할 수 있습니다. 예를 들면 다음과 같습니다 . 1 바이트를 절약 SPSET 0,21할 수 있습니다 SPSET.,21. ( 사용자 정의 함수 일 수 SPSET0,21있기 때문에 유효하지 않습니다 SPSET0) EXEC.는 프로그램 루프를 영원히 만드는 매우 짧은 방법입니다 (그러나 모든 변수를 재설정하므로 항상 사용할 수있는 것은 아닙니다)

(사용 레이블 GOTO, GOSUB, 독서는 DATA)로 표시됩니다 @LABELSmileBASIC한다. 표현식에 사용될 때 실제로 문자열로 취급됩니다. 예를 들어 BGMPLAY"@305C"다음과 같이 쓸 수 있습니다.BGMPLAY@305C

문자열은 줄 끝 (또는 프로그램 끝)에서 자동으로 닫힙니다. ?"Hello, World!"로 쓸 수 있습니다 ?"Hello, World!. 또한 길이를 변경하지 않고 프로그램을 여러 줄로 분할하여 프로그램을 더 읽기 쉽게 만드는 데 사용할 ?"Meow"BEEP 69수 있습니다.

?"Meow
BEEP 69

와, 레이블을 사용하여 MML을 시작하는 것은 미친 짓입니다. 문자 세트를 제한하지만 그 사실을 생각하지 못했을 것입니다.
달팽이 _

: 다른 장소 나 16 진수 숫자가 숫자 나 문자가 있다면 그것을 확인하는 것이었다 사용 @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"
12Me21

문자열이 기본적으로 문자 배열인지에 대한 일련의 답변을 쓸 것입니다.하지만 모든 것을 하나의 작업에 넣는 것이 상당히 낫기 때문입니다.
snail_

... 또는 당신은;)
달팽이 _

다른 언어로 작동하는 방식에 익숙하지 않습니다.
12Me21

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가 있다고 가정하므로, 유효 7BEEP별개입니다. 하나. 숫자 X=7END로 해석하려고하기 때문에 허용되지 않으며 강조 표시되지 않습니다 7E.... 그러나 E 뒤에 숫자가 없으므로 오류가 발생합니다. 일반적으로 이것은 파악하기가 쉽지 않지만 매우 안정적인 구문 강조 표시기를 사용하면 수행 할 수있는 작업과 수행 할 수없는 작업을 훨씬 쉽게 알 수 있습니다.

My 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

그러나 이번 달과 같이 값 중 하나만 원한다면 어떻게해야합니까? 변수 이름을 쓰지 않고 나머지 값을 "무시"할 수 있습니다. 그러나 선택적인 반품은 제외하고 쉼표로 남겨 두어야합니다.

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.