Answers:
Pyth与Python非常相似,因此将Python程序转换为Pyth非常容易。但是,由于Pyth是每命令一个字母的语言,因此有时很难直接编写Pyth。通过首先使用Python编写,一次无需考虑太多(因为Python是一种非常容易编写的语言)。
Pyth具有3类变量:通用的预初始化变量,基于用户输入的预初始化变量以及在首次使用时隐式生成分配的变量。
b = "\n"
d = " "
k = ""
G = "abcdefghijklmnopqrstuvwxyz"
H = {} # (empty dict)
N = '"'
T = 10
Y = []
Z = 0
Q = eval(input())
z = input()
请注意,只有在代码中的字符串之外使用了关联的变量时,才会在给定程序中运行这些初始化。此外,如果两者都使用Q,则顺序为,则顺序为z。
J和K。如果要将它们初始化为相同的值,则可以使用表达式(例如KJ0,它等同于lengthier)来进行初始化J0K0。
行尾的字符串不需要用引号引起来。例如:
"Hello, world!
是完全有效的Hello World程序。
C为基础的压缩这实际上是未记录的,字符串上的C实际上不是直接chr-> int,而是基数256->基数10(在一个char字符串上相同)。这在压缩int方面非常有用,我们可以使用以下脚本进行压缩:
sCMjQ256
以12345678910,结果为ßÜ>(其中有些不可打印的内容)。
同样,使用整数数组,您可以将它们连接起来,并通过转换为代码点并将其视为基数128来使用大型字符串。
C感谢@xnor向我展示的另一种用法是制作任意大数。天真的方法是:
^TT
但是我们可以通过以下方法将字节做得更好:
CG
这个基数256对整个字母进行反转换。结果156490583352162063278528710879425690470022892627113539022649722=〜1.56e62。
当lambda参数应用于参数map或reduce仅对参数应用一个操作时,可以使用缩写形式M和F。fMx等同于mfdx,并且fFx与相同.UfbZx。例如,假设我们将一个数字列表作为输入,输出每个数字递增。第一种方法可能是:
mhdQ
但是,可以将其重写为:
hMQ
类似的道理也适用于reduce用F。例如,假设计算整数列表的乘积是一个挑战。同样,第一次尝试可能是:
.U*bZQ
但是,使用F,可以缩短为:
*FQ
刮掉三个字节...还不错!
Q,因为当函数缺少输入时就可以对其进行补充*F
我相当定期地改进Pyth,删除不太有用的功能并添加更多有用的功能,因此请留意新功能并定期更新实现的副本。
最近添加的一些功能:(截至10/19/14)
y:充当*2数字,并充当字符串和列表上所有子集的列表。例如:
pyth -c 'y"abc'
['', 'a', 'b', 'c', 'ab', 'ac', 'bc', 'abc']
f:f通常是过滤器命令。现在,当以数字作为第二个参数调用时,它将过滤从该数字开始并以1递增的无限序列,然后返回结果序列的第一个元素。
例如,下面的代码查找超过十亿的最小素数:
pyth -c 'f!tPT^T9'
1000000007
yz呢?mvdczd不可能是最短的方法...
y因为我认为Pyth不需要具有多种超级容易解析的输入格式,例如Python格式。因此,是的,很mvdczd不幸,我认为必须这样做。
r的字符串处理套件中即可。
r看起来非常有用。
@Fdr1 + 1 @ Q2Iq%Qd0d中的根运算来制作因子计算器。当我尝试使用它时,它默认为index含义。有什么办法可以解决此问题?
有时,函数中的默认值可能对高尔夫有用。Pyth实际上支持这一点(令我惊讶的是)。例如:
DC=Z1RZ;C;C5
将打印:
1
5
执行此操作时,还可以使用J和K保存字符:
DgJ1K1R+JKg;g2;g2 3
印刷品:
2
3
5
这通常对递归算法很有用。
这不再起作用,但是如果有人想使用旧版本的Pyth打高尔夫球,我就把它留在了这里。
F假设您有2个元素元组,J = (a, b)并且想要r(a,b)2个arity函数r。
天真的方法是rhJeJ。
完成此r.*J操作的理想方法是使用unpack运算符。
rFJ进行折叠的真正理想方法是使用fold运算符。
.u吗?.u现在似乎是累计减少。
截至今天,这是一个新变化。
Q是自动初始化为评估输入的变量。它被隐式地附加到Pyth程序的末尾,所需的次数使该arity得以解决。要查看如何将其用于打高尔夫球的示例,假设我们要计算输入的Collatz函数。
编写它的最短方法是这样的:
@,/Q2h*3QQ
但是,由于Qs在文件末尾是隐式的,因此我们可以简单地编写:
@,/Q2h*3
节省2个字节。
请注意,带有非必需参数的函数将不会填充这些参数。例如,c"12 12"不会具有隐式Q,因为c仅需要1个参数。
F:用于循环。就像Python一样。
V:用于循环范围。既不给出变量也不给出范围,因此要短2个字符。
W:While循环。就像Python一样。
#:无限while循环。出现错误或明显中断而逃脱。现在仅try ... except在Pyth中起作用。
D:一般定义。就像Python。
L:1个参数,没有赋值函数,类似于Python的lambda,但已命名。函数名称,变量名称和return(R)无需给出,因此要短3个字符。
f:过滤器-选择输入序列的元素,这些元素在输入lambda上返回真实值。
f:大于或等于输入的第一个整数,给出真实的过滤结果。
m:Map-使用输入lambda变换输入序列的元素。
u:减少-折叠输入lambda的输入序列,将累加器初始化为第三个参数。
o:顺序-使用输入lambda作为键的输入序列的旧元素。
通常,对于任何给定的问题,都会有多种可能性,只有通过编写每个解决方案,您才能找出最短的解决方案。
.x最近可以用于try-except块。
.x{some_statments}{except_block - can this be empty}。
# ... B可以,如果你在表达式中不是这样使用
切换两个元素可能是一项非常昂贵的任务。因此,这是您要使用的两种方法。
在准备过程中,我们定义一个列表Y并用一些数字填充它。目标是切换第二个和第三个元素。
=Y[1 3 5 3 6 7)AGH,1 2
我们只需分配tmp变量J = Q[G],执行第一个列表分配Y[G] = Y[H],然后执行第二个最后一个分配Y[H] = J。这里的技巧是嵌套两个列表分配,因此您不必取消打印,也不必使用两次引用Y。
J@YGXXYG@YHHJ
代替
J@YG XYG@YHXYHJ
如果要切换的元素在列表中是唯一的,请使用此方法。真的很短 因此,这次我们切换第一个和第三个元素(值1和5是唯一的)。
=Y[1 3 5 3 6 7)K,Z2
这将使用列表的翻译功能:
XYm@YdK)
这个翻译代替每个元素Y[0]与Y[1]和每一个Y[1]用Y[0]。因此,如果值不是唯一的,则会发生坏事。例如K,1 2导致[1, 5, 3, 5, 6, 7]。
请注意,如果语句是代码中的最后一条,则右括号是可选的。
<newline>如果您的代码以命令式编程风格编写,则调试起来非常容易,因为您可以轻松打印中间结果。(永久链接)
FN.:Q2 loop
=Y+-Y-FNhN some random command
Y print intermediate result
;Y end for loop and print result
但是,大量的Pyth程序使用功能性编程的元素,例如map,filter和reduce,因此无法进行如此简单的打印。但是仍然可以使用\n命令。
使用u(reduce)的相同代码将是:(permalink)
u .:Q2Y reduce .:Q2, start with G = Y
+-G-FHhH random command
如果要打印中间值,只需插入\n:(permalink)
u .:Q2Y reduce
\nG print(G)
+-\nG-FHhH random command
\naa在换行符上打印并返回a。因此,您可以将其插入任何地方,而不必担心更改程序的功能。
g#
例如,假设您有J=5和K=12。然后g#JK= 12,也g#KJ= 12。
这是由@ Pietu1998发现的,他这样说:
不知道是否有人已经找到它,但是有一种很酷的方法可以在2个字节中执行max(A,B),而无需将3用于eS,AB。g#AB做同样的事情。(但是,由于它最多循环max(1,A-B + 1)次,因此效率非常低。一种优化是将数字可能更大,例如B。)
打包的Pyth是一种新的“编程语言”,它与Pyth完全相同,只是它使用每个字符7位而不是每个字符8位。
要使用它,请克隆pyth存储库。该文件packed-pyth.py是解释器。
假设您的代码是"Hello, world!。
首先,将其放在文件中: echo -n '"Hello, world!' > code.pyth
接下来,将Pyth代码打包到Packed Pyth文件中: python3 packed-pyth.py -p code.pyth code.ppyth
最后,运行Packed Pyth代码: python3 packed-pyth.py code.ppyth
运行代码时,可以提供-d标志以查看实际正在运行的Pyth代码是什么,并且可以在包含该代码的文件之后提供输入作为第二个命令行参数。
上行空间:
缺点:
仅ASCII。
没有互动输入。
完整的调试选项不可用。
更差的错误报告。
I和GCD进行除数测试免责声明:这仅适用于非负整数。
要检查两个非负整数是否可被整除,可以执行以下操作:
iI<divisor><dividend>
如果一个是整除b和一个≥b≥0 ,则gcd上述(A,B)= B。
它不一定会节省字节数!%<dividend><divisor>,但可能会为您节省空间,因为:
Q)。<pfn>,因为它本身就是一个函数。0。iI是一个函数,而!%不是,所以可以将其用作前缀函数。