สตริงการสร้างที่สั้นที่สุด


16

สตริงx สร้างสตริงyถ้าyเป็น substring xของซ้ำไม่มีที่สิ้นสุดของ ยกตัวอย่างเช่นสร้างabcbcabcab

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

อินพุต

bcabcabca

เอาท์พุต

abc

รหัสที่สั้นที่สุดชนะ คุณอาจสันนิษฐานว่าการป้อนข้อมูลมีเพียงตัวอักษร az (และขึ้นบรรทัดใหม่ต่อท้ายหากคุณต้องการ)


ผลลัพธ์ควรอยู่ในลำดับใด ๆ สมมติว่าเอาต์พุตสามารถเป็นbacตัวอย่างของคุณได้มากกว่าabc?
Ant's

@GroovyUser: ไม่อินพุตไม่ได้เป็นสตริงย่อยของรูปแบบซ้ำ ๆ ของbacs
Keith Randall

แต่การป้อนข้อมูลที่อาจประกอบด้วยอักขระย่อยของ(bca)^nซึ่งหมายความว่าเป็นเพียงเป็นที่ถูกต้องตัวอย่างเช่นกำหนดเป็นbca abc
JAB

1
@JAB: bcaไม่ใช่พจนานุกรมที่เล็กที่สุด
Keith Randall

อาฉันพลาดส่วนนั้นไป
JAB

คำตอบ:


9

Ruby 1.9, 40 ตัวอักษร

gets;a=?a;a.next!until(a*~/$/)[$_];$><<a

สมมติว่าอินพุตไม่ได้ถูกยกเลิกด้วยการขึ้นบรรทัดใหม่ นอกจากนี้มันอาจช้าขันเพื่อผลลัพธ์ที่ใหญ่ขึ้น

$ echo -n "bcabcabca" | ruby genlex.rb 
abc
$ echo -n "barfoobarfoobarfoo" | ruby1.9 genlex.rb 
arfoob

2

Python 88 185 ตัวอักษร

import re
s=raw_input()
m=s.index(min(s))
s=s[m:]+s[:m]
i=0
while s.replace(s[:i],''):i+=1
m=min(s[:i])
s=re.findall('%s[\w]*?(?=%s|$)'%(m,m),s[:i])
m=s.index(min(s))
print ''.join(s[m:]+s[:m])

เอาท์พุท:

bcabcabca
abc

aaa
a

abc
abc

cccbbcccbbcccbb
bbccc

barfoofoobarfoofoo
arfoofoob

bacabac
abacbac

ไม่ให้สตริงที่เล็กที่สุดในพจนานุกรมสำหรับอินพุตบางตัวเช่น "bacabac"
Howard

@Howard คุณพูดถูก ฉันได้อัปเดตโค้ดของฉันแล้วมันจะนานกว่านี้ แต่จัดการกับสตริงbacabacอย่างถูกต้อง
เวเดอร์

"abac" จะถูกต้องโปรดดูที่คำตอบของ @ yogsototh: bacabac abac
Howard

2

Haskell, 299 128 ตัวอักษร

import Data.List
main=interact(\z->minimum$filter(\w->isInfixOf z$concat$replicate(length z)w) $filter((/=)"")$inits=<<tails z)

ขอบคุณ jloy! ตอนนี้เวอร์ชันสั้นกว่ามากและฉันเชื่อว่าถูกต้อง


1
ดังนั้นข่าวดีก็คือว่ามันเป็นไปได้ที่จะตีกอล์ฟโซลูชั่นนี้ลงไปประมาณ 91 ตัวอักษรถ้าคุณยอมรับการป้อนข้อมูลใน stdin เช่นเดียวกับในวิธีการแก้ปัญหาทับทิม Ventero ของ น่าเสียดายที่อินพุตcabcabcabcสร้างabcabcขึ้นดังนั้นโซลูชันนี้จึงไม่ค่อยมี ฉันคิดว่าคุณจะต้องแก้ไขq++q++qเพื่อให้ได้ผลลัพธ์ที่ต้องการ ความพยายามอย่างรวดเร็วของฉันในการแก้ไขสิ่งต่าง ๆ ที่กระแทกกลับไปถึง 145 ตัวอักษร (สปอยเลอร์อยู่ที่นี่: gist.github.com/1035161 )

ขอบคุณ! ฉันไม่รู้เกี่ยวกับการโต้ตอบและไม่เคยคิดเลยว่า inits << = ก้อยเพื่อรับสตริงย่อยทั้งหมด ฉันแก้ไขเวอร์ชันของคุณเล็กน้อยเพื่อรับอักขระ ฉันลบการเรียงลำดับและเปลี่ยนแปลงตัวกรอง (ไม่ใช่. null) โดยตัวกรอง ((/ =) "") ขอบคุณอีกครั้ง!
yogsototh

ทำไมคุณถึงต้องการ(/=)""สภาพ ดูเหมือนจะไม่ทำอะไรเลย นอกจากนี้การกำจัด lambdas ช่วย: คุณสามารถกำจัด w ทั้งหมดโดยใช้.โอเปอเรเตอร์และเปลี่ยนฟังก์ชั่นหลักmain=interact sเป็นบันทึกอักขระสองสามตัว
Rotsor

ฉันคิดว่าคำตอบสำหรับ "bca" นั้นผิด ควรเป็น "abc" แต่เป็น "bca" ในขณะนี้
Rotsor

ทางออกหนึ่งที่เป็นไปได้ที่จะใช้แทนpermutations tails
Rotsor

2

Python 121 137 129 ตัวอักษร

s=raw_input()
n=len(s)
l=[(s+s)[i/n:i/n+i%n+1]for i in range(n*n)]
print min(filter(lambda x:(x*len(s)).find(s)+1,sorted(l)),key=len)

แก้ไข: แก้ไขข้อบกพร่องที่พบโดย JiminP


ว้าวมันเยี่ยมมาก! น่าเสียดายที่มันพิมพ์aababเป็นสตริงababa... :(
JiminP

ตกลงซ่อม ... มันใช้เวลานานกว่า :(
Jules Olléon

2

ทับทิม 1.9, 36

$><<(?a..gets).find{|s|(s*~/$/)[$_]}

ใช้วิธีการเดียวกับโซลูชันของ Ventero


2

งูหลาม 161 159 166 140 141 134 132 ตัวอักษร

y=raw_input();i=n=l=len(y)
while i:
 if (y[:i]*l)[:l]==y:n=i
 i-=1
x=y[:n];y=x*2
while i<n:
 x=min(x,y[i:i+n])
 i+=1
print x

แก้ไข : Golfed รหัสหลังจากอ่านความคิดเห็นของ Jules Olléon ลบ 'บั๊ก' ที่ให้bcdabcdabผลลัพธ์abbcออก

EDIT2 : แก้ไขข้อผิดพลาด ( abaaผลลัพธ์ในaaa) เห็นจูลส์Olléon

ฉันไม่รู้เกี่ยวกับ Python ดังนั้นรหัสนี้น่าจะเป็น 'ไม่เล่นกอล์ฟ'

ฉันรักกฎนี้

คุณอาจจะสมมติว่าการป้อนข้อมูลมีเพียงตัวอักษร az ...

อินพุตและเอาต์พุต

bcdabcd
abcd

bcabcabca
abc


abcdabcd
abcd

bcdabcdab
abcd

barfoofoobarfoofoobar
arfoofoob

cccbbcccbbcccbb
bbccc

aaaaaaaaaaaaaaaa
a

thequickbrownfox
brownfoxthequick

ababa
ab

abaa
aab

1
สุนัขจิ้งจอกสีน้ำตาลด่วน! หมาขี้เกียจ!
JiminP

วิธีแก้ปัญหาที่ดีสั้น ๆ และอาจเป็นความซับซ้อนที่ดีที่สุดที่นี่ คุณสามารถตีกอล์ฟได้เล็กน้อย - ตัวอย่างเช่นคุณไม่ต้องการ "int" เพื่อเปรียบเทียบสตริง และแทนที่ "ในขณะที่ฉัน> 0" โดย "ในขณะที่ฉัน" และ "y = y + y" โดย "y * = 2"
Jules Olléon

ที่จริงแล้วมันมีปัญหา: สำหรับ abaa มันจะพิมพ์ aaa ...
Jules Olléon

@Jules ขอบคุณสำหรับความคิดเห็น! ฉันไม่ได้คิดเกี่ยวกับสิ่งนั้น ...
JiminP

คุณสามารถทำแทนi-=1 i=i-1ในทำนองเดียวกันสำหรับการเพิ่มขึ้น
Lowjacker

1

Mathematica 124 ไบต์

x = StringLength@(y = "");
For[i = 1, ! (s = y~StringTake~i)~StringRepeat~x~StringContainsQ~y,i++];
First@Sort@StringPartition[s <> s, i, 1]

ช่องว่างและบรรทัดใหม่ (ต่อหน้าอัฒภาคที่ปลายบรรทัด) ไม่มีความหมายใน Mathematica และรวมไว้ที่นี่เพื่อความสะดวกในการอ่าน

อินพุตเข้าระหว่างเครื่องหมายคำพูดในบรรทัดแรก ถ้าแต่งใหม่เป็นฟังก์ชั่นก็จะรับสายเข้าเช่น:

f=(x=StringLength@(y=#);For[i=1,!(s=y~StringTake~i)~StringRepeat~x~StringContainsQ~y,i++];First@Sort@StringPartition[s<>s,i,1])&

f@"bca"

(* "abc" *)

f@"abaa"

(* "aab" *)

ถ้าเช่นนั้นก็คือ 128 ไบต์

Forห่วงเตะคนแรกที่iตัวละครของอินพุตและทำซ้ำพวกเขาอย่างน้อยขึ้นอยู่กับความยาวของการป้อนข้อมูลแล้วการตรวจสอบถ้าใส่เป็นย่อยของผล หลังจากพบความยาวของช่วงเวลาของสตริงStringPartitionคำสั่งจะต่อกันสองสำเนาของช่วงเวลานั้นและใช้สตริงย่อยทั้งหมดของความยาวนั้นจากนั้น (โดยทั่วไปจะได้รับการเปลี่ยนรูปแบบวงจรทั้งหมด) จากนั้นFirst@Sortจะพบหนึ่งในพวกเขาเมื่อสั่ง


0

javascript 96 Chars

var temp = {},len = str.length;
for(i in str) 
temp[str[i]] = true;
Object.keys(temp).join(""); 

ทำงาน Plunkr


1
ยินดีต้อนรับสู่ชุมชน! ฉันไม่สามารถทดสอบรหัสของคุณได้คุณสามารถให้การอ่านรหัสจาก GET / POST และการเขียนด้วยการแจ้งเตือนหรือ console.log หรือฟังก์ชั่นที่รับอินพุตเป็นพารามิเตอร์และส่งกลับผลลัพธ์ได้หรือไม่
แอรอน

@AaronGOUZIT ได้เพิ่ม pluckr
ngLover

ขอบคุณที่ช่วย แต่ถึงกระนั้นรหัสที่คุณโพสต์ไม่สามารถใช้เพียงอย่างเดียวดังนั้นการโกงจำนวนไบต์ ที่สำคัญกว่านั้นคือฉันกลัวว่ารหัสของคุณจะไม่ตรงตามข้อกำหนด: ฉันเชื่อว่าคุณส่งคืนชุดตัวอักษรที่เป็นเอกลักษณ์ที่ใช้แทนที่จะเป็น "กำลังสร้างสตริง" ซึ่งเราควรจะสามารถทำซ้ำ (โดยรวม) ด้วยการตัดทอน รับอินพุต ฉันรอคอยที่จะเห็นรหัสปรับปรุงของคุณ!
แอรอน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.