En Kısa Benzersiz Substrings


29

Giriş

Alfanümerik bir dize s.

Çıktı

Tam olarak bir kez (bitişik) bir alt dize olarak gerçekleşen en kısa dize s. Örtüşen oluşumlar belirgin olarak sayılır. Aynı uzunlukta birkaç aday varsa, hepsini olma sırasına göre çıkarmalısınız. Bu zorlamada, boş dize, n + 1bir uzunluk dizesinde defalar meydana gelir n.

Örnek

Dize düşünün

"asdfasdfd"

Boş dize içinde 10 kez oluşur, bu nedenle benzersiz oluşumu için bir aday değildir. Harflerin her biri "a", "s", "d", ve "f"onlar adaylar ya değildir bu yüzden iki kez en az oluşur. Alt tabakalar "fa"ve "fd"sadece bir kez ve bu sıraya göre meydana gelirken, diğer tüm uzunluk uzunlukları 2 ise iki kere meydana gelir. Böylece doğru çıktı

["fa","fd"]

kurallar

Hem fonksiyonlara hem de tam programlara izin verilir ve standart boşluklara izin verilmez. Çıktının tam olarak biçimlendirilmesi, gerekçeyle esnek. Özellikle, boş dize için çıktı üretilmesine izin verilmez, ancak hata atmak değildir. En düşük bayt sayısı kazanır.

Test durumları

"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]

Liderler Sıralaması

İşte size söz verdiğim dil liderlik tablosu.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>


Kombinatoryal yerleşik fonksiyonlarda herhangi bir sınırlama var mı?
Martin Ender

3
@ MartinBüttner Bu mücadelede her şey yolunda gider. Bu yeterli cevap alırsa, bir yan dil lider tablosu oluşturacağım, böylece daha donanımlı diller bile anlamlı bir rekabet edebilecek.
Zgarb

Benim kod golf afiş snippet kullanmak ister misiniz ? O zaman lider panosunu güncel tutmak için tüm düzenlemeleri izlemeniz gerekmez. Bunu yaparsanız, sizin için ekleyebilirim ve başlık formatlarına uymaları için cevapları gözden geçiririm.
Martin Ender

@ MartinBüttner Teşekkürler, bunu takdir ediyorum!
Zgarb

Hepsi tamam! Bir şey işe yaramazsa bana bildirin. (Gelecekteki zorluklarınız için tekrar kullanmaktan çekinmeyin.)
Martin Ender,

Yanıtlar:


3

Pyth, 27 26 bayt

&zhfTmf!/>zhxzYYm<>zkdUzUz

Burada dene.

Çevrimiçi derleyicideki bir hata nedeniyle boş dize durumunun yalnızca burada bulunabilen komut satırı sürümünde doğru çalıştığını unutmayın .

Online derleyici için girdi olarak yeni bir satır vererek hatayı da tedavi edebilirsiniz.

Açıklama:

                                   z = input(), implicit.
&z                                 Prints empty string if input is empty.
  hfT                              Take the first non-empty list from
     m                  Uz         A list of list of substrings of z, divided by length
                m<>zkdUz           with some shorter strings repeated later, to no effect.
      f                            Where the substrings are filtered on
       !/      Y                   There being 0 occurrences of the substring in
         >z                        The slice of z
           hxzY                    from the character after the first character
                                   of the first occurrence of the substring in z
                                   to the end of z.

Boş dize girişi başarısız.
Doktor

@Optimizer Bunun aslında çevrimiçi derleyicide bir hata olduğunu düşünüyorum. Komut satırı sürümünde çalışır. Aslında, zhiçbir giriş çevrimiçi ortamda başarısız olmaz, bu yüzden kesinlikle yorumlayıcıda bir hatadır.
isaacg,

EOF vermez mi?
Doktor

@Optimizer Pyth, yanlış giden şey olabilir, yeni satır sonlandırılmış giriş bekliyor.
isaacg,

Yani boş bir dize geçirmek bile mümkün değil?
Doktor

13

Python 3, 124 123 111 96 bayt

f=lambda s,n=1:[x for x in[s[i:i+n]for i in range(len(s)+1)]if s.find(x)==s.rfind(x)]or f(s,n+1)

Soldan ilk oluşumu sağdan ilk oluşumu ile aynı olacak şekilde dizeleri arar. +1İçinde rangeboş dize durumda barındırılabilir.

Sadece Python bir vardı Şimdi eğer .count()sayılır hangi örtüşen maçları, o zaman bu olurdu adil kısa ısırdı.


6

Mathematica, 95 94 79 bayt

Cases[Tally@StringCases[#,___,Overlaps->All],{s_,1}:>s]~MinimalBy~StringLength&

StringCasesBana tüm olası alt dizgileri getirir, Tallyve bir Caseskereden fazla MinimalBygörünenleri süzer ve en kısa olanları bulur.


&Kodun sonunda fazladan yok mu?
David G. Stork,

Evlat, hızlısın!
David G. Stork,

4

GolfScript, 44 bayt

:S;-1:x{;S,x):x-),{S>x<}%:^1/{^\/,2=},.!}do`

Girdiyi stdin'de bir dizge olarak alır ve çift dizili bir sözdiziminde çıktı verir: örn [["b"] ["c"]]. Çevrimiçi demo

teşrih

:S;          # Store input in S and pop it
-1:x         # Store -1 in x
{            # do-while loop
  ;          #   Pop x the first time and [] every subsequent time
  S,x):x-),  #   Increment x and build an array [0 1 ... len(S)-x]
  {S>x<}%    #   Map that array to [substr(S,0,x) substr(S,1,x) ...]
  :^         #   Store in ^ (to avoid the token coalescing with the next char)
  1/         #   Split by length 1 to iterate over 1-elt arrays rather than strings
  {^\/,2=},  #   Filter to arrays which occur exactly once as a subarray of ^
  .!         #   Duplicate and test emptiness
}do          # end do-while loop: loop if the filtered array is empty
`            # Stringify for output

Bu, boş dize için özel bir durum gerekmeyecek şekilde düzenlenmiştir (yukarıda verilen çevrimiçi demo'da bir test durumu olarak dahil ettim).


3

CJam, 52 43 40 bayt

]]q:Q,,{)Q,1$-),f{Q><}:R{R\a/,2=},}%{}=p

Girdi, tırnaksız dizgedir.

Açıklama :

]]                                       "For empty string input case";
  q:Q                                    "Read the input and store in Q";
     ,,                                  "Take length of input and 0 to length array";
       {                          }%     "Map the above array on this code block";
        )Q                               "Increment the number in the current iteration, L";
         Q,1$                            "Take input's length and copy the above number";
             -)                          "Get upper limit of next loop to get substrings";
               ,f{   }                   "Get 0 to above number array and for each";
                  Q><                    "Get the L length substring at Ith index where";
                                         "I loops from 0 to Q, - L + 1";
                      :R                 "Store this list of substring of length L in R";
                        {R\a/,2=},       "Filter to get unique substrings";
                                    {}=  "Get the first non empty substring array";
                                         "This leaves nothing on stack if all are empty";
                                       p "Print the top stack element. At this point, its";
                                         "Either the first non empty substring array or";
                                         "the ]] i.e. [""] which we added initially";

Örnek:

asdfdfasddfdfaddsasadsasadsddsddfdsasdf

Çıktı

["fas" "fad" "add" "fds"]

Burada çevrimiçi deneyin


3

Scala, 120 bayt

readLine.inits.flatMap(_.tails).toList.groupBy(l=>l).filter(x=>x._2.length<2).map(_._1).groupBy(_.length).minBy(_._1)._2

140 ile başladım ki en azından bir tweet'e uyuyordu.

(                                        // added for comments
 readLine                                // input
.inits.flatMap(_.tails).toList           // get all substrings of that string
.groupBy(l=>l).filter(x=>x._2.length<2)  // remove substrings that occur more than once
.map(_._1).groupBy(_.length)             // take the substring and group by length
.minBy(_._1)._2                          // take the list of shortest substrings
)

Merak ediyorum? Neden sadece (_)kimlik yerine çalışmıyor l=>l?
Gurme haskeller

Bende merak ediyorum Her nasılsa list.groupBy(_)aynı x => list.groupBy(x). Neden böyle uyguladıkları hakkında hiçbir fikrim yok.
Dominik Müller

3

JavaScript (ES6), 109 110

Düzen girdi dizesi alfanümerik olarak yerine indexOf arasında arayın. @IsmaelMiguel Teşekkürler

Özyinelemeli işlev, uzunluk 1 ile başlayan ve yukarı çıkan alt dizileri arıyor.

F=(s,n=1,r)=>
s?[...s].map((a,i)=>~s.indexOf(a=s.substr(i,n),s.search(a)+1)?r:r=[...r||[],a])&&r||F(s,n+1):[s]

Ungolfed ve açıkladı

 F = function(s, n=1) { // start with length 1
   var i, a, p, r;
   if (s == "") // special case for empty input string
     return [s];
   for (i = 0; i < s.length; i++) 
   // for each possibile substring of length n
   // (should stop at s.length-n+1 but going beyond is harmless)
   // Golfed: "[...s].map((a,i)" ... using i, a is overwrittem
   {
     a = s.substr(i, n); // substring at position i
     p = s.search(a); // p is the first position of substring found, can be i or less
     p = s.indexOf(a, p + 1) // p is now the position of a second instance of substring, or -1 if not found
     if (~p) // ~p is 0 if p is -1
     {
       ; // found more than once, do nothing
     }
     else
     {
       r = r || []; // if r is undefined, then it becomes an empty array
       r.push(a); // save substring 
       // Golfed: "r=[...r||[],a]"
     }
   }
   if (r) // if found some substring, saved in r
   {
     return r;
   }
   return F(s, n+1) // recursive retry for a bigger length
 }

FireFox / FireBug konsolunda test edin

;["", "abcaa", "rererere", "asdfasdfd", "ffffhhhhfffffhhhhhfffhhh", 
 "asdfdfasddfdfaddsasadsasadsddsddfdsasdf"]
.forEach(x=>console.log(x,F(x)))

Çıktı

 [""]
abcaa ["b", "c"]
rererere ["ererer"]
asdfasdfd ["fa", "fd"]
ffffhhhhfffffhhhhhfffhhh ["hffff", "fffff", "hhhhh", "hfffh"]
asdfdfasddfdfaddsasadsasadsddsddfdsasdf ["fas", "fad", "add", "fds"]

Yerine .searchkullanın .indexOfve 2 bayt kaydedin.
Ismael Miguel,

@IsmaelMiguel hayır çünkü 1) arama bir ofset parametresine sahip değildir 2) arama bir regexp bekler ve benzeri özel karakterlerle başarısız olur. * [] Ve diğerleri
edc65

1
Ancak, ilk önce, güvenle değiştirebilirsiniz s.indexOf(a)+1. Her ne kadar bu karakterler ile işe yaramayacak olsa da, endişelenmenize gerek yok! OP’den alıntı: " Input: An alphanumeric string s."
Ismael Miguel,

@ IsmaelMiguel doğru, teşekkürler. 'Alfanümerik' kısıtlamayı
kaçırdım

1
@IsmaelMiguel Bir yol bulamadım ... Gerçeğe ya da sahtekarlığa ihtiyacım var ve herhangi bir dizi (hatta boş []) javascript'te bir hakikaten değerdir
edc65 15

3

Java, 168 176 233

İşte oldukça basit bir iç içe döngü örneği.

void n(String s){for(int l=0,i=0,t=s.length(),q=0;l++<t&q<1;i=0)for(String b;i<=t-l;)if(s.indexOf(b=s.substring(i,i+++l),s.indexOf(b)+1)<0){System.out.println(b);q++;}}

Veya biraz daha okunabilir:

void t(String s){
    for(int l=0,i=0,t=s.length(),q=0;l++<t&q<1;i=0)
        for(String b;i<=t-l;)
            if(s.indexOf(b=s.substring(i,i++ +l),s.indexOf(b)+1)<0){
                System.out.println(b);
                q++;
            }
}

Eğer okunabilirliği, bölme isterseniz +++öyle olsun göstermek için yukarı + ++veya ++ +yardımcı olacağını ... Ve birkaç bayt kaydetmek istiyorsanız, initialising tarafından bunu bir yolu olabilir q=1, yerine q++ile q=tve değiştirilmesi l++<t&q<1gibi bir şeyle t>l+=q. Muhtemelen çalışabilmesi için bir veya iki başka ofset düzenlemesi gerekiyor.
Peter Taylor

@Peter Eh, okunabilir derken çoğunlukla "Yatay kaydırma yapmam gerekmiyor" derken kastettim +++. Çimdiklemeye çalışıyorum (özellikle q, biraz zararlı görünüyor), ancak henüz sağlam bir şey bulamadım.
Geobits

@PeterTaylor Java'nın lexing kuralları nedeniyle, +++daima çözer ++ +.
FUZxxl

@ FUZxxl, çoğu Java kullanıcısının bile bildiğinden şüpheliyim ve bu sitede Java bilmeyen birçok insan var.
Peter Taylor


3

Haskell, 169 162 155 153 151 138 120 115

import Data.List
l=length
q k=filter$(==)k.l
p y=q(minimum.map l$y)$y
f x=p$concat$q 1$group$sort$(tails x>>=inits)

Kullanmak için:

f "asdfdfasddfdfaddsasadsasadsddsddfdsasdf"

Hangi verir:

["add","fad","fas","fds"]

Btw. Kodumun son satırından nefret ediyorum (tekrarı h y). Bundan kurtulmak isteyen var mı?


1
Peki ya sen g y=q(minimum.(map l)$y)$y(etrafındaki parantezler map lgerçekten gerekli mi?) Ve sonra f=g.concat.q 1.group.sort.concatMap inits.tails?
FUZxxl

1
Kullanılması >>=yerine concatMap, yani f x=p$concat$q 1$group$sort$(tails x>>=inits)2 bayt kaydeder. Neden Data.Ordithalat?
nimi

1
Parantez içerisindeki parantezler qgereksizdir, çünkü yazabildiğiniz filter$(==)k.lgibi, sonuncusu $ve ys'den önceki boşluklar gibi p. Ayrıca, ithalattan sonra noktalı virgülleri kaldırabilirsiniz ( Data.Ordgerçekten gereksiz görünüyor).
Zgarb

Leksah derleyicisinin boşluk bırakmadığı kabul etmiyor $. Bazı baytları tıraş eder, ancak lisan belirtisinde mi?
RobAu

1
GHC kabul edecek.
Zgarb

3

J, 61 58 44 42 40 38 37 bayt

[:>@{.@(#~#@>)#\<@(~.#~1=#/.~)@(]\)]

Çözümün ayrı bileşenlerine ayrılan bir sürüm:

unqs =. ~. #~ 1 = #/.~               NB. uniques; items that appear exactly once
allsbsq =. #\ <@unqs@(]\) ]        NB. all unique subsequences
shrtsbsq =. [: >@{.@(#~ #@>) allsbsq NB. shortest unique subsequence
  • x #/. yiçinde xne sıklıkta gerçekleştiğine dair her bir farklı eleman için hesaplar y. Eğer bunu kullanırsak y #/. y, her bir farklı eleman yiçin sayımını alırız . Örneğin, a #/. aiçin a =. 1 2 2 3 4 4verim 1 2 1 2.
  • 1 = yHangi öğelerin yeşit olduğunu kontrol eder 1. Örneğin, 1 = a #/. averimler1 0 1 0 .
  • u~olan , Dönüşlü Monadik fiilin u. Bu, u~ yaynıdır y u y. Böylece, #/.~ yaynıdır #/.~ y. İKİLİ fiil uygulandığında, u~bir pasif arasında u. Yani, x u~ yaynı y u x. Bunlar açıkça belirtmediğim epeyce yerlerde kullanılıyor.
  • ~. yolan yumru ait yçıkarılabilir çiftleri ile bir vektör. Örneğin, ~. averim 1 2 3 4.
  • x # y( kopyala ) , a içerdiği yendekslerdeki öğelerden seçim yapar .x1
  • Böylece, sadece bir kez ortaya çıkan (1 = y #/. y) # (~. y)elementlerin bir vektörünü yaratır y. Tacik notasyonda, bu fiil ~. #~ 1 = #/.~; unqsaçıklamanın geri kalan kısmı için bu cümleyi arayalım .
  • x ]\ yBir oluşturur xile 1 + y - xtüm dizi ara ekleri içermemelidir vektörünün yuzunluğu x. Örneğin, 3 ]\ 'asdfasdfdverimler

    asd
    sdf
    dfa
    fas
    asd
    sdf
    dfd
    
  • # yolan çetelesini arasında yolduğu, eleman sayısı y.

  • u\ ygeçerli uher önek arasında y. Bu arada, ila #\ yarasında bir tamsayı vektörü oluşturur .1#y
  • < yybir kutuya koyar . Bu gereklidir, çünkü diziler yırtılmaz ve farklı uzunluklarda bir dizi son ekler hesaplarız; kutulu bir dizi skalar olarak sayılır.
  • Bu durumda, (i. # y) <@:unqs@(]\) ybir vektör oluşturur #yuzunluğu kutulu diziler k (bütün 0 ≤ için k < #yait ara ekleri içermemelidir) y tam olarak bir kez meydana gelir. Bu fiilin biçimsiz şekli i.@# <@unqs@(]\) ]ya i.@# <@(~. #~ 1 = #/.~)@(]\) ]da unqsismini kullanmıyorsak . Bu cümleyi allsbsqbu açıklamanın geri kalanı için diyelim . Örneğin, allsbsq 'asdfasdfd'verim:

    ┌┬─┬──┬───┬────┬─────┬──────┬───────┬────────┐
    ││ │fa│dfa│sdfa│asdfa│asdfas│asdfasd│asdfasdf│
    ││ │fd│fas│dfas│sdfas│sdfasd│sdfasdf│sdfasdfd│
    ││ │  │dfd│fasd│dfasd│dfasdf│dfasdfd│        │
    ││ │  │   │sdfd│fasdf│fasdfd│       │        │
    ││ │  │   │    │asdfd│      │       │        │
    └┴─┴──┴───┴────┴─────┴──────┴───────┴────────┘
    
  • (#@> y) # yyboş olmayanları , kutulu dizilerin vektöründen alır .

  • {. yvektörün ilk elemanını alır y.
  • > ykutuyu kaldırır y.
  • Böylece, > {. (#@> y) # ykutulu olmayan ilk boş olmayan diziyi kutulu dizi vektöründen verir y. Bu cümle >@{.@(#~ #@>)zımni notasyonda yazılmıştır .
  • Sonunda, [: >@{.@(#~ #@>) allsbsqönceki cümleyi, sahip allsbsqolduğumuz soruna bir çözüm oluşturmak için birleştirir . İşte boşluklu tam ifade:

    [: >@{.@(#~ #@>) i.@# <@(~. #~ 1 = #/.~)@(]\) ]
    

2

Haskell, 135 Bayt

import Data.List
f ""=[""]
f g=map(snd)$head$groupBy(\a b->fst a==fst b)$sort[(length y,y)|[y]<-group$sort[x|x@(_:_)<-tails g>>=inits]]

2

PHP, 171 152 134 125

function f($s){while(!$a&&++$i<strlen($s))for($j=0;$b=substr($s,$j++,$i);)strpos($s,$b)==strrpos($s,$b)&&($a[]=$b);return$a;}

http://3v4l.org/RaWTN


Açıkça tanımlamana gerek yok $j=0. Ahead, var substr($s,$j++,$i). Tanımlamadan $jbunu yeniden yazabilir substr($s,0+$j++,$i)ve 2 bayt kaydedebilirsiniz. Neden? Eh, ilk kez $jolacak null. Ve etkili geçirerek olacak nullkadar substro kadar iyi çalışır sanmıyorum ki. kullanma0+$j++ dönüştürür nulliçin 0. Gerekmediğini görürseniz, onsuz devam edin ve sadece $j=0parçayı çıkarın .
Ismael Miguel,

Bunu denedim; PHP'nin güçlü kapsamı olmadığı için çalışmaz, bu nedenle döngünün $jher yinelemesi için silinmez ve yeniden başlatılmaz while(). Böylece boş (ve bu nedenle 0bir $j++çağrı tarafından dönüştürülecek ) ilk kez etrafında iken, dış döngünün gelecekteki yinelemelerinde daha önce olduğu değerde kalır. Sıfırlamak kadar başlangıç ​​değil. Öneriniz için teşekkürler :-)
Stephen

Burada size 141 bayt uzunluğunda bir çözüm öneriyorum: function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}Değişiklikler:||1 , bitwise &( AND) yerine &&tek bir yer kullandım, $j<$l&&[...]parçayı for(2 bayt kurtarmayı) dışına taşıyarak gereksiz parantezleri kaldırın.
Ismael Miguel,

1
Sizin için bir 134 bayt uzun hediye: function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}Önceki koda yapılan değişiklikler:$b=substr($s,$j++,$i) içine strpos($s,$b)yapma strpos($s,$b=substr($s,$j++,$i)), daha gereksiz parenthesys kaldırıldı ve gereksiz kaldırıldı &.
Ismael Miguel,

1
Biraz daha doğrama yönetti :-) substr($s,$j++,$i)döner"" zaman $julaştığı dize uzunluğu ve falsebundan sonra, bu atama da döngü koşullu arası olarak görev yapabilir, böylece. Sonra $lkalan tek bir kullanım vardır , böylece bunlar da konsolide edilebilir.
Stephen

2

Groovy (Oracle uygulamasında Java regex), 124

c={m=it=~/(?=(.*?)(?=(.*))(?<=^(?!.*\1(?!\2$)).*))/;o=m.collect({it[1]});o.findAll({it.size()==o.min({it.size()}).size()});}

Groovy 2.4 + Oracle JRE 1.7'de test edilmiştir. Regex, Java 6'dan Java 8'e çalışmalıdır, çünkü yukarıdaki kodun çalışmasına izin veren hata düzeltilmedi. Önceki sürüm için emin değilim, çünkü Java 5’te Java 6’da giderilen geriye dönük bir hata var.

Düzenli ifade, giriş dizesinde her konumda, başka bir yerde yinelenen bir alt dizeye sahip olmayan en kısa dizeyi bulur. Dışarıdaki kod filtrelemeye özen gösterir.

(?=(.*?)(?=(.*))(?<=^(?!.*\1(?!\2$)).*))
  • İpler üst üste gelebildiğinden, her şeyi ön plana alarak çevreliyim (?=...).
  • (.*?) en kısa alt dize aramaları
  • (?=(.*)) Geçerli konumu işaretlemek için dizenin geri kalanını yakalar.
  • (?<=^(?!.*\1(?!\2$)).*)(?<=.*)uzunluk kontrolünü geçmesine izin veren uygulama hatalarından yararlanan değişken uzunluklu bir arkaya öykünme öyküsüdür .
  • (?!.*\1(?!\2$))basitçe, aynı alt dize başka bir yerde bulamadığınızı kontrol eder. Alt (?!\2$)dizinin eşleştiği orijinal konumu reddeder.

    Dışa bakan etraflı yapının sınırı iç içe dönük etrafa dayanıklı yapı için geçerli değildir. Bu nedenle, yuvalanmış negatif ileriye bakma(?!.*\1(?!\2$)) gerçekte sadece geriye doğru bakanlığın sınırına kadar değil, tüm dizgiyi kontrol eder.


2

Rebol, 136 bayt

f: func[s][repeat n length? b: copy s[unless empty? x: collect[forall s[unless find next find b t: copy/part s n t[keep t]]][return x]]]

Ungolfed:

f: func [s] [
    repeat n length? b: copy s [
        unless empty? x: collect [
            forall s [
                unless find next find b t: copy/part s n t [keep t]
            ]
        ][return x]
    ]
]

Kullanım örneği:

>> f ""       
== none

>> f "abcaa"
== ["b" "c"]

>> f "rererere"
== ["ererer"]

>> f "asdfasdfd"
== ["fa" "fd"]

>> f "ffffhhhhfffffhhhhhfffhhh"
== ["hffff" "fffff" "hhhhh" "hfffh"]

>> f "asdfdfasddfdfaddsasadsasadsddsddfdsasdf"
== ["fas" "fad" "add" "fds"]


NB. Sanırım kodun kalbi, findparçanın nasıl çalıştığı. Umarım bu açıklamaya yardımcı olur ...

>> find "asdfasdfd" "df"
== "dfasdfd"

>> next find "asdfasdfd" "df"
== "fasdfd"

>> find next find "asdfasdfd" "df" "df"
== "dfd"

>> ;; so above shows that "df" is present more than once - so not unique
>> ;; whereas below returns NONE because "fa" found only once - ie. bingo!

>> find next find "asdfasdfd" "fa" "fa"
== none

1

Haskell, 119

f s=[r|n<-[1..length s],l<-[map(take n)$take(length s-n+1)$iterate(drop 1)s],r<-[[j|j<-l,[j]==[r|r<-l,r==j]]],r/=[]]!!0

bir q = lengthyere koyabilir ve kullanabilir q, bazı baytları tıraş edebilirsiniz
RobAu

1

Brachylog , 10 bayt

sᶠ≡ᵍ~gˢlᵍt

Çevrimiçi deneyin!

sᶠ            The list of every substring of the input
  ≡ᵍ          grouped by identity,
    ~gˢ       with length-1 groups converted to their elements and other groups discarded,
       lᵍ     and grouped by their length,
         t    has the output as its last group.

Her ne kadar yerine her bir değerin ilk geçtiği göre grupları sipariş ile bu grupların değeriyle değil, doğal olarak sıralama yapar, her uzunluğunun ilk oluşumları azalan içindedir. Eşsizliğin filtrelenmesinin bunu mahvetemediğinden% 100 emin değilim, ancak henüz başarısız olan bir test vakası bulamadım.


1

05AB1E , 10 bayt

Œʒ¢}é.γg}н

Boş bir dize için hiçbir şey çıkarmaz.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Π          # Get all substrings of the (implicit) input-String
 ʒ          # Filter it by:
  ¢         #  Count how many times the current substring occurs in the (implicit) input-String
            #  (only 1 is truthy in 05AB1E, so the filter will leave unique substrings)
          # After the filter: sort the remaining substrings by length
     g}   # Then group them by length as well
         н  # And only leave the first group containing the shortest substrings
            # (which is output implicitly as result)

Bu, 05AB1E’nin sadece 1hakikaten değere sahip olması ve diğer her şeyin yanıltıcı olmasını sağlar . En kısa benzersiz alt tablonun, tüm olası girdi dizgilerinde tam olarak bir kez gerçekleşmesi garanti edilir. (Sadece aynı karakterleri içeren bir giriş-string (yani İçin aaaaa), alt dize olarak girdi-dizeleri kendisi sonucudur bu yüzden sadece bir kez meydana gelir ["aaaaa"]. Bir giriş-dize için yani (pattern tekrarlayarak ile "abcabc"), yine benzersiz altdizgelerin olduğunu sadece bir kez ortaya çıkar ( ["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]), bu sonuçlanacaktır ["ca"].)


0

Python 2, 150

import re
a=input()
r=range
l=len(a)
d=0
for i in r(l):
 if d:break
 for j in r(l-i):
  k=a[j:i+j+1]
  if len(re.findall("(?="+k+")",a))<2:d=1;print k

Gri alan yazdırmalı "", ancak hiçbir şey yazdırmıyorsunuz.
Jakube

1
@Jakube "Çıktının tam formatı esnek"
KSFT

Ancak hiç bir çıktınız yok.
Jakube

2
@Jakube Çıktı, olması gerektiği gibi, boş dizedir. Sadece bununla ilgili alıntılarım yok.
KSFT

1
@Jakube Buna izin vereceğim, çünkü boş dize zaten özel bir durum.
Zgarb

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.