Pisahkan string pada kemunculan pertama setiap karakter


45

Terkait.

Diberikan string ASCII yang dapat dicetak, membaginya menjadi daftar string yang tidak kosong dengan sub-string baru yang dimulai setiap kali karakter, yang sebelumnya tidak pernah terlihat dalam kasus yang sama, terjadi.

Contohnya

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

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

"AAA" → ["AAA"]

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

"" → []


Anekdot : Hasilnya akan memiliki antara 0 dan 95 elemen. Sub-string ke - 95 akan terus berlanjut sampai akhir karena pada saat itu, semua karakter ASCII yang dapat dicetak telah memulai sub-string, sehingga setiap karakter tambahan akan terjadi sebelumnya dan dengan demikian tidak dapat menyebabkan sub-string baru untuk dimulai.


1
Contoh berisi "dan 'sepertinya ide yang bagus.
Emigna

Apakah ""[""]dapat diterima?
Arnauld

5
@ Emigna Itu hanya mengacaukan format output contoh tanpa membawa kejelasan lebih lanjut.
Adám

1
Jika menghasilkan sebagai string yang dipisahkan baris baru, dapatkah ada baris baru yang memimpin / tertinggal?
wastl

2
@wastl Uh, saya akan mengizinkannya dalam kasus ini karena tidak dapat menunjukkan segmen kosong, meskipun tidak sesuai dengan keputusan saya sebelumnya yang [""]tidak valid. Mendesah.
Adám

Jawaban:


22

Jelly , 4 byte

QƤĠị

Cobalah online!

Penjelasan

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

Representasi internal string, yang ditampilkan oleh tautan TIO, sedikit berbeda.


10

Retina , 9 byte

q1,`.
¶$&

Cobalah online!

Penjelasan

Cocokkan setiap karakter ( .), buang kecocokan yang diulang ( q), buang kecocokan pertama ( 1,), dan masukkan umpan baris di depan setiap kecocokan ¶$&.


6

05AB1E , 11 byte

ÙSk¥sg¸«£õK

Cobalah online!

Penjelasan

Ù             # 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
Bagi siapa pun yang menemukan jawaban ini, ¸«bisa ªdalam versi baru 05AB1E.
Kevin Cruijssen

6

C,  75   65  63 byte

Berkat @Digital Trauma karena telah menghemat 10 byte dan terima kasih kepada @gastropner dan @ l4m2 karena masing-masing menghemat satu byte!

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

Mencetak baris baru terkemuka.

Cobalah online!

Tanpa baris baru terkemuka (71 byte):

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

Cobalah online!



@gastropner Trik pintar; Terima kasih!
Steadybox

{0}=> {}?
l4m2

@ l4m2 Ya, terima kasih!
Steadybox

5

Perl 6 ,  58 52  40 byte

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

Cobalah

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

Cobalah

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

Cobalah
(input adalah daftar karakter, dan output adalah daftar daftar karakter)

Diperluas:

*                   # 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

Output dari classifyadalah

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

Dan .sortmengubahnya menjadi:

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

».value menghapus kunci

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

Mengapa kunci-kunci itu pernah rusak? Apakah urutan penyisipan tidak dilacak seperti HashMapvs. LinkedHashMapdi Java di mana urutannya didasarkan pada memori vs. urutan penyisipan?
Magic Octopus Urn

1
@MagicOctopusUrn Tidak ada versi Perl yang telah memesan Hash. Bahkan Perl 5 versi 18 membuat Hash lebih acak yang membantu membuat jenis penolakan serangan layanan tertentu menjadi kurang mungkin, dan juga telah menyebabkan kode pengguna kereta untuk mengekspos perilaku kereta itu lebih sering. Sekarang seseorang dapat (dan kemungkinan telah) mengimplementasikan kelas yang melacak, tetapi itu akan membutuhkan lebih dari 5 karakter untuk memuat dan menggunakan.
Brad Gilbert b2gills

5

J , 7 byte

~:<;.1]

Cobalah online!

Penjelasan

Kesempatan Nub sieve untuk bersinar!

~: <;.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
Saya akan memposting jawaban yang persis sama (tidak mengherankan), ada baiknya saya melihat kiriman Anda sebelumnya :)
Galen Ivanov

2
@GalenIvanov I - dan saya membayangkan sebagian besar pegolf J lainnya - juga menikmati kesempatan untuk menggunakan nub saringan atau mengklasifikasikan sendiri.
cole

5

APL (Dyalog Unicode) , 8 byte SBCS

(≢¨∪\)⊆⊢

Cobalah online!


Tapi, tapi ... Ya ampun.
Adám

Saya curiga Anda mungkin telah memposting tantangan ini karena primitif baru (⊆). Jelas tidak :)
ngn

Sepertinya Kirby yang malu memegang botol bayi.
Magic Octopus Urn

untuk semua orang yang perlu mencari "Kirby" seperti yang saya lakukan - ini adalah bola merah muda antropomorfik dari video game Jepang
ngn

5

05AB1E , 8 byte

Ùvyy¶ì.;

Cobalah online!


Selalu akan menghasilkan 1 baris sebelumnya, yang konstan dan tidak menunjukkan perpecahan, alternatif 10-byte yang tidak menampilkan baris sebelumnya adalah Ùvyy¶ì.;}¦, Anda dapat mencobanya di sini . Menurut Adam, baris baru sebelum atau sesudahnya dapat diterima.


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

Setelah setiap iterasi kita dapatkan:

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

Yang mana:

m
i
ssissi
ppi

Bagus! Kalahkan saya dengan selisih yang adil;)
Emigna

@Emigna ini duduk sebagai komentar atas jawaban Anda selama 2 hari maka saya baru mempostingnya b / c tidak ada jawaban haha: P.
Magic Octopus Mm

Aneh, belum melihat pemberitahuan tentang itu. Cukup berbeda untuk jawabannya sendiri :)
Emigna

@Emigna yah, maksudku, aku menghapusnya haha.
Magic Octopus Mm

Melewati loop menghemat satu byte ÙSD¶ì.;. Tidak yakin mengapa kami tidak memikirkan itu sebelumnya: P
Emigna

5

Haskell , 39 byte

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

Cobalah online!

Menyisipkan simbol baris baru sebelum setiap karakter yang muncul untuk pertama kalinya, menghasilkan string yang dipisahkan baris baru, dengan baris baru yang memimpin. Tambahkan lines.untuk menghasilkan daftar.


Haskell , 55 byte

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

Cobalah online!

Berulang kali mengambil awalan karakter pertama ditambah karakter non-unik yang mengikutinya.


@WheatWizard Ups, ya, lines.
xnor

Mungkin ingin saya lakukan tail.linesuntuk menghapus string kosong tambahan sekarang saya memikirkannya.
Wheat Wizard

4

APL (Dyalog) , 9 byte

Terima kasih, Erik the Outgolfer untuk menghemat 1 byte!

⊢⊂⍨⍳∘≢∊⍳⍨

Cobalah online!

Penjelasan:

⍳⍨: Untuk setiap karakter, dapatkan indeks kemunculan pertamanya. misalnyamississippi -> 1 2 3 3 2 3 3 2 9 9 2

⍳∘≢: Rentang dari 1 hingga panjang input.

: Keanggotaan. misalnya1 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

⊢⊂⍨: Mempartisi string input dengan partisi baru mulai dari 1s pada vektor di atas


9 byte (monadik fgdan monadik f∘gberperilaku sama)
Erik the Outgolfer

Kenapa bukannya =?
Adám

Pada saat penulisan, saya tidak menganggap bahwa indeks akan berada di posisi yang benar. Meskipun jelas bahwa mereka
H.PWiz

4

Japt , 11 byte

‰ r@=iRUbY

Uji secara online!

Penjelasan

Hal ini terinspirasi oleh Sihir Octopus Mm 's solusi 05AB1E .

‰ 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 mengalami krisis identitas di sini, itu menyebut dirinya Ruby karena alasan tertentu. iRUbY!
Magic Octopus Mm

3

JavaScript (ES6), 37 byte

Disimpan 7 byte: baris baru terkemuka diizinkan secara eksplisit (Terima kasih @Shaggy!)

Mengambil input sebagai array karakter. Menghasilkan string yang dipisahkan baris baru.

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

Uji kasus


Baris baru terkemuka diizinkan sehingga Anda bisa menurunkannya hingga 37 byte
Shaggy

3

brainfuck, 66 byte

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

Diformat:

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

Cobalah online

Baris baru terdepan dalam output (yang hanya dicetak jika inputnya tidak kosong) dapat dihilangkan dengan biaya 5 byte dengan mengganti badan xloop utama (paling luar) dengan .>,[x].



2

K4 , 19 byte

Larutan:

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

Contoh:

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:""
,[""]

Penjelasan:

8 byte hanya untuk menangani ""...

$[#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

Python 2 , 81 74 byte

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

Cobalah online!



@JonathanAllan itu adalah efek samping yang menyesatkan, settidak menjaga ketertiban, anti-bukti ->s='c'*6+'a'*100+'b'
Rod

Saya tahu kita tidak bisa mengandalkan itu dalam implementasi masa depan tapi saya percaya diberikan integer memerintahkan kami menjaga ketertiban dalam set karena hash dari integer menjadi integer (seperti yang Anda telah menunjukkan hal yang sama tidak berlaku untuk objek lain - dapatkah Anda menemukan kata yang tidak berfungsi dengan alternatif saya?).
Jonathan Allan

@ Jonathanathan Allan juga tidak benar
Rod

Ah, cukup adil, kepercayaan saya salah!
Jonathan Allan


2

Perl, 30 byte

Termasuk +1untukp

Berikan masukan tanpa tertinggal baris baru di STDIN. Output juga tanpa tertinggal baris baru:

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

Jika Anda tidak peduli tentang memimpin dan mengikuti baris baru, ini 25( +3karena -pkarena kodenya berisi ') juga berfungsi:

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

Solusi hebat seperti biasa! Berdasarkan kasus uji yang disediakan, Anda tidak perlu menyebutkan hash, Anda dapat melakukannya ${$&}++. Ini tidak sekuat itu, tetapi mungkin cukup untuk tantangan ini? Juga, sudah ada konsensus tentang meta yang perl -ptidak memerlukan byte tambahan, Anda hanya perlu memiliki header sebagai Perl with `-p` ganti hanya Perl. Saya mencoba mengingat untuk melakukan itu sendiri ...
Dom Hastings

@HomHastings Anekdot tentang paling banyak 95 kemungkinan string sangat kuat menyiratkan yang 1valid, dalam hal vini diperlukan. Mengenai penghitungan, saya kebanyakan mengikuti codegolf.meta.stackexchange.com/a/7539/51507 yang bagi saya adalah meta post yang paling konsisten tentang menghitung perl.
Ton Hospel

Selalu menyenangkan untuk belajar dari tuannya. Secara khusus, dalam hal ini, &~v0untuk meraih karakter pertama. Terima kasih telah bergabung dengan situs ini dan berbagi keahlian lama Anda.
msh210

Anda dapat menggunakan Strawberry Perl, yang menggunakan "alih-alih 'dengan -e, dan kemudian Anda dapat menghitung -epsebagai +1 daripada +3. (Diuji.)
msh210

2

JavaScript, 61 54 52 byte

Mengambil input sebagai array karakter.

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

Cobalah

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 byte

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

Cobalah online!

Mengembalikan daftar substring (mungkin kosong).

Terima kasih kepada Michael M karena telah menghemat 7 byte!


3
function(s,n=nchar(s),g=substring)g(s,d<-which(!duplicated(g(s,1:n,1:n))),c(d[-1]-1,n))akan lebih pendek - dan tentu saja sedikit lebih buruk ...
Michael M

Kenapa substringbukannya substr?
plannapus

@MichaelM Bagus sekali! Saya masih harus menambahkan if(n)di sana karena substringmelempar kesalahan untuk input string kosong.
Giuseppe

1
@plannapus substrmengembalikan vektor dengan panjang yang sama dengan input pertamanya sementara substringmengembalikan satu dengan panjang yang sama dengan input terpanjangnya.
Giuseppe

@Giuseppe: Menjatuhkan "if (n)" di R 3.4.3 memetakan string input kosong "" ke string output kosong "", yang seharusnya tidak masalah (?)
Michael M

2

Stax , 8 byte

ç↓‼►▐NVh

Jalankan dan debug online

Representasi ascii dari program yang sama adalah ini.

c{[Ii=}(m

Untuk setiap karakter, ia terpecah ketika indeks karakter saat ini adalah posisi saat ini.

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 byte

-1 byte terima kasih kepada Emigna

i:::a$1g?!o1po

Cobalah online!

Mencetak baris baru yang memimpin dan tertinggal.

Ini melacak surat mana yang sudah muncul dengan pmenggunakan salinan karakter di tempat yang sesuai pada baris kedua, dan mencetak baris baru jika nilai yang diambil dari posisi itu bukan 1. Berakhir dalam kesalahan ketika mencoba untuk mencetak-1


Penggunaan hebat g/p! 16 byte
Emigna


1

JavaScript (ES6), 68 byte

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

Mengambil input sebagai daftar karakter.

Kasus uji:


Saya punya solusi yang sama dan bertanya apakah [""]dapat diterima untuk kasus tes terakhir. Tapi ternyata tidak . :-(
Arnauld

Oh, well, Anda punya solusi yang jauh lebih baik:)
Rick Hitchcock

1

PHP, 317 byte

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

Cobalah online!


2
Halo, dan selamat datang di PPCG! Saya telah mengedit posting Anda ke format standar kami, dan menambahkan tautan ke Try It Online sehingga orang lain dapat menguji kode Anda. Tujuan dari Code Golf adalah untuk menulis kode sesingkat mungkin, dan saya dapat melihat beberapa cara untuk membuat ini lebih pendek, seperti menggunakan nama variabel yang lebih pendek dan meninggalkan beberapa spasi. Anda dapat melihat tips umum dan halaman tips PHP untuk beberapa ide lainnya.
Bukan pohon

1

Merah , 79 byte

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

Cobalah online!

Tidak Disatukan:

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 byte

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

Cobalah online!

Mencetak substring yang dipisahkan oleh baris baru.

Penjelasan:

baris S(untuk SPLIT) tidak benar-benar terpecah, tetapi sebaliknya mengekstrak karakter pertama Ndan menyimpannya ( .) ke Y. Pada Fpenyakit, ia melompat ke END. Pertandingan hanya akan gagal ketika Nstring kosong. Jadi, ketika input kosong, ia langsung melompat ke ENDdan tidak menghasilkan apa-apa.

S = S Ymerangkai Yke S.

SPAN(S)greedily mencocokkan run karakter dalam S, dan mengirimkannya ( .) ke OUTPUT, setting ( .) Nke REMkarakter aining N(jika ada). Lalu ia melompat kembali ke S.


1

PowerShell, 73 byte

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

Pemakaian

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

Anda dapat menyimpan beberapa byte - Cobalah secara online!
mazzy

1

Ruby , 65 62 58 byte

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

Cobalah online!

Seorang lambda menerima string dan mengembalikan serangkaian string.

Pendekatan: Untuk setiap indeks, tambahkan karakter pada indeks itu ske dalam array hasil, atau ke string terakhir dalam array hasil. String#indexmengembalikan indeks dari argumen pertama.

-2 byte: Menginisialisasi asebagai argumen percikan alih-alih pada barisnya sendiri. Terima kasih, Nilai Tinta !

-1 byte: Gunakan c=s[i]... cbukan s[i]... s[i]. Terima kasih, Nilai Tinta !

-4 byte: Gunakan .timessebagai ganti.map



1

Java 8, 193 169 155 151 byte

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 byte terima kasih kepada @raznagul (untuk sesuatu yang jelas entah bagaimana saya merindukan diri saya sendiri ..)
-3 byte terima kasih kepada @OOBalance (lagi untuk sesuatu yang jelas saya entah bagaimana merindukan diri sendiri ..: S)

Penjelasan:

Cobalah online.

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
Saya tidak berpikir Anda membutuhkannya if(l<1). Jika ladalah 0loop tidak harus dilaksanakan pula sebagai 0<0adalah false.
raznagul

@raznagul Tidak yakin bagaimana saya melewatkan itu, tetapi Anda benar lengkap! ..>.>
Kevin Cruijssen

Anda menetapkan i=0dua kali. Anda dapat menyimpan 3 byte dengan menjatuhkan yang kedua:for(;i<l;i++)
OOBalance

@OOBalance Tidak yakin bagaimana itu terjadi ..: S Tapi terima kasih telah memperhatikan! :)
Kevin Cruijssen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.