MATL是Luis Mendo创建的一种高尔夫语言。事实证明,MATL具有很高的竞争力,经常击败其他高尔夫球语言,例如Pyth,CJam和Jelly。
在MATL打高尔夫球有哪些有用的技巧?(一如既往,请给每个答案一个提示!)
accumarray(XQ)可以说是相当强大的(甚至可能超过在MATLAB /倍频程,因为这些长度函数处理有方便的数字代码),但我不知道它不够好,说明具有很好的例子。如果它确实有用,那么有人可以提出一个使用它的想法的答案吗?
MATL是Luis Mendo创建的一种高尔夫语言。事实证明,MATL具有很高的竞争力,经常击败其他高尔夫球语言,例如Pyth,CJam和Jelly。
在MATL打高尔夫球有哪些有用的技巧?(一如既往,请给每个答案一个提示!)
accumarray(XQ)可以说是相当强大的(甚至可能超过在MATLAB /倍频程,因为这些长度函数处理有方便的数字代码),但我不知道它不够好,说明具有很好的例子。如果它确实有用,那么有人可以提出一个使用它的想法的答案吗?
Answers:
尽管它们中的一些在复制到剪贴板时会保留信息,但是它们都有预定义的值。
不知道我是否涵盖了所有预定义的值。
L也都有一个预定义的值,但是它们旨在用于特殊用途(而不是通用的通用值)。例如,1Lgives [1 0](用作index 1:end),2Lgives [0 -1 1](用于1:-1:end)。此外,默认情况下函数l和O接受0输入0并1分别产生和
4吗?
1的话4,14是不行的。您需要1 4。或者1K保存一个字节
&元功能(可选输入/输出规范)指定传递给函数的输入参数数量的传统方法是使用$元函数
2$: % Two-input version of :
同样,要指定输出参数的数量,您可以使用#元函数指定输出参数的数量,
2#S % Two-output version of sort
或者如果传递一个数字,大于的一个函数定义的输出参数的数量,仅将mod(N, numberOfOutputs) + 1输出提供。
4#S % Get only the second output of sort
您还可以指定逻辑数组作为输入,#以仅检索特定的输出参数。
TFT#u % Three output version of unique and discard the second output
所有这些输入/输出规范都很方便,但是它们可以非常快速地提高字节数。为了解决这个问题,MATL &在17.0.0版本中引入了元功能。此&元功能充当功能的特定输入或输出规范的快捷方式。让我们看看这意味着什么。
在上面的示例中,我们想使用的两个输入版本:(创建等距值的向量)。输入参数to的默认数量:是1(从创建一个数组[1...N]),但用户通常会希望指定需要第二个输入的范围的起始值,这是很常见的。因此:,我们已将其定义&为的快捷方式2$。
10 % Push 10 to the stack
12 % Push 12 to the stack
2$: % Create an array: [10, 11, 12]
现在变成以下内容,保存一个字节!
10 12 &:
&转换为的输入/输出规范是特定于功能的,以便我们优化字节节省。
每个功能帮助说明中的输入/输出参数部分已更新,以指示此替代输入/输出数量(如果有)。输入或输出参数的可能数量显示为一个范围,括号中显示每个参数的默认值。括号内&的/字符后会显示可以替换的输入/输出规范。
这是帮助说明的输入/输出参数部分 :
+- Min-Max range of # of inputs
| +----- Alt. Default # of inputs
| |
V V
1--3 (1 / 2); 1 <--- Possible / Default # of outputs
^
|
Default # of inputs
&每种功能的含义?非常小心。使用StackExchange API,我们能够下载在PPCG挑战中曾经使用过的所有MATL答案。通过解析每个答案,我们便能够确定将每个输入/输出规范用于每个功能的频率。然后,利用这些信息,我们可以客观地确定&元功能应代表每个功能的输入/输出规范。有时没有明确的赢家,因此许多功能目前尚未&定义。
这是我们使用的脚本(不幸的是,它是用MATLAB而不是 MATL 编写的)。
这里是一个直方图的例子中$/ #使用
&意思是“相对于默认值,输入数量增加1”。事实证明,他的建议有用得多
虽然true(T)和false(F)分别清楚地表示真实和虚假的输出,但广泛认可的真实/虚假定义使我们在MATL中更具灵活性。
定义指出:
if (x)
disp("x is truthy");
else
disp("x is falsy");
end
因此,我们可以编写一个快速的MATL真实/虚假测试,该测试将遍历所有输入并显示它们是真实的还是虚假的
` ? 'truthy' } 'falsey' ]DT
这在MATL中意味着什么
这实际上在MATL中(因此在MATLAB和Octave中)转换为,如果条件为非空并且其所有值的实数分量都不为零,则认为该条件为true 。对此应强调两个部分。
非零:这恰恰意味着不等于零(==)。其中包括正数,负数,非空字符等。您可以通过将给定值转换为logical值(g)轻松进行检查,也可以使用~~
F % Falsy
T % Truthy
0 % Falsy
1 % Truthy
2 % Truthy
-1 % Truthy
'a' % Truthy
' ' % Truthy (ASCII 32)
char(0) % Falsy (ASCII 0)
所有值:通常,我们认为标量是对还是错,但是在MATL中,我们可以评估标量,行向量,列向量甚至多维矩阵,并且当且仅当每个单个值都是非零(如上定义),否则为假。这里有一些例子来说明
[1, 1, 1] % Truthy
[1, 0, 0] % Falsey
[1, 1, 1; 1, 1, 1] % Truthy
[1, 0, 1; 1, 1, 1] % Falsey
'Hello World' % Truthy
如上所述,一个边缘情况是一个空数组[],该数组总是被认为是虚假的(示例)
我怎样才能更好地打高尔夫球?
如果挑战只是提到您的输出应该是真实的还是虚假的,则您可以利用上面的定义将答案减少几个字节。为避免混淆,建议您在答案中包含指向上面的在线真实/虚假测试的链接,以帮助说明MATL真实/虚假值是如何工作的。
几个具体的例子:
答案以结尾A。如果挑战需要truthy或falsy输出和你结束你的答案all(A)创建一个标量,你可以删除这个最后一个字节和你的回答将保持正确的(除非输出是[]因为[]是false不过[]A是true)。
确保数组仅包含一个唯一值:&=代替un1=。如果数组中的所有值相等,则广播的逐元素相等性比较将得出N x N所有矩阵。如果所有值都不相等,则此矩阵将包含一些0值,因此被认为是虚假的。
您通常可以使用“ TF”表示法来代替零和一的数组文字。例如,FTF与相同[0,1,0],仅FTF产生logical值,而不产生double值。这通常不是问题,因为任何算术运算都将逻辑值视为数字。例如,FTFQ给定[1,2,1](Q是“增加1”)。
在某些情况下,数字到二进制的转换可能会更短。例如,[1,0,1],TFT和5B是相同的; 再次警告,后两个是logical值。
当TF(逻辑)和[1 0](数字)之间的差异用作索引时。logical用作索引的类型数组意味着:选择与相对应的元素T,舍弃与相对应的元素F。因此,[10 20]TF)生产10(选择第一个元素),而[10 20][1 0])生产[10 20](索引[1 0]具有的解释1:end,即选择数组的所有元素)。
@/ X@在循环内。也许您可以说“保存字节”
如果循环end语句之后没有任何代码],则可以将其忽略。它们由MATL解析器隐式填充。
因此,如果您可以将内容从循环后移到循环内,则可以保存final ]。
作为一个特定的示例,以下代码查找一个数字的阶乘中有多少个尾随零N(请参阅此处):
1到N。5存在多少次。5(之所以有效5,是因为每次出现至少一次2)。第一个想法是:"@Yf5=]vs(请注意,循环后有一些语句):
: % Range from 1 to implicit input
" % For each number in that vector
@ % Push that number
Yf % Vector of prime factors (with repetitions)
5= % True for entries that equal `5`, and `false` for the rest
] % End for
v % Concatenate all vectors as a column vector
s % Sum. Implicitly display
由于v默认情况下将所有堆栈内容串联在一起,因此可以将其移入循环。而且由于加法关联,s也可以移动。那留]在代码的末尾,因此可以省略:"@Yf5=vs:
: % Range from 1 to implicit input
" % For each number in that vector
@ % Push that number
Yf % Vector of prime factors (with repetitions)
5= % True for entries that equal `5`, and `false` for the rest
v % Concatenate all vectors so far as a column vector
s % Sum. Inplicitly end loop and display
如果您来自MATLAB或Octave,则会发现许多MATL函数类似于这些语言中的函数。但是其中许多功能已得到扩展。
例如,考虑MATLAB的reshape函数,该函数在MATL中与相对应 e。代码段reshape([10 20 30 40 50 60], 2, 3)和reshape([10 20 30 40 50 60], 2, [])分别表示“重塑行向量[10 20 30 40 50 60成2×3矩阵”或“成2行矩阵与尽可能多的列按需要”。因此,两种情况下的结果都是二维数组
10 30 50
20 40 60
由于大小不兼容,类似reshape([10 20 30 40 50 60], 2, 2)或reshape([10 20 30 40 50 60], 5, [])会产生错误。但是,MATL将在第一种情况下删除元素(在线尝试!),或者在第二种情况下用零填充(在线尝试!)以分别生成,
10 30
20 40
和
10 60
20 0
30 0
40 0
50 0
与MATLAB对应项相比具有扩展功能的其他函数是(非穷举列表)S(sort),Yb(strsplit),m(ismember),h(horzcat),v(vertcat),Zd(gcd),Zm(lcm),YS(circshift),YA(dec2base),ZA(base2dec),Z"(blanks)。
在定义数字数组文字时,可以使用以下几种方法来节省字节。链接给出了使用它们的示例答案。这些已使用@Suever创建的分析脚本获得。
对于具有小的数字的阵列可以有时使用级联(功能h和v),以及预定义的文本,以避免使用空间作为分隔符:比较[2 4],2 4h并且2Kh,所有这些限定阵列[2 4]。同样,2K1v使用空栈定义[2; 4; 1]。实例。
对于稍大的数字,您可以利用一些字母在数组文字中具有数字含义的事实来节省空间。因此,[3 5 2 7;-4 10 12 5]可以代替使用[IAHC;dX12A]。实例。
具体来说,在数组文字中,
O,l,H I K具有通常的意义0,...,4A,...,E意思是5,...,9X 手段 10a,... d卑鄙-1,...,-4J并G意味着1j和-1jP 手段 piY 手段 infN意味着NaN。对于较大的数字,定义一个字符串并计算其连续的差异(使用d)会有所帮助:[20 10 35 -6]可以使用代替'!5?b\'d。之所以d可行,是因为使用字符的代码点来计算差异。实例。