无糖语法


55

在Haskell中,列表符号:

[a,b,c]

只是语法糖,用于:

a:b:c:[]

和字符串符号:

"abc"

只是语法糖,用于:

['a','b','c']

这意味着字符串:

"abc"

是相同的:

'a':'b':'c':[]

任务

给定一个字符串,您应该输出在Haskell中看起来像无语法的版本。

规则

  • 您将通过任何有效的输入方法收到一个字符串,您应该输出一个字符串,该字符串以:[]输入中的每个字符结尾,并用包围'并用分隔:。空字符串应该输出[]

  • 您可以假设您不会收到任何需要转义的字符(例如',换行符,制表符...),并且输入内容处于可打印的ascii范围内

  • 这是您应尽量减少答案的字节数

测试用例

"" -> []
"a" -> 'a':[]
"Hello, World" -> 'H':'e':'l':'l':'o':',':' ':'W':'o':'r':'l':'d':[]   

输入是否将具有非ascii值?您对需要转义的字符的限制要么要求我们知道Haskell会转义哪些字符,要么假定您的清单不完整。
FryAmTheEggman

@FryAmTheEggman您可以假定它们在ascii范围内
Wheat Wizard

7
@totallyhuman那些甚至都不是有效的Haskell。如果可能,但不是,则肯定不是。
小麦巫师

38
这个问题可以替换为“ Diet Haskell”。
3月Ho

1
@cairdcoinheringaahing没有, "并且'在语法上的不同。
小麦巫师

Answers:


85

Haskell,26个字节

(++"[]").((++":").show=<<)

在线尝试!

说明:

在非点表示法中,使用concatMap代替=<<,这变成

f s = concatMap(\c-> show c ++ ":")s ++ "[]"

给定一个string s,我们使用该函数将每个char映射c到一个字符串"'c':",该show函数返回大多数Haskell类型的字符串表示形式。这些字符串被连接起来,并[]附加了final 。

尽管不是挑战所要求的,但此答案甚至可以适当地转义,因为show它会注意:f "'"yields "'\\'':[]"


25
等一下,是(++'[':']':[]).((++':':[]).show=<<)不是?
亚当

11
当任何挑战都具有Haskell答案时,我会原则上反对它。这是这个的两倍。
瑞安·赖希

43

Haskell,33 28 26字节

foldr((.(':':)).shows)"[]"

在线尝试!

fold给定的无点函数从右边到以开头的输入字符串中[]。函数是:将char显示为Haskell字符,即',在结果:前面放一个字符,然后将其包围并连接起来。

编辑:@ØrjanJohansen保存了两个字节。谢谢!


我想这意味着(++'[':']':[]).(>>= \c->'\'':[]++[c]++'\'':':':[])
亚当

1
我认为这比其他Haskell答案(在相同字节数上):要好++,这是因为它用来构建列表,而不是,尽管两者都有自己的优雅之处。
CAD97

4
这真是太神奇了。两种不同的方法使用相同的语言具有相同的字节数。
J Atkin



16

Common Lisp,50 42字节

(format t"~{'~a':~}[]"(coerce(read)'list))

在线尝试!

通过使用@ read而不是定义函数来减少@coredump的注释。


1
欢迎来到PPCG!
Martin Ender

2
Lisp!的确欢迎:)
Olivier Dulac

@Renzo嗨,Renzo,您可以通过使用匿名lambda形式或直接调用read来将其缩小一点:((format t"~{'~a':~}[]"(coerce(read)'list))其他一些问题是更严格的wrt输入和输出,但这很好)
coredump

@coredump,谢谢!,我已经更新了代码。
Renzo




8

05AB1E15 12 11 10字节

-3字节归因于carusocomputing
-1字节归因于Adnan
-1字节归因于Outgolfer的天才想法

ʒ"'ÿ':"?},

在线尝试!

ʒ          # Filter out every character that the following code doesn't return 1 for
 "'ÿ':"?   #   Print the string 'ÿ': with ÿ replaced by this character
        }  # End for
         , # No character returned 1 so an empty array is left on the stack. Print that

显然我击败了您4秒;-)
Digital Trauma

1
当我按“发布您的答案”时,@ DigitalTrauma您的弹出。
莱利

1
您可以打印全局数组,而不用压入3个字节的括号。您也可以插值该字符串,以节省另一个字节,总计-3,最终结果为12个字节:vy"'ÿ':"?}¯?
Magic Octopus Urn

@carusocomputing我一直在测试套件中使用字符串插值器,但是忘记在实际代码中使用它。谢谢!
莱利

我认为@carusocomputing vy"'ÿ':"}¯J适用于11,但会J加入全局数组,而不是那种情况下的整个堆栈。
莱利

8

R,51个字节

f<-function(x)(paste0(gsub("(.)","'\\1':",x),'[]'))

1
不错的解决方案!您可以通过几种方式来节省一些字节,并真正解决这个问题。 默认的I / O允许您仅返回一个匿名函数,甚至从stdin接受输入,而stdin使用scan(,'')代替函数会短得多。
朱塞佩

谢谢,是R(和代码高尔夫!)的新手,所以还没有完全掌握其中的匿名函数,尽管我试图在其中没有“函数”的情况下进行操作。扫描可能有用!
tc

嗯,好吧,匿名函数只是一个不将其分配给变量的函数,因此您只需f<-从代码开头就删除该函数
Giuseppe

paste0(gsub('(。)',“'\\ 1':”,scan(,“”)),'[]')是43
Zahiro Mor

8

Pyth,14 10 8字节

j\:a`MQY

尝试这个!

-2个字节,感谢@isaacg

最后,pyth擅长某事。

说明

j\:a`MQY
    `MQ        # map the representation over the input string: ["'a'","'b'",...]
   a   Y       # append the empty list
j\:            # join on :

@isaacg谢谢!我忘记了M,我不知道为什么不使用a。现在,我们比这里的所有其他解决方案至少短2个字节!
KarlKastor



6

Python 2中48 46 44 37个字节

-2个字节,感谢Rod。-7字节归功于Wheat Wizard。

lambda s:':'.join(map(repr,s)+['[]'])

在线尝试!



哦,整洁。谢谢!
6

1
lambda s:':'.join(map(repr,[*s,[]]))或短一个lambda s:':'.join(map(repr,s))+":[]"
xnor

@xnor您提供的第二个示例似乎不适用于空情况。(原始答案看起来非常相似,但为解决空字符串问题付出了很多)
Wheat Wizard


6

JavaScript(ES6),36个字节

s=>s?`'${[...s].join`':'`}':[]`:"[]"

试试吧

f=
s=>s?`'${[...s].join`':'`}':[]`:"[]"
oninput=_=>o.innerText=f(i.value);o.innerText=f(i.value="abc")
<input id=i><pre id=o>


5

果冻 11 10  8 字节

-1字节,感谢Christian(删除串联;并改为使用隐式打印)

0字节(固定为一个空字符串的情况下,边缘-先前的完整方案:ŒṘ€j”:“:[]

-2感谢Outgolfer的Erik(p代替,;€因为”:有效长度为1,Ø[因为已成为的简写⁾[]

ŒṘ€p”:Ø[

在线尝试!

完整程序打印结果(作为链接,它返回字符列表的列表)。

...但是有没有办法使用STDIN进行保存?

怎么样?

ŒṘ€p”:Ø[ - Main link: list of characters, s  e.g. "Hey"
ŒṘ€      - Python representation for €ach    [["'",'H',"'"],["'",'e',"'"],["'",'y',"'"]]
    ”:   - literal character = ':'
   p     - Cartesian product                 [["'",'H',"'",':'],["'",'e',"'",':'],["'",'y',"'",':']]
         - implicit print (no newline): 'H':'e':'y':
      Ø[ - literal list of characters        ['[',']']
         - implicit print (no newline): []

4

PHP,41字节

<?=preg_filter("#.#","'$0':",$argn)."[]";

在线尝试!


短4个字节:for(;~$c=$argn[$i++];)echo"'$c':"?>[]
user63956

@ user63956不需要使用它<?,必须使用哪个选项?做一个自己的方法,我会告诉他要upvotes和Titus做了在此期间类似的东西
约尔格Hülsermann

它与-R标志一起使用。即使在eval()和等结构中,标签也可以关闭create_function()
user63956 2013年

4

Perl 5,22个字节

19个字节的代码+ -p标志。

s/./'$&':/g;$\="[]"

或者,对于相同的字节数,s/./'$&':/g;s/$/[]/

非常简单:将s/./'$&':/g每个字符都用引号引起来,并在:其后添加一个。$\在每次打印后都会隐式打印,因此将其设置为[]输出final []

在线尝试!


4

Java(OpenJDK 8)86 83 76字节

@KevinCruijssen -3个字节,@ FlorianSchaetz,
-7个字节

s->{String b="";for(char c:s.toCharArray()){b+="'"+c+"':";};return b+"[]";};

在线尝试!


您可以删除4个字节。;对于lambda答案,不必计入尾随,根本不需要在;之后}{并且}可以在for循环中将和删除。而你可以保存在Java中10 4个字节的改变都将Stringcharvar
凯文·克鲁伊森

4

Brainfuck,68个字节

+[-->+[<]>-]>>,[<.>.<.>>-[>+<+++++++++]>+.[-]<<,]-[+[+<]>>+]<+++.++.

在线尝试!


不能完全使用空字符串-在您的在线测试中给了我两个无效字符。很好,否则。
NoseKnows17年

@NoseKnowsAll我似乎无法复制它;没有输入我就没有输出。您能否提供带有该输入的更新链接?
daniero

这是我运行它时得到的:。输入为空时,它应返回“ []”且不带引号。
NoseKnows17年

@NoseKnowsAll您的链接转到“ hello world”输入(通过按该链接/链按钮获取更新的链接),但是,我明白您的意思了。我会研究一下
daniero

1
@NoseKnowsAll你去了,我修好了;)
daniero

3

脑高射炮135,131个字节

{({}<>)<>}(((((((()()()()()){})){}{}())){}{})[()()])<>{<>(((((((()()()){}()){}){}()){})[(((()()()){})){}{}()])<>)({}<({}<>)>)<>}<>

在线尝试!

+1-c标志的字节。

感谢WheatWizard删除了我无缘无故使用XD的非常明显的NOOP。


@WheatWizard> _>是的,我只是在测试您……哈哈哈,谢谢您指出这一点。我会在以后尝试打更多的高尔夫球,但是现在我要补充一下,哈哈
DJMcMayhem

3

标准ML52 50字节

感谢@Laikoni,节省了2个字节!

fn s=>String.translate(fn c=>"'"^str c^"':")s^"[]"

在线尝试!

String.translate是不幸长名字,但为5个字节比使用更短concatmapexplode


@Laikoni谢谢!我总是忘记运算符的优先级比函数低。
musicman523

3

Cubix31 29字节

uo@[)o'U);!A?ro;o;o;os:'/u:''

A也可以代替i; 试图找出是否有一个好的方法可以从中挤出另外一个或两个字节。-2个字节感谢MickyT!也超出了MickyT

适用于3x3x3立方体:

      u o @
      [ ) o
      ' U )
; ! A ? r o ; o ; o ; o
s : ' / u : ' ' . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

在线观看!

在线尝试!


通过在最后一个括号中使用几个增量,可以节省几个字节。这可以使底线有所压缩uo@[)o'U);!A?ro;o;o;os:'/u:''
MickyT




2

PHP,39字节

<?while(~$c=$argn[$i++])echo"'$c':"?>[]

与一起作为管道运行-F



2

Cubix,27个字节

uosW?U.iv":'"^soso;os@o[]'/

在线尝试!

      u o s
      W ? U
      . i v
" : ' " ^ s o s o ; o s
@ o [ ] ' / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

观看它运行

与吉塞普的回答略有不同。这会将冒号和报价放在堆栈上。然后,它循环遍历输入,交换并输出堆栈。仅废弃输入,并保留冒号和引号。

一旦到达输入的末尾,IP便会在立方体周围产生一点疑问,添加并输出括号。混合中有几个冗余命令。

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.