Buat pengubah daftar angka

20

Jangan Anda benci ketika Anda ingin menyalin-menempelkan daftar angka (vektor, array ...), dari satu program ke program lain, tetapi format nomor yang Anda gunakan tidak cocok dengan format yang Anda perlukan. ?

Misalnya, dalam MATLAB Anda mungkin memiliki daftar yang dipisahkan oleh ruang seperti ini:

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

Dengan Python, Anda harus memasukkan koma untuk membuat daftar itu menjadi input yang valid, jadi Anda harus mengubahnya

[1, 2, 3, 4, 5]

untuk membuatnya bekerja. Di C ++ Anda mungkin menginginkan sesuatu seperti:

{16,2,77,29}

dan seterusnya.

Untuk menyederhanakan kehidupan semua orang, mari kita buat konverter daftar, yang mengambil daftar pada format apa pun *, dan menampilkan daftar pada format lain yang ditentukan.

Kurung yang valid adalah:

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

Pembatas yang valid adalah:

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. 

Catatan, input dapat memiliki sejumlah spasi di antara angka-angka, tetapi output dapat memilih untuk memiliki spasi nol (jika ,atau ;digunakan sebagai pembatas), atau ruang tunggal (jika dibatasi-ruang).

Selain daftar input, akan ada string (atau dua karakter) yang menentukan format output. Format string pertama akan menjadi tipe pembukaan braket (hanya), [, (, <, {atau (yang terakhir adalah satu ruang yang digunakan ketika tidak ada braket sekitarnya). Jenis braket akan diikuti oleh jenis pembatas ,,, ;atau (yang terakhir adalah spasi tunggal). Dua karakter format input harus diambil sebagai argumen tunggal (string atau dua karakter berturut-turut) dalam urutan yang dijelaskan di atas.

Beberapa contoh format string:

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

Aturan:

  • Output tidak dapat memiliki spasi terdepan
  • Outputnya dapat memiliki spasi tambahan dan baris baru
    • Outputnya hanya berupa daftar angka, bukan ans =atau serupa
  • Input akan berupa daftar bilangan bulat atau angka desimal (baik positif dan negatif (dan nol)), dan serangkaian dua karakter
    • Jika input hanya terdiri dari bilangan bulat, daftar keluaran harus hanya memiliki bilangan bulat. Jika daftar input terdiri dari bilangan bulat dan angka desimal, semua angka output dapat berupa angka desimal. (Ini opsional untuk menjaga integer sebagai integer)
    • Jumlah digit maksimum setelah titik desimal yang harus didukung adalah 3.
    • Masukan akan berupa dua argumen. Yaitu jumlahnya dalam satu argumen, dan format string adalah satu argumen.
  • Kode dapat berupa program atau fungsi
  • Input dapat berupa argumen fungsi atau STDIN

Beberapa contoh:

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]

Kode terpendek dalam byte menang. Seperti biasa, pemenang akan dipilih satu minggu dari hari tantangan diposting. Jawaban yang diposting nanti masih bisa menang jika lebih pendek dari pemenang saat ini.


Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Stewie Griffin
sumber
Apakah trailing dan memimpin spasi putih diizinkan?
overactor
@overactor, lihat dua aturan pertama. Spasi memimpin tidak OK, trailing OK.
Stewie Griffin
Bisakah kita mengambil input dalam urutan yang berlawanan? (pembatas pertama, daftar kedua)
Martin Ender
@ MartinBüttner, ya. Tidak ditentukan bahwa harus daftar terlebih dahulu, jadi Anda dapat memilih.
Stewie Griffin
J digunakan _untuk menunjukkan elemen negatif. :(
Zgarb

Jawaban:

1

CJam, 27 byte

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

Coba di sini.

Penjelasan

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.
jimmy23013
sumber
8

JavaScript (ES6), 75 82

Sebagai fungsi anonim

Sunting: 2 byte disimpan thx @ user81655 (dan 5 lainnya baru saja memeriksanya)

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

Cuplikan tes

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>

edc65
sumber
6

CJam, 35 34 byte

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

Uji di sini.

Mengharapkan format di baris pertama dan daftar di baris kedua.

Penjelasan

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.
Martin Ender
sumber
5

Pyth, 33 byte

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

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

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
Jakube
sumber
Bisakah Anda menambahkan penjelasan tentang cara kerjanya?
Shelvacu
1
@Shel Di sini Anda.
Jakube
5

PowerShell, 108 100 95 85 Bytes

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

(lihat riwayat revisi untuk versi sebelumnya)

Golf 15 byte lagi dengan menghapus $bdan $svariabel dan mengubah parens pada string bagian dalam.

Ini mengambil input sebagai dua string dan menyimpannya ke dalam , $idan $zkemudian kita membangun string output baru. Parens dalam -splits $idengan regex untuk memilih hanya numerik digit, maka -joins kembali bersama-sama dengan pembatas yang diminta. Kami menyimpulkan bahwa dengan karakter pertama dari input pembatas (misalnya, [) dan menutupnya dengan pengindeksan ke dalam string berdasarkan nilai ASCII dari karakter pertama dan beberapa tipuan formulasi. Bagian luar .Trim()menghilangkan ruang depan atau belakang.

AdmBorkBork
sumber
Saya pikir Anda bisa mengganti ekspresi braket penutup Anda "]})>"["[{(< ".IndexOf($b[0])]dengan sesuatu seperti ' }) >]'[($b[0]-32)%6]. The ($b[0]-32)%6memberi Anda 0,2,4,5,1untuk membuka karakter bracket, yang dapat Anda gunakan untuk indeks ke penutupan braket tali ' }) >]'. Mungkin ada "formula" yang lebih pendek, tetapi ini tampaknya cukup baik.
Danko Durbić
@ DankoDurbić Luar Biasa! Saya mencoba membuat beberapa matematika untuk memilih karakter keluaran yang benar berdasarkan nilai ASCII, tetapi saya tidak dapat menemukan formula yang tepat. Saya terus tersandung dengan ()berada tepat di sebelah satu sama lain, tetapi tanda kurung lainnya memiliki karakter di antara keduanya, jadi saya pergi dengan pengindeksan. Terima kasih!
AdmBorkBork
Menggunakan String.Replace()alih-alih -replaceoperator akan membelikan Anda 2 byte lagi (tidak perlu melarikan diri atau mendefinisikan kelas karakter dengan [])
Mathias R. Jessen
@ MathiasR.Jessen Kecuali jika saya kehilangan sesuatu di sini, .Replace('[]{}()<>;,',' ')tidak akan menangkap karakter individu tetapi mencoba untuk mencocokkan keseluruhan simbol, yang tidak ada. Kita harus menggunakan Regex.Replace , yang melibatkan [regex]::panggilan .NET dan bukannya akan memperpanjang kode.
AdmBorkBork
@TessellatingHeckler Terima kasih! Saya menggunakan byte lain menggunakan -ne''bukan |?{$_}.
AdmBorkBork
4

Python 2, 96 byte

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

Panggil sebagai:

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

Keluaran:

[-1.3,3.4,4,5.55555555]
TFeld
sumber
2

JavaScript (ES6), 82 92 116 92 byte

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

Fungsi anonim, jalankan seperti ini

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

Ini mungkin bisa bermain golf lebih jauh ..

Tidak disatukan

(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] -> ">"
)
Bassdrop Cumberwubwubwub
sumber
Saya pikir Anda harus mengambil sebagai string, bukan daftar.
overactor
Benar-benar salah paham ini: The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters. Memperbaikinya, terima kasih
Bassdrop Cumberwubwubwub
2

Mathematica, 108 byte

Mathematica umumnya canggung dengan input string kecuali string dimaksudkan untuk ditafsirkan sebagai teks.

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

Penjelasan

StringCases[t,NumberString]mengembalikan daftar string angka.

Rifflemenyisipkan pemisah antara angka-angka.

/.Thread[c@"[ {<(" -> c@"] }>)"]) mengganti "braket" kiri dengan braket kanan.

<>adalah bentuk infiks dari StringJoin. Ini menempel bersama substring.

DavidC
sumber
2

Matlab, 85 byte

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

Contoh penggunaan:

>> @(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]
Luis Mendo
sumber
1

Julia, 95 byte

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)

Ini adalah fungsi fyang menerima dua string dan mengembalikan string.

Tidak Terkumpul:

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
Alex A.
sumber
1

Bash + GNU Utilities, 90

b=${2:0:1}
echo $b`sed "s/[][{}()<>]//g;s/[,; ]\+/${2:1}/g"<<<"$1"``tr '[{(<' ']})>'<<<$b`
Trauma Digital
sumber