清楚地加上括号的APL列车


19

在APL中,您可以编写默认的函数,称为trains。他们的工作方式与这一挑战无关。以下是将它们作为函数进行分组的不同方法:

⍴      -> ⍴
⍴⍴     -> ⍴⍴
⍴⍴⍴    -> ⍴⍴⍴
⍴⍴⍴⍴   -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴  -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...

顺序保持不变。程序是,只要严格存在3个以上的功能,则将后3个功能分组为一个功能。如果遇到嵌套火车,我们先将其括起来,然后再继续。这是适用于的过程⍴⍴⍴⍴⍴⍴

Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.

这是适用于的相同过程⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴

Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
  There are strictly more than 3 functions, repeat.
  We have met a nested train, applying procedure to that first:
    Step 0: ⍴⍴⍴
    There are 3 or less functions, we're done.
  Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
  There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴
  There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.

输入项

对于这一挑战,将简化输入。这意味着您可以选择2个不同的字符作为括号的开合符,为函数选择1个字符,这与为括号选择的字符不同。您选择的字符必须一致。输入将不为空,并且将不包含不包含任何内容的括号(即())。

输出量

同样,您可以选择3个不同的字符,2个用于括号,1个用于函数。请注意,它们不必与为输入选择的那些相同,但它们必须是一致的。

规则

  • 如果有括号仅在输入中包含一个函数,则必须在输出中将其删除。您的输出可能不包含不需要的括号(即仅包含一个函数或包含整个输出)。
  • 只要您的解决方案对这一挑战有效,就无需实现此处使用的算法。
  • 输入和输出是“输入和输出”部分中说明的格式的字符串。输入内容将至少包含一个字符。
  • 严格禁止使用标准漏洞
  • 这是,因此最短的答案会获胜。但是,将不会接受答案,因为这是一场针对每个语言的竞赛,并且鼓励使用与该语言相比使用其他语言编写的代码更长的语言进行回答。

测试用例

这里使用的字符是()⍴,您应将其替换为您选择的字符。

⍴                          -> ⍴
⍴                          -> ⍴
⍴⍴                         -> ⍴⍴
⍴⍴⍴                        -> ⍴⍴⍴
⍴⍴⍴⍴                       -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴            -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)            -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴              -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴                    -> ⍴⍴(⍴⍴⍴)
((⍴⍴))                     -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴                 -> ⍴⍴((⍴⍴)⍴⍴)

此挑战已发布在沙盒中。如果您具有所需的特权,则可以在此处查看沙盒帖子。


2
我认为FullyClearly更好。
亚当


@Adám我确实希望得到参考答案,尽管它不会获得很多支持;)
Egg the Outgolfer

@Adám 标题中的“ 明显”部分是指必须删除不需要的括号的事实。当您回答挑战时,应该做的就是全部; p
越野选手埃里克(Erik the Outgolfer)

确实,该函数将始终是幂等的吗?
硕果累累

Answers:


7

APL(Dyalog Classic)71 68 65 63字节

0{⍵≡⍕⍵:⍵⋄⍬≡⍵:'⍬'1=≢⍵:⍺∇⊃⍵⋄3≥≢⍵:⍺⌽')(',⍣⍺∊1∇¨⍵⋄⍺∇¯3(↓,∘⊂1∇↑)⍵}⍎

在线尝试!

我选择了I / O中的人物'('')''⍬'

该解决方案本身就是APL列车。

将输入解析为嵌套数组-一棵空数字向量()为叶的树。

dfn(即lambda- { })以递归方式遍历该树并将其转换为适当的带括号的字符串。left参数控制是否在必要时将括号添加到当前级别。

dfn根据正确的参数处理以下情况:

  • 如果已经是字符串(⍵≡⍕⍵),请返回

  • 如果是,返回字符'⍬'

  • 如果是单例,则深入了解(是递归调用的符号)

  • 如果长度≤3,则对每个项目递归并()在必要时用

  • 否则,递归3尾,在3尾之前添加所有前缀,然后再次递归


看起来像63个字符,其中大多数是Unicode。哪种字符编码会为此产生63个字节?我在UTF8中将其设为141个字节。
科里


@Corey 相关元发布
亚当

@Adám谢谢你。我看了一下,但不知道该寻找什么来获得答案。
科里

3

Python 2中224个 208 204字节

Xcoder先生,-16个字节; ovs, -4个字节

r=str.replace
p='p'
def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l
print r(r(r(r(r(`c(eval(r(r(r(input(),'(p)',p),p,'[],'),')','),')))`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]

在线尝试!尝试所有测试用例

代码可以分为三个主要步骤:
将输入转换为嵌套列表并替换(p)->p。单个功能p将被一个空列表代替。

eval(r(r(r(input(),'(p)',p),p,'[],'),')','),'))

一个递归函数,在当前列表上应用“ 3或更少”规则,并在所有子列表上调用自身。

def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l

大量替换以格式化为所需的输出格式

r(r(r(r(r(`c(...)`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]


1
这不会简化((pp))(或p((pp))p)。
马丁·恩德

2

CJam,56个字节

击败APL!

lW%~]]]{{_,{K_,({~}|}&}%{_,3>}{3/(aa\+:~}w}:K~~`1>W<W%S/

在线尝试!

这有效(我认为),我不知道为什么...

输入字符][T用于()⍴,输出字符][0用于()⍴(是的,这意味着它们与您期望的相反;例如,您可以传入TTT]TT[T]TTTT]TTT[[TT)。

高层概述

该程序将输入反向,因为它更方便。为了解析输入,我们利用CJam的解析器-反转并执行输入将提供输入的(向后)解析形式。

然后,我们定义一个过程KK完成我们提交的大部分工作,其工作方式如下:

  • 输入数组将是零和非空子数组的混合。确定子数组并递归应用于K它们。结果应该是另一个数组,并且如果该数组仅由单个元素组成,则将其解压缩(这消除了多余的括号)。
  • 只要结果包含三个以上元素,就将其前三个(而不是后三个;请记住输入正在反向处理)分组到一个列表中。
  • 返回结果。

通过应用K到输入,我们得到了输入的正确括号形式(唯一要注意的是,我们实际上将输入包装在一个单例列表中,然后再将其解包;其原因是我们希望将单例解压缩的代码段应用于顶层程序,而不仅仅是子数组)。之后,我们仅应用一些最小格式来获得结果。

打高尔夫球的一些解释

我最引以为豪的高尔夫是,用来执行整数和数组之间的检查。

  • 如果栈顶是整数n,则,生成范围[0..n)。由于我们将遇到的唯一整数是0,因此始终会给我们一个空列表[],即falsey。
  • 如果栈顶是数组,,则取其长度。因为我们遇到的所有数组都是非空的,所以这总是给我们一个正整数,这是事实。

可能感兴趣的另一个高尔夫球是我用来对数组的前三个元素进行分组的方法。它与我的“ Turing完整的语言解释器代码高尔夫”提交内容相似。CJam没有将数组分成两部分的简短方法(您可以在将原始数组和索引保留在堆栈上的同时,先将第一部分和第二部分切开,但效果不佳)因此,我要做的是使用use 3/,它将数组分为3个块。然后,我可以弹出第一个元素(,将数组包装两次aa,然后再追加到列表的开头\+。我们将数组包装两次的原因是,我们必须使用剥离一层:~,因为我们也将数组的其余部分也分组了。


Nitpick:这比没有内置功能的 APL好。
Erik the Outgolfer

@EriktheOutgolfer足够公平。
硕果累累

0

的JavaScript(ES6),149个 146字节

i='a';f=s=>s==(s=s[R='replace'](/\((\w+)\)/,(q,t)=>(f[q=i+=0]=f(t),q)))&&s==(s=s[R](/(?!^)((a0+|p){3})$/,"($1)"))?s[R](/a0+/g,t=>`(${f[t]})`):f(s)
<textarea cols=80 id=I>ppp(pp)p(pppp(ppp))pp</textarea><br>
<button onclick=O.innerText=f(I.value)>Run</button><br>
<pre id=O></pre>

使用()p,尽管您使用其他字母,也可以将更改为p结尾。

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.