Her karakterin ilk oluşumunda dizeyi bölme


45

İlgili.

Yazdırılabilir bir ASCII dizgisi verildiğinde, aynı durumda daha önce görülmemiş bir karakter ortaya çıktığında her seferinde başlayan yeni bir alt dizeyle boş olmayan dizgelerin bir listesine bölün.

Örnekler

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

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

"AAA" → ["AAA"]

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

"" → []


Fıkra : Sonuç, 0 ile 95 arasında element olacaktır. 95 inci alt dize mutlaka yeni bir alt dize başlamasına neden olamaz dolayısıyla bu noktada, tüm yazdırılabilir ASCII karakterleri bir alt dize başladık çünkü her ek karakter önce meydana gelmiş, bu nedenle, sonuna kadar devam edecek ve.


1
İçeren "ve 'iyi bir fikir gibi görünen bir örnek .
Emigna

Misiniz ""[""]kabul edilebilir?
Arnauld

5
@Emigna Bu, daha fazla netlik getirmeden sadece örnek çıktı formatıyla uğraşır.
18’de

1
Yeni satır ayrılmış bir dize olarak çıktı veriyorsanız, baştaki / sondaki yeni satır olabilir mi?
Wastl

2
@wastl Uh, bu durumda izin vereceğim, çünkü daha önceki kararımın geçersiz olduğu ile çakışsa da, boş bölümleri gösteremiyor [""]. İç çekmek.
Ad

Yanıtlar:


22

Jöle , 4 bayt

QƤĠị

Çevrimiçi deneyin!

açıklama

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 bağlantısının gösterdiği dizgelerin iç gösterimi biraz farklıdır.


10

Retina , 9 bayt

q1,`.
¶$&

Çevrimiçi deneyin!

açıklama

Her karakteri .eşleştirin ( q), tekrarlanan eşleşmeleri ( ) atın, ilk eşleşmeyi ( 1,) atın ve her eşleşmenin önüne bir satır besleme ekleyin ¶$&.


6

05AB1E , 11 bayt

ÙSk¥sg¸«£õK

Çevrimiçi deneyin!

açıklama

Ù             # 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
Bu cevap karşısında geliyor herkes için ¸«olabilir ª05AB1E yeni versiyonunda.
Kevin Cruijssen

6

C,  75   65  63 bayt

10 byte tasarruf için @Digital Trauma ve her bir byte tasarruf için hem @gastropner hem de @ l4m2 sayesinde!

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

Baştaki bir yeni satırı yazdırır.

Çevrimiçi deneyin!

Öncü bir yeni satır olmadan (71 bayt):

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

Çevrimiçi deneyin!



@gastropner Zekice numara; Teşekkürler!
Steadybox

{0}=> {}?
l4m2

@ L4m2 Evet, teşekkürler!
Steadybox

5

Perl 6 ,  58 52  40 bayt

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

Dene

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

Dene

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

Deneyin
(giriş bir karakter listesi ve çıktı bir karakter listesidir)

Expanded:

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

Çıkış classifyIS

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

Ve .sortsadece şuna dönüşür:

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

».value anahtarları kaldırır

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

Anahtarlar neden hiç çalışmıyor? Ekleme sırası , siparişin belleğe göre ekleme düzenine dayandığı Java'da HashMapbir a gibi izlenmiyor LinkedHashMapmu?
Magic Octopus Urn

1
@MagicOctopusUrn Perl'in hiçbir sürümü Hashes sipariş etmedi. Aslında Perl 5 sürüm 18, Hashes'i daha rasgele hale getirdi, bu da belirli bir hizmet reddi saldırısı türünü daha az mümkün hale getirmeye yardımcı oldu ve ayrıca buggy kullanıcı kodunun buggy davranışını daha sık göstermesini sağladı. Şimdi birileri izleyebilecek bir sınıf uygulayabilir (ve muhtemelen vardır), ancak yüklenmesi ve kullanılması 5 karakterden fazla sürer.
Brad Gilbert

5

J , 7 bayt

~:<;.1]

Çevrimiçi deneyin!

açıklama

Nub elek parlama şansı!

~: <;.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
Tam olarak aynı (şaşırtıcı olmayan bir şekilde) cevap göndermek üzereydim, ondan önce
Galen Ivanov

2
@ GalenIvanov I - ve diğer birçok J golfçüsünü de hayal ediyorum - nub elek kullanma veya kendi kendine sınıflandırma yapma şansını yeniden yaşamaya bırakın.
cole


5

05AB1E , 8 bayt

Ùvyy¶ì.;

Çevrimiçi deneyin!


Her zaman sabit olan ve bölünmüş bir göstergesi olmayan, önceki 1 satırını çıkarır, önceki satırsonu çıkarmayan 10 baytlık alternatif ise Ùvyy¶ì.;}¦, burada deneyebilirsiniz . Adam'a göre, bir önceki ya da sondaki yeni satır kabul edilebilir.


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

Her yinelemeden sonra şunu alırız:

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

Hangisi:

m
i
ssissi
ppi

Güzel! Adil bir marjla beni yendi;)
Emigna

@Emigna bu, 2 gün boyunca cevabınıza bir yorum olarak oturuyordu, sonra b / c cevabını yazdım haha: P.
Magic Octopus Urn

Garip, bu konuda herhangi bir bildirim görmedim. Kendi cevabı için yeterince farklı olsa :)
Emigna

@Emigna iyi, yani haha ​​sildim.
Magic Octopus Urn,

Döngünün atlanması bir bayttan tasarruf sağlar ÙSD¶ì.;. Bunu neden daha önce düşünmediğimizi bilmiyorum: P
Emigna

5

Haskell , 39 bayt

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

Çevrimiçi deneyin!

İlk kez görünen her karakterden önce yeni bir satır sembolü ekler, böylece yeni satırla ayrılmış bir dizeyle sonuçlanır. Liste lines.oluşturmaya bağlı.


Haskell , 55 bayt

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

Çevrimiçi deneyin!

Öncelikle ilk karakteri ve onu izleyen benzersiz olmayan karakterleri ön eke alır.


@WheatWizard Oops, evet lines.
xnor

tail.linesArtık düşündüğüm ekstra boş dizgeyi kaldırmak isteyebilirim .
Buğday Sihirbazı

4

APL (Dyalog) , 9 bayt

Teşekkürler, 1 bayt tasarruf için Outgolfer Erik!

⊢⊂⍨⍳∘≢∊⍳⍨

Çevrimiçi deneyin!

Açıklama:

⍳⍨: Her karakter için ilk oluşum endeksini alın. Örneğinmississippi -> 1 2 3 3 2 3 3 2 9 9 2

⍳∘≢: Giriş 1 ile 1 arasındaki uzunluk.

: Üyelik. Örneğin1 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

⊢⊂⍨: Giriş dizesini 1yukarıdaki vektörde s ile başlayan yeni bölümlerle bölümleyin.


9 bayt (monadik fgve monadik f∘gdavranırlar aynı)
Erik Outgolfer

Neden yerine =?
Ad'm

Yazarken, endekslerin doğru pozisyonda olacağını düşünmemiştim. Her ne kadar açık olsa da
H.PWiz

4

Japt , 11 bayt

‰ r@=iRUbY

Çevrimiçi test edin!

açıklama

Bu esinlenerek Sihirli Ahtapot Vazosu 'ın 05AB1E çözümü .

‰ 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 burada bir kimlik krizi geçiriyor, bir nedenden ötürü kendisine Ruby diyor. iRUbY!
Magic Octopus Urn,

3

JavaScript (ES6), 37 bayt

7 bayt kurtarıldı: baştaki yeni bir satıra açıkça izin verildi (Thanks @Shaggy!)

Girdiyi karakter dizisi olarak alır. Yeni satır ayrılmış bir dizge çıktılar.

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

Test durumları



3

brainfuck, 66 bayt

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

biçimlendirilmiş:

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

Çevrimiçi deneyin

Çıktıdaki baştaki yeni satır (yalnızca giriş boş değilse yazdırılır) x, ana (en dıştaki) döngünün gövdesinin yerini alarak 5 byte oranında kaldırılabilir .>,[x].



2

K4 , 19 bayt

Çözüm:

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

Örnekler:

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

Açıklama:

8 bayt sadece işlemek için ""...

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

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

Çevrimiçi deneyin!



@JonathanAllan yanıltıcı bir yan etkidir, setsiparişte tutulmaz, karşı s='c'*6+'a'*100+'b'
Çubuk

Sanırım gelecek uygulamalarda buna güvenemez biliyorum ama inanıyorum diğer nesneler için geçerli değildir biz nedeniyle aynı gösterdiği gibi (tamsayı olmak tamsayı karma kümesinde düzenin sağlanması sipariş tamsayılar verilen - Bulabileceğiniz alternatifimle çalışmayan bir kelime?).
Jonathan Allan,

@ JonathanAllan da doğru değil
Rod

Ah, yeterince adil, inancım yanlıştı!
Jonathan Allan,


2

Perl, 30 bayt

içerir +1içinp

STDIN'de satır sonunu izlemeden giriş yapın. Çıktı, izleyen yeni satır olmadan da:

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

Eğer lider ve yeni satır bu sondaki umurumda değil ise 25( +3için -pkod içerdiği için 'de çalışır):

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

Her zamanki gibi mükemmel çözüm! Sunulan test durumlarına göre, hash'ınızı adlandırmanıza gerek yok, yapabilirsiniz ${$&}++. Bu kadar sağlam değil, ama bu meydan okuma için yeterli olabilir? Ayrıca, metada perl -pek bir bayta ihtiyaç duymayan bir fikir birliği vardı , sadece başlığın Perl with `-p` sadece Perl yerine olması gerekir . Bunu kendim yapmayı hatırlamaya çalışıyorum ...
Dom Hastings

@HomHastings En fazla 95 olası dizgenin anekdotu, 1bunun geçerli olduğu anlamına gelir ve bu durumda vgerekli olan anlamına gelir . Saymaya gelince, çoğunlukla codegolf.meta.stackexchange.com/a/7539/51507 kodunu takip ediyorum. Bu benim için perl sayma konusunda en tutarlı meta yazı.
Ton Hospel

Efendiden öğrenmek her zaman güzeldir. Spesifik olarak, bu durumda, &~v0ilk karakteri kapmak için. Bu siteye katıldığınız ve uzmanlığınızı paylaştığınız için teşekkür ederiz.
msh210

Sen kullandığı Çilek Perl, kullanabilirsiniz "yerine 'sahip -eve sonra sayabilir -ep+1 ziyade +3 olarak. (Test edildi.)
msh210

2

JavaScript, 61 54 52 bayt

Girdiyi karakter dizisi olarak alır.

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

Dene

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 bayt

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

Çevrimiçi deneyin!

Alt dizelerin (muhtemelen boş) bir listesini döndürür.

7 bayt kaydettiğin için Michael M teşekkürler!


3
function(s,n=nchar(s),g=substring)g(s,d<-which(!duplicated(g(s,1:n,1:n))),c(d[-1]-1,n))daha kısa olurdu - ve tabii ki biraz çirkin ...
Michael M

Neden substringyerine substr?
plannapus

@MichaelM Çok güzel! Ben hala orada eklemek if(n)zorunda çünkü substringboş dize girişi için bir hata atar.
Giuseppe

1
@plannapus substr, ilk girişine eşit uzunlukta bir vektör verirken substring, girişlerinin en uzununa eşit uzunlukta bir döndürür.
Giuseppe

@Giuseppe: R 3.4.3'teki "if (n)" nin bırakılması "" boş giriş dizesini "" boş çıkış dizgisine "" eşler, hangisi iyi olmalı (?)
Michael M

2

Stax , 8 bayt

ç↓‼►▐NVh

Çevrimiçi çalıştır ve hata ayıkla

Aynı programın ascii gösterimi budur.

c{[Ii=}(m

Her karakter için, geçerli karakterin indeksi o anki konum olduğunda ayrılır.

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 bayt

Emigna sayesinde -1 bayt

i:::a$1g?!o1po

Çevrimiçi deneyin!

Baştaki ve sondaki yeni satırı yazdırır.

pİkinci satırdaki ilgili noktada karakterin bir kopyasını alarak ve bu konumdan getirilen değer 1 değilse, yeni bir satır yazdırarak hangi harflerin daha önce göründüğünü takip eder.-1


Harika kullanımı g/p! 16 bayt
Emigna


1

JavaScript (ES6), 68 bayt

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

Girdiyi karakter listesi olarak alır.

Test durumları:


Benzer bir çözüm buldum [""]ve son test durumu için kabul edilebilir olup olmadığını sordum . Ama öyle değil . :-(
Arnauld

Her neyse, çok daha iyi bir çözüm buldun
Rick Hitchcock

1

PHP, 317 bayt

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

Çevrimiçi deneyin!


2
Merhaba ve PPCG'ye hoş geldiniz! Gönderinizi standart biçimimize göre düzenledim ve diğer kişilerin kodunuzu test edebilmesi için Çevrimiçi Denemeye bir bağlantı ekledim. Code Golf'ün amacı, mümkün olan en kısa kodu yazmaktır ve daha kısa değişken isimleri kullanmak ve boşluklardan bazılarını bırakmak gibi, bu kısaltmanın birkaç yolunu görebiliyorum. Daha fazla fikir için genel ipuçlarını ve PHP ipucu sayfalarını inceleyebilirsiniz.
Ağaç değil

1

Kırmızı , 79 bayt

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

Çevrimiçi deneyin!

Ungolfed:

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 bayt

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

Çevrimiçi deneyin!

Yeni satırlarla ayrılmış alt dizeleri yazdırır.

Açıklama:

line S(for SPLIT) aslında ayrılmaz, bunun yerine ilk karakteri ayıklar Nve kaydeder ( .) Y. Açık Failure, bu atlar END. Eşleşme yalnızca Nboş dize olduğunda başarısız olmalıdır . Böylece giriş boş olduğunda doğrudan atlar ENDve hiçbir şey çıkarmaz.

S = S Ybitiştirir Yüzerine S.

SPAN(S)açgözlülükle karakterlerin bir çalışma eşleşir Sve (gönderir .kadar) OUTPUT(ayarı, .) Niçin REMbir Tahliye karakterleri N(eğer varsa). Sonra geri atlar S.


1

PowerShell, 73 bayt

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

kullanım

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

Bazı baytları kaydedebilirsiniz - Çevrimiçi deneyin!
mazzy

1

Ruby , 65 62 58 bayt

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

Çevrimiçi deneyin!

Bir dizgiyi kabul eden ve bir dizge dizisi döndüren bir lambda.

Yaklaşım: Her dizin için, o dizindeki karakteri ssonuç dizisine veya sonuç dizisindeki son dizeye ekleyin . String#indexargümanın ilk örneğinin dizinini döndürür.

-2 bayt: aKendi satırında bir uyarıcı argüman olarak başlat . Teşekkürler, Değer Mürekkebi !

-1 bayt: Kullanım c=s[i]... cyerine s[i]... s[i]. Teşekkürler, Değer Mürekkebi !

-4 bayt: .timesyerine kullanın.map



1

Java 8, 193 169 155 151 bayt

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 sayesinde -14 bayt (belli bir şey için kendimi özledim ..)
-3 @Balance sayesinde bayt (yine bir şekilde kendimi özlediğim belli bir şey için ..: S)

Açıklama:

Çevrimiçi deneyin.

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
İhtiyacın olduğunu sanmıyorum if(l<1). Eğer lbir 0döngü yürütülmemesi gerektiğini zaten olarak 0<0ise false.
raznagul

@raznagul Nasıl özlediğimden emin değilim, ama haklısın! ..>.>
Kevin Cruijssen

i=0İki kere ayarladın . for(;i<l;i++)
İkinciyi

@OOBalance Bunun nasıl olduğundan emin değilim ..: S Ama fark ettiğiniz için teşekkürler! :)
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.