Mẹo chơi gôn trong SmileBASIC


11

SmileBASIC xứng đáng được chú ý hơn. Tôi chỉ thấy 3 người dùng ở đây (bao gồm cả bản thân mình!) Cung cấp câu trả lời SB và trong khi điều đó không làm tôi ngạc nhiên, điều đó làm tôi thất vọng. Nó là một lang được trả tiền cũng như là một phương ngữ BASIC chắc chắn sẽ khiến mọi người tắt, nhưng đối với những người sở hữu nó, nó thực sự khá linh hoạt và đáng ngạc nhiên, có thể chơi được. Tôi hình dung tôi sẽ mở chủ đề mẹo này cho nó và xem những gì sẽ xảy ra.

Tôi mong đợi 12Me21 sẽ ghé thăm thường xuyên :)

Câu trả lời:


11

Thay thế string!=""bằngstring>""

SB cho phép bạn thực hiện so sánh lớn hơn / ít hơn trên các chuỗi, dựa trên các điểm mã của chúng. Tuy nhiên, chuỗi rỗng được coi là chuỗi nhỏ nhất có.

Vì vậy, đối tình huống mà bạn làm string!="", bạn có thể sử dụng một trong hai string>""hoặc ""<string, vì mỗi chuỗi lớn hơn """"nhỏ hơn mỗi chuỗi. Tùy thuộc vào việc bạn sử dụng <hay >phụ thuộc vào việc câu lệnh cần khoảng trắng trước hay sau là cú pháp hợp lệ, điều này cũng có thể giúp bạn tiết kiệm byte.

Ví dụ:

WHILE S$!=""

có thể biến thành

WHILE S$>""

và tiếp tục chơi golf

WHILE""<S$

Tất cả các chuỗi là sự thật. Ngay cả những cái trống rỗng.
ốc_

À được rồi. Có ý nghĩa.
Rɪᴋᴇʀ

6

Sử dụng ?, ., @, và chuỗi khép kín

Nhiều phương ngữ hỗ trợ BASIC ?cho in ấn, và SB cũng không ngoại lệ. Có một chức năng đầu ra văn bản cực ngắn là một lợi thế lớn.

Trong SmileBASIC, .được ước tính 0.0, vì vậy nó có thể được sử dụng thay cho 0 để tiết kiệm dung lượng. Ví dụ: SPSET 0,21có thể SPSET.,21, tiết kiệm 1 byte. ( SPSET0,21không hợp lệ vì SPSET0có thể là hàm do người dùng xác định) EXEC.là một cách cực kỳ ngắn để tạo vòng lặp chương trình mãi mãi (nhưng nó đặt lại tất cả các biến của bạn, vì vậy không phải lúc nào cũng có thể sử dụng được)

Nhãn (được sử dụng cho GOTO, GOSUBvà đọc DATA) được thể hiện như @LABELtrong SmileBASIC. Khi được sử dụng trong một biểu thức, chúng thực sự được coi là các chuỗi. Ví dụ, BGMPLAY"@305C"có thể được viết làBGMPLAY@305C

Các chuỗi được tự động đóng ở cuối dòng (hoặc cuối chương trình). ?"Hello, World!"có thể được viết là ?"Hello, World!. Điều này cũng có thể được sử dụng để làm cho các chương trình dễ đọc hơn bằng cách chia chúng thành nhiều dòng mà không thay đổi độ dài: ?"Meow"BEEP 69có thể

?"Meow
BEEP 69

Wow, sử dụng nhãn để bắt đầu MML là điên rồ. Sẽ không bao giờ nghĩ về điều đó, mặc dù nó giới hạn bộ ký tự của bạn.
ốc_

Một nơi khác tôi đã sử dụng là để kiểm tra xem một chữ số thập lục phân là một số hay một chữ cái: @A<POP(H$)ngắn hơn "@"<POP(H$)( Akhông quan trọng, nó chỉ kiểm tra ký tự đầu tiên vì nó sẽ không bao giờ giống nhau)
12Me21

3

Sử dụng lập chỉ mục chuỗi thay vì MID$

Các MID$chức năng là một chức năng phổ biến trong nhiều vấn đề cơ bản để có được một chuỗi con từ một nơi nào ở giữa một chuỗi. Tuy nhiên, nếu bạn chỉ cần lấy ký tự ở một số chỉ mục, sử dụng lập chỉ mục chuỗi ngắn hơn nhiều. Ví dụ:

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

Cả hai bản in C. Chuỗi này đều hỗ trợ lập chỉ mục giống như mảng trên cơ sở ký tự, vì vậy nếu bạn chỉ cần kiểm tra một ký tự tại một thời điểm, đây là cách tốt nhất để làm điều đó.


Bạn nên nói về cách các chuỗi có thể được sửa đổi theo cách này. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12Me21

Có lẽ tôi sẽ viết một bộ câu trả lời về cách các chuỗi về cơ bản là các mảng ký tự nhưng thậm chí còn tốt hơn, bởi vì đặt tất cả vào một chuỗi là một nhiệm vụ khá khó khăn.
ốc_

... hoặc bạn có thể viết một số;)
snail_

Tôi không quen lắm với cách nó hoạt động trong các ngôn ngữ khác.
12Me21

2

Khi nào nên sử dụng :(hoặc không)

Nhân :vật được sử dụng như một công cụ ngắt câu lệnh trong SB. Về cơ bản, bạn sử dụng nó để xếp các câu lệnh trên một dòng như vậy:

PRINT "HELLO!":PRINT "GOODBYE!"

Mặt khác, tuyên bố trung bình của bạn bị phá vỡ bởi một dòng mới:

PRINT "HELLO!"
PRINT "GOODBYE!"

Trong thực tế, bạn thường không cần sử dụng dấu hai chấm. Miễn là các câu lệnh có thể được chia thành các mã thông báo hợp lệ về mặt cú pháp, trình phân tích cú pháp có xu hướng tìm ra khi một kết thúc và các câu lệnh khác bắt đầu. Điều tương tự thường đi cho khoảng trắng.

PRINT"HELLO!"PRINT"GOODBYE!"

Tất nhiên, điều này không phải lúc nào cũng hoạt động. Luôn có những trường hợp mơ hồ và cú pháp không hợp lệ khi bạn phải ngắt câu lệnh một cách rõ ràng. Lấy ví dụ:

PRINT "HELLO";END

Dấu chấm phẩy có nghĩa PRINTlà đang mong đợi một biểu thức khác được in ra, trừ khi câu lệnh bị phá vỡ ở đó (chúng tôi sử dụng dấu chấm phẩy để ngăn chặn dòng mới.) Ở đây, nó giả sử ENDlà một giá trị, mặc dù là một từ khóa và cố gắng in nó, dẫn đến trong một lỗi Vì vậy, chúng ta phải phá vỡ tuyên bố này một cách rõ ràng, có thể là dấu hai chấm hoặc dòng mới.

Nói chung, nếu một cái gì đó có vẻ mơ hồ, hãy thử nó để xem nếu nó hoạt động. Nếu không, hãy phá vỡ tuyên bố. Ngoài ra, bất cứ điều gì tạo ra cú pháp không hợp lệ sẽ không được tô sáng chính xác như 12Me21 đã đề cập.


2

Sử dụng cú pháp tô sáng!

Trình chỉnh sửa mã của SmileBASIC có tích hợp cú pháp tô sáng, có thể được sử dụng để xác định xem mã có hoạt động hay không. Ví dụ, nếu bạn cố gắng thực hiện BEEP0, nó sẽ không làm nổi bật nó, bởi vì cần phải có một khoảng trắng giữa một hàm và một chữ số. Tuy nhiên BEEP., hoạt động, bởi vì. không phải là một chữ số.

Thông thường mã like X=7BEEPlà hợp lệ, vì các hàm không thể bắt đầu bằng một số, vì vậy SB giả định rằng 7BEEPlà riêng biệt. Tuy nhiên. X=7ENDKHÔNG được phép (và không được tô sáng), vì nó cố gắng diễn giải 7E...dưới dạng số, nhưng vì không có chữ số nào sau chữ E, nên nó không thành công, gây ra lỗi. Thông thường điều này sẽ khá khó để tìm ra, nhưng với cú pháp tô sáng rất đáng tin cậy, việc nói những gì bạn có thể và không thể làm sẽ dễ dàng hơn nhiều.

Công cụ tô sáng cú pháp SmileBASIC của tôi được thiết kế để (hy vọng) hoàn toàn khớp với hành vi của SB, vì vậy bạn có thể sử dụng nó để kiểm tra xem mã có hợp lệ không.

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

Tránh toán tử MOD

Toán tử mô đun thực sự dài và nên tránh nếu có thể.

Nếu bạn nhận được các ký tự từ một chuỗi, bạn chỉ có thể lặp lại chuỗi thay thế:

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

Đôi khi, bạn có thể lưu 1 ký tự ANDthay thế:

X MOD 4
3AND X

0

Bỏ qua OUTcác giá trị trả về

Một OUTchức năng hình thức là một với nhiều lợi nhuận; bạn chỉ định các biến để chấp nhận các giá trị trả về sau OUTtừ khóa. Một ví dụ sử dụng DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

Nhưng nếu bạn chỉ muốn một trong các giá trị, như tháng hiện tại thì sao? Bạn có thể "bỏ qua" phần còn lại của các giá trị bằng cách đơn giản là không viết bất kỳ tên biến nào để chấp nhận chúng! Tuy nhiên, bạn phải để lại dấu phẩy (ngoài việc trả lại tùy chọn không thường xuyên.)

DTREAD OUT ,monthVar,

Mà có thể được chơi thêm

DTREAD OUT,M,

0

Sử dụng LAST()

Bây giờ SmileBASIC 4 đã có mặt ở Nhật Bản, chúng ta có thể kiểm tra một số khoản tiết kiệm golf tiềm năng. Một chức năng ngay lập tức nhảy ra với tôi là LAST()hàm mới , trả về chỉ mục cuối cùng của một mảng hoặc chuỗi. Bạn có thể lưu một byte.

LEN(v)-1 'old way
LAST(v)  'new way
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.