คุณมีคำแนะนำทั่วไปสำหรับการเล่นกอล์ฟใน TI-BASIC สำหรับเครื่องคิดเลข TI-83/84 + ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟและอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับ TI-BASIC (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ)
กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คุณมีคำแนะนำทั่วไปสำหรับการเล่นกอล์ฟใน TI-BASIC สำหรับเครื่องคิดเลข TI-83/84 + ฉันกำลังมองหาความคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟและอย่างน้อยก็ค่อนข้างเฉพาะเจาะจงกับ TI-BASIC (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ)
กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
เครื่องคิดเลขของคุณนั้นฉลาดพอที่จะสรุปจุดสิ้นสุดของเส้นให้คุณและทำให้คุณสามารถละเว้นอักขระบางตัว
: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 ของฉัน
หากคุณคิดว่านี่เป็นแนวคิดมากกว่าหนึ่งข้อ (อนุมานตอนจบ) ฉันจะแยกพวกเขาออก
not(iPart(B))+(A=5
(A=5)+not(iPart(B
{lists}
, "strings"
และ[[matrices]]
) นิพจน์จะถูกปิดโดยอัตโนมัติเมื่อคุณมาถึงบรรทัดใหม่โคลอน (สแตนอินสำหรับบรรทัดใหม่นั้นไม่สามารถใช้กับสตริงได้เนื่องจากพวกเขาสามารถมีโคลอน) หรือลูกศรการกำหนดตัวแปร ( →
พิมพ์ด้วยปุ่ม STO button ` ) คุณสมบัติแปลก ๆ ของภาษา
Ans
หากคุณจะใช้นิพจน์ในบรรทัดถัดไปอย่าเก็บมันไว้ในตัวแปร! ตัวแปร Ans พิเศษคือโทเค็นหนึ่งไบต์ที่เก็บค่าของนิพจน์สุดท้ายที่ประเมิน ดังนั้น:
Xsin(A)->R
Disp R+tanh(R
เป็นไปได้
Xsin(A)
Disp Ans+tanh(Ans
ประหยัดสองไบต์
เคล็ดลับขั้นสูงเล็กน้อย:
ตารางการค้นหาขนาดเล็กมีประโยชน์สำหรับ 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 แต่ถ้าคุณไม่มีสำเนาให้ใช้สคริปต์ในภาษาที่คุณชื่นชอบ
ใส่ตัวแปรสมการนิพจน์ซ้ำแล้วซ้ำอีก
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(
ฟังก์ชัน
ฉันทามติปัจจุบันคืออนุญาตให้ใช้โค้ดทั้งหมดในล่ามสด เราสามารถใช้ประโยชน์จากนี้ทุกตัวแปรจริงเตรียมเริ่มต้นที่0
ใน TI-พื้นฐานและการเริ่มต้นเป็นค่าที่มีประโยชน์อาจจะเป็นXmin
-10
ดังนั้นถ้าคุณต้องการผลรวมสะสมในโปรแกรมที่ไม่ได้รับอินพุตจาก Ans หรือคุณต้องการ-10
ไบต์ที่น้อยลงหนึ่งทิปเคล็ดลับนี้สามารถช่วยคุณได้
หากคุณต้องการรายการ{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
seq(X,X,1,N
แม้ว่าN
จะไม่ใช่ค่าคงที่cumSum(1 or rand(N
ก็ตาม
บันทึกสองไบต์: หนึ่งสำหรับ 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
นี่คือตัวอย่างบางส่วนที่ฉันมักใช้ในการเขียนโค้ดกอล์ฟ:
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
1+sum(not(cumSum(Ans=X
median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans
tanh(ᴇ9Ans
คนหนึ่งถึงทำงาน
หากคุณพบว่าตัวเองกำลังใช้
0→G ;or any other variable
;other lines of code
จากนั้นคุณสามารถใช้ (เพื่อบันทึกไบต์):
DelVar G;other lines of code
นี่เป็นเพราะเมื่อคุณลบตัวแปร ( G
) มันจะกลายเป็นค่าเริ่มต้นในกรณี0
นี้ จากนั้นคุณสามารถใส่สายอื่นหลังจากที่DelVar
คำสั่งโดยไม่ต้องขึ้นบรรทัดใหม่ ระวังเมื่อวางข้อความสั่งการควบคุมที่สำคัญโดยตรงหลังจากDelVar
ข้อความ
(ทดสอบกับ TI-84)
เมื่อใช้รายการหลีกเลี่ยงรายการเริ่มต้น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
.
A
และตรวจสอบว่ามีการเปลี่ยนแปลงInput A
หรือไม่
หากคุณใช้เวลาB
-byte นิพจน์N
คุณควรกำหนดให้กับตัวแปรหรือไม่?
Ans
1+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
; นี้ช่วยประหยัดหนึ่งไบต์
โปรดทราบว่าการมีหรือไม่มีวงเล็บปิดอยู่บ่อยครั้งอาจทำให้การจัดเก็บนิพจน์มีประโยชน์หากจัดเรียงใหม่
ตอนนี้ฉันจะโต้แย้งตัวเองและบอกว่าควรเขียนโค้ดในหนึ่งบรรทัดให้มากที่สุด ทำไม? โดยทั่วไปเมื่อมีการแสดงออกซ้ำบนเส้นยาวมันสามารถลดความซับซ้อนได้
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)
ในการใช้ฟังก์ชั่นเช่น Line (ง่าย ๆ ด้วยพิกัดพิกเซลจำเป็นต้องเริ่มต้นแกนหน้าจอกราฟเป็นพิกเซลสี่เหลี่ยมจัตุรัสและลบแกน:
AxesOff
84→Xmin
72→Ymax
ZInteger
min(U,max(L,N
โดยที่ N คือหมายเลขหรืออัลกอริทึมและ U และ L เป็นขอบเขตบนและล่าง
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
สำหรับคะแนนความช่วยเหลือ