빈 문자열로 시작하고 시작하는 문자열이 주어지며 추가 및 복제 비용을 사용하여 만듭니다.


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
비용은 어떻게 정의됩니까? 양의 정수입니까?
Arnauld

1
코드 골프 (가장 짧은 코드) 챌린지를 만들려고한다고 생각하므로 코드 챌린지와 프로그래밍 점수를 대체하는 프로그래밍 퍼즐 태그를 제거했습니다.
xnor

7
누군가가 모든 테스트 사례에서 작동하지만 일반적으로 최적은 아니지만 휴리스틱 스가 좋은 프로그램을 작성할 수 있기 때문에 더 많은 테스트 사례를 갖는 것이 도움이 될 것이라고 생각합니다. 특히, 테스트 사례 중 어느 것도 처음에는 여러 개의 클론 또는 하위 문자열의 클론을 가지고 있지 않습니다. 비용 만 변경하면 출력이 변경되는 예를 갖는 것이 좋을 것이라고 생각합니다.
xnor

6
그건 그렇고 멋진 첫 도전!
Outgolfer Erik

단일 문자 복제가 여전히 복제 작업으로 간주됩니까?
digEmAll

답변:


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

자바 스크립트 (ES6) 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

R , 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
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.