首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让我们来减肥哈斯克尔

让我们来减肥哈斯克尔
EN

Code Golf用户
提问于 2017-09-04 16:54:11
回答 6查看 3.4K关注 0票数 21

Haskell的元组可以编写为

代码语言:javascript
复制
(a,b,c)

不过,这只是语法上的糖

代码语言:javascript
复制
(,,)a b c

通常情况下,n元组可以用n-1 ,s在(.)之间形成,然后用空格分隔其元素。例如,7-tuple,(1,2,3,4,5,6,7)可以由

代码语言:javascript
复制
(,,,,,,)1 2 3 4 5 6 7

由于Haskell没有一元组,所以不能形成它们。你也将不对空元组负责。

嵌套元组可以使用parens来重写操作顺序。

代码语言:javascript
复制
((1,2),3) == (,)((,)1 2)3

作为我们的追求从Haskell中移除所有的语法糖的一部分,我将要求您编写一个程序,从Haskell的元组中删除语法糖。

您的程序应该使用一个元组、一个数组或一个表示含糖元组的字符串,并且应该输出一个表示“无糖”元组的字符串。输入元组将只包含正整数或其他元组。

由于我们在这里打高尔夫球,你的产量应该很短。它不应该包含不必要的

  • 空间。空格只应用于分隔元组函数的参数,而不应出现在)(之前。
  • 括号。只有在形成元组函数或嵌套元组时才应使用括号。

这是一个密码-高尔夫问题,所以答案将以字节表示,而更少的字节更好。

测试用例

代码语言:javascript
复制
(1,2)     -> (,)1 2
(1,2,3)   -> (,,)1 2 3
((1,2),3) -> (,)((,)1 2)3
(1,2,3,4) -> (,,,)1 2 3 4
(1,(2,3)) -> (,)1((,)2 3)
(10,1)    -> (,)10 1
EN

回答 6

Code Golf用户

发布于 2017-09-05 18:42:10

哈斯克尔,119个字节

代码语言:javascript
复制
data T=I Int|U[T]
f(U t)="(("++init(t>>",")++')':foldr(\x y->f x++[' '|f x>",",y>","]++y)")"t
f(I n)=show n
init.tail.f

在网上试试! --它使用自定义数据类型T来表示元组,即元组((1,2),3)表示为U[U[I 1,I 2],I 3]。示例用法:init.tail.f $ U[U[I 1,I 2],I 3]生成(,)((,)1 2)3

票数 8
EN

Code Golf用户

发布于 2017-09-04 17:47:21

Python 2,110个字节

代码语言:javascript
复制
def f(t):
 s='('+','*~-len(t)+')';c=0
 for i in t:
	try:s+=' '*c+`+i`;c=1
	except:s+='(%s)'%f(i);c=0
 return s

在网上试试!

需要一个tuple

票数 6
EN

Code Golf用户

发布于 2017-09-05 08:27:34

Pip,45字节

代码语言:javascript
复制
{Y"()"b:yJ',X#a-1Fcab.:c>0?s.cyJ(fc)bR") "')}

这是一个以列表作为参数的函数。在网上试试!

注释版本

代码语言:javascript
复制
; Define an anonymous function (the argument is available inside as the variable a)
{
  ; Yank the string "()" into y variable
  Y "()"
  ; Create a string of len(a)-1 commas, join y on it, and assign to b
  b: y J ',X#a-1
  ; For each item c in a
  F c a
    ; Concatenate to b the following expression
    b .:
      ; Is c integer or list?
      ; (If c is a positive integer, c>0 is true; but if c is a list, c>0 is false)
      c>0 ?
        ; If c is integer, concatenate space followed by c
        s.c
        ; If c is list, call function recursively on c and use the result to join y
        yJ(fc)
  ; Replace ") " with ")" in b and return the resulting string
  b R ") " ')
}
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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