สั้นที่สุดระบุสารตั้งต้น


23

รับรายการสตริงแทนที่แต่ละสตริงด้วยหนึ่งในสตริงย่อยที่ไม่ว่างซึ่งไม่ใช่สตริงย่อยของสตริงอื่นใดในรายการและสั้นที่สุดเท่าที่จะทำได้

ตัวอย่าง

ได้รับรายการ["hello","hallo","hola"], "hello"ควรจะถูกแทนที่โดยเพียงแค่"e"เป็น substring นี้ไม่ได้มีอยู่ใน"hallo"และ"hola"และมันก็เป็นที่สั้นที่สุด "hallo"จะถูกแทนที่ด้วยอย่างใดอย่างหนึ่ง"ha"หรือ"al"และ"hola"โดยใด ๆ ของ"ho", หรือ"ol""la"

กฎระเบียบ

  • คุณสามารถสันนิษฐานได้ว่าสตริงนั้นจะต้องไม่ว่างเปล่าและมีอักขระที่เป็นตัวอักษรของเคสเดียวกันเท่านั้น
  • คุณสามารถสันนิษฐานได้ว่ามีสตริงย่อยดังกล่าวอยู่ในแต่ละสตริงในรายการนั่นคือไม่มีสตริงใดในรายการที่จะเป็นสตริงย่อยของสตริงอื่น ๆ
  • อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่เหมาะสม
  • นี่คือดังนั้นพยายามใช้ให้น้อยที่สุดในภาษาที่คุณเลือก

กรณีทดสอบ

มีเพียงหนึ่งเอาต์พุตที่เป็นไปได้สำหรับกรณีส่วนใหญ่

["ppcg"] -> ["p"] (or ["c"] or ["g"])
["hello","hallo","hola"] -> ["e","ha","ho"]
["abc","bca","bac"] -> ["ab","ca","ba"]
["abc","abd","dbc"] -> ["abc","bd","db"]
["lorem","ipsum","dolor","sit","amet"] -> ["re","p","d","si","a"]
["abc","acb","bac","bca","cab","cba"] -> ["abc","acb","bac","bca","cab","cba"]

เกี่ยวข้อง: สตริงย่อยที่ระบุสั้นที่สุด - แนวคิดที่คล้ายกัน แต่มีกฎที่เกี่ยวข้องมากกว่าและรูปแบบที่ยุ่งยาก


เหตุใด isnt ""(สตริงว่าง) ระบุเฉพาะ"ppcg"กรณีเดียว?
MooseBoys

2
@MooseBoys รับรายการสตริงแทนที่แต่ละสตริงด้วยหนึ่งในสตริงย่อยที่ไม่ว่างเปล่า
Mr. Xcoder

คำตอบ:




4

Pyth , 12 ไบต์

mhf!ts}LTQ.:

ลองที่นี่!

มันทำงานอย่างไร

Basicaly กรอง substrings ของแต่ละที่เกิดขึ้นในหนึ่งในสายในรายการ (นั่นคือมันเป็นเอกลักษณ์ของสตริงที่) และได้รับหนึ่ง

mhf!ts}LTQ.:     Full program, Q=eval(stdin_input())
m         .:     Map over Q and obtain all the substrings of each.
  f              And filter-keep those that satisfy (var: T)...
      }LTQ       ... For each string in Q, yield 1 if it contains T, else 0.
   !ts           ... Sum the list, decrement and negate. 
 h               Head. Yields the first valid substring, which is always the shortest.

4

Prolog (SWI) , 175 163 bytes

S/L/R:-sub_string(S,_,L,_,R).
[H|T]+[I|R]:-string_length(H,L),between(1,L,X),H/X/I,T+R.
R+R.
L-R:-L+R,forall(member(E,L),findall(_,(member(F,R),\+ \+ E/_/F),[_])).

ลองออนไลน์!

สิ่งที่นี่ส่วนใหญ่ควรจะค่อนข้างชัดเจน แต่:

คำอธิบาย

ลายเซ็น: ( += อินพุต, ?= เป็นตัวเลือก, -= เอาต์พุต, := นิพจน์)

  • sub_string(+String, ?Before, ?Length, ?After, ?SubString)
  • string_length(+String, -Length)
  • member(?Elem, ?List)
  • between(+Low, +High, ?Value)
  • findall(+Template, :Goal, -Bag)
  • forall(:Cond, :Action)

\+ \+เป็นเพียงnot not(เช่นแปลงตรงกับบูล (ในกรณีนี้ป้องกันได้จากการจับคู่ทั้งpในppcgแยกต่างหาก))


เครื่องมือที่เหมาะสมสำหรับงาน: P ยกเว้นความจริงที่ว่ามันเป็นใจ blowingly verbose
ASCII เท่านั้น


4

J , 30 29 25 ไบต์

1(|:(0{-.&,)"_1]\.)<\\.&>

ลองออนไลน์!

                   <\\.&>        a 3-dimensional array of substrings
1 |:                             transpose each matrix to sort the substrings by length
1              ]\.               all choices where one word is missing
    (0{-.&,)"_1                  for every matrix, flatten, remove substrings
                                  that are present in the corresponding complement,
                                  pick first


3

JavaScript (ES6), 93 ไบต์

a=>a.map(s=>(L=s.length,g=n=>a.every(S=>S==s|!~S.search(u=s.substr(n%L,n/L+1)))?u:g(n+1))(0))

ลองออนไลน์!

อย่างไร?

สำหรับแต่ละสายsของความยาวLในการป้อนข้อมูลอาร์เรย์a []และเริ่มต้นด้วยn = 0เราจะใช้ฟังก์ชันเวียนกรัม ()เพื่อสร้างสตริงทั้งหมดUของsด้วย:

u = s.substr(n % L, n / L + 1)

ตัวอย่างเช่นด้วยs = "abc"และL = 3 :

 n | n%L | floor(n/L+1) | u
---+-----+--------------+-------
 0 |  0  |       1      | "a"
 1 |  1  |       1      | "b"
 2 |  2  |       1      | "c"
 3 |  0  |       2      | "ab"
 4 |  1  |       2      | "bc"
 5 |  2  |       2      | "c"
 6 |  0  |       3      | "abc"
 7 |  1  |       3      | "bc"
 8 |  2  |       3      | "c"

วัสดุพิมพ์บางรายการสร้างขึ้นหลายครั้ง แต่ไม่เป็นไร สิ่งที่สำคัญก็คือว่าสตริงทุกความยาวNได้รับการสร้างขึ้นก่อนที่ย่อยใด ๆ ของความยาวN + 1

เราหยุดกระบวนการทันทีที่ไม่พบuในสตริงS อื่น ๆใน[]ซึ่งรับประกันได้ว่าจะเกิดขึ้นเมื่อu == sในกรณีที่แย่ที่สุดตามกฎการท้าทาย # 2:

ไม่มีสตริงในรายการจะเป็นสตริงย่อยของสตริงอื่น ๆ

ดังนั้นในตัวอย่างข้างต้นขั้นตอนที่7และ8จะไม่ถูกประมวลผลจริง


2

PowerShell , 107 ไบต์

($a=$args)|%{$(for($i=0;$i++-lt($g=($s=$_)|% Le*)){0..($g-$i)|%{$s|% s*g $_ $i}|?{!($a-match$_-ne$s)}})[0]}

ลองออนไลน์!

คำอธิบาย

สำหรับแต่ละสตริงที่ให้มา (และกำหนดทั้งอาร์เรย์ให้กับ$a):

  • ทำforห่วงมากกว่ากันยาว substring (1 based) ของสตริง (กำหนดสตริงตัวเองไป$sและระยะเวลาในการ$g)
  • สำหรับแต่ละความยาว ( $i):
    • ทำดัชนีลูปจาก 0 ถึงความยาว - $iจากนั้นสำหรับแต่ละดัชนี:
      • รับค่าสตริงย่อยของสตริงปัจจุบัน ( $s) ที่ตำแหน่ง$_(ดัชนี) และความยาว$i
      • ผ่านสตริงย่อยนั้นไปที่Where-Object( ?) และส่งคืนถ้า:
        • ชุดย่อยของอาร์เรย์ ( $a) ที่ไม่มีสตริงปัจจุบัน$sไม่มีการจับคู่สำหรับสตริงย่อยปัจจุบัน$_

กลับมาที่ระดับสตริงเรามีสตริงย่อยทั้งหมดของสตริงนี้ที่ไม่พบในรายการอื่นดังนั้นใช้อันแรก[0]เนื่องจากเราต้องการเพียงหนึ่งในนั้นแล้วต่อด้วยสตริงถัดไป


0

C # (Visual C # Interactive Compiler) , 149 ไบต์

a=>a.Select(s=>{var t=s;for(int j=0,k,l=s.Length;j++<l;)for(k=-1;j+k++<l;)if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())j=k=l;return t;})

ลองออนไลน์!

น้อย golfed ...

// a is an input array of strings
a=>
  // iterate over input array   
  a.Select(s=>{
    // t is the result string
    var t=s;
    // j is the substring length
    for(int j=0,k,l=s.Length;j++<l;)
      // k is the start index
      for(k=-1;j+k++<l;)
        // LINQ query to check if substring is valid
        // the tested string is collected in t
        if(!a.Where(u=>s!=u&u.Contains(t=s.Substring(k,j))).Any())
          // break loops
          j=k=l;
    // return result
    return t;
  })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.