万能药水句法糖


17

在药剂,(链接)的列表格式中的[head | tail]其中可以是任何东西,和是列表的其余部分的列表,以及[]-空列表-是唯一的例外。

列表也可以写成[1, 2, 3]等价于[1 | [2 | [3 | []]]]

您的任务是按照说明转换列表。输入将始终是有效列表(在Elixir中),仅包含与regex匹配的数字\[(\d+(, ?\d+)*)?\]。您可以使用带空格的输入(每个逗号后一个空格)或不带空格的输入。输出可以带空格(每个空格前后一个空格|)或不带空格。

对于带前导零的输入,您可以不带零或带零输出。

输入必须与输出一样作为字符串(如果编写函数)。

例子

[] -> []
[5] -> [5 | []]
[1, 7] -> [1 | [7 | []]]
[4, 4, 4] -> [4 | [4 | [4 | []]]]
[10, 333] -> [10 | [333 | []]]

相关,而不是重复,因为这部分涉及]到末尾添加模式。此外,这里的Haskell答案与那里的答案完全不同。


5
从我-1。不建议使用笨拙的IO格式。如果输入是列表,那么让我们将其作为列表,而不是让我们的代码的90%只是解析输入
Jo King

2
我们是否必须支持前导0?它们适合正则表达式。
乔·金

2
无糖语法的可能重复项
NoOneIsHere '18

5
@JoKing我认为这里的挑战本身就是关于在两种特定格式之间进行转换,因此解析输入是挑战的基本组成部分,而不是额外添加的内容。PS:我才意识到你的昵称是xD
Leo

2
@MuhammadSalman:挑战被标记为“正在解析”,因此有意向/从字符串转换为字符串的重要部分。
妮咪

Answers:


9

Haskell,50个字节

f.read
f(a:b)='[':show(a+0)++'|':f b++"]"
f _="[]"

在线尝试!

+0让Haskell的类型检查器知道我们正在处理的号码清单,所以read将解析输入字符串我们。


1
+1,我喜欢+0技巧!
B. Mehta



4

视网膜39 33 32 20字节

\b]
,]
+`,(.*)
|[$1]

使用H.PWiz,ovs,仅ASCII和Neil,节省了13个字节。
在线尝试!

说明

\b]
,]

如果我们没有空列表,请添加一个逗号结尾。

+`,(.*)
|[$1]

当有逗号时,请用括起来|[ thing ]




@ ASCII只可以通过更换再节省4个字节\b],]。(否则,我已经独立发现了相同的解决方案。)
尼尔(Neil

哦是的 我\b出于某种原因忘记了某物> _> 20个字节 @Mnemonic
仅ASCII的

4

Perl 5中 -pl31 28个字节

s/\d\K]/,]/;$\=']'x s/,/|[/g

在线尝试!

怎么样?

-p                    # (command line) Implicit input/output via $_ and $\
s/\d\K]/,]/;          # insert a comma at the end if the list is not empty
$\=']'x s/,/|[/g      # At the end of the run, output as many ']' as there are
                      # commas in the input.  Replace the commas with "|["

3

Elixir111 85字节

f=fn[h|t],f->"[#{h}|#{f.(t,f)}]"
[],_->"[]"
h,f->f.(elem(Code.eval_string(h),0),f)end

在线尝试!

我以前从未使用过Elixir。定义一个函数,该函数接受字符串和对其自身的引用,然后返回字符串。


3

锡兰,113字节

String p(String s)=>s.split(" ,[]".contains).select((x)=>!x.empty).reversed.fold("[]")((t,h)=>"[``h`` | ``t``]");

在线尝试!

这是写出来的:

// define a function p mapping Strings to Strings.
String p(String s) =>
    // we split the string at all characters which are brackets, comma or space.
    s.split(" ,[]".contains)    // → {String+}, e.g.  { "", "1", "7", "" }
    // That iterable contains empty strings, so let's remove them.
    // Using `select` instead of `filter` makes the result a sequential instead of
    // an Iterable.
     .select((x)=>!x.empty)    // → [String*], e.g.   [1, 7]
    // now invert the order.
    // (This needs a Sequential (or at least a List) instead of an Iterable.)
     .reversed                 // → [String*], e.g.   [7, 1]
    // Now iterate over the list, starting with "[]", and apply a function
    // to each element with the intermediate result.
     .fold("[]")                       // → String(String(String, String))
    //    This function takes the intermediate result `t` (for tail) and an element
    //    `h` (for head), and puts them together into brackets, with a " | " in the
    //    middle. This uses String interpolation, I could have used `"+` and `+"`
    //    instead for the same length.
          ((t,h)=>"[``h`` | ``t``]");  // → String

在线尝试!

正如ovs在(现在已删除)注释中所指出的:如果选择问题中指示的输入和输出的“无空格”选项,则可以再保护3个字节(其中明显带有空格)。

如果我们不需要解析输入,而只需将一个序列作为输入,它就会变得更短(69字节)。

String p(Object[]s)=>s.reversed.fold("[]")((t,h)=>"[``h`` | ``t``]");

在线尝试!



2

SNOBOL4(CSNOBOL4),114字节

	I =INPUT
S	N =N + 1	
	I SPAN(1234567890) . L REM . I	:F(O)
	O =O '[' L ' | '	:(S)
O	OUTPUT =O '[' DUPL(']',N)
END

在线尝试!

	I =INPUT				;* read input
S	N =N + 1				;* counter for number of elements (including empty list)
	I SPAN(1234567890) . L REM . I	:F(O)	;* get value matching \d until none left
	O =O '[' L ' | '	:(S)		;* build output string
O	OUTPUT =O '[' DUPL(']',N)		;* print O concatenated with a '[' and N copies of ']'
END

2

Stax,19 个字节

É▲²:WlÖ└%ï╪☺╒▓"We↨Φ

运行并调试

我的第一篇Stax帖子,可能不是最佳的。

打开包装并评论:

U,                      Put -1 under input
  {                     Block
   i                      Push loop index, needed later
    '[a$'|++              Wrap the element in "[...|"
            m           Map
             '[+        Add another "["
                s2+     Get the latest loop index + 2
                   ']*+ Add that many "]"

运行并调试这一



2

Befunge-98(PyFunge)22 21字节

'[,1;@j,]';#$&." |",,

在线尝试!

如果对输出没有怪异的限制,我们可以在18中这样做:

'[,1;@j,]';#$&.'|,

有趣的是,从技术上讲,这是一个在Python中不执行任何操作的程序。







1

果冻,18 字节

ŒVµ⁾[]jj⁾|[ṫ3;”]ṁ$

完整的程序将打印结果(作为单子链接,它接受字符列表,但返回字符和整数列表)。

在线尝试!

怎么样?

ŒVµ⁾[]jj⁾|[ṫ3;”]ṁ$ - Main link: list of characters  e.g. "[10,333]"
ŒV                 - evaluate as Python code              [10,333]
  µ                - start a new monadic chain, call that X
   ⁾[]             - list of characters                   ['[',']']
      j            - join with X                          ['[',10,333,']']
        ⁾|[        - list of characters                   ['|','[']
       j           - join                                 ['[','|','[',10,'|','[',333,'|','[',']']
           ṫ3      - tail from index three                ['[',10,'|','[',333,'|','[',']']
                 $ - last two links as a monad (f(X)):
              ”]   -   character                          ']'
                ṁ  -   mould like X                       [']',']'] (here 2 because X is 2 long)
             ;     - concatenate                          ['[',10,'|','[',333,'|','[',']',']',']']
                   - implicit (and smashing) print        [10|[333|[]]]

1

Java 10,107个字节

s->{var r="[]";for(var i:s.replaceAll("[\\[\\]]","").split(","))r="["+i+"|"+r+"]";return s.length()<3?s:r;}

在线尝试。

说明:

s->{                       // Method with String as both parameter and return-type
  var r="[]";              //  Result-String, starting at "[]"
  for(var i:s.replaceAll("[\\[\\]]","") 
                           //  Removing trailing "[" and leading "]"
             .split(","))  //  Loop over the items
    r="["+i+"|"+r+"]";     //   Create the result-String `r`
  return s.length()<3?     //  If the input was "[]"
          s                //   Return the input as result
         :                 //  Else:
          r;}              //   Return `r` as result

1

标准ML,71个字节

fun p[_]="]|[]]"|p(#","::r)="|["^p r^"]"|p(d::r)=str d^p r;p o explode;

在线尝试!使用不带空格的格式。例如it "[10,333,4]"产量"[10|[333|[4]|[]]]]"

不打高尔夫球

fun p [_]       = "]|[]]"          (* if there is only one char left we are at the end *)
  | p (#","::r) = "|[" ^ p r ^ "]" (* a ',' in the input is replaced by "|[" and an closing "]" is added to the end *)
  | p (d::r)    = str d ^ p r      (* all other chars (the digits and the initial '[') are converted to a string and concatenated to recursive result *)

val f = p o explode  (* convert string into list of chars and apply function p *)

在线尝试!


1

[R 140 136字节

根据Giuseppe的声音建议降低4个字节。

function(l,x=unlist(strsplit(substr(l,2,nchar(l)-1),", ")))paste(c("[",paste0(c(x,"]"),collapse=" | ["),rep("]",length(x))),collapse="")

在线尝试!


substr较短,第一个paste0可以是paste将其增加到136个字节。
朱塞佩

1
使用evalparsesub代替unliststrsplit并且substr,我也只能管理136个字节(我想这可能是更短,但它不是)
朱塞佩

@Giuseppe感谢-4个字节!我希望我们有一些简短的内容。递归解决方案也许?
JayCe '18年



0

sed + -E,46个字节

:
s/\[([0-9]+)(, ?([^]]*)|())\]/[\1 | [\3]]/
t

一个相当简单的方法。第二行将[\d+, ...]其更改为[\d | [...]]。如果替换成功,第三行将跳回到第一行。重复替换直到失败,然后程序终止。运行sed -E -f filename.sed,通过stdin传递输入。


0

红色,110字节

func[s][if s ="[]"[return s]replace append/dup replace/all b: copy s",""|[""]"(length? b)- length? s"]""|[]]"]

在线尝试!

非高尔夫版本的说明:

f: func[s][                      
    if s = "[]" [return s]                    ; if the list is empty, return it    
    b: copy s                                 ; save a copy of the input in b 
    replace/all b "," "|["                    ; replace every "," with "|["  
    append/dup b "]" (length? b) - length? s  ; append as many "]" as there were ","
    replace b "]" "|[]]"                      ; replace the first "]" with "|[]]"     
]                                             ; the last value is returned implicitly

红色是如此容易阅读,以至于我怀疑我需要添加以上评论:)


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.