Japt,29个 28字节
Japt是Ja vaScri pt的缩写。口译员
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
请注意,箭头功能需要兼容ES6的浏览器,例如Firefox的较新版本。输入以4项数组的形式输入,例如[1,-1,4,2]
。
怎么运行的
// Implicit: U = input array
1o5 // Create a range of integers from 1 to 5. Returns [1,2,3,4]
mZ=> // Map each item Z in this range to:
$eval$( // evaluate:
Uq'+ // U joined with "+" (equivalent to summing U)
)/2 // divided by 2,
-UgZ%4 // minus the item at Z%4 in the input. This translates to [y₁,x₂,y₂,x₁],
// which in turn tranlsates to:
// [(x₁-y₁+x₂+y₂)/2, (x₁+y₁-x₂+y₂)/2, (x₁+y₁+x₂-y₂)/2, (-x₁+y₁+x₂+y₂)/2]
// which is [Lx,Ly,Rx,Ry], or [Rx,Ry,Lx,Ly], depending on the situation.
// Implicit: Output last expression
打高尔夫球的方式
我首先尝试简单地复制@Mego的Python方法。这给我留下了这个48字节的怪物:(
注意:当前不应将输入包装在数组中。)
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
由于每个项目都需要除以2,因此使用以下命令映射整个数组会更短mY=>Y/2
:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
怎么办?好了,数组现在只需在pattern后面加三个输入,然后减去第四个1,2,3,0
。因此,我们可以将输入打包到一个数组中,然后将它们加在一起,除以2,然后减去必要的项:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
很好,节省了一个字节!但是有可能在一开始就缩小数组吗?让我们尝试将其打包成一个字符串,然后将其拆分为一个数组a
:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
看看,又保存了一个字节。但是还有更好的方法吗?好吧,我们可以使用以下事实[1,2,3,0] ≡ [1,2,3,4] mod 4
:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
另外两个字节!现在我们要去某个地方。但这Ug0 +Ug1 +Ug2 +Ug3
占用了大量空间。如果我们通过加法来减少数组怎么办?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
哇,真的有帮助!现在我们只有29个字节。多亏了@ןnɟuɐɯɹɐןoɯ,我什至还可以再减少一个字节。但是,如果我们可以使用内置的方法对数组求和,则它会更短:
1o5 mZ=>Uu /2-UgZ%4
19个字节!惊人!不幸的是,Japt尚无任何此类内置函数。如果有机会,我将其添加。欢迎提供有关程序或语言的建议!
好吧,从v1.4.4开始,我在Japt中实现的功能比我最初计划的要多。从较短版本的原始计划开始:
1o5 mZ=>Uu /2-UgZ%4
首先,我们需要更改一些内容:使用定义函数{
,并且sum函数是x
。此版本按原样工作:
1o5 mZ{Ux /2-UgZ%4
现在,@
是一个缩写XYZ{
,允许我们通过切换到保存一个字节Z
来X
。同样,£
是的快捷方式m@
,它可以保存另一个字节:
1o5 £Ux /2-UgX%4
最近,我实现了一项功能,U
通常可以将程序开头的a 忽略掉。但是,由于实现错误,这也可用于以下功能:
1o5 £x /2-UgX%4
最后,g
如果索引超出字符串的末尾,该函数将自动换行,从而使我们%4
总共可以删除13个字节:
1o5 £x /2-UgX
我以为19很棒;-) 在线测试!