制作数字列表转换器


20

当您想将一个数字列表(向量,数组...)从一个程序复制粘贴到另一个程序时,您是否讨厌它,但是您使用数字的格式与您所需要的格式不匹配?

例如,在MATLAB中,您可能会有一个用空格分隔的列表,如下所示:

[1 2 3 4 5]    (you can also have it comma separated, but that's not the point)

在Python中,您需要插入逗号以使该列表成为有效输入,因此您必须将其转换为

[1, 2, 3, 4, 5]

使它工作。在C ++中,您可能需要类似以下内容:

{16,2,77,29}

等等。

为了简化每个人的生活,让我们创建一个列表转换器,该转换器接受任何格式的列表*,然后输出另一种指定格式的列表。

有效括号为:

[list]
{list}
(list)
<list>
list      (no surrounding brackets)

有效的分隔符为:

a,b,c
a;b;c
a b c
a,  b,  c       <-- Several spaces. Must only be supported as input.
a;     b; c     <-- Several spaces. Must only be supported as input.
a   b   c       <-- Several spaces. Must only be supported as input. 

注意,输入可以有任意数量的号码之间的空间,但输出可以选择零个空间(如果,;用作分隔符),或一个空格(如果它的空间分隔)。

除了输入列表之外,还将有一个字符串(或两个字符)定义了输出格式。格式字符串将首先是开口支架类型(只), ,[,,( 或(最后一个是当不存在周围托架使用单个空间)。支架类型之后,将分隔符的类型,,或(最后一个是一个单一的空间)。必须按照上述顺序将两个输入格式字符当作单个参数(字符串或两个连续字符)。<{,;

格式字符串的一些示例:

[,    <-- Output format:   [a,b,c]
{;    <-- Output format:   {a;b;c}
      <-- Two spaces, output list has format:   a b c   

规则:

  • 输出不能有前导空格
  • 输出可以包含尾随空格和换行符
    • 输出应 是数字列表,而不是ans =类似数字
  • 输入将是一个整数或十进制数字(正负(和零),以及两个字符的字符串)的列表
    • 如果输入包含整数,则输出列表应仅包含整数。如果输入列表由整数和十进制数字组成,则所有输出数字都可以为十进制数字。(将整数保留为整数是可选的)
    • 小数点后必须支持的最大位数为3。
    • 输入将是两个参数。即数字在一个参数中,格式字符串是一个参数。
  • 该代码可以是程序或函数
  • 输入可以是函数参数或STDIN

一些例子:

1 2 3 4
[,
[1,2,3,4]

<1;  2;  3>
 ;    <-- Space + semicolon
1;2;3
not valid:  1.000;2.000;3.000   (Input is only integers => Output must be integers)

{-1.3, 3.4, 4, 5.55555555}
[,
[-1.300,3.400,4.000,5.556]  (5.555 is also valid. Rounding is optional)
also valid: [-1.3,3.4,4,5.55555555]

以字节为单位的最短代码获胜。与往常一样,获奖者将从挑战发布之日起的一周内选出。如果发布的答案短于当前的获胜者,则仍然可以获胜。


排行榜

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


是否允许尾随和前导空格?
overactor 2015年

@overactor,请参阅前两个规则。前导空格不正确,尾随也可以。
Stewie Griffin 2015年

我们可以按相反的顺序进行输入吗?(定界符第一,列表第二)
Martin Ender

@MartinBüttner,是的。未指定必须首先列出,因此可以选择。
Stewie Griffin 2015年

J _用来表示否定元素。:(
Zgarb 2015年

Answers:


1

CJam,27个字节

l)l_5ms`-SerS%*\S-_o_'(#(f-

在这里尝试。

说明

l      e# Read the format string.
)      e# Extract the separator.
l_     e# Read the list.
5ms`   e# Get a string that contains -.0123456789.
-      e# Get the characters in the list that are not in the string.
Ser    e# Replace those characters with spaces.
S%     e# Split by those characters, with duplicates removed.
*      e# Join with the separator.
\S-    e# Remove spaces (if any) from the left bracket.
_o     e# Output a copy of that character before the stack.
_'(#   e# Find '( in the left bracket string.
(      e# Get -1 if '( is the first character, and -2 if it doesn't exist.
f-     e# Subtract the number from every character in the left bracket string,
          making a right bracket.

8

JavaScript(ES6),75 82

作为匿名功能

编辑:2字节保存thx @ user81655(还有5个只是在审查它)

(l,[a,b])=>a.trim()+l.match(/[-\d.]+/g).join(b)+']})> '['[{(< '.indexOf(a)]

测试片段

F=(l,[a,b])=>a.trim()+l.match(/[-\d.]+/g).join(b)+']})> '['[{(< '.indexOf(a)]

// Test
console.log=x=>O.innerHTML+=x+'\n'
// default test suite
t=[['1 2 3 4','[,'],['<1;  2;  3>',' ;'],['{-1.3, 3.4, 4, 5.55555555}','[,']]
t.forEach(t=>console.log(t[0]+' *'+t[1]+'* '+F(t[0],t[1])))
function test() { console.log(P1.value+' *'+P2.value+'* '+F(P1.value,P2.value)) }
#P1 { width: 10em }
#P2 { width: 2em }
P1<input id=P1>
P2<input id=P2>
<button onclick="test()">-></button>
<pre id=O></pre>


6

CJam,35 34字节

l(S-l"{[<(,}]>);":BSerS%@*1$B5/~er

在这里测试。

预期格式在第一行,列表在第二行。

说明

l   e# Read the format line.
(   e# Pull off the first character, which is the opening bracket.
S-  e# Set complement with a space, which leaves brackets unchanged and turns a space
    e# into an empty string.
l   e# Read the list.
"{[<(,}]>);":B
    e# Push this string which contains all the characters in the list we want to ignore.
Ser e# Replace each occurrence of one of them with a space.
S%  e# Split the string around runs of spaces, to get the numbers.
@   e# Pull up the the delimiter string.
*   e# Join the numbers in the list with that character.
1$  e# Copy the opening bracket (which may be an empty string).
B5/ e# Push B again and split it into chunks of 5: ["{[<(," "}]>);"]
~   e# Unwrap the array to leave both chunks on the stack.
er  e# Use them for transliteration, to turn the opening bracket into a closing one.

5

Pyth,33个字节

rjjezrXwJ"<>[]  {}(),;"d7@c6JChz6

在线尝试:演示测试套件

说明:

J"<>[]  {}(),;"  assign this string to J

rjjezrXwJd7@c6JChz6   implicit: z = first input string, e.g. "[;"
       w              read another string from input (the list of numbers)
      X Jd            replace every char of ^ that appears in J with a space
     r    7           parse ^ (the string of numbers and spaces) into a list
  jez                 put z[1] (the separator symbol) between the numbers
            c6J       split J into 6 pieces ["<>", "[]", "  ", "{}", "()", ",;"]
               Chz    ASCII-value of z[0] (opening bracket symbol)
           @          take the correspondent (mod 6) brackets from the list
 j                    and put the numbers between these brackets
r                 7   remove leading and trailing spaces

您能补充一下它的工作原理吗?
Shelvacu 2015年

1
@Shel您在这里。
雅库布

5

PowerShell,108 100 95 85字节

$i,$z=$args;($z[0]+($i-split'[^\d.-]+'-ne''-join$z[1])+' }) >]'[($z[0]-32)%6]).Trim()

(请参阅以前版本的修订历史记录)

通过移除$b$s变量并更改内部字符串的paren来再打15个字节。

这将输入作为两个字符串并将它们存储在$i和中$z,然后构造一个新的输出字符串。内部括号-split小号$i用正则表达式来选择只包含数字,然后-joins的请求的分隔符重新走到一起。我们将其与定界符输入的第一个字符(例如[)连接起来,并根据第一个字符的ASCII值和一些公式化技巧将其索引到字符串中以将其关闭。外层.Trim()删除任何前导或尾随空格。


我认为你可以取代你的右括号表达"]})>"["[{(< ".IndexOf($b[0])]喜欢的东西' }) >]'[($b[0]-32)%6]。该($b[0]-32)%6给你0,2,4,5,1提供开括号字符,您可以使用它们将其括入右括号字符串' }) >]'。可能会有一个较短的“公式”,但这似乎足够好。
DankoDurbić2015年

@DankoDurbić太好了!我试图提出一些数学运算,以根据ASCII值选择正确的输出字符,但找不到正确的公式。我一直靠()紧挨在一起而被绊倒,但是其他括号之间有一个字符,因此我开始使用索引。谢谢!
AdmBorkBork 2015年

使用 String.Replace()代替-replace运算符可以再买2个字节(无需转义或使用定义字符类[]
Mathias R. Jessen 2015年

@ MathiasR.Jessen除非我在这里缺少任何内容,.Replace('[]{}()<>;,',' ')否则不会捕获单个字符,而是尝试匹配不存在的符号整体。我们需要使用Regex.Replace,它涉及一个[regex]::.NET调用,而会延长代码长度。
AdmBorkBork 2015年

@TessellatingHeckler谢谢!我用-ne''代替打了另一个字节|?{$_}
AdmBorkBork 2015年

4

Python 2,96字节

import re
lambda(a,(b,c)):(b+c.join(re.findall('[-\d\.]+',a))+'])>} '['[(<{ '.index(b)]).strip()

致电为:

f(('{-1.3, 3.4, ,4, 5.55555555}','[,'))

输出:

[-1.3,3.4,4,5.55555555]

2

JavaScript(ES6),82 92 116 92字节

(a,b)=>(c=a.match(/-?\d+(\.\d+)?/g).join(b[1]),d=b[0],d<"'"?c:d+c+"]}>)"["[{<(".indexOf(d)])

匿名函数,像这样运行

((a,b)=>(c=a.match(/-?\d+(\.\d+)?/g).join(b[1]),d=b[0],d<"'"?c:d+c+"]}>)"["[{<(".indexOf(d)]))("{1;  2;3;   4}","<;")

这可能会打得更远。

不打高尔夫球

(a,b)=>(                             // "{1;  2;3;   4}", "<;"
    c=a.match(/-?\d+(\.\d+)?/g)      // regex to match decimals
    .join(b[1]),                     // c -> "1;2;3;4"
    d=b[0],                          // d -> "<"
    d<"'" ?                          // if d is smaller than ' then ...
        c :                          // return just "1;2;3;4"
        d + c +                      // "<" + "1;2;3;4" + ...
        "]}>)" [ "[{<(".indexOf(d) ] // "]}>)"[2] -> ">"
)

我认为您必须将a作为字符串,而不是列表。
overactor 2015年

完全误解了:The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters。修复问题,谢谢
Bassdrop Cumberwubwubwub 2015年

2

Mathematica,108个字节

除非将字符串解释为文本,否则Mathematica对于字符串输入通常比较笨拙。

c=Characters;t_~f~p_:=({b,s}=c@p;b<>Riffle[StringCases[t,NumberString],s]<>(b/.Thread[c@"[ {<(" -> c@"] }>)"]))

说明

StringCases[t,NumberString]返回数字字符串列表。

Riffle在数字之间插入分隔符。

/.Thread[c@"[ {<(" -> c@"] }>)"]) 用右括号替换左“括号”。

<>是的中缀形式StringJoin。它将子字符串粘合在一起。


2

Matlab,85个字节

@(s,x)[x(1) strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)) x(1)+(x(1)~=32)+(x(1)~=40)]

使用示例:

>> @(s,x)[x(1) strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)) x(1)+(x(1)~=32)+(x(1)~=40)]
ans = 
    @(s,x)[x(1),strjoin(regexp(s,'-?\d+\.?\d*','match'),x(2)),x(1)+(x(1)~=32)+(x(1)~=40)]

>> ans('1 2.4 -3 -444.555 5', '[,')
ans =
[1,2.4,-3,-444.555,5]

1

朱莉娅,95个字节

f(l,s)=(x=s[1]<33?"":s[1:1])*join(matchall(r"[\d.-]+",l),s[2])*string(x>""?s[1]+(s[1]<41?1:2):x)

这是一个功能 f接受两个字符串并返回一个字符串。

取消高尔夫:

function f{T<:AbstractString}(l::T, s::T)
    # Extract the numbers from the input list
    n = matchall(r"[\d.-]+", l)

    # Join them back into a string separated by given separator
    j = join(n, s[2])

    # Set the opening bracket type as the empty string unless
    # the given bracket type is not a space
    x = s[1] < 33 ? "" : s[1:1]

    # Get the closing bracket type by adding 1 or 2 to the ASCII
    # value of the opening bracket unless it's an empty string
    c = string(x > "" ? s[1] + (s[1] < 41 ? 1 : 2) : x)

    # Put it all together and return
    return x * j * c
end

1

Bash + GNU实用程序,90

b=${2:0:1}
echo $b`sed "s/[][{}()<>]//g;s/[,; ]\+/${2:1}/g"<<<"$1"``tr '[{(<' ']})>'<<<$b`
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.