On vous donne une chaîne à créer et en commençant par la chaîne vide, faites-la en ajoutant et en clonant le coût

17

Votre tâche consiste à créer la chaîne cible donnée. En commençant par une chaîne vide, vous devrez y ajouter des caractères, jusqu'à ce que votre chaîne soit la même que celle que nous voulons. Vous pouvez soit ajouter un caractère à la fin de votre chaîne avec le coût x, soit cloner votre chaîne avec le coût y. Ce que nous voulons, c'est le moyen le moins cher de le faire.

Cas de test

targetString , appendcost, clonecost -> totalcost

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

la source
1
Comment les coûts sont-ils définis? S'agit-il d'entiers positifs?
Arnauld
1
Je pense que vous cherchez simplement à créer un défi de golf de code (code le plus court), j'ai donc supprimé le défi de code et les balises de programmation qui indiquent une autre façon de marquer.
xnor
7
Je pense que cela aiderait à avoir plus de cas de test, car il semble probable que quelqu'un pourrait écrire un programme qui a de bonnes heuristiques qui fonctionnent pour tous les cas de test mais ne sont pas optimaux en général. En particulier, aucun des cas de test n'a plusieurs clones ou clones de sous-chaînes qui ne sont pas au début. Je pense qu'il serait également bon d'avoir un exemple où changer uniquement les coûts modifie la production.
xnor
6
Bon premier défi, au fait!
Erik the Outgolfer
Le clonage d'une seule lettre est-il toujours considéré comme une opération de clonage?
digEmAll

Réponses:

2

Husk , 25 octets

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

Essayez-le en ligne!

Les entrées sont dans l'ordre ajouter le coût, le coût du clone, la cible.

Explication

φ?ö▼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
Zgarb
la source
1

Python 2 , 112 octets

f=lambda s,a,c,i=0:i<len(s)and min([a+f(s,a,c,i+1)]+[c+f(s,a,c,n)for n in range(i+1,len(s)+1)if s[i:n]in s[:i]])

Essayez-le en ligne!

ovs
la source
1

JavaScript (ES6), 123 111 octets

Prend l'entrée comme (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

Essayez-le en ligne!

Commenté

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)
Arnauld
la source
1

R , 192 185 octets

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

Essayez-le en ligne!

Code déroulé et explication:

# 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
  }
}
digEmAll
la source