숫자 목록 변환기 만들기


20

한 프로그램에서 다른 프로그램으로 숫자 목록 (벡터, 배열 ...)을 복사하여 붙여 넣기를 원할 때 싫어하지만 숫자가있는 형식이 필요한 형식과 일치하지 않습니다 ?

예를 들어, MATLAB에서는 다음과 같이 공백으로 구분 된 목록이있을 수 있습니다.

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

파이썬에서는 목록을 유효한 입력으로 만들려면 쉼표를 삽입해야합니다.

[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 =또는 유사한
  • 입력은 정수 또는 10 진수 (양수 및 음수 (0)) 및 두 문자의 문자열 목록입니다.
    • 입력이 정수 로만 구성된 경우 출력 목록에는 정수만 있어야합니다. 입력 목록이 정수와 10 진수로 구성된 경우 모든 출력 숫자는 10 진수 일 수 있습니다. (정수를 정수로 유지하는 것은 선택 사항입니다)
    • 지원해야하는 소수점 뒤의 최대 자릿수는 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]

바이트 단위의 가장 짧은 코드가 이깁니다. 항상 그렇듯이, 당첨자는 챌린지가 게시 된 날로부터 1 주일에 선정됩니다. 나중에 게시 된 답변은 현재 우승자보다 짧은 경우에도 이길 수 있습니다.


리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## 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가 아니며 후행은 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

자바 스크립트 (ES6), 75 82

익명의 기능으로

편집 : 2 바이트 저장 @ 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()

(이전 버전의 개정 내역 참조)

내부 문자열의 변수 를 제거 $b하고 $s변수를 변경 하여 15 바이트를 추가로 사용했습니다 .

이것은 두 문자열로 저장 그들을 등의 입력을 받고, $i그리고 $z우리는 새로운 출력 문자열을 구성. 내부 괄호 -split$i정규식과는 단 자리 숫자를 선택합니다 -join다시 함께 요청 된 구분 기호와이야. 우리는 구분 문자 입력의 첫 번째 문자 (예 :)를 연결하고 첫 번째 문자의 [ASCII 값과 일부 수식 속임수를 기반으로 문자열로 인덱싱하여 닫습니다. 바깥 쪽 .Trim()은 선행 또는 후행 공백을 제거합니다.


닫는 괄호 표현식 "]})>"["[{(< ".IndexOf($b[0])]을와 같은 것으로 바꿀 수 있다고 생각합니다 ' }) >]'[($b[0]-32)%6]. 는 ($b[0]-32)%6당신을 제공 0,2,4,5,1당신이 닫는 대괄호 문자열로 인덱스로 사용할 수 있습니다 브래킷 문자를 여는 ' }) >]'. 더 짧은 "수식"이있을 수 있지만 이것으로 충분합니다.
Danko Durbić

@ DankoDurbić 훌륭합니다! ASCII 값을 기반으로 올바른 출력 문자를 선택하기 위해 몇 가지 수학을 시도했지만 올바른 수식을 찾을 수 없습니다. 나는 ()서로 바로 옆에 서서 계속 넘어 졌지만 다른 괄호에는 문자가 있으므로 색인 작업을했습니다. 감사!
AdmBorkBork

사용 String.Replace() 대신의 -replace운영자 것은 당신에게 (탈출이나와 문자 클래스를 정의 할 필요 또 다른 2 바이트를 구입하지 않을 것이다 [])
마티아스 R. Jessen를

@ MathiasR.Jessen 여기에 뭔가 빠지지 않는 한, .Replace('[]{}()<>;,',' ')개별 문자를 잡지 않고 대신 존재하지 않는 기호 전체를 일치 시키려고 시도합니다. .NET 호출 을 포함하고 대신 코드를 길게하는 Regex.Replace 를 사용해야 [regex]::합니다.
AdmBorkBork

@TessellatingHeckler 감사합니다! -ne''대신에 다른 바이트를 사용 했습니다 |?{$_}.
AdmBorkBork

4

파이썬 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

자바 스크립트 (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] -> ">"
)

목록이 아닌 문자열로 사용해야한다고 생각합니다.
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

수학, 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

배쉬 + 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.