Tạo một công cụ chuyển đổi danh sách số


20

Bạn không ghét nó khi bạn muốn sao chép-dán danh sách các số (vectơ, mảng ...), từ chương trình này sang chương trình khác, nhưng định dạng bạn có các số trên không khớp với định dạng bạn cần trên ?

Chẳng hạn, trong MATLAB, bạn có thể có một danh sách được phân tách bằng dấu cách như sau:

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

Trong Python, bạn sẽ cần chèn dấu phẩy để biến danh sách đó thành đầu vào hợp lệ, vì vậy bạn phải chuyển đổi nó thành

[1, 2, 3, 4, 5]

Để làm cho nó hoạt động. Trong C ++, bạn có thể muốn một cái gì đó như:

{16,2,77,29}

vân vân

Để đơn giản hóa cuộc sống của mọi người, hãy tạo một trình chuyển đổi danh sách, lấy danh sách ở bất kỳ định dạng nào * và xuất ra một danh sách trên định dạng được chỉ định khác.

Dấu ngoặc hợp lệ là:

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

Các dấu phân cách hợp lệ là:

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. 

Lưu ý, đầu vào có thể có bất kỳ số khoảng trắng nào giữa các số, nhưng đầu ra có thể chọn không có khoảng trắng (nếu ,hoặc ;được sử dụng làm dấu phân cách) hoặc một khoảng trắng (nếu được phân cách bằng dấu cách).

Ngoài danh sách đầu vào, sẽ có một chuỗi (hoặc hai ký tự) xác định định dạng đầu ra. Chuỗi định dạng đầu tiên sẽ là kiểu mở khung (chỉ), [, (, <, {hoặc (người cuối cùng là một không gian duy nhất được sử dụng khi không có khung xung quanh). Các loại khung sẽ được theo sau bởi các loại delimiter, ,, ;hoặc (người cuối cùng là một không gian duy nhất). Hai ký tự định dạng đầu vào phải được lấy dưới dạng một đối số (chuỗi hoặc hai ký tự liên tiếp) theo thứ tự được mô tả ở trên.

Một số ví dụ về chuỗi định dạng:

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

Quy tắc:

  • Đầu ra không thể có không gian hàng đầu
  • Đầu ra có thể có dấu cách và một dòng mới
    • Đầu ra chỉ nên là danh sách các số, không ans =hoặc tương tự
  • Đầu vào sẽ là danh sách các số nguyên hoặc số thập phân (cả dương và âm (và không)) và một chuỗi gồm hai ký tự
    • Nếu đầu vào bao gồm chỉ số nguyên, danh sách đầu ra nên có chỉ số nguyên. Nếu danh sách đầu vào bao gồm số nguyên và số thập phân, tất cả các số đầu ra có thể là số thập phân. (Tùy chọn giữ số nguyên dưới dạng số nguyên)
    • Số chữ số tối đa sau dấu thập phân phải được hỗ trợ là 3.
    • Đầu vào sẽ là hai đối số. Tức là các số nằm trong một đối số và chuỗi định dạng là một đối số.
  • Mã có thể là một chương trình hoặc chức năng
  • Đầu vào có thể là đối số chức năng hoặc STDIN

Vài ví dụ:

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]

Mã ngắn nhất trong byte thắng. Như mọi khi, người chiến thắng sẽ được chọn một tuần kể từ ngày thử thách được đăng. Câu trả lời được đăng sau đó vẫn có thể giành chiến thắng nếu chúng ngắn hơn người chiến thắng hiện tại.


Bảng xếp hạng

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


Là dấu vết và khoảng trắng hàng đầu được phép?
overactor

@overactor, xem hai quy tắc đầu tiên. Khoảng trắng hàng đầu không ổn, theo dõi là OK.
Stewie Griffin

Chúng ta có thể lấy đầu vào theo thứ tự ngược lại? (phân cách đầu tiên, liệt kê thứ hai)
Martin Ender

@ MartinBüttner, vâng. Nó không được chỉ định rằng nó phải được liệt kê đầu tiên, vì vậy bạn có thể chọn.
Stewie Griffin

J dùng _để biểu thị các yếu tố tiêu cực. :(
Zgarb

Câu trả lời:


1

CJam, 27 byte

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

Hãy thử nó ở đây.

Giải trình

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

Là một chức năng ẩn danh

Chỉnh sửa: 2 byte đã lưu thx @ user81655 (và thêm 5 byte chỉ cần xem lại)

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

Kiểm tra đoạn

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 byte

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

Kiểm tra nó ở đây.

Mong đợi định dạng trên dòng đầu tiên và danh sách trên thứ hai.

Giải trình

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

Bình thường, 33 byte

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

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

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

Bạn có thể thêm một lời giải thích về cách nó hoạt động?
Shelvacu

1
@Shel Đây rồi.
Jakube

5

PowerShell, 108 100 95 85 byte

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

(xem lịch sử sửa đổi cho các phiên bản trước)

Đánh gôn thêm 15 byte bằng cách loại bỏ $b$scác biến và thay đổi parens trên chuỗi bên trong.

Điều này nhận đầu vào là hai chuỗi và lưu trữ chúng vào $i$zsau đó chúng tôi xây dựng một chuỗi đầu ra mới. Các dấu ngoặc bên trong -splits $ivới một regex để chỉ chọn ký tự số, sau đó -joinđã trở lại cùng với delimiter yêu cầu. Chúng tôi kết hợp với ký tự đầu tiên của đầu vào dấu phân cách (ví dụ [) và đóng nó bằng cách lập chỉ mục thành một chuỗi dựa trên giá trị ASCII của ký tự đầu tiên và một số thủ thuật xây dựng. Bên ngoài .Trim()loại bỏ bất kỳ không gian hàng đầu hoặc dấu.


Tôi nghĩ rằng bạn có thể thay thế biểu thức khung đóng của bạn "]})>"["[{(< ".IndexOf($b[0])]bằng một cái gì đó như ' }) >]'[($b[0]-32)%6]. Việc ($b[0]-32)%6cung cấp cho bạn 0,2,4,5,1để mở các ký tự khung, mà bạn có thể sử dụng để lập chỉ mục vào chuỗi khung đóng ' }) >]'. Có thể có một "công thức" ngắn hơn, nhưng điều này có vẻ đủ tốt.
Danko Durbić

@ DankoDurbić Tuyệt vời! Tôi đã cố gắng đưa ra một số phép toán để chọn đúng ký tự đầu ra dựa trên các giá trị ASCII, nhưng tôi không thể tìm thấy công thức phù hợp. Tôi tiếp tục bị vấp ngã ()khi ở ngay cạnh nhau, nhưng các dấu ngoặc khác có một ký tự ở giữa, vì vậy tôi đã đi với lập chỉ mục. Cảm ơn!
admBorkBork

Sử dụng String.Replace()thay cho -replacetoán tử sẽ mua cho bạn thêm 2 byte (không cần phải thoát hoặc định nghĩa một lớp ký tự với [])
Mathias R. Jessen

@ MathiasR.Jessen Trừ khi tôi thiếu một cái gì đó ở đây, .Replace('[]{}()<>;,',' ')sẽ không bắt được các ký tự riêng lẻ mà thay vào đó cố gắng khớp với toàn bộ biểu tượng, thứ không tồn tại. Chúng ta cần sử dụng Regex.Replace , liên quan đến một [regex]::cuộc gọi .NET và thay vào đó sẽ kéo dài mã.
admBorkBork

@TessellatingHeckler Cảm ơn! Tôi đã chơi một byte khác bằng cách sử dụng -ne''thay vì |?{$_}.
admBorkBork

4

Python 2, 96 byte

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

Gọi như:

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

Đầu ra:

[-1.3,3.4,4,5.55555555]

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

Một chức năng ẩn danh, chạy nó như thế này

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

Điều này có thể có thể được chơi golf cách xa hơn ..

Ung dung

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

Tôi nghĩ rằng bạn phải lấy một chuỗi, không phải là một danh sách.
overactor

Hoàn toàn hiểu lầm này : The input will be a list of integer or decimal numbers (both positive and negative (and zero)), and a string of two characters. Đã sửa lỗi, cảm ơn
Bassdrop Cumberwubwubwub

2

Toán học, 108 byte

Mathicala thường vụng về với các đầu vào chuỗi trừ khi chuỗi có nghĩa được hiểu là một văn bản.

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

Giải trình

StringCases[t,NumberString]trả về danh sách các chuỗi số.

Rifflechèn các dấu phân cách giữa các số.

/.Thread[c@"[ {<(" -> c@"] }>)"]) thay thế "khung" bên trái bằng khung bên phải.

<>là dạng infix của StringJoin. Nó dán lại các chuỗi con.


2

Matlab, 85 byte

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

Ví dụ sử dụng:

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

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)

Đây là một hàm fchấp nhận hai chuỗi và trả về một chuỗi.

Ung dung:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.