เคล็ดลับสำหรับการเล่นกอล์ฟใน SmileBASIC


11

SmileBASICสมควรได้รับความสนใจมากขึ้น ฉันเห็นผู้ใช้ 3 คนที่นี่เท่านั้น (รวมถึงตัวฉันด้วย!) ที่ให้คำตอบ SB และในขณะที่ไม่ได้ทำให้ฉันแปลกใจ แต่ก็ทำให้ฉันผิดหวัง มันเป็นภาษาที่ได้รับค่าตอบแทนรวมทั้งภาษาของภาษาเบสิกจะทำให้ผู้คนแตกต่างออกไปอย่างแน่นอน แต่สำหรับคนที่เป็นเจ้าของแล้วมันมีความยืดหยุ่นและน่าแปลกใจที่สามารถเล่นกอล์ฟได้ ฉันคิดว่าฉันเปิดกระทู้เคล็ดลับสำหรับมันและดูว่าเกิดอะไรขึ้น

ฉันคาดว่า 12Me21 จะไปเยี่ยมบ่อย ๆ :)

คำตอบ:


11

แทนที่string!=""ด้วยstring>""

SB ช่วยให้คุณทำการเปรียบเทียบมากขึ้น / น้อยลงบนสตริงตาม codepoints ของพวกเขา อย่างไรก็ตามสตริงว่างถือเป็นสตริงที่เล็กที่สุดที่มี

ดังนั้นสำหรับสถานการณ์ที่คุณstring!=""สามารถใช้อย่างใดอย่างหนึ่งstring>""หรือ""<stringเนื่องจากทุกสายมีค่ามากกว่า""และ""น้อยกว่าทุกสาย ขึ้นอยู่กับว่าคุณใช้<หรือ>ขึ้นอยู่กับว่าคำสั่งต้องการช่องว่างก่อนหรือหลังจะเป็นไวยากรณ์ที่ถูกต้องซึ่งยังสามารถบันทึกคุณไบต์

ตัวอย่างเช่น:

WHILE S$!=""

สามารถเปลี่ยนเป็น

WHILE S$>""

และเล่นกอล์ฟต่อไปที่

WHILE""<S$

สายทั้งหมดเป็นความจริง แม้แต่คนที่ว่างเปล่า
หอยทาก _

อ่าโอเค. มีเหตุผล.
Rɪᴋᴇʀ

6

การใช้?, ., @และสตริง unclosed

ภาษาถิ่นจำนวนมากที่รองรับระบบ 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

ว้าวการใช้ป้ายกำกับเพื่อเริ่ม MML นั้นไม่ได้ผล จะไม่เคยคิดเรื่องนี้แม้ว่ามันจะ จำกัด ชุดตัวละครของคุณ
หอยทาก _

อีกที่หนึ่งที่ฉันใช้คือตรวจสอบว่าตัวเลขฐานสิบหกเป็นตัวเลขหรือตัวอักษร: @A<POP(H$)สั้นกว่า"@"<POP(H$)( Aไม่สำคัญว่าจะตรวจสอบตัวอักษรตัวแรกเท่านั้นเพราะจะไม่เหมือนเดิม)
12Me21

3

ใช้การจัดทำดัชนีสตริงแทน MID$

MID$ฟังก์ชั่นการทำงานร่วมกันในเบื้องต้นเกี่ยวกับจำนวนมากที่จะได้รับ substring จากที่ไหนสักแห่งในช่วงกลางของสตริง อย่างไรก็ตามหากคุณต้องการรับตัวอักษรในดัชนีบางตัวการใช้การจัดทำดัชนีสตริงนั้นสั้นกว่ามาก ตัวอย่างเช่น:

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

ทั้งสองการพิมพ์ C. Strings สนับสนุนการจัดทำดัชนีเหมือนอาร์เรย์บนพื้นฐานของตัวละครดังนั้นหากคุณต้องการตรวจสอบครั้งละหนึ่งตัวอักษรนี่เป็นวิธีที่ดีที่สุดในการทำมัน


คุณควรพูดคุยเกี่ยวกับวิธีที่สตริงสามารถแก้ไขได้ด้วยวิธีนี้ 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 จึงถือว่า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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.