เคล็ดลับการตีกอล์ฟใน TI-BASIC


26

คุณมีคำแนะนำทั่วไปสำหรับการเล่นกอล์ฟใน TI-BASIC สำหรับเครื่องคิดเลข TI-83/84 + ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟและอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับ TI-BASIC (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ)

กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ


6
โปรดระบุเวอร์ชันที่คุณอ้างอิงด้วยเสมอ!
ข้อบกพร่อง

คำตอบ:


22

เครื่องคิดเลขของคุณนั้นฉลาดพอที่จะสรุปจุดสิ้นสุดของเส้นให้คุณและทำให้คุณสามารถละเว้นอักขระบางตัว

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

For(ลูปมีไวยากรณ์ดังนี้ - For(variable, start, end, increment)แต่คุณสามารถละเว้นการเพิ่มได้และจะใช้ 1:

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

และคุณสามารถละเว้นวงเล็บปิดท้าย (ที่ท้ายบรรทัด) ทั่วกระดาน:

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

ทดสอบกับเครื่องคิดเลข TI-84 Silver Edition ของฉัน

หากคุณคิดว่านี่เป็นแนวคิดมากกว่าหนึ่งข้อ (อนุมานตอนจบ) ฉันจะแยกพวกเขาออก


5
.... นี่เป็นสิ่งที่ผิด😭
Beta Decay

2
นอกจากนี้ให้ลองเขียนโค้ดใหม่เพื่อให้คุณใช้วงเล็บปิดน้อยที่สุด เฉพาะการแสดงออกครั้งสุดท้ายของทุกบรรทัดคุณจะได้รับวงเล็บฟรีดังนั้นให้ย้ายข้อความที่ซ้อนกันมากที่สุดไปยังจุดสิ้นสุด นั่นคือสามารถnot(iPart(B))+(A=5 (A=5)+not(iPart(B
lirtosiast

4
นี้ใช้สำหรับทุกอย่างที่ต้องการปิดไม่ได้เป็นเพียงวงเล็บ (คือ{lists}, "strings"และ[[matrices]]) นิพจน์จะถูกปิดโดยอัตโนมัติเมื่อคุณมาถึงบรรทัดใหม่โคลอน (สแตนอินสำหรับบรรทัดใหม่นั้นไม่สามารถใช้กับสตริงได้เนื่องจากพวกเขาสามารถมีโคลอน) หรือลูกศรการกำหนดตัวแปร ( พิมพ์ด้วยปุ่ม STO button ` ) คุณสมบัติแปลก ๆ ของภาษา
MI Wright

14

ใช้ Ans

หากคุณจะใช้นิพจน์ในบรรทัดถัดไปอย่าเก็บมันไว้ในตัวแปร! ตัวแปร Ans พิเศษคือโทเค็นหนึ่งไบต์ที่เก็บค่าของนิพจน์สุดท้ายที่ประเมิน ดังนั้น:

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

เป็นไปได้

Xsin(A)
Disp Ans+tanh(Ans

ประหยัดสองไบต์


9

ใช้ตารางการค้นหาที่เข้ารหัสในจำนวนจุดลอยตัว

เคล็ดลับขั้นสูงเล็กน้อย:

ตารางการค้นหาขนาดเล็กมีประโยชน์สำหรับ code golf: บ่อยครั้งมากที่เราต้องการฟังก์ชั่นที่แมปเช่น 0 ถึง 1, 1 ถึง 2, 2 ถึง 1 และทุกอย่างเป็น 0 อย่างไรก็ตามอาร์เรย์ TI-BASIC ไม่เหมาะ สำหรับจุดประสงค์นี้: สำหรับสิ่งหนึ่งมันเป็นแบบอิงและอีกอย่างหนึ่งไม่สามารถแยกค่าได้จนกว่าอาร์เรย์จะถูกเก็บไว้ในAnsหรือรายการตัวแปร

ในคำตอบของฉัน ที่นี่ฉันเก็บตารางการค้นหาขนาดเล็กในค่าคงที่เวทย์มนตร์ในฐาน 11 เพียงแค่รายการค่าที่คุณต้องการใช้

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

แปลงเป็นรูปแบบที่มีประโยชน์

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

เขียนในฐานที่คุณต้องการ (ฐาน 11)

.106003A097

และแปลงเป็นฐาน 10

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

วิธีอาร์เรย์ที่สั้นที่สุดคือ 8 ไบต์อีกต่อไป!

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

TI-BASIC จะเก็บเฉพาะทศนิยมถึง 14 หลักเท่านั้นดังนั้นคุณสามารถจัดเก็บได้มากถึง 44 บิตและ 14 หลักเท่านั้น

เทคนิคนี้สามารถปรับปรุงได้บ่อยขึ้นโดยใช้การค้นหาแบบ brute-force เพื่อค้นหาค่าคงที่เวทย์มนตร์มากกว่าการเข้ารหัส base-N ฉันยังอยู่ในขั้นตอนของการเล่นกอล์ฟคำตอบข้างต้น แต่นักเล่นกอล์ฟระดับมาตรฐาน TI-BASIC Weregoose ใช้วิธีนี้เพื่อสร้างความแตกต่างระหว่างตัวเลข coprime กับ 30 (นั่นคือรายการซ้ำของ6, 4, 2, 4, 2, 4, 6, 2) ใน wiki / forum TI-BASIC ผู้พัฒนาที่มีตัวอย่างนี้:

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

ค่าคงที่เวทมนต์ 576 ถูกค้นพบโดยใช้ Mathematica แต่ถ้าคุณไม่มีสำเนาให้ใช้สคริปต์ในภาษาที่คุณชื่นชอบ


5

ใส่ตัวแปรสมการนิพจน์ซ้ำแล้วซ้ำอีก

EX:

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

เป็นไปได้:

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

หมายเหตุ: เป็นการยากที่จะใช้สิ่งนี้ได้ดี แต่นั่นไม่ได้หมายความว่าคุณควรลืมตัวแปรสมการ: P

ที่มา: http://tibasicdev.wikidot.com/selfmodify

-c4ooo จาก Omnimaga


ในตัวอย่างนี้คุณสามารถประหยัดได้มากขึ้นด้วยการเพิ่มnนิพจน์แรกพร้อมกับRemainder(ฟังก์ชัน
Conor O'Brien

5

ข้ามการเริ่มต้นตัวแปรที่ไม่จำเป็น

ฉันทามติปัจจุบันคืออนุญาตให้ใช้โค้ดทั้งหมดในล่ามสด เราสามารถใช้ประโยชน์จากนี้ทุกตัวแปรจริงเตรียมเริ่มต้นที่0ใน TI-พื้นฐานและการเริ่มต้นเป็นค่าที่มีประโยชน์อาจจะเป็นXmin -10ดังนั้นถ้าคุณต้องการผลรวมสะสมในโปรแกรมที่ไม่ได้รับอินพุตจาก Ans หรือคุณต้องการ-10ไบต์ที่น้อยลงหนึ่งทิปเคล็ดลับนี้สามารถช่วยคุณได้


Xmax คือ 10 และ Ymin และ Ymax ทำงานเหมือนกันใช่ไหม นอกจากนี้ยังมีพารามิเตอร์กราฟอื่น ๆ ที่มีค่าอื่น ๆ ฉันคิดว่า
Fabian Röling

5

การสร้างรายการที่เล็กลง

หากคุณต้องการรายการ{1,2,...,N}โดยที่ N คือพูดว่า 42 วิธีที่ชัดเจนในการสร้างมันคือ

seq(X,X,1,42. 

อย่างไรก็ตามหนึ่งไบต์ที่เล็กกว่านั้นคือแฮ็คที่เรียบร้อยโดยใช้binomcdf(คำสั่ง (การแจกแจงแบบทวินามสะสม)

cumSum(binomcdf(41,0

ใช้งานได้เมื่อ N เป็นค่าคงที่เท่านั้นเนื่องจากการออมมาจากการแทนที่ N-1 ด้วยค่าในรหัส

มีสองกรณีที่อนุญาตให้ใช้รหัสที่สั้นกว่านี้ได้

หากคุณมีรายการL1มิติ N อยู่แล้ว:

cumSum(1 or L1

หากคุณไม่สนใจคำสั่งซื้อ:

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

2
รับประกันว่าจะมีขนาดเล็กลงหนึ่งไบต์ (และช้าลงอย่างโง่เขลา) seq(X,X,1,Nแม้ว่าNจะไม่ใช่ค่าคงที่cumSum(1 or rand(Nก็ตาม
Misha Lavrov

4

กำจัดคำสั่ง End สำหรับ If บล็อกที่ท้ายโปรแกรม

บันทึกสองไบต์: หนึ่งสำหรับ End และอีกหนึ่งสำหรับ linebreak นอกจากนี้ยังช่วยให้คุณใช้ Disp Disp โดยนัยในบรรทัดสุดท้ายมักจะบันทึกไบต์เพิ่มเติม

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

เป็นไปได้:

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

ควรสังเกตว่าเคล็ดลับนี้ใช้ไม่ได้กับบล็อกลูป +1 สำหรับเคล็ดลับที่ดีแม้ว่า
เอกสิทธิ์

4

รู้สำนวนของคุณ

นี่คือตัวอย่างบางส่วนที่ฉันมักใช้ในการเขียนโค้ดกอล์ฟ:

  • แปลงค่าความจริง (0/1): หรือnot(not(Ans Ans and 1ตัวเลือกใดที่จะใช้ขึ้นอยู่กับวงเล็บที่จำเป็น
  • เพิ่มหนึ่งรายการเป็นค่าความจริง: int(e^(Ans. 1+(Ansบันทึกเปิดวงเล็บมากกว่า มีประโยชน์มากเนื่องจาก TI-BASIC มีอาร์เรย์หนึ่งชุด
  • แผนที่{0,1}ไปยัง{1,-1}: cos(πAns. 1-2Ansประหยัดมากกว่าหนึ่งไบต์

  • ฟังก์ชั่นเข้าสู่ระบบของตัวเลข: tanh(ᴇ9Ans
  • ปัดไปทางบวกอนันต์: -int(-Ans
  • จำนวนหลักในจำนวนเต็มบวก: 1+int(log(Ans
  • จำนวนเชิงซ้อนในการแสดงรายการ {Re,Im} :imag(Ans{i,1

  • แปลงสตริงเป็นรายการ: seq(inString("...",sub(Ans,X,1)),X,1,length(Ans(โดยที่...คือสตริงค้นหา)
  • ตัดองค์ประกอบแรกของรายการ: ΔList(cumSum(Ans
  • ตัดองค์ประกอบสุดท้ายของรายการ: ΔList(cumSum(Ans)-Ans
  • ตรวจสอบว่าองค์ประกอบทั้งหมดของรายการ L1ไม่ซ้ำกัน:SortA(L1:min(ΔList(L1
  • ค้นหาหมายเลข X ในรายการ (ส่งคืนการเกิดครั้งแรก): 1+sum(not(cumSum(Ans=X
  • โหมดของรายการเมื่อมีโหมดเดียวและรายการมีองค์ประกอบมากที่สุด 10 รายการ: (น่าเกลียด แต่สั้น): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans

ฉันไม่เข้าใจว่าทำไมtanh(ᴇ9Ansคนหนึ่งถึงทำงาน
SuperJedi224

1
@ SuperJedi224 เอ่อ tanh (0 คือศูนย์และข้อ จำกัด ของอินฟินิตี้ทางซ้ายและขวาคือ -1 และ 1 มันจะได้ใกล้เคียงกับค่าเหล่านั้นอย่างมากดังนั้นที่ผ่านมา + -17 หรืออยู่ภายในข้อผิดพลาดในการปัดเศษของ + -1 หากค่าสัมบูรณ์มากกว่า 17ish แล้วเราเพียงแค่ใช้ tanh (คนเดียว
lirtosiast

3

หากคุณพบว่าตัวเองกำลังใช้

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

จากนั้นคุณสามารถใช้ (เพื่อบันทึกไบต์):

DelVar G;other lines of code

นี่เป็นเพราะเมื่อคุณลบตัวแปร ( G) มันจะกลายเป็นค่าเริ่มต้นในกรณี0นี้ จากนั้นคุณสามารถใส่สายอื่นหลังจากที่DelVarคำสั่งโดยไม่ต้องขึ้นบรรทัดใหม่ ระวังเมื่อวางข้อความสั่งการควบคุมที่สำคัญโดยตรงหลังจากDelVarข้อความ

(ทดสอบกับ TI-84)


สิ่งนี้ไม่ค่อยมีประโยชน์ ตัวแปรถูกเตรียมใช้งานเป็น 0 โดยค่าเริ่มต้นและคุณสามารถเป็นศูนย์ Y ได้โดยทำ ZStandard
lirtosiast

@ThomasKwa มันมีประโยชน์กับฉันหลายครั้ง เมื่อต้องการรีเซ็ตบางส่วนผ่านการดำเนินการ
Conor O'Brien

2
ในการตีกอล์ฟ? เมื่อ? หากคุณแสดงโปรแกรมที่ฉันคิดว่าฉันจะสามารถเพิ่มประสิทธิภาพของ DelVar
lirtosiast

@ThomasKwa ไม่ใช่ xode golf ต่อ seแต่ควรเขียนโปรแกรมบนพื้นที่ดิสก์เหลือน้อย (TI-83) ฉันไม่มีโปรแกรมตอนนี้ ฉันจะติดต่อกลับไปหาคุณ
Conor O'Brien

1
หลังจากความคิดสองสามนาทีฉันสามารถนึกถึงสถานการณ์สองสามสถานการณ์ที่ DelVar อาจสั้นที่สุดเช่นหลังประโยค If-line แบบเดี่ยว
lirtosiast

3

รายการตัวแปรใดที่จะใช้

เมื่อใช้รายการหลีกเลี่ยงรายการเริ่มต้นL₁ผ่านL₆รายการที่มีชื่อพร้อมชื่อตัวอักษร: ᶫAถึงᶫZ(โดยที่ L ตัวน้อยอยู่)

หนึ่งค่าใช้จ่ายสองไบต์ในการอ้างอิง (แม้ว่าL₁จะเป็นโทเค็นเดียวมันเป็นโทเค็นสองไบต์) แต่เมื่อเก็บค่าในรายการคุณสามารถวางสัญลักษณ์บันทึกไบต์:

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

เป็นไปได้

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

เครื่องคิดเลขจะตรวจสอบชนิดข้อมูลของนิพจน์เมื่อตัดสินใจว่าจะเก็บผลลัพธ์ไว้ที่ใด

ในทำนองเดียวกันInput AหรือPrompt Aจะเก็บไว้เพื่อᶫAหากผู้ใช้เข้าสู่รายการแทนที่จะเป็นตัวเลข

สามารถใช้คำสั่งอื่น ๆ ได้โดยไม่ต้องใช้คำสั่งแม้ว่าส่วนใหญ่คำสั่งเหล่านี้จะไม่ค่อยใช้ในการเล่นกอล์ฟ ตัวอย่างเช่นMatr►list(อนุญาตให้ลบออกในอาร์กิวเมนต์ที่สามสี่และสูงกว่า

กฎทั่วไปคือถ้าคำสั่งใช้ชื่อตัวแปรลิสต์และไม่ใช่นิพจน์รายการและหากไม่มีไวยากรณ์ทางเลือกที่สามารถใส่ตัวแปรชนิดอื่นได้คำสั่งนั้นอาจทำงานด้วยการหยุดทำงาน

สิ่งนี้ไม่ทำงานกับการแก้ไขรายการเดียวของรายการ: 1→ᶫA(3ไม่สามารถเปลี่ยนเป็น1→A(3ไม่สามารถเปลี่ยนเป็น

Ansแน่นอนตัวแปรรายการที่ดีที่สุดในการใช้งานอยู่เสมอ


รออะไร? " Input A" จะเก็บไว้ᶫAหากผู้ใช้เข้าสู่รายการ "นั่นหมายความว่าหลายโปรแกรมของฉันนั้นค่อนข้างง่ายที่จะแตกจากนั้นก็ดีที่ฉันไม่มีInputโปรแกรมจำนวนมากอยู่ดีฉันส่วนใหญ่มีเครื่องมือขนาดเล็กที่ไม่มีการตรวจสอบข้อผิดพลาดหรือ เกมที่สมบูรณ์แบบที่ใช้GetKeyแทนInput.
Fabian Roling

1
หากคุณกระตือรือร้นในการพิสูจน์ตัวตนโปรแกรมของคุณกับสิ่งนี้คุณสามารถเก็บค่าแบบสุ่มไว้Aและตรวจสอบว่ามีการเปลี่ยนแปลงInput Aหรือไม่
Misha Lavrov

2

รู้ค่าใช้จ่ายการมอบหมายตัวแปรของคุณ

หากคุณใช้เวลาB-byte นิพจน์Nคุณควรกำหนดให้กับตัวแปรหรือไม่?

Ans1+Nไบต์ค่าใช้จ่ายที่จะใช้ (หนึ่งสำหรับการแบ่งบรรทัดและอีกหนึ่งรายการสำหรับแต่ละครั้งที่ใช้งานดังนั้นให้ใช้ Ans เมื่อ(B-1)*(N-1)>2สามารถมีได้เพียงหนึ่งรายการAnsต่อบรรทัดดังนั้นให้ลองใช้ค่าทั้งหมดสำหรับAnsที่อาจมีประโยชน์

ตัวแปรจริง (เช่นXค่าใช้จ่าย) ไบต์เพื่อใช้พวกเขาเมื่อ3+N(B-1)*(N-1)>4

ตัวแปรรายการค่าใช้จ่ายไบต์เพื่อใช้พวกเขาเมื่อ3+2N(B-2)*(N-1)>5

ตัวแปรสมการมีประโยชน์น้อยที่สุด: พวกเขาต้องการ4+2Nไบต์ (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

เมื่อมีฟังก์ชั่นการประเมินในรายการเก็บไว้ในรายการมากกว่าตัวแปรสมการเช่นu; นี้ช่วยประหยัดหนึ่งไบต์

โปรดทราบว่าการมีหรือไม่มีวงเล็บปิดอยู่บ่อยครั้งอาจทำให้การจัดเก็บนิพจน์มีประโยชน์หากจัดเรียงใหม่

ตอนนี้ฉันจะโต้แย้งตัวเองและบอกว่าควรเขียนโค้ดในหนึ่งบรรทัดให้มากที่สุด ทำไม? โดยทั่วไปเมื่อมีการแสดงออกซ้ำบนเส้นยาวมันสามารถลดความซับซ้อนได้


1

int (rand มากกว่า randInt (

X + int (Yrand เท่ากับหรือน้อยกว่าไบต์กว่า randInt (X, Y เนื่องจาก randInt เป็นโทเค็น 2 ไบต์ประโยชน์ที่อาจเกิดขึ้น:

X + สามารถถูกปล่อยทิ้งไว้เมื่อขอบเขตล่างเป็น 0 บันทึกสองไบต์

X + เป็นสิ่งจำเป็นก่อน randInt (อย่างไรก็ตามในบางสถานการณ์เช่นสุ่มจากฟังก์ชันขั้นตอนเช่น {2,5,8,11}

X + int (Yrand (N สามารถใช้เช่นเดียวกับ randInt (X, Y, N เพื่อสร้างรายการของตัวเลขสุ่ม N)

การเริ่มต้น Graphscreen

ในการใช้ฟังก์ชั่นเช่น Line (ง่าย ๆ ด้วยพิกัดพิกเซลจำเป็นต้องเริ่มต้นแกนหน้าจอกราฟเป็นพิกเซลสี่เหลี่ยมจัตุรัสและลบแกน:

AxesOff
84→Xmin
72→Ymax
ZInteger

ที่หนีบ

min(U,max(L,N

โดยที่ N คือหมายเลขหรืออัลกอริทึมและ U และ L เป็นขอบเขตบนและล่าง

เป็น N ในรายการ

max(N={X,Y,Z

รายการคณิตศาสตร์เพิ่มเติม

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

เอาท์พุต

การแสดงและข้อความ (ทั้งคู่สามารถถูกล่ามโซ่ดังนั้น Disp A, B จะแสดง A และ B ในบรรทัดแยกต่างหากและข้อความ (28,40, A, B จะพิมพ์ A ถัดจาก B ในหนึ่งบรรทัด

เทคโนโลยีจากห่วงการเคลื่อนไหวที่ดีที่สุด

การเพิ่มประสิทธิภาพจำนวนมากเหล่านี้เป็นส่วนหนึ่งของเทคโนโลยีที่ใช้ในการย้ายตัวละครไปรอบ ๆ หน้าจอด้วยจำนวนน้อยที่สุด

http://tibasicdev.wikidot.com/movement

รายการขนาดโทเค็น

http://tibasicdev.wikidot.com/tokens

สำหรับคะแนนความช่วยเหลือ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.