각 문자가 처음 나타날 때 스플릿 문자열


45

관련.

인쇄 가능한 ASCII 문자열이 주어지면, 이전에 같은 경우에 보지 못한 문자가 발생할 때마다 새로운 하위 문자열이 시작되는 비어 있지 않은 문자열 목록으로 분할하십시오.

"mississippi" → ["m","i","ssissi","ppi"]

"P P & C G" → ["P"," P ","& ","C ","G"]

"AAA" → ["AAA"]

"Adam" → ["A","d","a","m"]

"" → []


일화 : 결과는 0에서 95 사이의 요소를 갖습니다. 그 시점에서 인쇄 가능한 모든 ASCII 문자가 하위 문자열을 시작했기 때문에 95 번째 하위 문자열은 반드시 끝까지 계속됩니다. 따라서 모든 추가 문자가 이전에 발생하여 새로운 하위 문자열을 시작할 수 없습니다.


1
예 포함 "하고 '좋은 아이디어처럼 보인다.
Emigna

겠습니까 ""[""]수용 할 수?
Arnauld

5
@Emigna 더 이상의 명확성을 제공하지 않으면 서 예제 출력 형식을 엉망으로 만듭니다.
Adám

1
줄 바꿈으로 구분 된 문자열로 출력하는 경우 선행 / 후행 줄 바꿈이있을 수 있습니까?
wastl

2
@wastl 어, 이전의 판결 [""]이 유효하지 않다고 하더라도 빈 세그먼트를 나타낼 수 없기 때문에이 경우 허용합니다 . 한숨.
Adám

답변:


22

젤리 , 4 바이트

QƤĠị

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

설명

QƤĠị  Input is a string, say s = "adam"
 Ƥ    For each prefix of s: ["a","ad","ada","adam"]
Q     remove duplicates: ["a","ad","ad","adm"]
  Ġ   Group indices by equal values: [[1],[2,3],[4]]
   ị  Index into s: ["a","da","m"]

TIO 링크가 표시하는 문자열의 내부 표현은 약간 다릅니다.



6

05AB1E , 11 바이트

ÙSk¥sg¸«£õK

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

설명

Ù             # remove duplicates in input
 S            # split to a list of characters
  k           # get the (first) index of each character in the input
   ¥          # calculate delta's
    sg¸«      # append the length of the input
        £     # split the list into pieces of these sizes
         õK   # remove empty string (for the special case "" -> [])

1
이 답변 을 접하는 사람은 새 버전의 05AB1E에 ¸«있을 수 있습니다 ª.
Kevin Cruijssen

6

C,  75   65  63 바이트

10 바이트를 절약 한 @Digital Trauma와 각 바이트를 절약 한 @gastropner와 @ l4m2에 감사합니다!

f(char*s){for(int l[128]={};*s;putchar(*s++))l[*s]++||puts(l);}

선행 줄 바꿈을 인쇄합니다.

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

줄 바꿈이 없으면 (71 바이트) :

f(char*s){int l[128]={};for(l[*s]=1;*s;putchar(*s++))l[*s]++||puts(l);}

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



@gastropner 영리한 속임수; 감사!
Steadybox

{0}=> {}?
l4m2

@ l4m2 예, 감사합니다!
Steadybox

5

펄 6 ,  58 52  40 바이트

{$/={};.comb.classify({$+=!$/{$_}++}).sort».value».join}

시도 해봐

*.comb.classify({$+=!(%){$_}++}).sort».value».join

시도 해봐

*.classify({$+=!(%){$_}++}).sort».value

시도하십시오
(입력은 문자 목록이고 출력은 문자 목록입니다)

넓히는:

*                   # parameter for WhateverCode lambda

  .classify(        # classify that list
    {
        $           # anonymous scalar state variable (accumulator)

      +=            # increment it if:

        !           # Bool invert the following
          (
            %       # anonymous hash state variable
          ){ $_ }++ # look to see if the character was seen already
    }
  ).sort\           # sort the Pairs by key (makes the order correct)
  ».value           # get the value from each Pair

의 출력 classify

{ # Hash
  1 => ['m'],
  2 => ['i'],
  3 => ['s','s','i','s','s','i'],
  4 => ['p','p','i'],
}

그리고 .sort그냥 다음으로 바꿉니다.

[
  1 => ['m'],
  2 => ['i'],
  3 => ['s','s','i','s','s','i'],
  4 => ['p','p','i'],
]

».value 키를 제거합니다

[
  ['m'],
  ['i'],
  ['s','s','i','s','s','i'],
  ['p','p','i'],
]

왜 열쇠가 고장 났을까요? 삽입 순서 는 순서가 메모리 대 삽입 순서를 기반으로하는 Java 의 HashMapvs. a 처럼 추적되지 LinkedHashMap않습니까?
Magic Octopus Urn

1
@MagicOctopusUrn Perl의 어떤 버전도 해시를 주문하지 않았습니다. 실제로 Perl 5 버전 18은 해시를 더욱 무작위 화하여 특정 유형의 서비스 거부 공격을 덜 가능하게하고 버그가있는 사용자 코드로 인해 버그가있는 동작을 더 자주 노출시킵니다. 이제 누군가는 추적 할 수있는 클래스를 구현할 수 있었을 것입니다. 그러나로드하여 사용하려면 5 자 이상이 필요합니다.
브래드 길버트 b2gills

5

J , 7 바이트

~:<;.1]

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

설명

Nub sieve의 기회가 빛납니다!

~: <;.1 ]
        ]  Input
~:         Nub sieve (1 if the character is the first instance in string)
    ;.1    Split input on 1s in nub sieve
   <       And box each

2
나는 똑같은 (놀랍지 않게) 대답을 게시하려고했는데, 그 전에 제출 한 내용
Galen Ivanov

2
@GalenIvanov I-그리고 대부분의 다른 J 골퍼들도 nub sieve 또는 self-classify를 사용할 기회를 좋아합니다.
cole

5

하지만 .. 오 마이.
Adám

새로운 프리미티브 (⊆)로 인해이 챌린지를 게시했을 수도 있습니다. 분명히 :)
ngn

커비가 젖병을 들고있는 것처럼 보입니다.
매직 문어 Urn

내가 한 것처럼 "Kirby"를 찾아야하는 모든 사람들을 위해 – 그것은 일본 비디오 게임의 의인화 된 분홍색 공입니다
ngn

5

05AB1E , 8 바이트

Ùvyy¶ì.;

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


항상 하나의 선행 줄 바꿈을 출력합니다.이 줄 바꿈은 상수이며 분할을 나타내지 않습니다. 앞 줄 바꿈을 출력하지 않는 10 바이트 대안 은 여기서 시도Ùvyy¶ì.;}¦수 있습니다 . Adam에 따르면 선행 또는 후행 줄 바꿈이 허용됩니다.


Input      = mississippi                               | Stack
-----------#-------------------------------------------+----------------------------------
Ù          # Push unique letters of first input.       | ['misp']
 v         # Iterate through each unique letter.       | []
  yy       # Push 2 copies of the letter (or yD)       | ['m','m']
    ¶      # Push a newline char.                      | ['m','m','\n']
     ì     # Prepended to the letter.                  | ['m','\nm']
      .;   # Replace first instance with '\n + letter' | ['\nmississippi']

각 반복 후에 우리는 다음을 얻습니다.

['\nmississippi'] > ['\nm\nississippi'] > ['\nm\ni\nssissippi'] > ['\nm\ni\nssissi\nppi']

어느 것이 :

m
i
ssissi
ppi

좋은! 공정한 마진으로 저를 이길;)
Emigna

@ Emigna 이것은 2 일 동안 귀하의 답변에 대한 의견으로 앉아있었습니다. 그냥 b / c 응답 없음 haha ​​: P.
Magic Octopus Urn

이상하게도 이에 대한 알림을 보지 못했습니다. 비록 자신의 답변을 위해 충분히 다릅니다 :)
Emigna

@Emigna 음, 하하를 삭제했습니다.
Magic Octopus Urn

루프를 건너 뛰면 바이트가 절약 ÙSD¶ì.;됩니다. 왜 우리가 이전에 그것을 생각하지 않았는지 확실하지 않습니다 : P
Emigna

5

하스켈 , 39 바이트

foldl(\s c->s++['\n'|all(/=c)s]++[c])""

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

처음 나타나는 모든 문자 앞에 줄 바꿈 기호를 삽입하여 줄 바꿈으로 구분 된 문자열과 줄 바꿈 문자를 만듭니다. lines.목록을 생성하기 위해 추가 하십시오.


하스켈 , 55 바이트

(""%)
_%[]=[]
p%s|(a,b)<-span(`elem`s!!0:p)s=a:(a++p)%b

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

접두사에 첫 번째 문자와 그 뒤에 오는 고유하지 않은 문자를 반복적으로 사용합니다.


@WheatWizard 죄송합니다 lines.
xnor

tail.lines내가 생각하기에 여분의 빈 문자열을 제거 하고 싶을 수도 있습니다.
밀 마법사

4

APL (Dyalog) , 9 바이트

감사합니다. 1 바이트를 절약 한 Outgolfer Erik!

⊢⊂⍨⍳∘≢∊⍳⍨

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

설명:

⍳⍨: 각 문자마다 첫 번째 색인을 가져옵니다. 예 :mississippi -> 1 2 3 3 2 3 3 2 9 9 2

⍳∘≢: 1에서 입력 길이까지의 범위입니다.

: 회원. 예 :1 2 3 4 5 6 7 8 9 10 11∊1 2 3 3 2 3 3 2 9 9 2 -> 1 1 1 0 0 0 0 0 1 0 0

⊢⊂⍨: 1위의 벡터 에서 s로 시작하는 새 파티션으로 입력 문자열을 파티션하십시오.


9 바이트 (모나 딕 fg과 모나 딕 f∘g이 동일하게 작동)
Outgolfer Erik 18:19

대신에 =?
Adám

글을 쓰는 시점에서 나는 인덱스가 정확한 위치에 있다고 생각하지 않았습니다. 그들이 확실하다는 것은
H.PWiz

4

apt , 11 바이트

‰ r@=iRUbY

온라인으로 테스트하십시오!

설명

이는 Magic Octopus Urn05AB1E 솔루션 에서 영감을 얻은 입니다.

‰ r@=iRUbY    Implicit: U = input string
‰             Split U into chars, and keep only the first occurrence of each.
   r@          Reduce; for each char Y in this string...
        UbY      Find the first index of Y in U.
      iR         Insert a newline at this index in U.
     =           Set U to the result.
               As reduce returns the result of the last function call, this gives the
               value of U after the final replacement, which is implicitly printed.

1
Japt는 여기서 정체성의 위기를 겪고 있습니다. 어떤 이유로 루비라고 부릅니다. iRUbY!
Magic Octopus Urn

3

자바 스크립트 (ES6), 37 바이트

7 바이트 절약 : 새로운 줄 바꿈이 명시 적으로 허용되었습니다 (감사합니다 @Shaggy!).

문자 배열로 입력을받습니다. 줄 바꿈으로 구분 된 문자열을 출력합니다.

s=>s.map(c=>s[c]=s[c]?c:`
`+c).join``

테스트 사례



3

brainfuck, 66 바이트

,[>+[<[>+<<-<+>>-]>[>]<<[[+]++++++++++.>>>]<]<[>+<-]>>>[>>]<<-.>,]

형식화 :

,
[
  >+
  [
    <[>+< <-<+>>-]
    >[>]
    <<[[+]++++++++++.>>>]
    <
  ]
  <[>+<-]
  >>>[>>]
  <<-.>,
]

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

출력의 선행 개행 문자 (입력이 비어 있지 않은 경우에만 인쇄 됨)는 x주 (가장 바깥 쪽) 루프 의 본문 을 로 대체하여 5 바이트의 비용으로 제거 할 수 있습니다 .>,[x].



2

K4 , 19 바이트

해결책:

$[#x;(*:'.=x)_;,]x:

예 :

q)k)$[#x;(*:'.=x)_;,]x:"mississippi"
,"m"
,"i"
"ssissi"
"ppi"
q)k)$[#x;(*:'.=x)_;,]x:"P P & C G"
,"P"
" P "
"& "
"C "
,"G"
q)k)$[#x;(*:'.=x)_;,]x:"AAA"
"AAA"
q)k)$[#x;(*:'.=x)_;,]x:"Adam"
,"A"
,"d"
,"a"
,"m"
q)k)$[#x;(*:'.=x)_;,]x:""
,[""]

설명:

8 바이트는 처리하는 것입니다 ""...

$[#x;(*:'.=x)_;,]x: / the solution
                 x: / save input as variable x
$[  ;         ; ]   / $[condition;true;false]
  #x                / length of x ("" has length 0, i.e. false)
             _      / cut right at left indices
     (      )       / do together
          =x        / group x into key/value (char!indices)
         .          / return value (get indices)
      *:'           / first (*:) each
               ,    / enlist, "" => [""]

2

파이썬 2 , 81 74 바이트

def f(s):d=sorted(map(s.find,set(s)));print map(lambda a,b:s[a:b],d,d[1:])

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



그것이 오해의 소지가 부작용이의 @JonathanAllan, set순서, 반대 증거를 보관하지 않습니다 ->s='c'*6+'a'*100+'b'
로드

나는 우리가 미래의 구현에서 그것에 의존 할 수 없다는 것을 알고 있지만 정수의 해시 때문에 정수의 해시 때문에 세트에서 순서를 유지 한다고 생각 합니다. 내 대안으로 작동하지 않는 단어?).
Jonathan Allan

@JonathanAllan 도 마찬가지입니다
Rod

아, 충분히 공정한 내 믿음은 거짓이었습니다!
Jonathan Allan


2

펄, 30 바이트

포함 +1을 위해p

STDIN에서 줄 바꿈없이 입력하십시오. 출력은 또한 줄 바꿈이 없습니다 :

echo -n adam | perl -pE 's%.%$v{$&}+++!pos?$&:$/.$&%eg'; echo

당신은 선도와 줄 바꿈이 후행 걱정하지 않는 경우 25( +3대한 -p코드가 포함되어 있기 때문에 '또한 작동) :

#!/usr/bin/perl -p
s%%$/x!$v{$'&~v0}++%eg

언제나처럼 훌륭한 솔루션! 제공된 테스트 사례에 따라 해시 이름을 지정할 필요가 없습니다 ${$&}++. 강력하지는 않지만이 도전에 충분할까요? 또한 perl -p추가 바이트가 필요없는 메타에 대한 합의가 있었 으므로 Perl with `-p` Perl 대신 헤더를 가져야합니다 . 나는 그것을 스스로 기억하려고 노력하고 있습니다 ...
Dom Hastings

@DomHastings 최대 95 개의 가능한 문자열에 대한 별첨은 이것이 1유효하다는 것을 암시 v합니다. 계산과 관련하여 필자는 대부분 codegolf.meta.stackexchange.com/a/7539/51507따르며 이는 perl 계산에 대한 가장 일관된 메타 포스트입니다.
Ton Hospel

항상 마스터에게서 배우는 것이 좋습니다. 즉,이 경우, &~v0첫 번째 문자를 잡는. 이 사이트에 가입하고 오랜 전문 지식을 공유해 주셔서 감사합니다.
msh210

와 함께 "대신 사용하는 Strawberry Perl 을 사용할 수 있으며 +3 대신 +1로 계산할 수 있습니다 . (Tested.)'-e-ep
msh210

2

자바 스크립트, 61 54 52 바이트

문자 배열로 입력을받습니다.

s=>s.map(x=>a[x]?a[y]+=x:a[x]=a[++y]=x,a=[],y=-1)&&a

시도 해봐

o.innerText=JSON.stringify((f=
s=>s.map(x=>a[x]?a[y]+=x:a[x]=a[++y]=x,a=[],y=-1)&&a
)([...i.value=""]));oninput=_=>o.innerText=JSON.stringify(f([...i.value]))
<input id=i><pre id=o></pre>


2

R , 94 87 바이트

function(s,n=nchar(s),g=substring)g(s,d<-which(!duplicated(g(s,1:n,1:n))),c(d[-1]-1,n))

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

부분 문자열의 빈 목록을 반환합니다.

7 바이트를 절약 한 Michael M에게 감사합니다!


3
function(s,n=nchar(s),g=substring)g(s,d<-which(!duplicated(g(s,1:n,1:n))),c(d[-1]-1,n))더 짧을 것입니다-물론 조금 더 추한 것입니다 ...
Michael M

substring대신에 substr?
plannapus

@MichaelM 아주 좋아요! 빈 문자열 입력에 오류가 발생하기 if(n)때문에 여전히 거기 에 추가해야합니다 substring.
주세페

1
@plannapus substr는 첫 번째 입력과 동일한 길이의 벡터를 substring반환하고 입력의 가장 긴 길이와 동일한 길이의 벡터를 반환합니다.
주세페

@Giuseppe : R 3.4.3에서 "if (n)"을 삭제하면 빈 입력 문자열 ""이 빈 출력 문자열 ""에 매핑됩니다.이 값은 괜찮습니다 (?)
Michael M

2

Stax , 8 바이트

ç↓‼►▐NVh

온라인 실행 및 디버그

동일한 프로그램의 ASCII 표현은 이렇습니다.

c{[Ii=}(m

각 문자에 대해 현재 문자의 색인이 현재 위치 일 때 분할됩니다.

c            copy the input
 {    }(     split the string when the result of the enclosed block is truthy
  [          duplicate the input string under the top of the stack
   I         get the character index of the current character
    i=       is it equal to the iteration index?
        m    print each substring

2

> <> , 22 17 14 바이트

Emigna 덕분에 -1 바이트

i:::a$1g?!o1po

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

선행 및 후행 줄 바꿈을 인쇄합니다.

p두 번째 행의 해당 지점에서 문자 사본을 잘라 내고 해당 위치에서 가져온 값이 1이 아닌 경우 개행을 인쇄하여 이미 표시된 문자를 추적 합니다. 인쇄하려고 할 때 오류가 발생합니다.-1


의 큰 사용 g/p! 16 바이트
Emigna


1

자바 스크립트 (ES6), 68 바이트

s=>s.map(c=>o[c]?t+=c:(t&&m.push(t),t=o[c]=c),t='',o=m=[])&&[...m,t]

문자 목록으로 입력을받습니다.

테스트 사례 :


비슷한 솔루션이 있었고 [""]마지막 테스트 사례에 적합한 지 물었습니다 . 그러나 그렇지 않습니다 . :-(
Arnauld

오, 글쎄, 당신은 어쨌든 훨씬 더 나은 해결책을 얻었
Rick Hitchcock

1

PHP, 317 바이트

function SplitOnFirstUnique($s){
    $len = strlen($s); 
    $output = [];
    $newstring = '';
    for ($i=0; $i < $len ; $i++) { 
        $newstring = $newstring.$s[$i];
        if(!in_array($s[$i] , $output  )){
            $output[] = $newstring;
            $newstring = '';
        }
    }
    return $output;
}

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


2
안녕하세요, PPCG에 오신 것을 환영합니다! 귀하의 게시물을 표준 형식으로 편집하고 다른 사람들이 귀하의 코드를 테스트 할 수 있도록 온라인으로 연결 링크를 추가했습니다. Code Golf의 목표는 가능한 가장 짧은 코드를 작성하는 것입니다. 짧은 변수 이름을 사용하고 공백을 생략하는 등 몇 가지 방법으로 더 짧게 만들 수 있습니다. 더 많은 아이디어를 얻으 려면 일반 팁PHP 팁 페이지를 확인하십시오 .
나무가 아님

1

빨강 , 79 바이트

func[s][foreach c next unique/case append s"^@"[print copy/part s s: find s c]]

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

언 골프 드 :

f: func [s] [
    b: next unique/case append s "^@"  ; append `null` to the end of the string, than
                                       ; find the unique characters and 
                                       ; store all except the first to b  
    foreach c b [                      ; for each character in b
        print copy/part s s: find s c  ; print the part of the string to
                                       ; where the character is found and
                                       ; set the beginning of the string to that position
    ]
] 

1

SNOBOL4 (CSNOBOL4) , 115 91 77 바이트

	N =INPUT
S	N LEN(1) . Y	:F(END)
	S =S Y
	N SPAN(S) . OUTPUT REM . N	:(S)
END

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

개행으로 구분 된 하위 문자열을 인쇄합니다.

설명:

S(for SPLIT)는 실제로 분할되지 않지만 대신 첫 번째 문자를 추출하여 N( .)에 저장합니다 Y. 에 Failure, 그것은에 점프 END. N빈 문자열 인 경우에만 일치가 실패 합니다. 따라서 입력이 비어 있으면 직접 점프하여 END아무것도 출력하지 않습니다.

S = S Y에 연결 Y합니다 S.

SPAN(S)greedily은 (는 ) 에있는 일련의 문자를 일치시키고 ( ) 를 (의 경우 ) 의 aining 문자로 설정 하여 S보냅니다 . 그런 다음로 돌아갑니다 ..OUTPUT.NREMNS


1

PowerShell, 73 바이트

{$r=@();$h=@{};[char[]]$ARGS[0]|%{if(!($h[$_]++)){$r+=""};$r[-1]+=$_};$r}

용법

PS> & {$r=@();$h=@{};[char[]]$ARGS[0]|%{if(!($h[$_]++)){$r+=""};$r[-1]+=$_};$r} "mississipi" | ConvertTo-Json -Compress
["m","i","ssissi","pi"]

바이트를 절약 할 수 있습니다- 온라인으로 사용해보십시오!
Mazzy

1

루비 , 65 62 58 바이트

->s,*a{s.size.times{|i|(i==s.index(c=s[i])?a:a[-1])<<c}
a}

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

문자열을 받아들이고 문자열 배열을 반환하는 람다.

접근 방식 : 각 인덱스에 대해 해당 인덱스의 문자를 s결과 배열 또는 결과 배열의 마지막 문자열에 추가하십시오. String#index인수의 첫 번째 인스턴스의 색인을 리턴합니다.

-2 바이트 : a자체 행이 아닌 스 플랫 인수로 초기화하십시오 . 감사합니다, 가치 잉크 !

-1 바이트 : 사용 c=s[i]... c대신 s[i]... s[i]. 감사합니다, 가치 잉크 !

-4 바이트 : .times대신 사용.map



1

자바 (8) 193 169 155 151 바이트

s->{for(int l=s.length(),i=0,j;i<l;i++)if(s.indexOf(s.charAt(i))==i){for(j=i;++j<l&&s.indexOf(s.charAt(j))!=j;);System.out.println(s.substring(i,j));}}

@raznagul 덕분에 -14 바이트 (어쨌든 내가 잃어버린 것 때문에 ..) @OOBalance
덕분에 -3 바이트 (어쨌든 내가 잃어버린 것 .. : S)

설명:

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

s->{                    // Method with String parameter and no return-type
  for(int l=s.length(), //  The length of the input-String
          i=0,j;        //  Index integers
      i<l;i++)          //  Loop `i` from 0 to `l` (exclusive)
    if(s.indexOf(s.charAt(i))==i){
                        //   If the character at index `i` hasn't occurred yet:
      for(j=i;++j<l     //    Inner loop `j` from `i` to `l` (exclusive),
          &&s.indexOf(s.charAt(j))!=j;);
                        //     as long as the character at index `j` has already occurred
      System.out.println(//    Print:
        s.substring(i,j));}}
                        //     The substring of the input from index `i` to `j` (exclusive)

1
나는 당신이 필요하다고 생각하지 않습니다 if(l<1). 경우 l입니다 0루프가 실행되지합니다 어쨌든 등 0<0이다 false.
raznagul

@raznagul 내가 어떻게 그것을 놓쳤는 지 확실하지 않지만, 당신은 올바르게 완성되었습니다! ..>.>
Kevin Cruijssen

i=0두 번 설정하고 있습니다. 두 번째 바이트를 삭제하여 3 바이트를 절약 할 수 있습니다.for(;i<l;i++)
OOBalance

@OOBalance 어떻게 된 일인지 잘 모르겠습니다. : S 그러나 알아 채셔서 감사합니다! :)
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.