TI-BASIC'te golf oynamak için ipuçları


26

TI-83/84 + serisi hesap makineleri için TI-BASIC'de golf oynamak için hangi genel önerilere sahipsiniz? Kod-golf problemlerine uygulanabilecek ve en azından biraz da TI-BASIC'e özgü fikirler arıyorum (örneğin, "yorumları kaldır" bir cevap değildir).

Lütfen cevap başına bir ipucu gönderin.


6
Lütfen her zaman hangi sürümden bahsettiğinizi ekleyin !
kusur

Yanıtlar:


22

Hesap makineniz sizin için satırların sonunu çıkarmakta oldukça akıllıdır ve bu nedenle epeyce karakterleri atlayabilirsiniz.

:Disp "HELLO WORLD    //is the same as...
:Disp "HELLO WORLD"

For(döngüler şöyle bir sözdizimine sahiptir - For(variable, start, end, increment)ancak bu artışı ihmal edebilirsiniz ve 1 değerini kullanacaktır:

:For(A,1,5     //is the same as...
:For(A,1,5,1)

ve tahta üzerindeki bitiş parantezlerini (satırların sonunda) atlayabilirsiniz:

:Output(1,1,A
:int(A
:round(A
etc.

TI-84 Silver Edition hesap makinemde test edildi

Bunun birden fazla fikir olduğunu düşünüyorsanız (çıkarımlar)


5
.... bu sadece yanlıştır 😭
Beta Decay

2
Ayrıca, en az sayıda parantez parantezi kullanmanız için kodu yeniden yazmaya çalışın. Her satırın yalnızca son ifadesinde parantezleri ücretsiz alırsınız, bu nedenle en iç içe ifadeleri sonuna kadar taşır. Bu not(iPart(B))+(A=5olabilir (A=5)+not(iPart(B.
lirtosiast

4
Bu, sadece parantez kapatma ihtiyacı her şey için geçerlidir (yani {lists}, "strings"ve [[matrices]]). Yeni bir satıra eriştiğinizde, iki nokta üst üste (yeni satır için bir stand-in; sütunlar içerebildikleri için dizeler için geçerli değildir) veya değişken atama oku ( STO ▶ `tuşuyla yazılan değişkenler için geçerli değildir) ifadeleri otomatik olarak kapatılır. ). Dilin tuhaf bir özelliği.
MI Wright,

14

kullanım Ans

Sadece bir sonraki satırda bir ifade kullanacaksanız, onu bir değişkene kaydetmeyin! Özel Ans değişkeni, değerlendirilen son ifadenin değerini depolayan tek baytlık bir simgedir. Böylece:

Xsin(A)->R
Disp R+tanh(R

olabilir

Xsin(A)
Disp Ans+tanh(Ans

iki bayt kaydediliyor.


9

Kayan noktalı sayılarla kodlanmış bir arama tablosu kullanın

Biraz gelişmiş bir ipucu:

Küçük arama tabloları kod golfü için kullanışlıdır: sık sık, örneğin 0 - 1, 1 - 2, 2 - 1 ve 0 için her şeyi eşleyen bir işleve ihtiyacımız vardır. Ancak, TI-BASIC dizileri uygun değildir Bunun için: Birincisi, bir tabanlıdır ve bir diğeri için dizi depolanana Ansveya bir liste değişkenine kadar bir değer elde edilemez .

Cevabım burada , ben Basitçe kullanmak istediğiniz değerleri listelemek baz 11. sihirli sabit küçük bir arama tablosu saklamak,

{0,-1,5,-1,-1,2,9,-1,8,6}

yararlı bir forma dönüştür

{1,0,6,0,0,3,10,0,9,7}

İstediğiniz tabana yazın (taban 11)

.106003A097

ve 10 tabanına dönüştürün

-1+int(11fPart(11^Ans.0954191904

En kısa dizi yaklaşımı 8 bayttır!

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

TI-BASIC sadece yüzer sayıyı 14 ondalık basamağa kadar kaydeder, bu yüzden en fazla 44 bit, sadece 14 tane basamak basabilir.

Bu teknik, baz-N kodlaması yerine sihirli bir sabit bulmak için kaba kuvvet arama kullanılarak daha da geliştirilebilir. Hala yukarıdaki cevabı golf etme sürecindeyim ama yinelemeci TI-BASIC golfçü Weregoose , wiki / forum TI- BASIC’de 30 (yani, yinelenen bir liste ) olan sayıların arasındaki farkları üretmek için bu yöntemi kullandı.6, 4, 2, 4, 2, 4, 6, 2 Bu kod parçasını içeren geliştirici:

2+2iPart(3fPart(576e^(fPart(I/8

576 sihirli sabiti Mathematica kullanılarak bulundu, ancak bir kopyasına sahip değilseniz en sevdiğiniz dilde bir komut dosyası kullanın.


5

Tekrarlanan ifadeler denklem değişkenlerini koyun.

EX:

Remainder(randInt(1,9),1
Remainder(randInt(1,9),5
Remainder(randInt(1,9),10

Olabilir:

"randInt(1,9→u
Remainder(u,1
Remainder(u,5
Remainder(u,10

Not: Bunun için iyi bir kullanım bulmak zor, ancak bu denklem değişkenlerini unutmanız gerektiği anlamına gelmez: P

Kaynak: http://tibasicdev.wikidot.com/selfmodify

-c4ooo Gönderen: Omnimaga


Bu örnekte, işlevle nbirlikte ilk ifadeye ekleyerek daha fazla tasarruf edebilirsiniz Remainder(.
Conor O'Brien,

5

Gereksiz değişken başlatmayı atla

Mevcut fikir birliği, tüm kodların yeni bir tercüman üzerinde çalıştırılmasına izin vermektir. Bundan faydalanabiliriz - tüm başlatılmamış gerçek değişkenler 0TI-BASIC'de Xminbaşlar ve olası yararlı değer olarak başlar -10. Bu nedenle, Ans'dan girdi almayan bir programda toplam çalıştırma yapmanız gerekiyorsa veya bir -10tane daha az baytta ihtiyacınız varsa , bu ipucu size yardımcı olabilir.


Xmax 10 ve Ymin ve Ymax benzer şekilde davranıyor, değil mi? Ayrıca, başka değerleri olan başka grafik parametreleri de var bence.
Fabian Röling,

5

Küçük liste üretimi

Eğer bir listeye ihtiyacınız varsa {1,2,...,N}, N'nin 42 olduğunu söyleyin, onu yaratmanın en açık yolu

seq(X,X,1,42. 

Ancak, ondan daha küçük bir bayt binomcdf((kümülatif binom dağılımı) komutunu kullanarak düzgün bir kesmek .

cumSum(binomcdf(41,0

Bu sadece N sabit olduğunda işe yarar, çünkü tasarruf N-1'in koddaki değeri ile değiştirilmesidir.

Daha kısa koda izin veren iki durum vardır.

Zaten bir L1boyut listeniz varsa :

cumSum(1 or L1

Siparişinizi umursamıyorsanız:

randIntNoRep(1,N     ;random permutation of numbers from 1 to N

2
Bir bayt daha küçük (ve aptalca daha yavaş) sabit olmadığı seq(X,X,1,Nzaman bile olsa daha yavaş olduğu garantilidir . NcumSum(1 or rand(N
Misha Lavrov

4

Bir programın sonunda If blokları için Bitiş deyimlerini ortadan kaldırın.

İki bayt kazandırır: biri Sonu, diğeri satır sonu için. Ayrıca, son satırda zımni Disp'i kullanmanıza izin verir, bu da genellikle ek bir bayt tasarrufu sağlar.

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
Disp 3ln(A
End
//end of program

Olabilir:

[code]
If A>5
Then
Output(1,1,Ans²+Ans+A
3ln(A
//end of program

Bu ucun loop blokları için çalışmadığı unutulmamalıdır. İyi bahşiş için +1
Tau

4

Deyimlerinizi bilin

Kod golfünde sıkça kullandığım bazı snippet'ler:

  • Gerçeğe-değere dönüştür (0/1):, not(not(Ansveya Ans and 1. Hangisini kullanmak gerekli parantezlere bağlıdır.
  • Bir gerçek-değere birini ekleyin: int(e^(Ans. Açık bir paren kaydeder 1+(Ans. Çok kullanışlı, çünkü TI-BASIC tek tabanlı dizilere sahip.
  • Harita {0,1}için {1,-1}: cos(πAns. Bir bayttan fazla tasarruf sağlar 1-2Ans.

  • Sayının işaret işlevi: tanh(ᴇ9Ans
  • Pozitif sonsuzluğa doğru yuvarlak: -int(-Ans
  • Pozitif bir tamsayıdaki hane sayısı: 1+int(log(Ans
  • Listelenecek karmaşık sayı {Re,Im}:imag(Ans{i,1

  • Dizeyi listeye dönüştür: seq(inString("...",sub(Ans,X,1)),X,1,length(Ans( ...arama dizesi nerede )
  • Listenin ilk öğesini kes: ΔList(cumSum(Ans
  • Bir listenin son öğesini kes: ΔList(cumSum(Ans)-Ans
  • Listedeki tüm öğelerin L1benzersiz olup olmadığını kontrol edin :SortA(L1:min(ΔList(L1
  • Bir listede X sayısını arayın (ilk oluşumu döndürür): 1+sum(not(cumSum(Ans=X
  • Tek bir mod olduğunda ve listede en fazla 10 öğenin bulunduğu bir liste modu: (çirkin ancak kısa): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans

Gerçekten neden tanh(ᴇ9Ansçalıştığını anlamıyorum .
SuperJedi224

1
@ SuperJedi224 Eh, tanh (0 sıfır, solda ve sağda sonsuzluk sınırları -1 ve 1'dir. Bu değerlere katlanarak yaklaşır, yani + -17 ya da öylesine + -1 yuvarlama hatası içindedir. mutlak değerler zaten 17ish büyükse, biz sadece yalnız (tanh kullanın.
lirtosiast

3

Kendinizi kullanarak bulursanız

0→G ;or any other variable
;other lines of code

Sonra kullanabilirsiniz (bir bayt kaydetmek için):

DelVar G;other lines of code

Bunun nedeni bir değişkeni ( G) sildiğinizde , bu durumda varsayılan değer haline gelmesidir 0,. Ardından, DelVarifadeden sonra yeni bir satır olmadan başka bir satır koyabilirsiniz . Önemli kontrol ifadelerini doğrudan ifadeden sonra koyarken dikkatli olun DelVar.

(TI-84'te test edilmiştir)


Bu nadiren faydalıdır; değişkenler varsayılan olarak 0'a sıfırlanır ve bir ZStandard yaparak Y'yi sıfırlayabilirsiniz.
lirtosiast

@ThomasKwa Birçok durumda, özellikle benim için yararlı oldu. Bir sıfırlama işlemi gerektiğinde yarı yarıya yapılması gerektiğinde.
Conor O'Brien,

2
Kod golfünde mi? Ne zaman? Bana programı gösterirseniz DelVar'ı optimize edebileceğimi düşünüyorum.
lirtosiast

@ThomasKwa Değil xode golf başına oldukça düşük disk alanı üzerinde programlama (TI-83). Şu an programa sahip değilim. Sana bu konuda geri döneceğim.
Conor O'Brien,

1
Birkaç dakikalık bir düşünceden sonra, DelVar'ın tek satırlı If ifadelerinden sonra olduğu gibi en kısa olabileceği birkaç senaryo düşünebilirim.
lirtosiast

3

Hangi liste değişkenleri kullanılacak?

Listeleri kullanırken, varsayılan listeleri önlemek L₁aracılığıyla L₆tek harfli adlarla adlandırılmış listelerin lehine: ᶫAaracılığıyla ᶫZ(burada küçük L).

Biri referans almak için iki bayta malolur (ancak L₁tek bir simgedir, iki baytlık bir simgedir) ancak değerleri bir listeye kaydederken , sembolü bir bayt ayırarak bırakabilirsiniz :

{1,2,3,4,5→ᶫA

olabilir

{1,2,3,4,5→A

Hesap makinesi, sonucun nerede saklandığına karar verirken ifadenin veri türünü kontrol eder.

Benzer bir şekilde, Input Aya da Prompt Ahiç saklayacak ᶫAkullanıcının bir sayı yerine bir listesini girerse.

Çoğu diğer komutlar olmadan kullanılabilir , ancak çoğu nadiren golf oynamakta kullanılır. Örneğin, üçüncü, dördüncü ve daha yüksek argümanlarda kaldırılmasına Matr►list(izin verir .

Genel kural, komut bir liste ifadesi değil bir liste değişkeni adı alırsa ve farklı bir tür değişken koyabilecek alternatif bir sözdizimi yoksa, o zaman komutun soluyla çalışabilmesidir .

Bu, bir listenin tek bir girişini değiştirmekle çalışmaz: 1→ᶫA(3olarak değiştirilemez 1→A(3.

Tabii ki, kullanılacak en iyi liste değişkeni daima Ans.


Bir dakika ne? " Input A" ᶫAkullanıcı bir listeye girerse saklar . "Bu, programlarımın çoğunun kolayca kırılabileceği anlamına gelir. Öyleyse, bu kadar çok Inputprograma sahip olmama gerek yok , çoğunlukla hata kontrolü olmadan küçük araçlara sahibim ya da kullanmak komple oyunlar GetKeyyerine Input.
Fabian Roling

1
Programlarınızı buna karşı kullanıcılara karşı korumayı gerçekten seviyorsanız, rasgele bir değere her zaman rastgele bir değer kaydedebilir Ave sonrasında değişip değişmediğini kontrol edebilirsiniz Input A.
Misha Lavrov

2

Değişken atama maliyetlerinizi bilin

Eğer bir kullanırsanız B-byte ifade Ndefa, bir değişkene atamak gerekir?

Anskullanılacak maliyet 1+Nbaytları (satır sonu için bir tane ve her kullanıldığı zaman için bir tane, bu nedenle Ans'ı kullanın (B-1)*(N-1)>2. AnsHer satır için yalnızca bir tane olabilir , bu nedenle Ansyararlı olabilecek tüm değerleri deneyin .

Gerçek değişkenler (örneğin X) maliyet 3+Nbaytları, bu yüzden ne zaman kullanın (B-1)*(N-1)>4.

Maliyet 3+2Nbaytlarını listele , bu yüzden onları kullan (B-2)*(N-1)>5.

Denklem değişkenleri en az kullanışlıdır: 4+2Nbaytlara ihtiyaçları vardır . Onları ne zaman kullanın (B-2)*(N-1)>6.

Min. bytes in an expression to save
 N \ var. | Ans | Real | List | Eqn
------------------------------------
 2           4     5      8      9
 3           3     4      5      6
 4           2     3      4      5

Bir fonksiyon bir listeyi değerlendirdiğinde, onu gibi bir denklem değişkeni yerine bir listeye kaydedin u. bu bir bayt kazandırır.

Yakın parantezlerin varlığı veya yokluğunun, yeniden düzenlenmeleri durumunda genellikle saklanan ifadelerin avantajlı olmasına neden olabileceğini unutmayın.

Şimdi kendimle çelişiyorum ve birinin bir satırda mümkün olduğunca kod yazması gerektiğini söyleyeceğim. Niye ya? Genellikle bir satırda uzun süre tekrar eden bir ifade olduğunda, basitleştirilebilir.


1

int (randInt üzerinden rand ()

X + int (Yrand, randInt'a göre eşittir veya daha az bayta eşittir (randInt olarak X, Y, 2 baytlık bir simgedir. Bazı potansiyel faydalar:

İki sınır bayt, alt sınır 0 olduğunda X + bırakılabilir

Randevudan önce X + gereklidir (belirli durumlarda, örneğin {2,5,8,11} gibi bir adım işlevinden rastgele seçilen

X + int (Yrand (N, N rastgele sayıların bir listesini oluşturmak için sadece RandInt (X, Y, N gibi kullanılabilir)

Grafik ekran başlatma

Line gibi işlevleri kullanmak için (piksel koordinatlarıyla kolayca) grafik ekran eksenlerini kare piksellere sıfırlamak ve eksenleri kaldırmak gerekir:

AxesOff
84→Xmin
72→Ymax
ZInteger

Kelepçe

min(U,max(L,N

N sayı veya algoritma ise ve U ve L üst ve alt sınırlardır.

Listede N Var

max(N={X,Y,Z

Daha fazla Liste matematik

L1*L2→L3

instead of

for(A,1,dim(L1
L1(A)*L2(A→L3(A
End

This also works for things like this:
not(L1
L1 and L2

Çıktı

Disp ve Metin (her ikisi de zincirlenebilir, böylece Disp A, B, A'yı B'den sonra ayrı satırlarda görüntüler ve Metin (28,40, A, B, A'nın B'ye bir satırda basmasını sağlar.

Optimal hareket döngüsünden teknoloji

Bu optimizasyonların çoğu, en az bayt cinsinden bir karakteri ekran etrafında hareket ettirmek için kullanılan teknolojinin bir parçası

http://tibasicdev.wikidot.com/movement

Token Boyut Listeleri

http://tibasicdev.wikidot.com/tokens

Yardım puanlaması için

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.