가장 짧은 사전 식으로 가장 작은 생성 문자열


16

무한 반복의 하위 문자열 인 경우 문자열 은 문자열을 x 생성 합니다 . 예를 들어 generate 를 생성 합니다.yyxabcbcabcab

입력을 생성 할 가장 짧은 사전 식 문자열을 찾기위한 프로그램을 작성하십시오. 표준 입력에는 한 줄의 텍스트가 제공됩니다. 생성 문자열을 표준 출력으로 인쇄해야합니다. 예를 들면 다음과 같습니다.

입력

bcabcabca

산출

abc

가장 짧은 코드가 승리합니다. 입력에 문자 az (및 원하는 경우 후행 줄 바꿈) 만 포함되어 있다고 가정 할 수 있습니다.


어떤 순서로 출력해야합니까? 출력이 bac아닌 예제에 있을 수 있다고 가정 해보십시오 abc.
앤트의

@GroovyUser : 아니오, 입력은 반복되는 패턴의 하위 문자열이 아닙니다 bac.
Keith Randall

그러나 입력 은의 하위 문자열로 구성 될 수 있습니다. (bca)^nbca, 주어진 예제에서와 마찬가지로 유효합니다 abc.
JAB

1
@JAB : 사 bca전적으로 가장 작은 것은 아닙니다.
Keith Randall

아, 어떻게 든 그 부분을 놓쳤다.
JAB

답변:


9

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

파이썬 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올바르게 처리 합니다.
Vader

"abac"가 맞을 것입니다. @yogsototh의 답변 : bacabac abac를 참조하십시오 .
Howard

2

하스켈, 299

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

jloy에게 감사합니다! 이제 버전이 훨씬 짧아서 정확하다고 생각합니다.


1
좋은 소식은 Ventero의 Ruby 솔루션에서와 같이 stdin에서 입력을 수락하면이 솔루션을 약 91 자까지 골프화 할 수 있다는 것입니다. 불행히도, 입력 cabcabcabc은을 생성 하므로이 abcabc솔루션은 존재하지 않습니다. q++q++q원하는 결과를 얻으려면 수정해야한다고 생각합니다 . 그래도 범프를 고치려는 빠른 시도는 최대 145 자까지 가능합니다. (스포일러는 여기에 있습니다 : gist.github.com/1035161 )

감사! 나는 모든 하위 문자열을 얻기 위해 inits << = tails에 대해 상호 작용하거나 결코 알지 못했습니다. 약간의 문자를 얻기 위해 버전을 약간 수정했습니다. 정렬을 제거하고 filter ((/ =) "")로 filter (not.null)를 변경했습니다. 다시 감사합니다!
yogsototh 2016 년

(/=)""상태 가 필요 합니까? 아무것도하지 않는 것 같습니다. 또한 람다를 제거하면 도움이됩니다. .연산자를 사용하여 전체를 제거 하고 기본 기능을 변경 main=interact s하여 두 문자를 저장할 수 있습니다.
Rotsor

"bca"에 대한 답이 틀렸다고 생각합니다. "abc"여야하지만 지금은 "bca"입니다.
Rotsor

가능한 해결책 중 하나는 permutations대신에 사용하는 것입니다 tails.
Rotsor

2

파이썬 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

파이썬, 161159166140141134 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

편집 : Jules Olléon의 의견을 읽은 후 코드를 골프화했습니다. 에서 발생하는 '버그'를 제거 bcdabcdab했습니다 abbc.

EDIT2 : Jules Olléon이 발견 한 버그 ( abaa결과 aaa)가 수정 되었습니다.

나는 파이썬에 대해 잘 모르므 로이 코드는 아마도 '골프되지 않습니다'.

나는이 규칙을 좋아한다 :

입력에 문자 az 만 포함되어 있다고 가정 할 수 있습니다 ...

입력 및 출력

bcdabcd
abcd

bcabcabca
abc


abcdabcd
abcd

bcdabcdab
abcd

barfoofoobarfoofoobar
arfoofoob

cccbbcccbbcccbb
bbccc

aaaaaaaaaaaaaaaa
a

thequickbrownfox
brownfoxthequick

ababa
ab

abaa
aab

1
브라운 폭스, 빨리! 개, 게으른!
JiminP

좋은 해결책, 꽤 짧고 아마도 가장 복잡한 것입니다! 예를 들어, 문자열을 비교하기 위해 "int"가 필요하지 않습니다. "while i> 0"을 "while i"로, "y = y + y"를 "y * = 2"로 바꿉니다.
Jules Olléon

이 AAA를 인쇄 abaa을 위해 ... : 사실 문제가있다
쥘 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

자바 스크립트 96 문자.

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

작업 플런저


1
커뮤니티에 오신 것을 환영합니다! 그래도 코드를 테스트 할 수 없었습니다 .GET / POST에서 코드를 읽고 alert 또는 console.log로 작성하거나 입력을 매개 변수로 사용하여 출력을 반환하는 함수를 제공 할 수 있습니까?
Aaron

@AaronGOUZIT 추가 pluckr
ngLover

고마워요. 여전히 게시 한 코드를 단독으로 사용할 수 없으므로 바이트 수를 속이는 것입니다. 더 중요한 것은 코드가 사양을 존중하지 않는 것 같습니다. "생성 문자열"대신 사용되는 고유 문자 세트를 반환한다고 생각합니다. 입력을 얻습니다. 업데이트 된 코드를 기대합니다!
Aaron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.