首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >APL中的高尔夫技巧

APL中的高尔夫技巧
EN

Code Golf用户
提问于 2014-01-05 22:19:56
回答 16查看 4.8K关注 0票数 42

我最近开始了一次代码高尔夫挑战,似乎赢家是GolfScript (惊喜,惊喜!)。有趣的是,还有一个非常强大的竞争对手有机会战胜GolfScript。它的名字是APL我在APL上看到了很多答案。似乎这种语言对于代码高尔夫球相当有效,所以我决定向您提供您所知道的APL程序的任何代码高尔夫技巧。可以随意发布一些代码示例。看到语言在起作用通常是非常有趣的。

EN

回答 16

Code Golf用户

发布于 2014-01-05 23:31:34

编辑:对于那些根本不懂APL但想要使用APL的人来说,掌握Dyalog APL是一个非常好的资源。

  1. 评价严格地从右到左。这包括设置变量,因此利用它。2+a, 1+a←1 -> 3 4 a设置为11+a计算为2a,2计算为1 22+1 2计算为3 4
  2. 与C一样,可以与一个函数(即a +← 3 )结合。与C不同,这是通用的:foo F← barfoo设置为F bar。这在某种程度上是不直观的,它作为表达式返回bar,而不是F bar。它也适用于匿名函数:一个a+←3 0←⋄,3 a+←3⋄,6a{⍵/‘!’}←4⋄a!
  3. 您可以像预期的那样将数组分配给一个数组:A[3]←8。但是,您也可以同时分配多个项:A[3 5 6]←9 1 4,甚至A[3 5 6]←9,将它们全部设置为同一项。当然,您也可以在这里向添加一个函数。然后,函数将分别应用于每个元素,就好像您执行了一样。
  4. 是你的朋友,即使他看起来不太高兴。
    1. 如果F是并元,并元将切换参数:a F b <-> b F⍨ a。这在打高尔夫球时很有用,因为它可以避免你使用牙套:( right )K <-> y K⍨F G H这确实改变了评估顺序,因为右手总是在左手之前被计算。
    2. 如果F是二进位元,则一元对函数的两边应用相同的参数: 5⍴5 5 5⍴⍨5 5 5,参数只计算一次。这对于外部产品尤其有用,例如,要将数组中的每个值与同一数组中的其他值进行比较,您可以使用∘.=⍨而不必执行x∘.=x←(whatever)
    3. 如果F是一元的,那么什么也不做,但是它确实将函数与参数分开。因此,如果函数是复杂的,仍然可以保存大括号:{⍵+3}⍣5 6∇{⍵+3}∇⍣5 6 ({⍵+3}⍣5)6 21 {⍵+3}⍣5⍨6 21

  5. 然后学习习语!打高尔夫的习惯用法。例如:(1^.=Y X),⍴Y )↑X)⌿X可以机械地转换为: X⌿⍨Y^.=⍨X↑⍨(1↑⍴X),⍴Y,然后进一步转换为: X⌿⍨Y^.=⍨X↑⍨(⊃⍴X),⍴Y (首先)等价于1↑ (取一个)。并且可能: X⌿⍨Y^.=⍨X↑⍨(≢X),⍴Y (理货)与⊃⍴ (形状的第一个元素)等价,但标量除外。
票数 28
EN

Code Golf用户

发布于 2015-01-01 13:55:36

火车

代码语言:javascript
复制
A(f g h)B      ←→  (A f B)g A h B  ⍝ fork
 (f g h)B      ←→  (  f B)g   h B  ⍝ fork
A(  g h)B      ←→         g A h B  ⍝ atop
 (  g h)B      ←→         g   h B  ⍝ atop
 (A g h)       ←→  ({A} g h)       ⍝ "Agh" fork
 (f g h k)     ←→  (f (g h k))     ⍝ 4-train
 (f g h k l)   ←→  (f g (h k l))   ⍝ 5-train, etc
 (f g h k l m) ←→  (f(g h(k l m))) ⍝ groups of 3 from the right, last could be 2
  f∘g B        ←→    f g B         ⍝ "compose" operator, useful in trains
A f∘g B        ←→  A f g B
票数 19
EN

Code Golf用户

发布于 2018-08-07 07:53:32

使用将乘法和加法

结合起来

代码语言:javascript
复制
(a×b)+C  ->  a⊥b,C
(C)+a×b  ->  a⊥b,C
(a×b)-C  ->  a⊥b,-C

假设:

  • ab是在用作左参数时不需要进一步括号的术语。
  • C是一个表达式,当用作左参数时可能需要括号。
  • a b C求值为数值标量
票数 11
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/17665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档