나눠. 그러나 전부는 아닙니다!


11

이 StackOverflow 질문에서 영감을 얻었습니다 .

입력:

우리는 세 가지 입력을받습니다 :

  • 분리 D할 분리 문자
  • I둘 사이 의 문자 는 구분 문자를 무시합니다 (모호하게 들리지만 아래에서 설명하겠습니다)
  • S

산출:

분할 후 하위 문자열을 포함하는 목록 / 배열입니다.

예:

Input:
D = ','
I = '"'
S = '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"'

Output:
['11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,']

왜? 쉼표에 분할은 일반적으로도 나눌 것 98,00, 12,000,000그리고 ,-,두 / 세 가지입니다. 그러나 그것들은 I입력 문자 내에 있기 때문에 여기서 나누는 것을 무시합니다.

도전 규칙 :

  • I입력 문자열에 항상 짝수의 문자 가 있다고 가정 할 수 있습니다 .
  • 문자 I가 항상 D옆에 있어야 한다고 가정 할 수 있으며 (입력의 첫 번째 문자 또는 마지막 문자 인 경우 제외) 여전히 올바르게 분할 될 수 있습니다. 그래서 당신은 같은 필요가 없습니다 D = ','; I = '"'; S = 'a,b"c,d"e,f'이런, 나 아무것도 D=','; I='"'; S='a",b,"c'.
  • 입력 문자열은 S하나의 것도 포함하지 수 D또는 I. no가 포함되어 있으면 D전체 입력 문자열을 항목으로 만 사용하여 목록을 출력합니다.
  • 출력 목록은 문자를 포함하지 않습니다 I이 더 포함 된 경우에도 더 이상 D(당신은에서 볼 수 있듯이 "Abc "되는 'Abc '위의 예제에서).
  • 안에있는 부분 문자열 I만 포함 할 수 D있습니다. 예를 들어 D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'초래 ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • D의 시작이나 끝에 있지 않을 것이라고 가정 할 수 S있으므로 빈 항목을 추적 / 선행 처리 할 필요가 없습니다.
  • 입력에 두 개의 인접 D항목이 있으면 빈 항목이 있습니다. 즉 D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'초래 ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • 입력 및 출력에 범위의 인쇄 가능한 ASCII 만 포함되어 있다고 가정 할 수 있습니다 [32, 126](따라서 탭과 줄 바꿈 제외).
  • 또한 목록 / 배열을 반환 / 출력하는 대신 (특히 목록 / 배열이없는 언어 (예 : Retina)) 모든 항목을 개행으로 구분하여 출력 할 수 있습니다.
  • 바이트를 저장하면 목록을 역순으로 출력 할 수 있습니다. 그러나 정렬 또는 '셔플'순서로 출력 할 수 없습니다. 그래서 D = ','; I = 'n'; S = 'a,2,b,3,c'으로 출력을 할 수있다 [a,2,b,3,c]거나 [c,3,b,2,a],하지만하지 [2,3,a,b,c,][a,3,b,c,2]예를 들어.

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 (예 : TIO ) 링크를 추가하십시오 .
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

Input:
D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
Output:
['a', 'b,c', 'd', '', 'e', '', 'f']

Input:
D = ','; I = '"'; S = '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"'
Output:
['11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,']

Input:
D = ' '; I = ','; S = 'this is a test , to see if you understand it, or not , hmmm, I think I have too many commas , or not , perhaps..'
Output:
['this', 'is', 'a', 'test', ' to see if you understand it', 'or', 'not', ' hmmm', 'I', 'think', 'I', 'have', 'too', 'many', 'commas', ' or not ', 'perhaps..']

Input:
D = 'x'; I = 'y'; S = 'contains no lowercase X nor Y'
Output:
['contains no lowercase X nor Y']

Input:
D = '1'; I = '3'; S = '3589841973169139975105820974944592078316406286208948254211370679314'
Output: ['58984197', '69', '9975105820974944592078', '64062862089482542', '', '70679', '4']

Input:
D = ' '; I = 'S'; S = 'regular split on spaces'
Output:
['regular', 'split', 'on', 'spaces']

현재 답변의 대부분 (또는 모두?)은 테스트 사례 6의 시작과 끝에 빈 항목이 없습니다. 이것은 특별한 경우입니까, 아니면 테스트 사례의 오류입니까? ( "", "'ll remove all ", "")
TFeld

@TFeld 특별한 경우입니다. D = ','; I = '"'; S = ',"a,b",c,,d,""'방금 알았 기 때문에 거의 모든 대답도 실패합니다 . 도전 과제를 약간 수정하여 시작이나 끝에서 빈 항목을 사용할 수 없습니다. 과거 Java와 05AB1E의 경험을 바탕으로 언어가 기본적으로 올바르게 수행되지 않을 때 분할 후 빈 항목을 수동으로 수정하는 방법을 알고 있습니다. 이와 같은 테스트 사례는 여전히 지원되어야합니다. D = ','; I = '"'; S = 'a,"b,c",d,,e['a', 'b,c', 'd', '', 'e']사이에 빈 항목이 있습니다.
Kevin Cruijssen

최종 출력이 입력 순서를 유지해야합니까? 예'1,"2,3"' -> ['2,3','1']
Kamil Drakari

1
@KamilDrakari 흠, 나는 그것을 앞뒤로 허용하지만 섞지 않는 규칙을 추가 할 것입니다. 그래서 [a,b,c][c,b,a]출력을 허용하지만, [a,c,b]또는 [b,a,c]하지 예를 들어.
Kevin Cruijssen

D=','; I='"'; S='a",b,"c'올바른 입력 결과는 무엇입니까 ?
Zgarb

답변:


3

Japt , 16 바이트

qV mÏu ?X:XrWRÃq

시도 해봐!

기본적으로 DLosc의 최신 Pip 답변과 동일한 전략으로 "quoted"섹션을 따로 설정하고 나머지 문자열에서 구분 기호를 줄 바꿈으로 바꾸어 줄 바꿈 구분 출력을 생성합니다.

전체 설명 :

qV                  Split on I
   m          Ã     For each segment:
    Ïu ?              If the segment has an odd index (quoted)...
        X             Keep it as-is
         :          Otherwise:
          XrWR        Replace each D in the segment with a newline
               q    Join it all to a single string

첫 번째 항목을 인용하더라도 색인 0이 아닌 색인 1로 끝납니다 q. 첫 문자로 분리 문자를 찾으면 분할 (인덱스 0)의 첫 번째 항목을 빈 문자열로 만듭니다. 따옴표의 두 번째 항목이 올바르게됩니다 (색인 1). 다음 은 주요 견적을 올바르게 처리하는 데모입니다.


따옴표 외부 에서 D를 줄 바꿈으로 바꾸고 줄 바꿈으로 나누면 바이트가 절약 되어 결국 줄 바꿈을 D로 바꿀 필요가 없습니다. 코드가 짧아 질 수 있습니까?
DLosc

@DLosc 실제로, 제안에 감사드립니다! 이제 새로운 버전에서 퍼팅
카밀 Drakari

8

R , 34 바이트

수정되지 않은 일반 scan에 대한 적절한 인수 text, sep그리고 quote그것을해야한다.

function(D,I,S)scan(,t=S,"",,,D,I)

온라인으로 사용해보십시오!


2
평소처럼 R은 스트링 분할 문제를 해결해줍니다.
ngm

2
업무에 적합한 언어에 대해 이야기하십시오. :) 몇 가지 테스트 사례를 확인했으며 모두 제대로 작동하는 것 같습니다. 추신 : 메타에 따라 변수에 저장하여 입력하는 것은 허용되지 않습니다.
Kevin Cruijssen

1
@KevinCruijssen scan4 바이트를 제출 한 다음 적절한 위치에 인수를 사용하여 호출 할 수 있습니까?
J.Doe

1
@ J.Doe Umm .. 난 몰라 R tbh에 사용할 수있는 입력 형식에 익숙하지 않습니다. 프로그램 인수 또는 STDIN과 함께 전체 프로그램을 사용하는 것과 적절한 매개 변수가있는 (람다) 함수 또는 STDIN을 사용하는 것이 기본적으로 허용됩니다. 메타 포스트에서 나는 이전에 링크 된 모든 유효한 입력 형식 (긍정적 인 점수)이 언급되어 있습니다. 이것이 R에 어떻게 작용 하는지 모르겠다.
Kevin Cruijssen

@J. 지금 제출은 전체 프로그램이며 현재 stdin에서 입력을받지 않습니다. 가장 짧은 해결책은 함수로 감싸는 것입니다.
Giuseppe

7

C (gcc) , 64 바이트

c;f(d,i,s)char*s;{for(;*s;s++)*s==i?c=!c:putchar(d-*s|c?*s:10);}

온라인으로 사용해보십시오!

자바 스크립트 (Node.js) , 57 바이트

(d,i,s)=>s.replace(c=/./g,e=>i==e?(c^=1,''):d!=e|c?e:`
`)

온라인으로 사용해보십시오!


1
C 답변은 훌륭하게 작동하지만 JS 답변은 여전히 출력 D내에 I포함되어있을뿐만 아니라 ITIO 링크의 첫 번째 테스트 사례에서도 볼 수 있습니다. (PS : C 답변의 포트임을 나타내는 링크와 함께 별도의 답변으로 게시하는 것이 더 나을 수도 있습니다.)
Kevin Cruijssen

1
@KevinCruijssen 수정되었습니다. 보통 나는 비슷한 답변을 함께 게시하고 다른 사람들의 작업에 의한 경우에만 포트라고 말합니다
l4m2


4

, 18 바이트

FxcxQb?!:oOo?xRanx

입력을 명령 행 인수로 사용합니다. 온라인으로 사용해보십시오!

완전히 다른 접근법 : 문자열을 한 번에 한 문자 씩 처리하고 원하는 결과를 줄 바꿈으로 출력합니다.

어떻게?

                    a,b,c are cmdline args (respectively representing D,I,S); o is 1;
                    n is newline (implicit)
                    We use o for a flag indicating whether or not to change D into newline
Fxc                 For each character x in c:
   xQb?              If x equals b (the ignore character),
       !:o            Logically negate o in-place
          O          Else, output the following (with no trailing newline):
           o?         If o is truthy,
             xRan      x, with a (the delimiter) replaced with newline
                 x    Else, x unchanged

4

MATL , 24 바이트

y=Yso~yi=*~*cO10Zt2G[]Zt

입력은 S, I, D.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

입력을 고려하십시오 D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'.

y     % Implicit inputs: S, I. Duplicate from below
      % STACK: 'a,"b,c",d,,e,"",f', '"', 'a,"b,c",d,,e,"",f'
=     % Is equal? Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0]
Ys    % Cumulative sum
      % STACK: 'a,"b,c",d,,e,"",f', [0 0 1 1 1 1 2 2 2 2 2 2 2 3 4 4 4]
o~    % Parity, negate
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1]
y     % Duplicate from below
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1], 'a,"b,c",d,,e,"",f'
i=    % Input: D. Is equal? Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1], [0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0]
*~    % Multiply, negate (equivalent to NAND). Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1]
*     % Multiply, element-wise. Characters are converted to ASCII code
      % STACK: [97 0 34 98 44 99 34 0 100 0 0 101 0 34 34 0 102]
c     % Convert to char (character 0 is shown here as '·')
      % STACK: 'a·"b,c"·d··e·""·f'
O10   % Push 0 and then 10
      % STACK: 'a·"b,c"·d··e·""·f', 0, 10
Zt    % Replace character 0 by character 10 (newline; shown here as '¶')
      % STACK: 'a¶"b,c"¶d¶¶e¶""¶f'
2G[]  % Push second input (I) and then [] (empty array)
      % STACK: 'a¶"b,c"¶d¶¶e¶""¶f', '"', []
Zt    % Replace character given by input I by empty; that is, remove it. Implicit display
      % STACK: 'a¶b,c¶d¶¶e¶¶f'

3

망막 , 45 바이트

L$`(?=.*¶(.)¶(.))(\2(.*?)\2|(.*?))(\1|¶)
$4$5

온라인으로 사용해보십시오! 설명:

(?=.*¶(.)¶(.))(\2(.*?)\2|(.*?))(\1|¶)

의 값을 찾아 봐 앞서 DI다음 두 줄에 있습니다. 우리가 발견하는 경우 다음에, I다음을 먹고 옆에있는 문자와 일치 ID달리 바로 옆에 문자와 일치, D또는 줄의 끝을.

L$`
$4$5

목록은 각 경기에서 4와 5를 캡처합니다. 4는 2 I초 사이의 캡처 이고 5는 2 D초 사이의 캡처 입니다.


3

파워 쉘, 71 바이트

param($d,$i,$s)$s-split{(1-($script:a+=$i-ceq$_)%2)*($d-ceq$_)}|% *m $i

덜 골프 테스트 스크립트 :

$f = {

param($d,$i,$s)
$s-split{
    $script:a+=$i-ceq$_
    (1-$a%2)-and($d-ceq$_)
}|% Trim $i

}

@(
    ,(',','"',
    '',
    '')

    ,(',','"',
    'a,"b,c",d,,e,"",f',
    'a', 'b,c', 'd', '', 'e', '', 'f')

    ,(',','"',
    '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"',
    '11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,')

    ,(' ',',',
    'this is a test , to see if you understand it, or not , hmmm, I think I have too many commas , or not , perhaps..',
    'this', 'is', 'a', 'test', ' to see if you understand it', 'or', 'not', ' hmmm', 'I', 'think', 'I', 'have', 'too', 'many', 'commas', ' or not ', 'perhaps..')

    ,('x','y',
    'contains no lowercase X nor Y',
    'contains no lowercase X nor Y')

    ,('1','3',
    '3589841973169139975105820974944592078316406286208948254211370679314',
    '58984197', '69', '9975105820974944592078', '64062862089482542', '', '70679', '4')

    ,(' ','S',
    'regular split on spaces',
    'regular', 'split', 'on', 'spaces')

) | % {
    $d,$i,$s,$expected = $_
    $result = &$f $d $i $s
    "$("$result"-eq"$expected"): $result"
}

산출:

True:
True: a b,c d  e  f
True: 11020199 Abc  aduz  444 bieb dc 2  2222.00 whatever 5dc 222.22 22.00 98,00 12,000,000 21-09-2018  06:00 ,-,
True: this is a test  to see if you understand it or not  hmmm I think I have too many commas  or not  perhaps..
True: contains no lowercase X nor Y
True: 58984197 69 9975105820974944592078 64062862089482542  70679 4
True: regular split on spaces

설명:


2

SNOBOL4 (CSNOBOL4) , 109 바이트

	D =INPUT
	I =INPUT
	S =INPUT
S	S (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0)) REM . S	DIFFER(S)	:S(S)
END

온라인으로 사용해보십시오!

그 가정 D =','I ='"'. 그런 다음 패턴 (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))은 문자열의 모양과 같 ".*"거나 .*뒤에 오는 문자열과 일치 ,하고 임의의 ( .*) 문자를 OUTPUT하여 일치하지 않는 REMainder를 설정하고 비어 있지 않은 한 S반복 S합니다.


2

-n , 29 24 바이트

cR Xa[na]@(bN{$`})^n||:b

입력을 명령 행 인수로 사용합니다. 온라인으로 사용해보십시오!

전략 : 외부 I쌍, D줄 바꿈으로 바꿉니다 (문자열에 줄 바꿈이 표시되지 않기 때문에). 그런 다음 줄 바꿈과 strip을 분리하십시오 I.


2

젤리 ,  20  18 바이트

;`j⁵œṣ⁴œṣḊṖYʋ€Ðo³Y

세 개의 인수를 복용 전체 프로그램은 D, I, S한 줄에 각 항목을 인쇄한다.

온라인으로 사용해보십시오! (바닥 글은 줄 바꿈과 결합합니다)

어떻게?

D양쪽에 여분의 부분을두고 Is로 분할하고 s에서 홀수 색인 항목을 분할 D한 다음 머리와 꼬리를 제거하고 개행과 결합하고 마지막으로 개행으로 결과를 결합하십시오.


1
목록 을 반환하는 것과는 달리 목록 출력은 어떻게 든 구분되어야하므로 1) 목록이라는 것을 알 수 있습니다 .2) 한 항목이 끝나고 다른 항목이 시작되는 위치를 알 수 있습니다. (나는 그것을 뒷받침 할 특정 메타 게시물이 없지만 관찰 할 수없는 행동 에 대한 토론과 관련이 있습니다 . 현재 프로그램이 문자열이 아닌 목록을 출력하는 것은 관찰 할 수 없습니다. )
DLosc

따라서 강화를 줄 바꿈으로 결합으로 바꿀 수 있다고 생각합니다 (문자와 혼합 된 문자 목록을 반환하지만 전체 프로그램으로 새 줄에 항목을 인쇄합니다).
Jonathan Allan


@JonathanAllan 20 바이트 솔루션은 의도 한대로 작동하지만 주석에서 17 바이트는 잘못된 결과를 제공하는 것 같습니다 .
Kevin Cruijssen

1
@ KevinCruijssen-그래, 모바일 골프는 좋지 않다, 나는 홀수 색인 항목에 대한 줄 바꿈에 의한 조인을 놓쳤다.
Jonathan Allan

2

PHP , 50 바이트

function q($D,$I,$S){return str_getcsv($S,$D,$I);}

온라인으로 사용해보십시오! 내장 기능을 사용 합니다 .

입력 재배치가 허용되면 ( (S,D,I)그래서 str_getcsv서명 과 일치 ) 44 바이트 버전이 있습니다.


1
주문을 지정하는 한 재 배열 입력이 허용된다고 생각합니다. 그것은 분명, 당신이 변수를 사용할 수 있도록하기 위해 $S, $D그리고 $I이 50 바이트 길이의 버전, 0 바이트의 비용.
Ismael Miguel

또한, 50과, 버전 바이트 $S, $D, $I변수는 인수의 순서에 대한 지침을 제공 할 수있다.
Ismael Miguel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.