各文字の最初の出現時に文字列を分割


45

関連する。

印刷可能なASCII文字列が与えられた場合、以前は同じケースで見られなかった文字が出現するたびに、新しいサブ文字列で始まる空でない文字列のリストにそれを分割します。

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

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

"AAA" → ["AAA"]

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

"" → []


逸話:結果には0〜95個の要素が含まれます。95 番目のサブ文字列は、その時点ですべての印刷可能なASCII文字がサブ文字列を開始しているため、必ず最後まで継続します。したがって、すべての追加文字が前に発生し、新しいサブ文字列を開始できません。


1
例含む"'良いアイデアのように思えます。
エミグナ

""[""]受け入れられますか?
アーナルド

5
@Emignaこれは、わかりやすくすることなく、出力形式の例を混乱させているだけです。
アダム

1
改行で区切られた文字列として出力する場合、先頭または末尾に改行がありますか?
wastl

2
@wastlええと、空のセグメントを示すことができないため、この場合は許可しますが、以前の[""]無効の判断と衝突しますが。はぁ。
アダム

回答:


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の新しいバージョンで。
ケビンクルーッセン

6

C、 75   65  63バイト

10バイトを節約してくれた@Digital Traumaと、それぞれ1バイトを節約してくれた@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

Perl 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'],
]

キーが故障するのはなぜですか?挿入順序は次のように追跡されていないHashMap対A LinkedHashMap、Javaでの順序は、メモリ対の挿入順序に基づいていますか?
魔法のタコUr

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
私はまったく同じ(驚くことではない)回答を投稿しようとしていましたが、その前にあなたの提出物を見たのは良いことです:)
ガレンイワノフ

2
@GalenIvanov I-そして私は他のほとんどのJゴルファーも想像します-ナブシーブを使用するか、自己分類する機会を楽しんでいます。
コール

5

しかし、しかし...ああ、私の。
アダム

新しいプリミティブ(⊆)が原因で、このチャレンジを投稿したのではないかと思います。明らかにない:)
ngn

哺乳瓶を持った恥ずかしいカービーのように見えます。
魔法のタコ

それは日本のビデオゲームから擬人ピンクのボールだ-私が行ったように、「星のカービィ」をルックアップする必要があるすべての人のために
NGN

5

05AB1E、8バイト

Ùvyy¶ì.;

オンラインでお試しください!


常に1つ前の改行を出力します。これは定数であり、分割を示すものではありません。前の改行を出力しない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これは2日間あなたの答えに対するコメントとして座っていました。
魔法のタコ

奇妙なことに、それに関する通知を見ていません。しかし、それ自身の答えのために十分に異なる:)
エミグナ

@Emignaよく、私はそれを削除しました笑。
魔法のタコ

ループをスキップするとバイトが節約されますÙSD¶ì.;。なぜ私たちがそれを前に考えなかったのかわからない:P
Emigna

5

Haskell、39バイト

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

オンラインでお試しください!

初めて出現するすべての文字の前に改行記号を挿入します。その結果、改行で区切られた文字列になり、先頭に改行が付きます。lines.リストを作成する準備をします。


Haskell、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バイト節約してくれてありがとう!

⊢⊂⍨⍳∘≢∊⍳⍨

オンラインでお試しください!

説明:

⍳⍨:各文字について、その最初の出現のインデックスを取得します。例えば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は同じように動作します)
エリックアウトゴルファー

なぜ代わりに=
アダム

執筆時点では、インデックスが正しい位置にあるとは考えていませんでした。彼らがしていることは明らかですが
H.PWiz

4

Japt、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はここでアイデンティティの危機に直面しており、何らかの理由で自身をRubyと呼んでいます。iRUbY
魔法のタコ

3

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

パイソン281の 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'
ロッド

将来の実装ではこれに依存できないことはわかっていますが、整数のハッシュが整数であるため、セット内で順序を維持する順序付き整数が与えられていると考えています(他のオブジェクトでも同じではないことを示しているため、私の代替ではうまくいかない言葉?)。
ジョナサンアラン

@JonathanAllan も真実ではない
ロッド

ああ、まあ、私の信念は間違っていました!
ジョナサンアラン


2

Perl、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の代わりにヘッダーが必要です。私は自分自身...それを行うことを覚えしようとしている
ドムヘイスティングス

@DomHastings最大で95個の可能性のある文字列についての別表1は、それが有効であることを非常に強く暗示していvます。カウントに関しては、私はほとんどcodegolf.meta.stackexchange.com/a/7539/51507に従いますこれはperlのカウントに関する最も一貫したメタ投稿です。
トンホスペル

マスターから学ぶのはいつもいいことです。具体的には、この場合、&~v0最初の文字を取得します。このサイトに参加し、長い専門知識を共有していただきありがとうございます。
msh210

あなたは使用していますイチゴのPerl、使用することができます"代わりに'とし-e、その後、あなたが数えることができる-ep1ではなく3通り。(テスト済み)
msh210

2

JavaScript、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

R94 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))短いだろう-そしてもちろんビット醜いの...
マイケル・M

なぜsubstring代わりにsubstr
プランナパス

@MichaelMとても素敵!空の文字列入力に対してエラーをスローするif(n)ため、まだそこに追加する必要がありsubstringます。
ジュゼッペ

1
@plannapus substrは、最初の入力に等しい長さのベクトルをsubstring返しますが、入力の最長に等しい長さのベクトルを返します。
ジュゼッペ

@Giuseppe:削除「(n)があれば、」Rにおいて3.4.3は微細であるべきである「「空の出力文字列に」空の入力文字列」マップ(?)
マイケル・M

2

スタックス、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バイト

エミグナのおかげで-1バイト

i:::a$1g?!o1po

オンラインでお試しください!

先頭および末尾の改行を印刷します。

p2番目の行の対応するスポットで文字のコピーを取得し、その位置からフェッチされた値が1でない場合は改行を印刷することにより、どの文字がすでに出現しているかを追跡します。-1


の素晴らしい使用g/p16バイト
Emigna


1

JavaScript(ES6)、68バイト

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

入力を文字のリストとして受け取ります。

テストケース:


同様の解決策があり[""]、最後のテストケースで許容できるかどうかを尋ねました。しかし、そうではありません。:-(
Arnauld

とにかく、あなたはとにかくはるかに良い解決策を手に入れました:)
リックヒッチコック

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へようこそ!投稿を標準形式に編集し、他の人がコードをテストできるように、Try It Onlineへのリンクを追加しました。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

オンラインでお試しください!

改行で区切られた部分文字列を出力します。

説明:

SSPLIT)は実際には分割されませんが、代わりにの最初の文字を抽出し、にN保存します(.Y。でFailure、それはにジャンプしますEND。一致が失敗するのNは、空の文字列の場合のみです。入力が空の場合このように、それはに直接ジャンプしEND、何も出力します。

S = S Yに連結YSます。

SPAN(S)は、の一連の文字に貪欲に一致し、Sそれを(.)に送信し、(存在する場合)のaining文字にOUTPUT設定(.Nします。その後、にジャンプして戻ります。REMNS



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独自の行ではなく、スプラット引数として初期化します。ありがとう、Value Ink

-1バイト:c=s[i]...のc代わりにs[i]...を使用しますs[i]ありがとう、Value Ink

-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));}}

-14は、おかげバイト@raznagulを(..明らかに、私は何とか自分を逃した何かのため)
-3のおかげバイト@OOBalance(..明らかに、私は何とか自分を逃した何かのためもう一度を: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)。場合l0ループが実行すべきではないとにかくなど0<0ですfalse
raznagul

@raznagul私がそれを見逃した方法がわからないが、あなたは完全に正しい!..>。>
ケビン・クルーッセン

i=02回設定しています。:あなたは二番目のドロップすることにより、3つのバイトを保存することができますfor(;i<l;i++)
OOBalance

@OOBalanceどのように起こったのかわからない..:Sしかし、気づいてくれてありがとう!:)
ケビンクルーイッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.