สตริงย่อยที่ไม่ซ้ำกันสั้นที่สุด


29

อินพุต

sสตริงตัวอักษรและตัวเลข

เอาท์พุต

สตริงที่สั้นที่สุดที่เกิดขึ้นครั้งว่าเป็น (ติดกัน) substring sใน การซ้อนทับที่เกิดขึ้นนับว่าแตกต่างกัน หากมีผู้สมัครหลายรายที่มีความยาวเท่ากันคุณจะต้องส่งออกทั้งหมดตามลำดับที่ปรากฏ ในความท้าทายนี้สตริงว่างเกิดขึ้นครั้งในสตริงของความยาวn + 1n

ตัวอย่าง

พิจารณาสตริง

"asdfasdfd"

สตริงว่างเกิดขึ้น 10 ครั้งดังนั้นจึงไม่ใช่ตัวเลือกสำหรับการเกิดที่ไม่ซ้ำกัน แต่ละตัวอักษร"a", "s"และ"d", "f"เกิดขึ้นอย่างน้อยสองครั้งจึงไม่ได้เป็นผู้สมัคร สตริงย่อย"fa"และ"fd"เกิดขึ้นเพียงครั้งเดียวและตามลำดับนี้ในขณะที่สตริงย่อยอื่นที่มีความยาว 2 เกิดขึ้นสองครั้ง ดังนั้นผลลัพธ์ที่ถูกต้องคือ

["fa","fd"]

กฎระเบียบ

อนุญาตให้ใช้ทั้งฟังก์ชั่นและโปรแกรมเต็มรูปแบบและช่องโหว่มาตรฐานไม่ได้ การจัดรูปแบบที่แน่นอนของผลลัพธ์มีความยืดหยุ่นด้วยเหตุผล โดยเฉพาะอย่างยิ่งไม่อนุญาตให้สร้างเอาต์พุตสำหรับสตริงว่างเปล่า แต่การโยนข้อผิดพลาดไม่ใช่ จำนวนไบต์ต่ำสุดชนะ

กรณีทดสอบ

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

ลีดเดอร์บอร์ด

นี่คือลีดเดอร์บอร์ดตามภาษาที่ฉันสัญญา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


ข้อ จำกัด ใด ๆ ของฟังก์ชั่นในตัว combinatorial?
Martin Ender

3
@ MartinBüttnerในความท้าทายนี้ทุกอย่างเป็นไป หากนี่เป็นคำตอบที่เพียงพอฉันจะจัดลีดเดอร์บอร์ดแยกตามภาษาดังนั้นแม้แต่ภาษาที่มีอุปกรณ์ครบครันก็อาจมีการแข่งขันที่มีความหมาย
Zgarb

คุณต้องการใช้ข้อมูลโค้ดลีดเดอร์บอร์ดกอล์ฟของฉันหรือไม่ จากนั้นคุณจะไม่ต้องตรวจสอบการแก้ไขทั้งหมดเพื่อทำให้กระดานผู้นำเป็นปัจจุบัน ถ้าคุณทำฉันสามารถเพิ่มให้คุณและฉันจะทำตามคำตอบเพื่อให้ตรงกับรูปแบบส่วนหัว
Martin Ender

@ MartinBüttnerขอบคุณฉันขอขอบคุณ!
Zgarb

เสร็จเรียบร้อย! แจ้งให้เราทราบหากมีบางสิ่งไม่ทำงาน (อย่าลังเลที่จะนำมาใช้ซ้ำสำหรับความท้าทายของคุณในอนาคต)
Martin Ender

คำตอบ:


3

Pyth, 27 26 ไบต์

&zhfTmf!/>zhxzYYm<>zkdUzUz

ลองที่นี่

โปรดทราบว่าเนื่องจากบั๊กในคอมไพเลอร์ออนไลน์กรณีสตริงว่างจะทำงานได้อย่างถูกต้องในเวอร์ชันบรรทัดคำสั่งซึ่งสามารถพบได้ที่นี่

นอกจากนี้คุณยังสามารถแก้ไขข้อผิดพลาดโดยให้ newline เป็นอินพุตสำหรับคอมไพเลอร์ออนไลน์

คำอธิบาย:

                                   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.

ล้มเหลวในการป้อนสตริงที่ว่างเปล่า
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ฉันคิดว่านั่นเป็นข้อผิดพลาดในคอมไพเลอร์ออนไลน์จริงๆ มันทำงานบนรุ่นบรรทัดคำสั่ง อันที่จริงแล้วzไม่มีการป้อนข้อมูลล้มเหลวทางออนไลน์ดังนั้นจึงเป็นข้อผิดพลาดในล่าม
isaacg


@Optimizer Pyth คาดว่าอินพุตที่ยกเลิกบรรทัดใหม่ซึ่งอาจเป็นสิ่งที่ผิดพลาด
isaacg

ดังนั้นการส่งผ่านสตริงว่างเปล่าจึงเป็นไปไม่ได้เลยเหรอ?
เครื่องมือเพิ่มประสิทธิภาพ

13

Python 3, 124 123 111 96 ไบต์

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)

ค้นหาสายอักขระที่เกิดขึ้นครั้งแรกจากทางซ้ายเหมือนกันกับที่เกิดขึ้นครั้งแรกจากทางด้านขวา +1ในrangeเพื่อรองรับสำหรับกรณีสตริงที่ว่างเปล่า

ทีนี้ถ้ามีเพียงไพ ธ อนที่มีการ.count()นับการแข่งขันที่ทับซ้อนกันการแข่งขันนี้จะสั้นกว่านี้เล็กน้อย


6

Mathematica, 95 94 79 ไบต์

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

StringCasesทำให้ฉันมีสารตั้งต้นที่เป็นไปได้ทั้งหมดTallyและCasesกรองสิ่งที่ปรากฏมากกว่าหนึ่งครั้งและMinimalByค้นหาสิ่งที่สั้นที่สุด


ไม่ได้มีเป็นพิเศษ&ในตอนท้ายของรหัส?
David G. นกกระสา

เจ้าเร็วมาก!
David G. นกกระสา

4

GolfScript ขนาด 44 ไบต์

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

จะเข้าเป็นสตริงใน stdin และผลในไวยากรณ์ดับเบิลอาร์เรย์: [["b"] ["c"]]เช่น การสาธิตออนไลน์

การผ่า

: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

สิ่งนี้ถูกจัดเรียงไว้โดยไม่จำเป็นต้องมีตัวพิมพ์พิเศษสำหรับสตริงว่าง (ซึ่งฉันได้รวมไว้ในกรณีทดสอบในการสาธิตออนไลน์ที่ลิงก์ด้านบน)


3

CJam, 52 43 40 ไบต์

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

อินพุตคือสตริงที่ไม่มีเครื่องหมายคำพูด

คำอธิบาย :

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

ตัวอย่าง:

asdfdfasddfdfaddsasadsasadsddsddfdsasdf

เอาท์พุต

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

ลองออนไลน์ได้ที่นี่


3

สกาลา, 120 ไบต์

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

ฉันเริ่มด้วย 140 ซึ่งอย่างน้อยก็พอดีกับทวีต

(                                        // 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
)

ฉันสงสัยหรือไม่ ทำไมไม่(_)ทำงานเป็นตัวตนแทนl=>l?
ภูมิใจ Haskeller

ฉันก็สงสัยเช่นกัน อย่างใดเป็นเช่นเดียวกับlist.groupBy(_) x => list.groupBy(x)ฉันไม่รู้ว่าทำไมพวกเขาถึงใช้มันอย่างนั้น
Dominik Müller

3

JavaScript (ES6), 109 110

แก้ไขการค้นหาแทน indexOf เนื่องจากสตริงอินพุตเป็นตัวอักษรและตัวเลข ขอบคุณ @IsmaelMiguel

ฟังก์ชั่นแบบเรียกซ้ำมองหาวัสดุตั้งต้นที่มีความยาว 1 ขึ้นไป

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และอธิบาย

 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

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

เอาท์พุต

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

ใช้.searchแทน.indexOfและคุณบันทึก 2 ไบต์
Ismael Miguel

@IsmaelMiguel ไม่เพราะ 1) การค้นหาไม่มีพารามิเตอร์ตรงข้าม 2) การค้นหาคาดหวังว่า regexp และจะล้มเหลวด้วยตัวอักษรพิเศษเช่น * [] และอื่น ๆ
edc65

1
แต่ในครั้งแรกที่คุณได้อย่างปลอดภัยสามารถแทนที่ (บนs.indexOf(a)+1) แม้ว่ามันจะไม่ทำงานกับตัวอักษรเหล่านั้น แต่คุณไม่ต้องกังวล! การอ้างอิง OP: " Input: An alphanumeric string s."
Ismael Miguel

@IsmaelMiguel ใช่ไหมขอบคุณ พลาดข้อ จำกัด 'ตัวอักษรและตัวเลข'
edc65

1
@IsmaelMiguel ฉันไม่พบวิธี ... ฉันต้องการความจริงหรือเท็จและอาเรย์ใด ๆ (แม้ว่างเปล่า []) เป็นค่าความจริงในจาวาสคริปต์
edc65

3

Java, 168 176 233

ต่อไปนี้เป็นตัวอย่างลูปพื้นฐานที่ซ้อนกัน

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

หรืออ่านเพิ่มเติมได้อีกเล็กน้อย :

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

หากคุณต้องการอ่านแยก+++ขึ้นเพื่อแสดงไม่ว่าจะเป็น+ ++หรือ++ +จะช่วย ... และถ้าคุณต้องการที่จะบันทึกไบต์อีกไม่กี่อาจจะมีวิธีการที่จะทำเช่นนั้นโดย initialising q=1แทนที่q++ด้วยq=tและเปลี่ยนกับสิ่งที่ต้องการl++<t&q<1 t>l+=qอาจต้องใช้การปรับค่าชดเชยอย่างน้อยหนึ่งหรือสองค่าเพื่อให้ทำงานได้
ปีเตอร์เทย์เลอร์

@ Peter ดีโดยผมสามารถอ่านได้หมายความว่าส่วนใหญ่ "ผมไม่ได้มีการเลื่อนในแนวนอน" +++แต่ฉันชี้แจง ฉันพยายามปรับแต่ง (โดยเฉพาะอย่างยิ่งqซึ่งรู้สึกสิ้นเปลืองบ้าง) แต่ยังไม่พบสิ่งใดที่แข็ง
Geobits

@PeterTaylor เนื่องจากกฎ lexing ชวามักจะหายไป+++ ++ +
FUZxxl

@FUZxxl ฉันสงสัยว่าแม้แต่ผู้ใช้ Java ส่วนใหญ่ก็รู้เรื่องนี้และมีคนจำนวนมากในไซต์นี้ที่ไม่รู้จัก Java
ปีเตอร์เทย์เลอร์

1
ใช้ indexOf กับชดเชยแทน lastIndexOf ควรจะตัด 1 ไบต์ (ดูคำตอบจาวาสคริปต์ของฉัน)
edc65

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)

วิธีใช้:

f "asdfdfasddfdfaddsasadsasadsddsddfdsasdf"

ซึ่งจะช่วยให้:

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

Btw ฉันเกลียดบรรทัดสุดท้ายของรหัส (การซ้ำซ้อนh y) มีใครแนะนำให้กำจัดมัน?


1
คุณให้คำจำกัดความเกี่ยวกับg y=q(minimum.(map l)$y)$y(คือวงเล็บที่map lจำเป็นต้องใช้จริง ๆ ไหม?) แล้วf=g.concat.q 1.group.sort.concatMap inits.tails?
FUZxxl

1
ใช้>>=แทนconcatMapคือf x=p$concat$q 1$group$sort$(tails x>>=inits)ประหยัด 2 ไบต์ ทำไมต้องData.Ordนำเข้า
nimi

1
ในวงเล็บqไม่จำเป็นเนื่องจากคุณสามารถเขียนfilter$(==)k.lเป็นเป็นคนสุดท้าย$และช่องว่างก่อนที่ในy pนอกจากนี้คุณยังสามารถลบเครื่องหมายอัฒภาคหลังจากการนำเข้า ( Data.Ordดูเหมือนไม่จำเป็นจริงๆ)
Zgarb

คอมไพเลอร์ Leksah ไม่ยอมรับ$ตามด้วยช่องว่าง มันจะโกนของบางไบต์ แต่มันอยู่ในสเป็คภาษา?
RobAu

1
GHC จะยอมรับมัน
Zgarb

3

J, 61 58 44 42 40 38 37 ไบต์

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

นี่คือรุ่นที่แบ่งออกเป็นแต่ละองค์ประกอบของการแก้ปัญหา:

unqs =. ~. #~ 1 = #/.~               NB. uniques; items that appear exactly once
allsbsq =. #\ <@unqs@(]\) ]        NB. all unique subsequences
shrtsbsq =. [: >@{.@(#~ #@>) allsbsq NB. shortest unique subsequence
  • x #/. yคำนวณสำหรับแต่ละองค์ประกอบที่แตกต่างกันในวิธีการที่มักจะอยู่ในที่เกิดขึ้นในx yหากเราใช้สิ่งนี้เป็นy #/. yเราจะได้รับองค์ประกอบที่แตกต่างกันในyการนับ ยกตัวอย่างเช่นa #/. aสำหรับอัตราผลตอบแทนa =. 1 2 2 3 4 41 2 1 2
  • 1 = yการตรวจสอบซึ่งรายการจะเท่ากับy 1ยกตัวอย่างเช่นอัตราผลตอบแทน1 = a #/. a1 0 1 0
  • u~เป็นสะท้อนuของคำกริยาเอก นี้คือเป็นเช่นเดียวกับu~ y y u yดังนั้นจึงเป็นเช่นเดียวกับ#/.~ y #/.~ yเมื่อนำไปใช้กับคำกริยา dyadic, u~เป็นเรื่อย ๆuของ นั่นคือเป็นเช่นเดียวกับx u~ y y u xสิ่งเหล่านี้ถูกใช้ในสถานที่อื่นไม่กี่ที่ฉันไม่ได้กล่าวถึง
  • ~. yคือนับของyเวกเตอร์ที่มีซ้ำกันลบออก ยกตัวอย่างเช่นอัตราผลตอบแทน~. a1 2 3 4
  • x # y( สำเนา ) เลือกจากyรายการในดัชนีที่มีx1
  • ดังนั้น(1 = y #/. y) # (~. y)สร้างเวกเตอร์ขององค์ประกอบเหล่านั้นyซึ่งปรากฏเพียงครั้งเดียว ในสัญลักษณ์โดยนัยคำกริยานี้เขียนเป็น~. #~ 1 = #/.~; เราจะเรียกวลีนี้ว่าunqsคำอธิบายที่เหลือ
  • x ]\ yสร้างxโดย1 + y - xอาร์เรย์ของทุกinfixesของเวกเตอร์ของความยาวy xตัวอย่างเช่น3 ]\ 'asdfasdfdผลผลิต

    asd
    sdf
    dfa
    fas
    asd
    sdf
    dfd
    
  • # yเป็นคะแนนของy, ที่อยู่, yจำนวนขององค์ประกอบใน

  • u\ yนำไปใช้uกับแต่ละคำนำหน้าyของ อนึ่ง#\ yสร้างเวกเตอร์ของจำนวนเต็มจากไป1#y
  • < yใส่yลงในกล่อง นี่เป็นสิ่งจำเป็นเพราะอาร์เรย์ไม่สามารถขาดและเราคำนวณอาร์เรย์ของคำต่อท้ายที่มีความยาวต่างกัน อาเรย์แบบบรรจุกล่องนับเป็นสเกลาร์
  • ดังนั้น(i. # y) <@:unqs@(]\) yสร้างเวกเตอร์ของ#yอาร์เรย์ชนิดบรรจุกล่องของความยาวk (สำหรับ 0 ≤ k <ทั้งหมด#y) infixes ของyที่เกิดขึ้นเพียงครั้งเดียว รูปแบบโดยปริยายของคำกริยานี้คือi.@# <@unqs@(]\) ]หรือi.@# <@(~. #~ 1 = #/.~)@(]\) ]ถ้าเราไม่ใช้unqsชื่อ เราจะเรียกวลีนี้ว่าallsbsqคำอธิบายที่เหลือ ตัวอย่างเช่นallsbsq 'asdfasdfd'อัตราผลตอบแทน:

    ┌┬─┬──┬───┬────┬─────┬──────┬───────┬────────┐
    ││ │fa│dfa│sdfa│asdfa│asdfas│asdfasd│asdfasdf│
    ││ │fd│fas│dfas│sdfas│sdfasd│sdfasdf│sdfasdfd│
    ││ │  │dfd│fasd│dfasd│dfasdf│dfasdfd│        │
    ││ │  │   │sdfd│fasdf│fasdfd│       │        │
    ││ │  │   │    │asdfd│      │       │        │
    └┴─┴──┴───┴────┴─────┴──────┴───────┴────────┘
    
  • (#@> y) # yใช้จากเวกเตอร์ของอาร์เรย์yที่ไม่ได้ว่างเปล่า

  • {. yyใช้เวลาองค์ประกอบแรกของเวกเตอร์
  • > yyเอากล่องจาก
  • ดังนั้นผลตอบแทนถัวเฉลี่ยไม่มีกล่องอาร์เรย์ที่ไม่ว่างเปล่าเป็นครั้งแรกจากเวกเตอร์ของอาร์เรย์ชนิดบรรจุกล่อง> {. (#@> y) # y yวลีนี้เขียนขึ้น>@{.@(#~ #@>)ในรูปแบบโดยปริยาย
  • สุดท้าย[: >@{.@(#~ #@>) allsbsqรวบรวมวลีก่อนหน้าด้วยallsbsqเพื่อสร้างวิธีแก้ไขปัญหาที่เรามี นี่คือวลีที่เต็มไปด้วยช่องว่าง:

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

2

Haskell, 135 ไบต์

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


$j=0คุณไม่จำเป็นต้องกำหนดอย่างชัดเจน substr($s,$j++,$i)ข้างหน้าคุณมี โดยไม่ต้องกำหนด$jคุณสามารถเขียนนี้substr($s,0+$j++,$i)และคุณประหยัด 2 ไบต์ ทำไมถึงเป็นอย่างนั้น? ดีเป็นครั้งแรกที่จะได้รับ$j nullและคุณจะได้อย่างมีประสิทธิภาพจะผ่านnullไปsubstrซึ่งผมไม่คิดว่าจะทำงานได้ดี การใช้0+$j++จะแปลงไปnull 0ถ้าคุณเห็นว่ามันไม่จำเป็นต้องทำต่อไปโดยไม่มีมันและเพียงแค่ถอดชิ้น$j=0ส่วนออก
Ismael Miguel

พยายามที่; มันไม่ได้ทำงานเพราะ PHP ไม่ได้มีการกำหนดขอบเขตที่แข็งแกร่งจึง$jไม่ได้ล้างและ reinitialised สำหรับทวนของแต่ละwhile()วง ดังนั้นในขณะที่มันเป็นโมฆะ (และด้วยเหตุนี้จะถูกแปลง0เป็น$j++สาย) เป็นครั้งแรกในรอบการทำซ้ำในอนาคตของวงรอบนอกมันจะถูกทิ้งไว้ที่ค่าเดิม การเริ่มต้นใหม่ไม่ใช่การรีเซ็ต ขอขอบคุณสำหรับข้อเสนอแนะ :-)
Stephen

ที่นี่ฉันให้คุณแก้ปัญหายาว 141 ไบต์: 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;}การเปลี่ยนแปลง: ลบทั้งหมดของคุณ||1ใช้ bitwise &( AND) แทน&&ในที่เดียวย้าย$j<$l&&[...]ส่วนนอกfor(บันทึก 2 ไบต์) และลบวงเล็บที่ไม่จำเป็นบางอย่าง
Ismael Miguel

1
หนึ่ง 134 ไบต์ของขวัญนานสำหรับคุณ: 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;}การเปลี่ยนแปลงที่เกิดขึ้นกับรหัสก่อนหน้านี้: ย้าย$b=substr($s,$j++,$i)เข้ามาstrpos($s,$b)ทำให้มันstrpos($s,$b=substr($s,$j++,$i))ออก parenthesys &ไม่จำเป็นมากขึ้นและลบที่ไม่จำเป็น
Ismael Miguel

1
จัดการสับเพิ่มเติม :-) substr($s,$j++,$i)ผลตอบแทน""เมื่อ$jถึงความยาวของสตริงและfalseหลังจากนั้นเพื่อให้การมอบหมายยังสามารถทำหน้าที่เป็นตัวแบ่งตามเงื่อนไขวง จากนั้นมีการใช้งาน$lที่เหลือเพียงครั้งเดียวเพื่อให้สามารถรวมได้เช่นกัน
สตีเฟ่น

2

Groovy (Java regex เกี่ยวกับการติดตั้ง Oracle), 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 regex ควรใช้งานได้กับ Java 6 ถึง Java 8 เนื่องจากข้อผิดพลาดที่ทำให้โค้ดข้างต้นไม่สามารถทำงานได้ ไม่แน่ใจสำหรับเวอร์ชั่นก่อนหน้านี้เนื่องจากมีข้อบกพร่องในการดูใน Java 5 ซึ่งได้รับการแก้ไขใน Java 6

regex ค้นหาสตริงที่สั้นที่สุดซึ่งไม่มีซับสตริงที่ซ้ำกันที่อื่นทุกตำแหน่งในสตริงอินพุต รหัสภายนอกดูแลการกรอง

(?=(.*?)(?=(.*))(?<=^(?!.*\1(?!\2$)).*))
  • (?=...)ตั้งแต่สายสามารถซ้อนทับกันฉันล้อมรอบสิ่งที่ทั้งในรูปลักษณ์ข้างหน้า
  • (.*?) ค้นหาจากสตริงย่อยที่สั้นที่สุด
  • (?=(.*)) จับส่วนที่เหลือของสตริงเพื่อทำเครื่องหมายตำแหน่งปัจจุบัน
  • (?<=^(?!.*\1(?!\2$)).*)เป็นการจำลองการมองความยาวแปรผันซึ่งใช้ประโยชน์จากบั๊กการนำไปใช้ซึ่งอนุญาตให้(?<=.*)ผ่านการตรวจสอบความยาว
  • (?!.*\1(?!\2$))เพียงตรวจสอบว่าคุณไม่พบสตริงย่อยเดียวกันที่อื่น (?!\2$)ปฏิเสธตำแหน่งเดิมที่ย่อยจะถูกจับคู่

    ขีด จำกัด ของโครงสร้างการมองด้านนอกไม่ได้ใช้กับโครงสร้างการค้นหาในแบบซ้อน ดังนั้นการค้นหาเชิงลบที่ซ้อนกัน(?!.*\1(?!\2$))จะตรวจสอบสตริงทั้งหมดจริง ๆ ไม่ใช่แค่ถึงขอบเขตด้านขวาของการค้นหา


2

Rebol ขนาด 136 ไบต์

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

ตัวอย่างการใช้งาน:

>> 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 ฉันคิดว่าหัวใจของรหัสคือfindส่วนที่ใช้งานได้อย่างไร หวังว่านี่จะช่วยอธิบาย ...

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

คุณสามารถวางที่q = lengthใดที่หนึ่งและใช้งานqได้โกนออกเป็นบางไบต์
RobAu

1

Brachylogขนาด 10 ไบต์

sᶠ≡ᵍ~gˢlᵍt

ลองออนไลน์!

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.

แม้ว่าจะไม่ได้เรียงตามค่าที่กลุ่มจัดเรียงไว้ แต่การเรียงลำดับกลุ่มตามการเกิดขึ้นครั้งแรกของแต่ละค่าการเกิดขึ้นครั้งแรกของทุกความยาวจะลดลงตามลำดับ ฉันไม่แน่ใจ 100% ว่าการกรองที่มีลักษณะเฉพาะไม่สามารถทำให้เกิดปัญหาได้ แต่ฉันยังไม่ได้ทดสอบกรณีนี้ล้มเหลว


1

05AB1E , 10 ไบต์

Œʒ¢}é.γg}н

แสดงผลอะไรสำหรับสตริงว่าง

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Œ           # 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)

สิ่งนี้ใช้ประโยชน์จากการที่ 05AB1E มีเพียง1ค่าความจริงเท่านั้นและทุกอย่างอื่นเป็นเท็จ สตริงย่อยที่สั้นที่สุดที่ไม่ซ้ำกันจะรับประกันว่าจะเกิดขึ้นเพียงครั้งเดียวเสมอสำหรับอินพุตสตริงที่เป็นไปได้ทั้งหมด (สำหรับอินพุต - สตริงที่มีอักขระเหมือนกันเท่านั้น (เช่นaaaaa) อินพุต - สตริงเองเป็นซับสตริงเกิดขึ้นเพียงครั้งเดียวดังนั้นผลลัพธ์คือ["aaaaa"]สำหรับอินพุต - สตริงที่มีรูปแบบการทำซ้ำ (เช่น"abcabc") ยังคงมีสตริงย่อยที่ไม่ซ้ำกันเท่านั้น เกิดขึ้นหนึ่งครั้ง ( ["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]) ดังนั้นสิ่งนี้จะส่งผลให้["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

พื้นที่สีเทาควรพิมพ์""แต่คุณไม่พิมพ์อะไรเลย
Jakube

1
@Jakube "การจัดรูปแบบที่แน่นอนของเอาต์พุตมีความยืดหยุ่น"
KSFT

แต่คุณไม่มีผลลัพธ์เลย
Jakube

2
@Jakube ผลลัพธ์เป็นสตริงว่างเปล่าเหมือนกับที่ควรจะเป็น ฉันแค่ไม่มีคำพูดล้อมรอบมัน
KSFT

1
@ Jakube ฉันจะอนุญาตนี้เนื่องจากสตริงว่างเป็นกรณีพิเศษต่อไป
Zgarb

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.