SmileBASIC में गोल्फ के लिए टिप्स


11

SmileBASIC अधिक ध्यान देने योग्य है। मैंने केवल 3 उपयोगकर्ताओं को यहां (स्वयं सहित!) एसबी उत्तर प्रदान करते हुए देखा है, और जबकि यह मुझे आश्चर्यचकित नहीं करता है, यह मुझे निराश करता है। यह एक पेड लैंग होने के साथ-साथ एक BASIC बोली होने के नाते निश्चित रूप से लोगों को बंद कर देता है, लेकिन उन लोगों के लिए जिनके पास वास्तव में यह बहुत लचीला है और आश्चर्यजनक रूप से, गोल्फ के लिए उपयुक्त है। मुझे लगा कि मैं इसके लिए यह सुझाव धागा खोलूंगा और देखूंगा कि क्या आता है।

मुझे उम्मीद है कि 12Me21 अक्सर दौरा करेंगे :)

जवाबों:


11

बदलें string!=""के साथstring>""

SB आपको कोडिंग के आधार पर स्ट्रिंग्स पर अधिक / कम तुलना करने की अनुमति देता है। हालाँकि, खाली स्ट्रिंग को सबसे छोटी स्ट्रिंग माना जाता है।

तो उन स्थितियों के लिए जहां आप करते string!=""हैं string>""या तो आप या तो उपयोग कर सकते हैं ""<string, क्योंकि प्रत्येक स्ट्रिंग से अधिक है ""और ""प्रत्येक स्ट्रिंग से कम है। इस पर निर्भर करता है कि आप उपयोग करते हैं <या >इस पर निर्भर करते हैं कि क्या कथन को वाक्यविन्यास से पहले या बाद में व्हाट्सएप की आवश्यकता है, जो आपको बाइट्स से भी बचा सकता है।

उदाहरण के लिए:

WHILE S$!=""

में बदल सकते हैं

WHILE S$>""

और आगे गोल्फ के लिए

WHILE""<S$

सभी तार सत्य हैं। यहां तक ​​कि खाली भी।
घोंघा_

आह ठीक है। समझ में आता है।
R

6

का उपयोग करते हुए ?, ., @, और खुली हुई तार

?मुद्रण के लिए बुनियादी समर्थन की कई बोलियां , और एसबी कोई अपवाद नहीं है। एक बहुत ही छोटा पाठ आउटपुट फंक्शन होना एक बड़ा लाभ है।

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

वाह, एमएमएल शुरू करने के लिए लेबल का उपयोग करना पागल है। यह कभी नहीं सोचा होगा, हालांकि यह आपके चरित्र सेट को सीमित करता है।
घोंघा_

एक अन्य जगह जिसका मैंने उपयोग किया था यह जांचने के लिए कि क्या हेक्साडेसिमल अंक एक संख्या या एक अक्षर था: @A<POP(H$)से छोटा है "@"<POP(H$)( Aकोई फर्क नहीं पड़ता, यह केवल पहले वर्ण की जांच करता है क्योंकि यह कभी भी समान नहीं होगा)
12Me21

3

के बजाय स्ट्रिंग अनुक्रमण का उपयोग करें MID$

MID$समारोह में कई बुनियादी बातों में एक आम समारोह एक स्ट्रिंग के बीच में कहीं से सबस्ट्रिंग प्राप्त करने के लिए है। हालाँकि, यदि आपको केवल कुछ इंडेक्स पर वर्ण प्राप्त करने की आवश्यकता है, तो स्ट्रिंग इंडेक्सिंग का उपयोग करना बहुत कम है। उदाहरण के लिए:

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

ये दोनों सी। स्ट्रिंग्स चरित्र आधार पर अनुक्रमणिका की तरह सरणी का समर्थन करते हैं, इसलिए यदि आपको केवल एक समय में एक वर्ण की जांच करने की आवश्यकता है, तो यह इसे करने का सबसे अच्छा तरीका है।


आपको इस बारे में बात करनी चाहिए कि कैसे तार को इस तरह से संशोधित किया जा सकता है। A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12M2121

मैं शायद इस बारे में जवाबों का एक सेट लिखूंगा कि कैसे तार मूल रूप से चरित्र सरणियां हैं, लेकिन इससे भी बेहतर, क्योंकि यह सब एक में डालना काफी काम है।
घोंघा_

... या आप कुछ लिख सकते हैं;)
घोंघा_

मैं अन्य भाषाओं में कैसे काम करता हूं, इससे बहुत परिचित नहीं हूं।
12M2121

2

कब उपयोग करें :(या नहीं)

:चरित्र एस.बी. में एक बयान ब्रेकर के रूप में प्रयोग किया जाता है। मूल रूप से, आप इसका उपयोग एक पंक्ति में स्टेटमेंट को स्टैक करने के लिए करते हैं जैसे:

PRINT "HELLO!":PRINT "GOODBYE!"

अन्यथा, आपका औसत विवरण एक नई सीमा से टूट जाता है:

PRINT "HELLO!"
PRINT "GOODBYE!"

वास्तव में, आपको अक्सर बृहदान्त्र का उपयोग करने की आवश्यकता नहीं होती है। जब तक बयानों को वाक्यगत रूप से मान्य टोकन में तोड़ा जा सकता है, तब तक पार्सर यह पता लगाने के लिए जाता है कि एक समाप्त होता है और दूसरा शुरू होता है। वही अक्सर व्हाट्सएप के लिए जाता है।

PRINT"HELLO!"PRINT"GOODBYE!"

बेशक, यह हमेशा काम नहीं करता है। हमेशा अस्पष्ट मामले और अवैध सिंटैक्स होते हैं, जहां आपको स्पष्ट रूप से बयानों को तोड़ना पड़ता है। उदाहरण के लिए:

PRINT "HELLO";END

अर्धविराम का मतलब है कि PRINTएक और अभिव्यक्ति के प्रिंट आउट की उम्मीद है, जब तक कि बयान वहाँ नहीं हो जाता (हम न्यूलाइन को दबाने के लिए लटकते अर्धविराम का उपयोग करते हैं।) यहाँ यह ENDमाना जाता है कि यह एक कीवर्ड होने के बावजूद एक मान है, और इसे प्रिंट करने की कोशिश करता है, जिसके परिणामस्वरूप। एक त्रुटि में। इस प्रकार, हमें स्पष्ट रूप से इस कथन को तोड़ना होगा, यह बृहदान्त्र या न्यूलाइन हो सकता है।

सामान्य तौर पर, अगर कुछ अस्पष्ट लगता है, तो यह देखने की कोशिश करें कि क्या यह काम करता है। यदि ऐसा नहीं है, तो कथन को तोड़ें। इसके अलावा, कुछ भी जो अवैध सिंटैक्स का उत्पादन करेगा उसे सही ढंग से हाइलाइट नहीं किया गया है जैसा कि 12Me21 में उल्लेख किया गया है।


2

वाक्यविन्यास हाइलाइटर का उपयोग करें!

SmileBASIC के कोड संपादक में एक सिंटैक्स हाइलाइटर है, जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोड काम करेगा या नहीं। उदाहरण के लिए, यदि आप करने की कोशिश करते हैं BEEP0, तो यह इसे उजागर नहीं करेगा, क्योंकि फ़ंक्शन और अंक के बीच एक स्थान होना चाहिए। हालांकि BEEP.काम करता है, क्योंकि। कोई अंक नहीं है।

आम तौर पर जैसे कोड X=7BEEPमान्य होता है, क्योंकि फ़ंक्शन एक संख्या से शुरू नहीं हो सकता है, इसलिए एसबी मान लेता है 7और BEEPअलग हैं। तथापि। X=7ENDअनुमति नहीं है (और हाइलाइट नहीं किया गया है), क्योंकि यह 7E...एक संख्या के रूप में व्याख्या करने की कोशिश करता है , लेकिन चूंकि ई के बाद कोई अंक नहीं है, यह विफल हो जाता है, जिससे त्रुटि होती है। आम तौर पर यह पता लगाना बहुत कठिन होगा, लेकिन एक बहुत ही विश्वसनीय वाक्यविन्यास हाइलाइटर के साथ, यह बताना बहुत आसान है कि आप क्या कर सकते हैं और क्या नहीं।

मेरा SmileBASIC सिंटैक्स हाइलाइटर (उम्मीद से) एसबी के व्यवहार से पूरी तरह से मेल खाता है, इसलिए आप यह जांचने के लिए उपयोग कर सकते हैं कि क्या कोड वैध है।

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

अब जब स्माइलबासिक 4 जापान में है, तो हम कुछ संभावित गोल्फ बचत की जांच कर सकते हैं। एक जो तुरंत मेरे लिए कूदता है वह नया LAST()फ़ंक्शन है, जो किसी सरणी या स्ट्रिंग के अंतिम सूचकांक को लौटाता है। आप एक बाइट बचा सकते हैं।

LEN(v)-1 'old way
LAST(v)  'new way
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.