लाइब्रेरी खोजने का कोड-गोल्फर तरीका


15

चुनौती:

मेरे संगीत संग्रह में मेरे हजारों गाने हैं, और सौभाग्य से मेरे लिए, मेरे पसंदीदा खिलाड़ी का एक खोज कार्य है। मेरे पास एक महान स्मृति है- मैं अपने संग्रह में हर गीत का शीर्षक याद रख सकता हूं। हालाँकि, मैं बहुत आलसी हूँ और टाइप करना पसंद नहीं करता - प्रत्येक अतिरिक्त कीस्ट्रोक एक राग है!

  • एक गीत को अलग करने के लिए मुझे सबसे छोटी स्ट्रिंग क्या चाहिए? खोज के दौरान टाइपिंग को कम करने के लिए मैं जिन कुंजियों का उपयोग कर सकता हूं, उनकी सूची याद रखने में मेरी मदद करें!

यह , इसलिए सबसे छोटा कोड जीतता है।


नियम:

गीत शीर्षक की एक इनपुट सूची को देखते हुए, निम्न बाधाओं के अधीन खोज कुंजियों की सूची बनाएं:

  1. प्रत्येक गाने के शीर्षक में एक खोज कुंजी होनी चाहिए।
  2. आउटपुट सूची में वर्णों की कुल संख्या यथासंभव कम होनी चाहिए।
  3. मेरा पसंदीदा संगीत खिलाड़ी है foobar2000 :
    • खोज फ़ंक्शन केस-संवेदी नहीं है। ( appleजैसा है aPpLE)।
    • प्रत्येक खोज कुंजी में रिक्त स्थान द्वारा अलग किए गए किसी भी क्रम में एक या अधिक "शब्द" शामिल होने चाहिए:
      • प्रत्येक शब्द एक होना चाहिए -स्ट्रिंग इसी शीर्षक गीत की।
      • यदि एक ही स्थानापन्न को कई बार निर्दिष्ट किया जाता है, तो यह उसके संबंधित गीत के शीर्षक में कई बार होना चाहिए।
      • यदि किसी सबस्ट्रिंग में एक स्थान होता है, तो उस विकल्प को उद्धरणों से घिरा होना चाहिए।

संकेत:

  • अक्सर, कुछ गाने के शीर्षक के लिए, कई खोज कुंजियाँ होती हैं, जो नियम 2 होती हैं। ऐसे में, कोई भी एक कुंजी करेगा, लेकिन आपको उन सभी को सूचीबद्ध करने के लिए ब्राउनी पॉइंट मिलते हैं।
  • आप मान सकते हैं कि इनपुट सूची में केवल ASCII अक्षर होंगे, लेकिन ब्राउटी पॉइंट्स को UTF-8 संगतता के लिए प्रदान किया जाएगा।
  • क्या नियम 3 का पालन करना कठिन था? यहां देखिए यह कैसे काम करता है:


उदाहरण:

यदि मेरे संगीत संग्रह में केवल दो एल्बम शामिल होते हैं, माइकल जैक्सन ऑफ़ द वॉल और थ्रिलर :

आप अपने कार्यक्रम का परीक्षण करने के लिए ऊपर दी गई सूचियों का उपयोग कर सकते हैं। यहाँ दूसरी सूची का कच्चा संस्करण दिया गया है:

["Don't Stop 'Til You Get Enough","Rock with You","Working Day and Night","Get on the Floor","Off the Wall","Girlfriend","She's out of My Life","I Can't Help It","It's the Falling in Love","Burn This Disco Out","Wanna Be Startin' Somethin'","Baby Be Mine","The Girl Is Mine","Thriller","Beat It","Billie Jean","Human Nature","P.Y.T. (Pretty Young Thing)"]

1
क्या आपके पास एक उदाहरण है जिसमें कुंजी के लिए कई स्ट्रिंग्स की आवश्यकता है?
जोनाथन एलन

1
कैसे के बारे में ["Wanta Be A Wanna B","Wanta Bea A Wanna B","Wanna Be A Wanna Bea"]?
जोनाथन एलन

... लेकिन उन्हें क्या होना चाहिए / हो सकता है अगर कोई स्थान खुद को सबस्ट्रिंग में अनुमति नहीं देता है - ध्यान दें कि सभी पूरे शब्द टकराते हैं।
जोनाथन एलन

एक बिगाड़ने में कच्चा संस्करण क्यों है?
लीक नुन्

जवाबों:


4

पायथन 2, 556 बाइट्स

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

-10 बाइट्स, @Riker, @ovs के लिए धन्यवाद

सब कुछ काम करने के लिए मुझे शाम को ले गया।
आउटपुट गीत का नाम, खोज कुंजियों का सरणी और खोज कुंजियों का जोड़ संयुक्त (रिक्त स्थान और उद्धरण सहित)

import re
S=map(str.lower,input())
T=len
for s in S:
 y=s;n=T(s)
 def R(r,t):
    global n,y
    l=T(' '.join(t))+2*sum(map(lambda x:' 'in x,t))
    if l>n:return
    if(lambda K:T([s for s in S if T(s)-T(reduce(lambda x,y:re.sub(re.escape(y),'',x,1),K,s))==T(''.join(K))])==1)(t)and l<n:y=t;n=l
    u=[(lambda s,n:n and[''.join(y) for y in eval('zip(s%s)'%(''.join(',s[%s:]'%-~x for x in range(n))))]or list(s))(r,i)for i in range(T(r))]
    for i in range(T(r)):
     for j in range(T(r)-i):R(r[j+T(u[i][j]):],t+[u[i][j]])
 R(s,[])
 print[' 'in x and'"%s"'%x or x for x in y]

कुछ स्पष्टीकरण:

T=len

समारोह len(), बहुत बार यहां इस्तेमाल किया तो यह नाम बाइट्स की बचत होती है


L=lambda s,n:n and[''.join(y) for y in eval('zip(s%s)'%(''.join(',s[%s:]'%-~x for x in range(n))))]or list(s)

स्ट्रिंग s lenght n के सभी संभावित सबस्ट्रिंग का मूल्यांकन करता है।
eval(...)कमांड zip(s,s[1:],s[2:],...,s[n:])
बनाता nहै sयदि यह संभव हो तो हर सूचकांक से लंबन का सब्सट्रेट बनाता है। तो के लिए s='budd'और n='2'यह उत्पादन करेगा बू, उद, dd


F=lambda K:len([s for s in S if len(s)-len(reduce(lambda x,y:re.sub(re.escape(y),'',x,1),K,s))==len(''.join(K))])==1

यह सुनिश्चित करने के लिए फ़िल्टर करें कि क्या प्रदान की गई कुंजियाँ (K) अद्वितीय गीत के नाम के लिए हैं।
re.sub को उदाहरण में ['nn', 'nn'] जैसे कई समान कुंजी के लिए आवश्यक है।


इनर फंक्शन def R(r,t)सबस्ट्रिंग के सभी संभावित संयोजनों को बनाने के लिए एक पुनरावर्ती है, जो गीत के नाम का वर्णन कर सकता है।
हर संयोजन की तुलना वर्तमान में कम से कम एक (यदि कोई थी) के साथ बनाई गई संयोजनों की कम संख्या के साथ की जाती है - यदि यह बड़ा है, तो इसे सभी डेरिवेटिव के रूप में स्वीकार नहीं किया जाएगा।
राज्य को ट्रैक करने के लिए फ़ंक्शन 2 चर का उपयोग करता है: nवर्तमान कम से कम कुंजी संयोजन yके संयोजन के लिए और स्वयं संयोजन के लिए


l=T(' '.join(t))+2*sum(map(lambda x:' 'in x,t))

यह कुंजी संयोजन की लंबाई की गणना करता है। ' '.joinकुंजियों के बीच रिक्त स्थान जोड़ें और 2*sum(...)रिक्त स्थान के साथ कुंजियों के लिए आवश्यक उद्धरणों की संख्या की गणना करें।


u=[L(r,i)for i in range(0,T(r))]

वर्तमान स्ट्रिंग के लिए सभी संभव कुंजी संयोजन (हर संभव लंबाई का) पाने के लिए पहले लंबो फ़ंक्शन का उपयोग करता है।


सभी उत्पन्न कुंजियों के माध्यम से देखने के लिए दो और अगले पुनरावर्ती कदम के लिए उन्हें व्यक्तिगत रूप से पास करने के लिए दो चक्र। कुंजी स्थान ( j) इसके अंत में स्ट्रिंग को सही ढंग से स्लाइस करने के लिए आवश्यक है r[j+T(u[i][j]):]:।
स्लाइस स्ट्रिंग प्रदान करता है, जो कि चालू कुंजी समाप्त होता है, इसलिए कोई भी ओवरलैप नहीं होगा।
यदि जगह अज्ञात है, तो समान कुंजी सब कुछ गड़बड़ कर देगी।


[' 'in x and'"%s"'%x or x for x in y]

बस की तुलना में बहुत लंबे समय तक y, लेकिन रिक्त स्थान की चाबियाँ उद्धरण से घिरी होनी चाहिए


ये अद्भुत है। आप नियम 3 सही पाने वाले पहले व्यक्ति हैं!
अयान

1
वैसे, आपको 0,अपनी किसी एक सीमा को हटाकर दो बाइट्स करने में सक्षम होना चाहिए : u=[L(r,i)for i in range(0,T(r))]=> u=[L(r,i)for i in range(T(r))]
नॉटजैगन

1
आप कुछ और बाइट्स बचा सकते हैं: अपने आउटपुट में, आपको इनपुट स्ट्रिंग्स और आउटपुट स्ट्रिंग्स के आकार को दिखाने की आवश्यकता नहीं है।
अयन

@ @ 彩 एम धन्यवाद! मैंने रेंज और आउटपुट से इस कुछ बाइट्स को ट्रिम कर दिया है।
डेड पॉसम

1
S=map(str.lower,input())-5 बाइट्स के लिए
अंडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.