SmileBASIC'te golf için ipuçları


11

SmileBASIC daha fazla ilgiyi hak ediyor. SB cevapları veren burada sadece 3 kullanıcı gördüm (kendim dahil!) Ve bu beni şaşırtmasa da beni hayal kırıklığına uğrattı. Ücretli bir dil olmanın yanı sıra bir BASIC lehçesi olmak insanları kesinlikle kapatıyor, ancak sahip olanlar için aslında oldukça esnek ve şaşırtıcı bir şekilde golf yapılabilir. Bunun için ipucunu açacağımı ve ne geldiğini anlayacağımı düşündüm.

12Me21 sık sık ziyaret bekliyoruz :)

Yanıtlar:


11

Değiştir string!=""ilestring>""

SB, kod noktalarına bağlı olarak dizelerde daha büyük / daha az karşılaştırma yapmanıza olanak tanır. Ancak, boş dize, var olan en küçük dize olarak kabul edilir.

Ne yaparsan durumlar için string!=""size birini kullanabilirsiniz string>""veya ""<stringher dize daha büyüktür, çünkü ""ve ""daha az her dize aşıyor. Kullanıp kullanmadığınıza <veya >ifadenin geçerli sözdizimi için önce veya sonra boşluk gerektirip gerektirmediğine bağlı olarak, bayt tasarrufu da sağlayabilir.

Örneğin:

WHILE S$!=""

dönüştürülebilir

WHILE S$>""

ve daha da

WHILE""<S$

Bütün teller doğrudur. Boş olanlar bile.
snail_

Ah tamam. Mantıklı.
Rɪᴋᴇʀ

6

Kullanılması ?, ., @ve kapanmamış dizeleri

BASIC'in birçok lehçesi ?baskı için destek ve SB bir istisna değildir. Son derece kısa bir metin çıktı fonksiyonuna sahip olmak büyük bir avantajdır.

SmileBASIC'te, .olarak değerlendirilir 0.0, böylece yer kazanmak için 0 yerine kullanılabilir. Örneğin: 1 bayt tasarruf SPSET 0,21edilebilir SPSET.,21. ( SPSET0,21geçersizdir, çünkü SPSET0kullanıcı tanımlı bir işlev olabilir) EXEC.bir program döngüsünü sonsuza kadar oluşturmanın çok kısa bir yoludur (ancak tüm değişkenlerinizi sıfırlar, bu nedenle her zaman kullanılabilir değildir)

(Kullanılan etiketler GOTO, GOSUBve okuma DATA) olarak temsil edilir @LABELSmileBASIC içinde. Bir ifadede kullanıldığında, bunlar aslında dize olarak ele alınır. Örneğin BGMPLAY"@305C"şu şekilde yazılabilir:BGMPLAY@305C

Dizeler bir satırın sonunda (veya programın sonunda) otomatik olarak kapatılır. ?"Hello, World!"olarak yazılabilir ?"Hello, World!. Bu, uzunluğu değiştirmeden programları birden çok satıra bölerek daha okunabilir hale getirmek için de kullanılabilir: ?"Meow"BEEP 69olabilir

?"Meow
BEEP 69

Vay, MML'yi başlatmak için etiketleri kullanmak çılgınca. Karakter setinizi sınırlasa da bunu hiç düşünmezdim.
snail_

Kullandığım başka bir yer, onaltılık bir rakamın bir sayı mı yoksa bir harf mi olduğunu kontrol etmekti: @A<POP(H$)daha kısa "@"<POP(H$)( Aönemli değil, asla aynı olmayacağından sadece ilk karakteri kontrol ediyor)
12Me21

3

Bunun yerine dize dizini kullanma MID$

MID$İşlev bir dize ortasında yere bir alt dizeyi almak için birçok BASIC ortak bir işlevdir. Ancak, karakteri bir dizinde almanız gerekiyorsa, dize dizine ekleme özelliğini kullanmak daha kısadır. Örneğin:

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

Bu baskı C'nin her ikisi de. Dizeler karakter bazında dizi benzeri dizine eklemeyi destekler, bu nedenle bir seferde yalnızca bir karakteri kontrol etmeniz gerekiyorsa, bunu yapmanın en iyi yolu budur.


Dizelerin bu şekilde nasıl değiştirilebileceği hakkında konuşmalısınız. A$=@AA:A$[2]="BD":A$[0]="":A$[2]="C"
12

Muhtemelen karakter dizilerinin temelde nasıl karakter dizileri olduğuna dair bir dizi cevap yazacağım ama daha da iyisi, çünkü hepsini bir araya getirmek oldukça önemli bir görev.
snail_

... ya da biraz yazabilirsiniz;)
snail_

Diğer dillerde nasıl çalıştığını çok iyi bilmiyorum.
12

2

Ne zaman kullanılır :(veya kullanılmaz )

:Karakter SB açıklamada kesici olarak kullanılır. Temel olarak, ifadeleri aşağıdaki gibi bir satırda yığınlamak için kullanırsınız:

PRINT "HELLO!":PRINT "GOODBYE!"

Aksi takdirde, ortalama ifadeniz bir satırsonu tarafından kesilir:

PRINT "HELLO!"
PRINT "GOODBYE!"

Gerçekte, genellikle iki nokta üst üste işaretini kullanmanıza gerek yoktur. İfadeler sözdizimsel olarak geçerli belirteçlere bölünebildiği sürece, ayrıştırıcı biri sona erdiğinde ve diğeri başladığında çözme eğilimindedir. Aynı şey boşluk için de geçerli.

PRINT"HELLO!"PRINT"GOODBYE!"

Tabii ki, bu her zaman işe yaramaz. İfadeleri açıkça kırmanız gereken her zaman belirsiz durumlar ve geçersiz sözdizimleri vardır. Örnek verelim:

PRINT "HELLO";END

Noktalı virgül PRINT, ifade burada kesilmedikçe başka bir ifadenin yazdırılmasını beklediği anlamına gelir (yeni satırı bastırmak için sarkan noktalı virgüller kullanırız.) Burada END, bir anahtar kelime olmasına rağmen bir değer olduğu varsayılır ve yazdırmaya çalışır. bir hata. Bu nedenle, bu ifadeyi, ister kolon ister yeni satır olsun, açıkça kırmalıyız.

Genel olarak, bir şey belirsiz görünüyorsa, işe yarayıp yaramadığını görmek için deneyin. Değilse, ifadeyi kırın. Ayrıca, geçersiz sözdizimi üretecek herhangi bir şey 12Me21'in belirttiği gibi doğru şekilde vurgulanmamıştır.


2

Sözdizimi vurgulayıcıyı kullanın!

SmileBASIC'in kod düzenleyicisinde, kodun çalışıp çalışmayacağını belirlemek için kullanılabilecek yerleşik bir sözdizimi vurgulayıcı bulunur. Örneğin, yapmaya çalışırsanız BEEP0, vurgulamaz, çünkü bir işlev ve bir rakam arasında boşluk olması gerekir. Ancak BEEP.çalışır, çünkü. bir rakam değil.

X=7BEEPİşlevler bir sayı ile başlayamadığından normalde like kodu geçerlidir, bu nedenle SB bunu 7ve BEEPayrı olduğunu varsayar . Ancak. bir sayı olarak X=7ENDyorumlamaya çalıştığı için EĞER DEĞİLDİR (ve vurgulanmamıştır), 7E...ancak E'den sonra bir rakam olmadığından başarısız olur ve hataya neden olur. Normalde bunu anlamak oldukça zor olurdu, ancak çok güvenilir bir sözdizimi vurgulayıcı ile neler yapabileceğinizi ve yapamayacağınızı söylemek çok daha kolaydır.

SmileBASIC sözdizimi vurgulayıcım , SB'nin davranışını (umarım) mükemmel şekilde eşleştirmek için tasarlanmıştır, böylece kodun geçerli olup olmadığını kontrol etmek için kullanabilirsiniz.

<!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 operatöründen kaçının

Modül operatörü gerçekten uzundur ve mümkünse kaçınılmalıdır.

Bir dizeden karakter alıyorsanız, bunun yerine dizeyi tekrarlayabilirsiniz:

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

Bazen ANDbunun yerine 1 karakter kaydedebilirsiniz :

X MOD 4
3AND X

0

OUTDönüş değerlerini ihmal etme

Bir OUTşekilde işlevi birden fazla döner ile biridir; OUTanahtar kelimeden sonra dönüş değerlerini kabul etmek için değişkenleri belirtirsiniz . Kullanan bir örnek DTREAD:

DTREAD OUT yearVar,monthVar,dayVar

Ancak, şu anki ay gibi değerlerden yalnızca birini istiyorsanız ne olur? Değerlerin geri kalanını kabul etmek için herhangi bir değişken adı yazmadan "yok sayabilirsiniz"! Bununla birlikte, virgül içinde ayrılmak zorundasınız (ara sıra isteğe bağlı dönüş dışında).

DTREAD OUT ,monthVar,

Hangi daha da golf olabilir

DTREAD OUT,M,

0

kullanım LAST()

Şimdi SmileBASIC 4 Japonya'da çıktığı için, potansiyel golf tasarruflarından bazılarını kontrol edebiliriz. Hemen bana atlayan bir LAST()işlev, bir dizinin veya dizenin son dizinini döndüren yeni işlevdir. Bir bayt kaydedebilirsiniz.

LEN(v)-1 'old way
LAST(v)  'new way
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.