สร้างตัวแปลงรายการตัวเลข


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 converter ที่รับรายการในทุกรูปแบบ * และส่งออกรายการในรูปแบบอื่นที่ระบุ

วงเล็บที่ถูกต้องคือ:

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ และเช่นเคยผู้ชนะจะถูกเลือกหนึ่งสัปดาห์จากวันที่มีการโพสต์ความท้าทาย คำตอบที่โพสต์ในภายหลังยังคงสามารถชนะหากพวกเขาสั้นกว่าผู้ชนะปัจจุบัน


ลีดเดอร์บอร์ด

ส่วนย่อยของสแต็กที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ 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

@overactor ดูกฎสองข้อแรก ช่องว่างนำหน้าไม่ตกลงต่อท้ายเป็น OK
Stewie Griffin

เราสามารถรับอินพุตในลำดับตรงกันข้ามได้หรือไม่? (ตัวคั่นแรกรายการที่สอง)
Martin Ender

@ MartinBüttnerใช่ ไม่ได้ระบุว่าจะต้องเป็นรายการแรกดังนั้นคุณสามารถเลือกได้
Stewie Griffin

J ใช้_เพื่อแสดงถึงองค์ประกอบเชิงลบ :(
Zgarb

คำตอบ:


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

1
@Shel ที่นี่คุณอยู่
Jakube

5

PowerShell, 108 100 95 85 ไบต์

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

(ดูประวัติการแก้ไขสำหรับเวอร์ชั่นก่อนหน้า)

เล่นกอล์ฟอีก 15 ไบต์โดยการลบ$bและ$sตัวแปรและเปลี่ยน parens บนสตริงด้านใน

สิ่งนี้จะนำเข้าเป็นสองสายและเก็บไว้ใน$iและ$zจากนั้นเราสร้างสตริงออกใหม่ parens ภายใน-splits $iกับ regex เพื่อเลือกเพียงตัวเลขที่เป็นตัวเลขแล้ว-joins กลับมารวมกันกับตัวคั่นร้องขอ เราเชื่อมต่อกันด้วยอักขระตัวแรกของอินพุตตัวคั่น (เช่น[) และปิดมันด้วยการจัดทำดัชนีเป็นสตริงตามค่า ASCII ของอักขระตัวแรกและเล่ห์เหลี่ยมสูตรบางอย่าง ด้านนอก.Trim()จะลบช่องว่างนำหน้าหรือต่อท้าย


ฉันคิดว่าคุณสามารถแทนที่แสดงออกวงเล็บปิดของคุณกับสิ่งที่ต้องการ"]})>"["[{(< ".IndexOf($b[0])] ช่วยให้คุณมีตัวละครวงเล็บเปิดซึ่งคุณสามารถใช้เพื่อดัชนีเป็นสตริงวงเล็บปิด อาจมี "สูตร" ที่สั้นกว่านี้ แต่ดูเหมือนจะดีพอ ' }) >]'[($b[0]-32)%6]($b[0]-32)%60,2,4,5,1' }) >]'
Danko Durbić

@ DankoDurbićยอดเยี่ยม! ฉันพยายามคำนวณคณิตศาสตร์เพื่อเลือกอักขระผลลัพธ์ที่ถูกต้องตามค่า ASCII แต่ฉันไม่พบสูตรที่ถูกต้อง ฉันได้รับการเพิ่มขึ้นเรื่อย ๆ โดย()การอยู่ติดกัน แต่วงเล็บอื่น ๆ มีตัวละครระหว่างดังนั้นฉันไปกับการจัดทำดัชนี ขอบคุณ!
AdmBorkBork

ใช้String.Replace()แทน-replaceโอเปอเรเตอร์จะซื้ออีก 2 ไบต์ (ไม่จำเป็นต้องหลบหนีหรือกำหนดคลาสอักขระด้วย[])
Mathias R. Jessen

@ MathiasR.Jessen เว้นเสียแต่ว่าฉันทำอะไรที่นี่หายไป.Replace('[]{}()<>;,',' ')ตัวละครแต่ละตัวจะไม่จับตัวเอง แต่พยายามที่จะจับคู่ทั้งสัญลักษณ์ซึ่งไม่มีอยู่จริง เราจำเป็นต้องใช้Regex.Replaceซึ่งเกี่ยวข้องกับการ[regex]::เรียก. NET และจะยืดรหัสแทน
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}","<;")

นี่อาจเป็นวิธี golfed เพิ่มเติม ..

Ungolfed

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

ฉันคิดว่าคุณต้องใช้เป็นสตริงไม่ใช่รายการ
overactor

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

Julia, 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ที่ยอมรับสองสตริงและส่งคืนสตริง

Ungolfed:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.