Mẹo chơi gôn trong TI-BASIC


26

Bạn có mẹo chung nào để chơi gôn trong TI-BASIC cho máy tính sê-ri TI-83/84 +? Tôi đang tìm kiếm những ý tưởng có thể áp dụng cho các vấn đề về golf-code và ít nhất cũng hơi cụ thể đối với TI-BASIC (ví dụ: "xóa bình luận" không phải là một câu trả lời).

Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.


6
Vui lòng luôn luôn bao gồm phiên bản mà bạn đang giới thiệu!
flawr

Câu trả lời:


22

Máy tính của bạn khá thông minh trong việc suy ra cuối dòng cho bạn, và do đó bạn có thể bỏ qua khá nhiều ký tự.

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

For(các vòng lặp có một cú pháp như thế này - For(variable, start, end, increment)nhưng bạn có thể bỏ qua phần tăng và nó sẽ sử dụng 1:

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

và bạn có thể bỏ qua dấu ngoặc đơn kết thúc (ở cuối dòng) trên bảng:

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

Đã thử nghiệm trên máy tính TI-84 Silver Edition của tôi

Nếu bạn nghĩ rằng đây là nhiều hơn một ý tưởng (suy ra kết thúc) thì tôi sẽ chia chúng ra


5
.... đây chỉ là sai
Beta Decay

2
Ngoài ra, hãy thử viết lại mã để bạn sử dụng số lượng dấu ngoặc đơn đóng ít nhất. Chỉ trên biểu thức cuối cùng của mỗi dòng, bạn nhận được dấu ngoặc đơn miễn phí, vì vậy hãy di chuyển các câu lệnh lồng nhau nhất đến cuối. Đó là, not(iPart(B))+(A=5có thể (A=5)+not(iPart(B.
lirtosiast

4
Điều này áp dụng cho tất cả những gì cần đóng cửa, không chỉ là dấu ngoặc đơn (cụ thể là {lists}, "strings"[[matrices]]). Biểu thức sẽ tự động bị đóng khi bạn đạt đến một dòng mới, dấu hai chấm (một ký tự thay thế cho dòng mới; tuy nhiên, không áp dụng cho các chuỗi, vì chúng có thể chứa dấu hai chấm) hoặc mũi tên gán biến ( được gõ bằng nút STO ▶ ` ). Thật là một tính năng kỳ lạ của ngôn ngữ.
MI Wright

14

Sử dụng Ans

Nếu bạn sẽ chỉ sử dụng một biểu thức trong dòng tiếp theo, đừng lưu nó vào một biến! Biến Ans đặc biệt là mã thông báo một byte lưu trữ giá trị của biểu thức cuối cùng được ước tính. Như vậy:

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

có thể

Xsin(A)
Disp Ans+tanh(Ans

tiết kiệm hai byte.


9

Sử dụng bảng tra cứu được mã hóa theo số dấu phẩy động

Một mẹo hơi cao cấp:

Các bảng tra cứu nhỏ rất hữu ích cho việc chơi gôn mã: rất thường xuyên là chúng ta cần một hàm ánh xạ, ví dụ: 0 đến 1, 1 đến 2, 2 đến 1 và mọi thứ khác đến 0. Tuy nhiên, mảng TI-BASIC không phù hợp cho mục đích này: đối với một điều, chúng là một nền tảng và đối với một mục đích khác, một giá trị không thể được trích xuất cho đến khi mảng được lưu trữ trong Anshoặc một biến danh sách.

Trong câu trả lời của tôi ở đây , tôi lưu trữ một bảng tra cứu nhỏ trong hằng số ma thuật ở cơ sở 11. Chỉ cần liệt kê các giá trị bạn muốn sử dụng,

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

chuyển đổi thành một hình thức hữu ích

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

viết vào cơ sở mong muốn của bạn (cơ sở 11)

.106003A097

và chuyển đổi sang cơ sở 10

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

Cách tiếp cận mảng ngắn nhất dài hơn 8 byte!

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

TI-BASIC chỉ lưu trữ số float đến 14 chữ số thập phân, vì vậy bạn có thể lưu trữ tối đa 44 bit nhưng chỉ có 14 chữ số thập phân.

Kỹ thuật này thường có thể được cải thiện hơn nữa bằng cách sử dụng tìm kiếm brute-force để tìm hằng số ma thuật thay vì mã hóa cơ sở N. Tôi vẫn đang trong quá trình chơi golf câu trả lời ở trên, nhưng người chơi golf TI-BASIC chiều dài Weregoose đã sử dụng phương pháp này để tạo ra sự khác biệt giữa các số coprime với 30 (nghĩa là một danh sách lặp lại 6, 4, 2, 4, 2, 4, 6, 2) trên wiki / diễn đàn TI-BASIC Nhà phát triển với đoạn trích này:

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

Hằng số ma thuật 576 đã được tìm thấy bằng Mathicala, nhưng nếu bạn không sở hữu một bản sao, hãy sử dụng tập lệnh bằng ngôn ngữ yêu thích của bạn.


5

Đặt biểu thức lặp lại các phương trình biến.

EX:

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

Có thể:

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

Lưu ý: thật khó để tìm ra cách sử dụng tốt cho việc này, nhưng điều đó không có nghĩa là bạn nên quên các biến phương trình: P

Nguồn: http://tibasicdev.wikidot.com/elfmodify

-c4ooo từ Omnimaga


Trong ví dụ này, bạn có thể tiết kiệm nhiều hơn bằng cách thêm nvào biểu thức đầu tiên, cùng với Remainder(hàm.
Conor O'Brien

5

Bỏ qua khởi tạo biến không cần thiết

Đồng thuận hiện tại là cho phép tất cả các mã được chạy trên một trình thông dịch mới. Chúng ta có thể tận dụng lợi thế của nhóm này tất cả các biến thực chưa được khởi tạo tại 0TI-BASIC và Xminbắt đầu như một giá trị hữu ích có thể -10. Vì vậy, nếu bạn cần tổng cộng chạy trong một chương trình không lấy đầu vào từ Ans hoặc bạn thực sự cần một -10byte ít hơn, mẹo này có thể giúp bạn.


Xmax là 10 và Ymin và Ymax hành xử tương tự nhau, phải không? Ngoài ra có một số tham số biểu đồ khác có một số giá trị khác, tôi nghĩ vậy.
Fabian Röling

5

Tạo danh sách nhỏ hơn

Nếu bạn cần một danh sách {1,2,...,N}, trong đó N là 42, cách rõ ràng để tạo ra nó là

seq(X,X,1,42. 

Tuy nhiên, một byte nhỏ hơn đó là một hack gọn gàng bằng cách sử dụng lệnh binomcdf((phân phối nhị thức tích lũy).

cumSum(binomcdf(41,0

Điều này chỉ hoạt động khi N là hằng số, vì tiền tiết kiệm đến từ việc thay thế N-1 bằng giá trị của nó trong mã.

Có hai trường hợp cho phép mã thậm chí ngắn hơn.

Nếu bạn đã có một danh sách L1thứ nguyên N:

cumSum(1 or L1

Nếu bạn không quan tâm đến thứ tự:

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

2
Được đảm bảo nhỏ hơn một byte (và chậm hơn một cách ngu ngốc) seq(X,X,1,Nngay cả khi Nkhông phải là hằng số cumSum(1 or rand(N.
Misha Lavrov

4

Loại bỏ các câu lệnh kết thúc cho các khối If ở cuối chương trình

Lưu hai byte: một cho Kết thúc và một cho ngắt dòng. Nó cũng cho phép bạn sử dụng Disp ngụ ý trên dòng cuối cùng, thường lưu một byte bổ sung.

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

Có thể:

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

Cần lưu ý rằng mẹo này không hoạt động đối với các khối vòng lặp. +1 cho mẹo hay mặc dù
Tau

4

Biết thành ngữ của bạn

Dưới đây là một số đoạn tôi thường sử dụng trong mã golf:

  • Chuyển đổi thành giá trị thật (0/1) : not(not(Ans, hoặc Ans and 1. Cái nào để sử dụng phụ thuộc vào dấu ngoặc đơn cần thiết.
  • Thêm một vào một giá trị thật : int(e^(Ans. Lưu một paren mở hơn 1+(Ans. Rất hữu ích, vì TI-BASIC có các mảng dựa trên một.
  • Bản đồ {0,1}tới {1,-1}: cos(πAns. Lưu một byte qua 1-2Ans.

  • Hàm số của một số: tanh(ᴇ9Ans
  • Vòng về phía vô cực tích cực: -int(-Ans
  • Số chữ số trong một số nguyên dương: 1+int(log(Ans
  • Số phức để liệt kê {Re,Im}:imag(Ans{i,1

  • Chuyển đổi chuỗi thành danh sách: seq(inString("...",sub(Ans,X,1)),X,1,length(Ans( ...chuỗi tìm kiếm ở đâu)
  • Cắt bỏ phần tử đầu tiên của danh sách: ΔList(cumSum(Ans
  • Cắt bỏ phần tử cuối cùng của danh sách: ΔList(cumSum(Ans)-Ans
  • Kiểm tra xem tất cả các yếu tố của danh sách L1là duy nhất:SortA(L1:min(ΔList(L1
  • Tìm kiếm số X trong danh sách (trả về lần xuất hiện đầu tiên): 1+sum(not(cumSum(Ans=X
  • Chế độ của danh sách khi một chế độ duy nhất tồn tại và danh sách có tối đa 10 yếu tố: (xấu, nhưng ngắn): median(Ans,10^(seq(sum(Ans=Ans(X)),X,1,dim(Ans

Tôi thực sự không hiểu tại sao tanh(ᴇ9Anscái này hoạt động.
SuperJedi224

1
@ SuperJedi224 Chà, tanh (0 là 0 và các giới hạn về vô cực ở bên trái và bên phải là -1 và 1. Nó gần theo cấp số nhân với các giá trị đó, vì vậy vượt quá + -17 hoặc do đó, nó nằm trong sai số làm tròn của + -1. Nếu các giá trị tuyệt đối đã lớn hơn 17ish, chúng ta chỉ cần sử dụng tanh (một mình.
lirtosiast

3

Nếu bạn thấy mình đang sử dụng

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

Sau đó, bạn có thể sử dụng (để lưu một byte):

DelVar G;other lines of code

Điều này là do khi bạn xóa một biến ( G), nó sẽ trở thành giá trị mặc định của nó, trong trường hợp này , 0. Sau đó, bạn có thể đặt một dòng khác sau DelVarcâu lệnh mà không cần dòng mới . Hãy cẩn thận khi đặt các tuyên bố kiểm soát quan trọng trực tiếp sau một DelVartuyên bố.

(Đã thử nghiệm trên TI-84)


Điều này hiếm khi hữu ích; các biến được khởi tạo thành 0 theo mặc định và bạn có thể zero Y bằng cách thực hiện ZSt Chuẩn.
lirtosiast

@ThomasKwa Nó rất hữu ích với tôi trong nhiều trường hợp, đặc biệt. khi thiết lập lại được yêu cầu giữa chừng thực hiện.
Conor O'Brien

2
Trong mã golf? Khi nào? Nếu bạn chỉ cho tôi chương trình tôi nghĩ tôi sẽ có thể tối ưu hóa DelVar.
lirtosiast

@ThomasKwa Không phải xode golf per se , thay vào đó, lập trình trên không gian đĩa thấp (TI-83). Tôi không có chương trình ngay bây giờ. Tôi sẽ lấy lại cho bạn về điều đó.
Conor O'Brien

1
Sau vài phút suy nghĩ, tôi có thể nghĩ ra một vài tình huống khi DelVar có thể có thể ngắn nhất, như sau các câu lệnh If một dòng.
lirtosiast

3

Danh sách các biến để sử dụng?

Khi sử dụng danh sách, tránh các danh sách mặc định L₁thông qua L₆các danh sách được đặt tên có tên một chữ cái: ᶫAthông qua ᶫZ( chữ L nhỏ).

Một trong hai chi phí để tham chiếu (mặc dù L₁là một mã thông báo duy nhất, nó là mã thông báo hai byte) nhưng khi lưu trữ các giá trị trong danh sách, bạn có thể bỏ ký hiệu, lưu một byte:

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

có thể

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

Máy tính kiểm tra kiểu dữ liệu của biểu thức khi quyết định nơi lưu kết quả.

Tương tự, Input Ahoặc Prompt Asẽ lưu trữ ᶫAnếu người dùng vào danh sách thay vì số.

Một số lệnh khác có thể được sử dụng mà không cần , mặc dù hầu hết chúng hiếm khi được sử dụng trong chơi gôn. Ví dụ, Matr►list(cho phép loại bỏ trong các đối số thứ ba, thứ tư và cao hơn của nó.

Nguyên tắc chung là, nếu lệnh lấy tên biến danh sách chứ không phải biểu thức danh sách và nếu không có cú pháp thay thế nào có thể đặt một loại biến khác ở đó, thì lệnh có thể hoạt động với bên trái.

Điều này không hoạt động với việc sửa đổi một mục duy nhất của danh sách: 1→ᶫA(3không thể thay đổi thành 1→A(3.

Tất nhiên, biến danh sách tốt nhất để sử dụng luôn luôn Ans.


Đợi đã, cái gì? " Input A" lưu trữ ᶫAnếu người dùng vào danh sách. "Điều đó có nghĩa là nhiều chương trình của tôi khá dễ bị Inputhỏng. Dù sao thì tôi cũng không có nhiều chương trình đó, tôi hầu như không có công cụ nhỏ nào mà không kiểm tra lỗi hoặc hoàn thành các trò chơi sử dụng GetKeythay vì Input.
Fabian Röling

1
Nếu bạn thực sự quan tâm đến việc người dùng chứng minh các chương trình của mình chống lại điều này, bạn luôn có thể lưu trữ một giá trị ngẫu nhiên Avà kiểm tra xem nó có thay đổi sau đó không Input A.
Misha Lavrov

2

Biết chi phí chuyển nhượng biến của bạn

Nếu bạn sử dụng thời gian Bbiểu thức -byte N, bạn có nên gán nó cho một biến không?

Anschi phí 1+Nbyte để sử dụng (một cho ngắt dòng và một cho mỗi lần sử dụng, vì vậy hãy sử dụng Ans khi (B-1)*(N-1)>2. Chỉ có thể có một Anscho mỗi dòng, vì vậy hãy thử tất cả các giá trị cho Ansđiều đó có thể hữu ích.

Các biến thực (ví dụ X) chi phí 3+Nbyte, vì vậy sử dụng chúng khi (B-1)*(N-1)>4.

Liệt kê các biến chi phí 3+2Nbyte, vì vậy sử dụng chúng khi (B-2)*(N-1)>5.

Các biến phương trình là ít hữu ích nhất: chúng cần 4+2Nbyte. Sử dụng chúng khi (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

Khi một hàm đánh giá vào một danh sách, lưu nó vào một danh sách thay vì một biến phương trình như u; Điều này tiết kiệm một byte.

Hãy nhớ rằng sự hiện diện hoặc vắng mặt của dấu ngoặc đơn thường có thể khiến các biểu thức lưu trữ trở nên thuận lợi nếu chúng được sắp xếp lại.

Bây giờ tôi sẽ mâu thuẫn với chính mình và nói rằng người ta nên viết mã trên một dòng càng nhiều càng tốt. Tại sao? Thông thường khi có một biểu thức lặp lại dài trên một dòng, nó có thể được đơn giản hóa.


1

int (rand over randInt (

X + int (Yrand bằng hoặc ít byte hơn randInt (X, Y vì randInt là mã thông báo 2 byte. Một số lợi ích tiềm năng:

X + có thể bị bỏ qua khi giới hạn dưới là 0, tiết kiệm hai byte

X + là cần thiết trước randInt (dù sao trong một số trường hợp nhất định, ví dụ ngẫu nhiên từ một hàm bước như {2,5,8,11}

X + int (Yrand (N có thể được sử dụng như randInt (X, Y, N để tạo danh sách N số ngẫu nhiên

Khởi tạo đồ thị

Để sử dụng các chức năng như Line (dễ dàng với tọa độ pixel, cần phải khởi tạo trục đồ thị thành pixel vuông và loại bỏ trục:

AxesOff
84→Xmin
72→Ymax
ZInteger

Kẹp

min(U,max(L,N

Trong đó N là số hoặc thuật toán và U và L là giới hạn trên và dưới

Có N trong danh sách

max(N={X,Y,Z

Thêm danh sách toán

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

Đầu ra

Phân tán và Văn bản (cả hai đều có thể được xâu chuỗi, do đó, Phân phối A, B sẽ hiển thị A rồi B ​​trên các dòng và Văn bản riêng biệt (28,40, A, B sẽ in A bên cạnh B trên một dòng

Công nghệ từ vòng lặp chuyển động tối ưu

Rất nhiều trong số các tối ưu hóa này là một phần của công nghệ được sử dụng để di chuyển một ký tự xung quanh màn hình trong một vài byte

http://tibasicdev.wikidot.com/movement

Danh sách kích thước mã thông báo

http://tibasicdev.wikidot.com/tokens

Để được giúp đỡ ghi bàn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.