TI-BASIC中打高尔夫球的技巧


26

您对TI-83 / 84 +系列计算器在TI-BASIC中打高尔夫球有哪些一般提示?我正在寻找可以应用于代码高尔夫球问题的想法,并且这些想法至少也特定于TI-BASIC(例如,“删除评论”不是答案)。

请为每个答案发布一个提示。


6
请始终提供您所指的版本
瑕疵的

Answers:


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银版计算器上测试

如果您认为这是一个以上的想法(推断结局),那么我将其分解


5
....这是错误的😭
β衰变

2
另外,请尝试重写代码,以便使用最少的右括号。仅在每行的最后一个表达式上,您可以免费获得括号,因此将嵌套最多的语句移到末尾。即not(iPart(B))+(A=5可以(A=5)+not(iPart(B
lirtosiast 2015年

4
这适用于需要关闭,不只是括号中的一切(即{lists}"strings"[[matrices]])。当您到达换行符,冒号(换行符的代表;但不适用于字符串,因为它们可能包含冒号)或变量赋值箭头(,使用STO▶`按钮键入)时,表达式将自动关闭。)。这种语言的怪异特征。
MI Wright

14

使用 Ans

如果仅在下一行中使用表达式,请不要将其存储到变量中!特殊的Ans变量是一个一字节的令牌,用于存储最后一个求值表达式的值。从而:

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

Xsin(A)
Disp Ans+tanh(Ans

节省两个字节。


9

使用以浮点数编码的查找表

稍微先进的提示:

小型查询表对于代码搜索非常有用:通常,我们需要一个将0映射为1、1、2映射为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个十进制数字。

通常可以通过使用蛮力搜索来查找魔术常数而不是base-N编码来进一步改进此技术。我仍在寻找上述答案的过程中,但TI-BASIC高尔夫球手Weregoose 使用此方法6, 4, 2, 4, 2, 4, 6, 2在wiki /论坛TI-BASIC上生成数字互质数与30(即的重复列表)之间的差异。使用此代码段的开发人员:

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

魔法常数576是使用Mathematica找到的,但是如果您没有副本,请使用自己喜欢的语言编写脚本。


5

放置重复的表达式方程式变量。

例如:

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

Omnimaga的-c4ooo


在此示例中,您可以通过添加n第一个表达式以及Remainder(函数来节省更多。
Conor O'Brien 2015年

5

跳过不必要的变量初始化

当前的共识是允许所有代码在新的解释器上运行。我们可以利用这一优势-所有未初始化的实变量都始于0TI-BASIC,并Xmin以可能有用的值开始-10。因此,如果您需要在不接收来自Ans的输入的程序中进行总运行,或者确实需要-10少一个字节,那么此技巧可以为您提供帮助。


Xmax是10,Ymin和Ymax表现相似,对吧?我认为,还有其他一些图形参数具有其他值。
FabianRöling18年

5

较小的列表生成

如果您需要一个列表{1,2,...,N},其中N是42,那么创建它的明显方法是

seq(X,X,1,42. 

但是,使用binomcdf((累积二项式分布)命令可以使该字节小一个整洁的hack 。

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

在程序末尾消除If块的End语句

保存两个字节:一个用于End,一个用于换行。它还允许您在最后一行上使用隐式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是个不错的建议
Tau

4

了解你的成语

以下是我通常在代码高尔夫中使用的一些片段:

  • 转换为真值(0/1):not(not(AnsAns 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 2015年

3

如果您发现自己使用

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

然后,您可以使用(保存一个字节):

DelVar G;other lines of code

这是因为删除变量(G)时,它会成为其默认值,在这种情况下为0。然后,您可以在DelVar语句后添加另一行,而无需换行。将重要控制语句直接放在语句之后时要小心DelVar

(在TI-84上测试)


这很少有用。变量默认情况下初始化为0,并且可以通过执行ZStandard来将Y设置为零。
lirtosiast

@ThomasKwa在许多情况下,对我来说非常有用,尤其是。在执行过程中需要重置时。
科纳·奥布莱恩

2
在打代码?什么时候?如果您向我展示该程序,我想我将能够优化DelVar。
lirtosiast 2015年

@ThomasKwa 本身并不是xode golf ,而是在低磁盘空间上编程(TI-83)。我现在没有程序。我会尽快给您回复。
科纳·奥布莱恩

1
经过几分钟的思考,我可以想到一些可能最短的DelVar场景,例如单行If语句之后。
飞鸟

3

使用哪个列表变量?

使用列表时,请避免使用默认列表 L₁ through L₆,而应使用具有一个字母名称的命名列表:ᶫAthrough ᶫ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

当然,最好使用list变量始终是Ans


等一下 “ Input A”存储到ᶫA用户是否输入列表的状态。”这意味着我的很多程序都很容易破解。然后,我没有那么多Input程序是个好主意,我要么拥有没有错误检查的小工具,要么使用GetKey代替的完整游戏Input
FabianRöling18年

1
如果您真的很想让用户对程序进行验证,则可以随时将随机值存储到,A然后检查它是否已更改Input A
米莎·拉夫罗夫 Misha Lavrov)

2

了解您的可变分配成本

如果使用B-byte表达式N时间,是否应将其分配给变量?

Ans花费1+N使用的字节数(一个用于换行,每次使用一个,因此使用Ans when (B-1)*(N-1)>2Ans每行只能有一个,因此请尝试使用所有值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字节的令牌。一些潜在的好处:

下界为0时可以省掉X +,节省两个字节

在randInt(之前无论如何都必须使用X +,例如,从诸如{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和Text(都可以链接,因此Disp A,B将在单独的行上显示A,然后显示B,而Text(28,40,A,B将在一行的B旁边显示A)

最佳运动循环带来的技术

这些优化中有很多是用于在屏幕上以最小字节数移动字符的技术的一部分

http://tibasicdev.wikidot.com/movement

代币大小列表

http://tibasicdev.wikidot.com/tokens

求助得分

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.