String.prototype.isRepeated


41

अद्यतन : isaacg का पायथ सबमिशन विजेता है!


आप में से कई लोगों ने सुना होगा कि शहर में जावास्क्रिप्ट का एक कूलर संस्करण है (ईएस 6 पढ़ें) जिसमें एक विधि है String.prototype.repeatताकि आप कर सकें

"Hello, World!".repeat(3)

और पाओ

"Hello, World!Hello, World!Hello, World!"

आउटपुट के रूप में।

आपका काम अपनी पसंद की भाषा में एक फ़ंक्शन या प्रोग्राम लिखना है जो पता लगाता है कि क्या कोई स्ट्रिंग इस तरह के परिवर्तन के तहत चला गया है।

यानी इनपुट स्ट्रिंग nको एक छोटे स्ट्रिंग के सटीक पुनरावृत्ति के रूप में दर्शाया जा सकता है । आउटपुट (फ़ंक्शन के रिटर्न स्टेटमेंट या STDOUT के रूप में) सत्य होना चाहिए अगर स्ट्रिंग हो सकता है या गलत हो सकता है यदि स्ट्रिंग को छोटे स्ट्रिंग के पुनरावृत्ति के रूप में प्रस्तुत नहीं किया जा सकता है।

कुछ नमूना इनपुट:

"asdfasdfasdf"  // true
"asdfasdfa"     // false
"ĴĴĴĴĴĴĴĴĴ"     // true
"ĴĴĴ123ĴĴĴ123"  // true
"abcdefgh"      // false

ध्यान दें कि अंतिम इनपुट गलत है, इस प्रकार nसे अधिक होना चाहिए1

पूरा नियम

  • इनपुट करने के लिए किसी भी भाषा में एक फ़ंक्शन / प्रोग्राम लिखें (फ़ंक्शन तर्क के माध्यम से / कमांड लाइन args / STDIN) एक स्ट्रिंग
  • रिटर्न / प्रिंट सत्य मान यदि दिए गए स्ट्रिंग को एक छोटे स्ट्रिंग के सटीक पुनरावृत्ति के माध्यम से बनाया जाता है, तो कम से कम दो बार दोहराता है।
  • इनपुट स्ट्रिंग का अधिकतम आकार आदर्श रूप से इन्फिनिटी है
  • स्ट्रिंग में सभी संभव ASCII वर्ण हो सकते हैं
  • यह एक इसलिए पात्रों की जीत में सबसे छोटा कोड है।

"" - खाली स्ट्रिंग - वापसी क्या होनी चाहिए? (इसमें खाली स्ट्रिंग की प्रतियों की अनंत संख्या समाहित है।)
बिल्वपत्र

@billpg मिथ्या मूल्य
अनुकूलक

क्या आप वोट से टूट रहे हैं? सामान्य अभ्यास पहले से मुझे लगता है कि प्रस्तुत है (ठीक है, पहले वाला जो बांधने के स्कोर तक नीचे पहुंचा था)। लेकिन मुझे यकीन नहीं है कि यह डिफ़ॉल्ट टाई-ब्रेकर के रूप में कहीं भी लिखा गया है, इसलिए अंततः यह आपके ऊपर है।
मार्टिन एंडर

उनकी पोस्टिंग के बीच का समय केवल 30 मिनट है। मैं यह नहीं मानूंगा कि जीतने के लिए पर्याप्त है :)। चूंकि वह समय अब ​​नहीं बदलेगा, लेकिन वोट मिल सकते हैं, मैं वोटों के साथ गया
ऑप्टिमाइज़र

इस सवाल का नाम xnor में बदला जाना चाहिए :) वह आदमी है!
सिलविउ बर्किया

जवाबों:


16

अजगर , ९

/:+zz1_1z

या

}z:+zz1_1

ये दोनों @ xnor के अजगर जवाब के करीबी अनुवाद हैं, सिवाय इसके कि वे STDIN से इनपुट लेते हैं और इसे प्रिंट करते हैं। पहले के बराबर है:

z = input()
print((z+z)[1:-1].count(z))

झूठी के लिए 0, सच के लिए 1।

दूसरी पंक्ति इसके बराबर है:

z = input()
print(z in (z+z)[1:-1])

असत्य के लिए असत्य, सत्य के लिए असत्य।

पायथ के आधिकारिक कंपाइलर में दूसरे से संबंधित एक बग था, जिसे मैंने सिर्फ पैच किया था, इसलिए पहला मेरा आधिकारिक सबमिशन है।


मैं आपको उस बग के बारे में सूचित करने का एक तरीका खोज रहा था (बूलियन मुद्रित नहीं होता है)। पहले के बारे में नहीं सोचा xथा और बहुत लंबा था ...
डेनिस

हाँ, बग अब तय हो गया है। इसके अलावा, अगर आप बग्स की रिपोर्ट करना चाहते हैं, तो एक अच्छा तरीका हो सकता है कि आप github साइट पर एक मुद्दा खोलें, यहाँ: github.com/isaacg1/pyth/issues
isaacg

ओह, यह वहाँ है। मैं GitHub के आसपास अपना रास्ता नहीं जानता, और मैंने कभी भी दाईं ओर नेविगेशन पैनल पर ध्यान नहीं दिया ...
डेनिस

81

पायथन (24)

lambda s:s in(s+s)[1:-1]

यह जाँचता है कि क्या स्ट्रिंग दो बार समाप्‍त होने का पर्याय है, पहले और अंतिम वर्णों को तुच्छ मिलान से बचाने के लिए। यदि यह है, तो यह स्वयं का एक गैर-चक्रीय चक्रीय क्रमांकन होना चाहिए, और इस प्रकार बार-बार खंडों का योग।


8
गोल्फस्क्रिप्ट में एक तुच्छ अनुवाद 10 वर्ण देता है:..+);(;\?)
जस्टिन

3
मुझे समझ में नहीं आता कि यह कैसे काम करता है। क्या आप एक मैन्युअल रूप से समझाया गया उदाहरण दे सकते हैं कि यह कैसे एक स्ट्रिंग को संभालेगा?
नजल्ल

8
@ नाटेकरखोफ ले abcabcs+sमें बदल जाता है abcabcabcabc[1:-1]दोनों सिरों की चॉप उपज के लिए bcabcabcabcab। और फिर उसी के विकल्प के रूप में s in ...खोजने की कोशिश करता abcabcहै। इस विकल्प को मूल आधे में से किसी में नहीं पाया जा सकता है, क्योंकि वे दोनों को छोटा कर दिया गया है, इसलिए इसे दोनों हिस्सों में फैलाया जाना चाहिए। विशेष रूप से, इसकी शुरुआत से पहले इसका अपना अंत होना चाहिए, जिसका अर्थ है कि यह समान (दोहराया) सब्सट्रिंग्स से बना होना चाहिए।
मार्टिन एंडर

6
आप इसे दोगुना करने के बाद इसे काट लें। abबन ababजाता है ba, इसलिए यह गलत aaहो aaaaजाता है aa, जबकि बन जाता है , जो सच हो जाता है।
हिस्टोक्रेट

1
@ सर्जबॉर्श यह केवल एक ही काम करता है: qweqweqweमें weqweqweqweqweqwहै True
xnor

30

रेगेक्स (ईसीएमएस्क्रिप्ट स्वाद), 11 बाइट्स

रेगेक्स के लिए एक नौकरी की तरह लगता है!

^([^]+)\1+$

इसका परीक्षण यहां करें।

मैंने ECMAScript को चुना है, क्योंकि यह एकमात्र स्वाद है (मुझे पता है) जिसमें [^]किसी भी चरित्र से मेल खाता है। अन्य सभी में, मुझे या तो व्यवहार को बदलने .या [\s\S]तीन वर्णों के उपयोग के लिए एक ध्वज की आवश्यकता होगी ।

कैसे हम झंडा गिनती कर रहे हैं पर निर्भर करता है, कि हो सकता है निश्चित रूप से एक बाइट कम हो। जैसे अगर हम पैटर्न + झंडे (उदाहरण के लिए सीमांकक की अनदेखी) की गिनती कर रहे हैं, तो पीसीआरई / पर्ल समतुल्य होगा

/^(.+)\1+$/s

सीमांकक को नजरअंदाज करते हुए 10 बाइट्स है।

इसका परीक्षण यहां करें।

यह केवल उन तारों से मेल खाता है जिनमें कुछ प्रतिस्थापन के कम से कम दो दोहराव शामिल हैं।

यहां पूर्ण 26-बाइट ES6 फ़ंक्शन है, लेकिन मैं यह बताता हूं कि नियमित अभिव्यक्ति प्रस्तुतियाँ आम तौर पर मान्य हैं:

f=s->/^([^]+)\1+$/.test(s)

^(.+)\1+$मेरे लिए काम करता है, जो 9 बाइट्स है। यह आपके लिए काम नहीं करता है?
ऑप्टिमाइज़र

@Optimizer लाइन ब्रेक के साथ एक स्ट्रिंग का प्रयास करें।
मार्टिन एंडर

मैंने कोशिश की asd\nasd\nasd\n। यह काम करता है
ऑप्टिमाइज़र

@Optimizer refiddle.com/refiddles/5417fb2475622d4df7e70a00 मेरे लिए काम नहीं करता है (और यह नहीं होना चाहिए)
मार्टिन एंडर

हाँ, यह काम नहीं करता है। शायद यह बच जाता है \ जब मैं \nस्वयं लिखता हूं
ऑप्टिमाइज़र

12

CJam, 9

q__+)@+#)

Xnor के विचार के समान।

q      " Read input. ";
__+    " Duplicate twice and concatenate them together. ";
)      " Remove the last character of the longer string. ";
@+     " Insert that character at the beginning of the shorter string. ";
#)     " Find the shorter string in the longer string, and increase by one. ";


फाइनल की जरूरत क्यों )? मुझे लगता है कि इसका उचित -1 मतलब FALSE और> = 0 का मतलब TRUE
डिजिटल ट्रॉमा

@DigitalTrauma मुझे लगता है कि 0 सीजेएम में झूठा है ... जैसे ऑपरेटरों के लिए gऔर ?
jimmy23013

@DigitalTrauma: क्या इसकी आवश्यकता अंततः ओपी पर निर्भर करती है, लेकिन कड़ाई से केवल शून्य बोलना CJam में गलत माना जाता है।
डेनिस

@ user23013 @ डेनिस लेकिन #खोज ऑपरेटर के बारे में क्या ? निश्चित रूप से इसका परिणाम भी सफलता बनाम असफलता के दृष्टिकोण से "सत्य" है?
डिजिटल ट्रॉमा

7

एपीएल, ११

2<+/x⍷,⍨x←⍞

स्पष्टीकरण
स्क्रीन से स्ट्रिंग इनपुट को ले जाता
x←है, चर में परिणामी स्ट्रिंग में x
,⍨स्वयं
x⍷खोज के साथ स्ट्रिंग को समाप्‍त करता है x। एक सरणी देता है जिसमें एक मैच की शुरुआती स्थिति में 1 है और कहीं और 0 है। अगर
+/रकम
2<2 से अधिक है (जैसा कि 2 तुच्छ मैच होंगे) सरणी की जाँच करें


7

सीजाम, 10 बाइट्स

मैंने सीजम बग को पकड़ लिया। मेरा पहला उत्तर, इसलिए शायद कुछ और बातें गढ़ी जा सकती हैं:

q__+(;);\#

FALSE के लिए आउटपुट -1 और TRUE के लिए एक नंबर> = 0 है


5
क्लब में आपका स्वागत है!
डेनिस

5

GolfScript, 10 बाइट्स

..+(;);\?)

फिर भी एक्सनोर के चतुर विचार का एक और कार्यान्वयन।


Hahaha, मैंने अभी एक मिनट पहले पोस्ट किया था: codegolf.stackexchange.com/questions/37851/… । मैंने इसे एक उत्तर के रूप में पोस्ट करने के बारे में सोचा, लेकिन मुझे लगा कि तुच्छ अनुवाद निर्बाध हैं।
जस्टिन

मैंने इस बार भी नए उत्तरों के लिए जाँच की, लेकिन नई टिप्पणियों के लिए नहीं ... आपका कोड )हालांकि गायब है ; जब मैच नहीं होगा, तो यह प्रिंट होगा -1। यदि आप उत्तर के रूप में पोस्ट करने जा रहे हैं, तो मैं ख़ुशी से मेरा डिलीट कर दूंगा।
डेनिस

)आपने अपना उत्तर पोस्ट करने से ठीक पहले मुझे जोड़ा (मैंने टिप्पणी संपादित की)
जस्टिन

1
बेहतर संस्करण (CJam में) q__+)@+#):। यह GolfScript में काम नहीं करता है।
jimmy23013

1
@ user23013: फिर से नहीं। मैं बस पोस्ट करने वाला था! अब तक बहुत सारे CJammers वहाँ हैं ...: P
Dennis


3

शुद्ध बैश, 30 बाइट्स

@ Xnor के चतुर उत्तर का सरल पोर्ट :

[[ ${1:1}${1:0: -1} =~ "$1" ]]

बाहर निकलें कोड TRUE के लिए 0 और FALSE के लिए 1 है:

$ for s in 'Hello, World!Hello, World!Hello, World!' 'asdfasdfasdf' 'asdfasdfa' 'ĴĴĴĴĴĴĴĴĴ' 'ĴĴĴ123ĴĴĴ123' 'abcdefgh'; do echo "./isrepeated.sh "\"$s\"" returns $(./isrepeated.sh "$s"; echo $?)"; done
./isrepeated.sh "Hello, World!Hello, World!Hello, World!" returns 0
./isrepeated.sh "asdfasdfasdf" returns 0
./isrepeated.sh "asdfasdfa" returns 1
./isrepeated.sh "ĴĴĴĴĴĴĴĴĴ" returns 0
./isrepeated.sh "ĴĴĴ123ĴĴĴ123" returns 0
./isrepeated.sh "abcdefgh" returns 1
$ 

नोट =~के भीतर [[ ... ]]है बैश में regex ऑपरेटर । हालांकि "पैटर्न के किसी भी हिस्से को स्ट्रिंग के रूप में मिलान करने के लिए मजबूर करने के लिए उद्धृत किया जा सकता है" । अतः जैसा कि अक्सर बैश के मामले में, सही उद्धरण प्राप्त करना बहुत महत्वपूर्ण है - यहां हम सिर्फ एक स्ट्रिंग सबमैच की जांच करना चाहते हैं न कि रेगेक्स मैच की।


3

TI-BASIC - 32

मैंने सोचा था कि मैं एक टोकन भाषा की कोशिश करूँगा। Ans में स्ट्रिंग के साथ चलाएँ, 0 यदि गलत है और यदि सच है तो दोहराया स्ट्रिंग की लंबाई।

inString(sub(Ans+Ans,1,2length(Ans)-1),sub(Ans,length(Ans),1)+Ans

कमाल है कि यह एक-लाइनर कैसे है।


लेकिन ... लेकिन ... मैं
टाइमटेक

@Timtech खैर, TI-BASIC में स्ट्रिंग हेरफेर करने की कोशिश कर रहे किसी पर ध्यान दें: TI-BASIC में स्ट्रिंग हेरफेर की कोशिश न करें। : P यह बनाने और अनुकूलन के लिए बहुत कठिन था।
जोसिया विंस्लो

अच्छा विचार। स्ट्रिंग हेरफेर करना सबसे कठिन काम है। हालाँकि, मैंने इस तरह के कई उत्तर पोस्ट किए हैं, इसलिए मुझे लगता है कि अब आपके पास एक प्रतियोगी है;)
टिमटेक

जो है सामने रखो! : पी
जोशिया विंस्लो

3

ECMAScript 6 (189)

(function(){var S=String.prototype,r=S.repeat;S.isRepeated=function(){return!1};S.repeat=function(c){var s=new String(r.call(this,c));if(c>1)s.isRepeated=function(){return!0};return s}}());

 

< console.log("abc".isRepeated(),"abc".repeat(10).isRepeated());
> false true

निश्चित रूप से यह एकमात्र वैध समाधान है? उदाहरण के लिए, शब्द (स्ट्रिंग) nanaजरूरी नहीं बनाया गया है"na".repeat(2)


"nana"नहीं है, लेकिन सवाल यह परीक्षण नहीं कर रहा है कि क्या .repeatइस्तेमाल किया गया था या नहीं। बल्कि, क्या स्ट्रिंग एक दोहराया है या नहीं
ऑप्टिमाइज़र

मुझे पता है, मैं सिर्फ एक स्मार्ट-गधा बनने की कोशिश कर रहा था: पी
मर्डोक्स

2

ECMAScript 6 (34 36 )

एक और ES6 उत्तर, लेकिन एक्सनोर की चालrepeat का उपयोग और उपयोग किए बिना :

f=i=>(i+i).slice(1,-1).contains(i)

ईएस 6-सक्षम ब्राउज़र जैसे फ़ायरफ़ॉक्स के कंसोल में चलना चाहिए।


2

सी 85

l,d;f(s){return l=strlen(s),strstr(d,strcpy(strcpy(d=alloca(l*2+1),s)+l,s)-1)-d-l+1;}

यह काफी लंबा निकला, लेकिन बाहरी कार्य हमेशा ऐसे ही होते हैं। यह मेरे दिमाग में आया कि मैं हर स्ट्रिंग फ़ंक्शन को लूप या एक पुनरावर्ती द्वारा प्रतिस्थापित कर सकता हूं। लेकिन मेरे अनुभव में यह अधिक लंबा होगा और स्पष्ट रूप से मैं इसे आज़माना नहीं चाहता।

कुछ शोध के बाद मैंने उच्च प्रदर्शन पर समाधान देखा, लेकिन चतुर (और संक्षिप्त) के रूप में नहीं है। बस मूल होने के लिए ... मैं सी में एक ही विचार को फिर से लिखा था।

स्पष्टीकरण:

int length, 
    duplicate;
int is_repetition(char *input)
{
    // length = "abc" -> 3
    length = strlen(input);
    // alloca because the function name is as long as "malloc" 
    // but you don't have to call free() because it uses the stack
    // to allocate memory
    // duplicate = x x x x x x + x
    duplicate = alloca(length*2 + 1);
    // duplicate = a b c 0 x x + x
    strcpy(duplicate, input);
    // duplicate = a b c a b c + 0
    strcpy(duplicate + length, input);
    if (strstr(duplicate,duplicate + length - 1) != duplicate + length - 1)
        // repetition
        // e.g. abab -> abababab -> aba[babab]
        // -> first occurence of [babab] is not aba[babab]
        // but a[babab]ab -> this is a repetition
        return 1;
    else
        // not repetition
        // e.g. abc -> abcabc -> ab[cabc]
        // -> first occurence of [cabc] is ab[cabc]
        // it matches the last "cabc"
        return 0;
}

1

ECMAScript 6 (59 62 67 73 )

विजेता नहीं, लेकिन ऐसा लगता है कि वास्तव में ES6 में इस प्रश्न के लिए कम से कम एक उत्तर होना चाहिए जो वास्तव में repeatफ़ंक्शन का उपयोग करता है :

f=i=>[...i].some((_,j)=>i.slice(0,j).repeat(i.length/j)==i)

ईएस 6-सक्षम ब्राउज़र जैसे फ़ायरफ़ॉक्स के कंसोल में चलना चाहिए।

यह बहुत सारे अनावश्यक पुनरावृत्तियों को करता है, लेकिन इससे बचने के लिए अधिक समय क्यों लगता है, है ना?

  • # 1 संपादित करें: कुछ बाइट्स को एक फ़ंक्शन में परिवर्तित करके सहेजा गया। ऑप्टिमाइज़र को धन्यवाद!
  • # 2 संपादित करें: अधिक बाइट्स को बचाने के लिए प्रसार ऑपरेटर चाल के लिए hsl का धन्यवाद!
  • # 3 संपादित करें: और एक और 3 बाइट्स के लिए रोब डब्ल्यू के लिए धन्यवाद!

आप इसे अधिक बाइट्स को सहेजने के लिए केवल एक फ़ंक्शन में बदल सकते हैं
ऑप्टिमाइज़र

@ सही, मुझे लगता है कि यह "स्टडिन" होना जरूरी नहीं है। आपका नाम आपके नाम पर है :)
इंगो बुर्क

मैं इस परीक्षण नहीं किया है, लेकिन आप का उपयोग करने के लिए सक्षम होना चाहिए प्रसार ऑपरेटर के लिए [...i]के बजायi.split('')
NinjaBearMonkey

1
@ एचएसएल क्रेजी, जो काम करता है। मुझे नहीं पता था कि प्रसार ऑपरेटर इस तरह काम करता है। मूल रूप से मैं सख्त तौर पर रेंज के साथ एक सरणी बनाने के लिए इसका उपयोग करने की कोशिश करता था 0..N। धन्यवाद!
इंगो बुर्क

1
.slice(0,j)की तुलना में एक वर्ण छोटा है .substr(0,j)। इसके अलावा, एक पूर्णांक में रूपांतरण अनावश्यक लगता है |0जिसे हटाया जा सकता है ( |0वास्तव में विधि की उपयोगिता कम कर देता है क्योंकि यह दोहराव के लिए विफल हो जाएगा जो 2 ^ 31 से अधिक है)।
रॉब डब्ल्यू


0

जावा 8, 28 बाइट्स

s->s.matches("(?s)(.+)\\1+")

इसे ऑनलाइन आज़माएं।

स्पष्टीकरण:

जाँचता है कि इनपुट-स्ट्रिंग regex से मेल खाती है, जहां पूरे स्ट्रिंग से मिलान करने के लिए String#matchesअंतर्निहित रूप से जोड़ा ^...$जाता है।
स्वयं रेगेक्स की व्याख्या:

^(s?)(.+)\1+$
^                Begin of the string
 (s?)            Enable DOTALL-mode, where `.` also matches new-lines
     (           Open capture group 1
      .+          One or more characters
        )        Close capture group 1
         \1+     Plus the match of the capture group 1, one or more times
            $    End of the string

तो यह मूल रूप से जांचता है कि क्या एक सबस्ट्रिंग दो या अधिक बार (नई-लाइनों का समर्थन करते हुए) दोहराया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.