数値リストコンバーターを作成する


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. 

入力は数字の間に任意の数のスペースを含めることができますが、出力はゼロのスペース(,または;区切り文字として使用される場合)、または単一のスペース(スペース区切りの場合)を選択できます。

入力リストに加えて、出力形式を定義する文字列(または2文字)があります。フォーマット文字列は、最初、開口ブラケットタイプ(のみ)になり[(<{または(最後のものには、周囲のブラケットがない場合に使用される単一の空間です)。ブラケットタイプの後には、デリミタタイプ,;または(最後のスペースは単一のスペースです)が続きます。2つの入力形式文字は、上記の順序で単一の引数(文字列または2つの連続した文字)として使用する必要があります。

書式文字列の例:

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

ルール:

  • 出力の先頭にスペースを含めることはできません
  • 出力には、末尾のスペースと改行を含めることができます
    • 出力は 数字のリストのみで、そうでないans =か類似している必要があります
  • 入力は、整数または10進数(正と負(およびゼロ)の両方)のリストと、2文字の文字列です。
    • 入力が整数のみで構成されている場合、出力リストには整数のみを含める必要があります。入力リストが整数と10進数で構成される場合、すべての出力番号は10進数にすることができます。(整数を整数として保持することはオプションです)
    • サポートする必要がある小数点以下の最大桁数は3です。
    • 入力は2つの引数になります。つまり、数値は1つの引数に含まれ、フォーマット文字列は単一の引数になります。
  • コードはプログラムまたは関数にすることができます
  • 入力は、関数の引数または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]

バイト単位の最短コードが勝ちです。いつものように、優勝者はチャレンジが投稿された日から1週間以内に選ばれます。後で投稿された回答は、現在の勝者より短い場合でも勝つことができます。


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


末尾および先頭の空白は許可されますか?
オーバーアクター

@overactor、最初の2つのルールを参照してください。先頭の空白は問題ありませんが、末尾の空白は問題ありません。
スティーヴィーグリフィン

入力を逆の順序で取得できますか?(区切り文字が最初、リストが2番目)
マーティンエンダー

@MartinBüttner、はい。最初にリストする必要があることは指定されていないため、選択できます。
スティーヴィーグリフィン

J _は負の要素を示すために使用します。:(
ズガルブ

回答:


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

ここでテストしてください。

最初の行に形式が、2行目にリストが必要です。

説明

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

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()

(以前のバージョンの改訂履歴を参照)

除去することにより、別の15のバイトをGolfed $b$s変数と内側列に括弧を変更します。

これは、入力を2つの文字列として受け取り、それらを$i$zに保存してから、新しい出力文字列を作成します。内側の括弧-split$i数字のみを選択するための正規表現では、その後、-join要求された区切り文字と一緒に戻ってね。それを区切り文字入力の最初の文字(たとえば、[)と連結し、最初の文字のASCII値に基づいた文字列へのインデックス付けと、いくつかの定式トリックを使用して閉じます。外側.Trim()は、先頭または末尾のスペースを削除します。


かっこ式"]})>"["[{(< ".IndexOf($b[0])]をのようなものに置き換えることができると思います' }) >]'[($b[0]-32)%6]($b[0]-32)%6あなたを与える0,2,4,5,1あなたは閉じ括弧文字列にインデックスを使用することができブラケット文字を、開くため' }) >]'。短い「式」があるかもしれませんが、これで十分なようです。
ダンコドゥルビッチ

@DankoDurbićすばらしい!ASCII値に基づいて正しい出力文字を選択するための数学を考え出そうとしていましたが、正しい式が見つかりませんでした。私は()お互いのすぐ隣にいることでつまずき続けましたが、他のブラケットには文字がありますので、インデックスを作成しました。ありがとう!
AdmBorkBork

演算子のString.Replace()代わりに使用すると、-replaceさらに2バイト購入されます(エスケープまたは文字クラスをで定義する必要はありません[]
Mathias R. Jessen

@ MathiasR.Jessenここで何かが足りない限り、.Replace('[]{}()<>;,',' ')個々の文字をキャッチせず、代わりに存在しないシンボリックな全体と一致させようとします。.NET呼び出しを含むRegex.Replaceを使用する必要があり、[regex]::代わりにコードが長くなります。
AdmBorkBork

@TessellatingHecklerありがとう!の-ne''代わりにを使用して別のバイトをゴルフしました|?{$_}
AdmBorkBork

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] -> ">"
)

リストではなく文字列として取得する必要があると思います。
オーバーアクター

これを完全に誤解しました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

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 2つの文字列を受け入れて文字列を返すです。

ゴルフをしていない:

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`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.