सबसे छोटा, शाब्दिक रूप से सबसे छोटा उत्पादक स्ट्रिंग


16

एक स्ट्रिंग एक स्ट्रिंग x उत्पन्न करता है yयदि yएक अनंत दोहराने का एक विकल्प है x। उदाहरण के लिए abcउत्पन्न करता है bcabcab

सबसे छोटा, शाब्दिक रूप से सबसे छोटा स्ट्रिंग खोजने के लिए एक प्रोग्राम लिखें जो इनपुट उत्पन्न करेगा। आपको मानक इनपुट पर पाठ की एक पंक्ति दी गई है। आपको मानक उत्पादन के लिए स्ट्रिंग को प्रिंट करना चाहिए। उदाहरण के लिए:

इनपुट

bcabcabca

उत्पादन

abc

सबसे छोटा कोड जीतता है। आप मान सकते हैं कि इनपुट में केवल अक्षर az (और यदि आप चाहते हैं तो एक अनुगामी newline) है।


आउटपुट किसी भी क्रम में होना चाहिए? कहते हैं कि आउटपुट bacआपके उदाहरण में हो सकता है abc?
चींटी का

@GroovyUser: नहीं, इनपुट bacएस के दोहराया पैटर्न का एक विकल्प नहीं है ।
कीथ रान्डेल

लेकिन इनपुट में एक विकल्प हो सकता है (bca)^n, जिसका अर्थ bcaहै कि दिए गए उदाहरण के लिए मान्य है abc
JAB

1
@ जेएबी: bcaलेक्सिकोग्राफिक रूप से सबसे छोटा नहीं है।
कीथ रान्डेल

आह, मुझे किसी तरह वह हिस्सा याद आ गया।
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सही तरह से हैंडल करता है।
वडेर

"अबेक" सही होगा, देखें @ योगसोत का जवाब: एक बकबक अबैक।
हावर्ड

2

हास्केल, 299 128 वर्ण

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

धन्यवाद करने के लिए! अब संस्करण दोनों बहुत छोटा है और मेरा मानना ​​है कि सही है।


1
तो, अच्छी खबर यह है कि यदि आप स्टेंट पर इनपुट को स्वीकार करते हैं तो यह समाधान लगभग 91 चार्ट तक नीचे गिराना संभव है, जैसे कि वेंटरो के रूबी समाधान में। दुर्भाग्य से, इनपुट का cabcabcabcउत्पादन होता है abcabc, इसलिए यह समाधान काफी नहीं है। मुझे लगता है q++q++qकि वांछित परिणाम प्राप्त करने के लिए आपको संशोधित करना होगा । हालांकि 145 चरों तक की टकराती चीजों को ठीक करने का मेरा त्वरित प्रयास। (स्पोइलर यहां हैं: gist.github.com/1035161 )

धन्यवाद! मैं अंतःक्रियाओं के बारे में न तो बातचीत के बारे में जानता था और न ही कभी भी। सभी चीजों को पाने के लिए। मैंने थोड़े से वर्ण प्राप्त करने के लिए आपके संस्करण को थोड़ा संशोधित किया। मैंने फ़िल्टर ((= =) "") द्वारा सॉर्ट और परिवर्तित फ़िल्टर (not.null) को हटा दिया। एक बार फिर धन्यवाद!
योगसोथोथ

आपको (/=)""शर्त की आवश्यकता क्यों है ? यह कुछ भी करने के लिए प्रतीत नहीं होता है। इसके अलावा, लंबोदर से छुटकारा पाने में मदद मिलती है: आप .ऑपरेटर का उपयोग करके पूरी तरह से छुटकारा पा सकते हैं और main=interact sकुछ पात्रों को बचाने के लिए मुख्य कार्य को बदल सकते हैं ।
रॉटस्टर

मुझे लगता है कि "bca" का उत्तर गलत है। यह "एबीसी" होना चाहिए, लेकिन अब "बीकेए" है।
रॉटर्स

एक संभव समाधान permutationsइसके बजाय उपयोग करना है tails
रॉटस्टर

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)

EDIT: बग को JiminP द्वारा स्पॉट किया गया है


वाह यह बहुत अच्छी बात है! दुर्भाग्य से, यह aababस्ट्रिंग के लिए प्रिंट करता है ababa... :(
JiminP

ठीक है, तय ... यह लंबा हो रहा है :(
जूल्स ओलेयन

2

रूबी 1.9, 36

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

वेंटरो के समाधान के समान दृष्टिकोण का उपयोग करता है।


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

EDIT : जूल्स ओलेऑन की टिप्पणी को पढ़ने के बाद कोड गढ़ा। एक 'बग' को हटा दिया, जिसके bcdabcdabपरिणामस्वरूप abbc

EDIT2 : जूल्स ओलेऑन द्वारा स्पॉट किए गए बग ( abaaपरिणाम aaa) को निश्चित किया गया ।

मैं पायथन के बारे में अच्छी तरह से नहीं जानता, इसलिए यह कोड शायद 'गोल्फ नहीं' है।

मुझे यह नियम पसंद है:

आप मान सकते हैं कि इनपुट में केवल अक्षर az है ...

निवेश निर्गम

bcdabcd
abcd

bcabcabca
abc


abcdabcd
abcd

bcdabcdab
abcd

barfoofoobarfoofoobar
arfoofoob

cccbbcccbbcccbb
bbccc

aaaaaaaaaaaaaaaa
a

thequickbrownfox
brownfoxthequick

ababa
ab

abaa
aab

1
भूरी लोमड़ी, जल्दी! कुत्ता, आलसी!
13

अच्छा समाधान, बहुत छोटा और शायद यहाँ सबसे अच्छा जटिलता! आप इसे थोड़ा गोल्फ कर सकते हैं - उदाहरण के लिए, आपको तार की तुलना करने के लिए "int" की आवश्यकता नहीं है; और "जबकि i> 0" को "जबकि मैं" और "y = y + y" को "y * = 2" से प्रतिस्थापित करें।
जूल्स ओलेयन

वास्तव में एक समस्या है: अबा के लिए यह आटे को प्रिंट करता है ...
जूल्स ऑलोन

@Jules टिप्पणी के लिए धन्यवाद! मैंने उस बारे में नहीं सोचा था ...
JiminP

आप i-=1इसके बजाय कर सकते हैं i=i-1। इसी तरह वेतन वृद्धि के लिए।
लोजैकर

1

गणितज्ञ 124 बाइट्स

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

व्हॉट्सएप और न्यूलाइन्स (लाइनों के सिरों पर अर्धविराम की उपस्थिति में) का गणित में कोई मतलब नहीं है और पठनीयता के लिए यहां शामिल हैं।

पहली पंक्ति में उद्धरण चिह्नों के बीच इनपुट जाता है। यदि एक फ़ंक्शन के रूप में पुनर्गणना होती है, तो यह स्ट्रिंग इनपुट की तरह लेता है:

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 से कोड रीडिंग प्रदान कर सकते हैं और अलर्ट या कंसोल.लॉग के साथ लिख सकते हैं या एक फ़ंक्शन को एक पैरामीटर के रूप में इनपुट ले सकते हैं और आउटपुट वापस कर सकते हैं?
आरोन

@AaronGOUZIT ने
ngLover

धन्यवाद, इससे मदद मिलती है। फिर भी, आपके द्वारा पोस्ट किया गया कोड अकेले उपयोग नहीं किया जा सकता है, जिससे कि बाइट की गिनती धोखा दे। इससे भी महत्वपूर्ण बात, मुझे डर है कि आपका कोड ऐनक का सम्मान नहीं करता है: मेरा मानना ​​है कि आप "जनरेटिंग स्ट्रिंग" के बजाय उपयोग किए जाने वाले अद्वितीय अक्षरों का एक सेट लौटाते हैं, जिसे हमें वैकल्पिक ट्रंकेशन के साथ (पूरे के रूप में) दोहराने में सक्षम होना चाहिए इनपुट प्राप्त करें। मैं आपके अपडेटेड कोड को देखने के लिए उत्सुक हूं!
एरोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.