आपको रिक्त स्ट्रिंग बनाने और शुरू करने के लिए एक स्ट्रिंग दी जाती है, इसे आकर्षक और क्लोनिंग लागत का उपयोग करके बनाते हैं


17

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

परीक्षण के मामलों

targetString , appendcost, clonecost -> totalcost

"bb", 1, 2 -> 2
"bbbb", 2, 3 -> 7
"xzxpcxzxpy", 10, 11 -> 71
"abababab", 3, 5 -> 16
"abababab", 3, 11 -> 23

1
लागतों को कैसे परिभाषित किया जाता है? क्या वे सकारात्मक पूर्णांक हैं?
अरनौलद

1
मुझे लगता है कि आप कोड गोल्फ (सबसे छोटा कोड) चुनौती बनाना चाहते हैं, इसलिए मैंने कोड चुनौती और प्रोग्रामिंग पहेली टैग हटा दिए जो स्कोरिंग के कुछ वैकल्पिक तरीके का संकेत देते हैं।
xnor

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

6
अच्छी पहली चुनौती, वैसे!
को आउटगोल्फर

क्या एक अक्षर के क्लोनिंग को अभी भी क्लोन ऑपरेशन माना जाता है?
डाइजेक्सिल

जवाबों:


2

भूसी , 25 बाइट्स

φ?ö▼z+:⁴∞²m⁰§:h§δf`€otṫḣ0

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

इनपुट ऑर्डर ऑर्डर की लागत, क्लोन लागत, लक्ष्य में हैं।

व्याख्या

φ?ö▼z+:⁴∞²m⁰§:h§δf`€otṫḣ0  Two explicit inputs and one implicit.
                           Example: 2, 3, s="abab"
φ                          Make a recursive function and call it on s:
 ?                      0   If s is empty, return 0.
  ö▼z+:⁴∞²m⁰§:h§δf`€otṫḣ    Otherwise do this.
                       ḣ    Prefixes: ["a","ab","aba","abab"]
                    otṫ     Suffixes except the first one: ["bab","ab","b"]
               §δf`€        Keep those prefixes that have the corresponding suffix as substring: ["ab","aba"]
            §:h             Prepend s minus last character: ["aba","ab","aba"]
          m⁰                Recurse on each: x=[6,4,6]
        ∞²                  Repeat the clone cost: [3,3,3,..
      :⁴                    Prepend append cost: [2,3,3,3,..
    z+                      Add component-wise to x: [8,7,9]
   ▼                        Minimum: 7


1

जावास्क्रिप्ट (ईएस 6), 123 111 बाइट्स

के रूप में इनपुट लेता है (x)(y)(s)

x=>y=>m=g=([s,...r],o='',c=0)=>s?[...r,g(r,o+s,c+x)].map(_=>s+=r.shift(~o.search(s)&&g(r,o+s,c+y)))|m:m=m<c?m:c

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

टिप्पणी की गई

x => y =>                    // x = 'append' cost; y = 'clone' cost
m =                          // m = minimum cost, initialized to a non-numeric value
                             //     this is what will eventually be returned
g = (                        // g = recursive function taking:
  [s,                        //   - the input string split into s = next character
      ...r],                 //     and r[] = array of remaining characters
  o = '',                    //   - o = output string
  c = 0                      //   - c = current cost
) =>                         //
  s ?                        // if s is defined:
    [ ...r,                  //   split a copy of r
      g(r, o + s, c + x)     //   do a recursive call with an 'append' operation
    ].map(_ =>               //   iterate as many times as there are remaining characters
                             //   in r[], + 1
      s +=                   //     append to s
        r.shift(             //     the next character picked from the beginning of r[]
          ~o.search(s) &&    //     if s is found in o,
          g(r, o + s, c + y) //     do a recursive call with a 'clone' operation
        )                    //     (note that both s and r are updated *after* the call)
    ) | m                    //   end of map(); return m
  :                          // else:
    m = m < c ? m : c        //   update m to min(m, c)

1

आर , 192 185 बाइट्स

f=function(s,a,c,k=0,x="",R=substring,N=nchar,p=R(s,1,1:N(s)))'if'(!N(s),k,{y={};for(i in c(R(s,1,1),p[mapply(grepl,p,x)]))y=min(y,f(R(s,N(i)+1),a,c,k+'if'(any(y),c,a),paste0(x,i)));y})

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

अनियंत्रित कोड और स्पष्टीकरण:

# s is the current remaining string (at the beginning is equal to the target string)
# a is the append cost
# c is the clone cost
# k is the current cost (at the beginning is zero)
# x is the partially constructed string (at the beginning is empty)
f=function(s,a,c,k=0,x=""){
  # store in p all the possible prefixes of s
  p = substring(s,1,1:nchar(s))
  # if s is empty return the current cost k
  if(!nchar(s))
    k
  else{
    y={}
    # prepend the first letter of s (=append operation) to  
    # the prefixes in p that are contained in x (=clone operations)
    for(i in c(substring(s,1,1),p[mapply(grepl,p,x)])){
      # perform first the append then the clone operations and recurse, 
      # storing the cost in y if lower than previous
      # (if y is NULL is an append operation otherwise is a clone, we use the right costs)
      y = min(y,f(substring(s,nchar(i)+1),a,c,k+'if'(any(y),c,a),paste0(x,i)))
    }
    # return the current cost
    y
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.