Size boş bir dize yapmak ve başlamak, bir ekleme ve klonlama maliyeti kullanarak yapmak için bir dize verilir


17

Göreviniz verilen hedef dizeyi oluşturmaktır. Boş bir dize ile başlayarak, dizeniz istediğimizle aynı olana kadar karakter eklemeniz gerekir. Dizenizin sonuna x maliyetiyle bir karakter ekleyebilir veya dizenizi y maliyetiyle klonlayabilirsiniz. İstediğimiz bunu yapmanın en ucuz yoludur.

Test Durumları

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
Maliyetler nasıl tanımlanır? Pozitif tamsayılar mı?
Arnauld

1
Ben sadece kod golf (en kısa kod) meydan okuma yapmak için düşünüyorum, bu yüzden kod meydan okuma ve puanlama bazı alternatif yol gösteren programlama etiketleri kaldırıldı.
xnor

7
Daha fazla test vakasına sahip olmanın yardımcı olacağını düşünüyorum, çünkü birisinin tüm test vakaları için çalışan iyi sezgisel özelliklere sahip bir program yazabileceği düşünülüyor, ancak genel olarak optimal değil. Özellikle, test durumlarının hiçbirinde başlangıçta olmayan birden fazla klon veya alt dizgilerin klonları yoktur. Sadece maliyet değiştirmenin çıktıyı değiştirdiği bir örneğe sahip olmanın iyi olacağını düşünüyorum.
xnor

6
Bu arada güzel ilk meydan okuma!
Outgolfer Erik

Tek bir harfin kopyalanması hala bir klonlama işlemi olarak kabul ediliyor mu?
digEmTüm

Yanıtlar:


2

Kabuk , 25 bayt

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

Çevrimiçi deneyin!

Girdiler ek maliyet, klon maliyeti, hedef sırasıyla.

açıklama

φ?ö▼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

JavaScript (ES6), 123 111 bayt

Girişi alır (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

Çevrimiçi deneyin!

Yorumlananlar

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

R , 192185 bayt

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})

Çevrimiçi deneyin!

Kaydedilmemiş kod ve açıklama:

# 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
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.