Bạn được cung cấp một chuỗi để tạo và bắt đầu với chuỗi trống, làm cho nó sử dụng chi phí nối thêm và nhân bản


17

Nhiệm vụ của bạn là tạo chuỗi mục tiêu đã cho. Bắt đầu với một chuỗi trống, bạn sẽ phải thêm các ký tự vào chuỗi đó, cho đến khi chuỗi của bạn giống với chuỗi chúng tôi muốn. Bạn có thể thêm một ký tự vào cuối chuỗi của bạn với chi phí x hoặc bạn có thể sao chép chuỗi của bạn với chi phí y. Những gì chúng tôi muốn là cách rẻ nhất để làm điều này.

Các trường hợp thử nghiệm

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
Chi phí được xác định như thế nào? Họ có phải là số nguyên dương không?
Arnauld

1
Tôi nghĩ rằng bạn chỉ đang tìm cách thực hiện thử thách golf mã (mã ngắn nhất), vì vậy tôi đã loại bỏ thử thách mã và lập trình các thẻ câu đố chỉ ra một số cách ghi điểm khác.
xnor

7
Tôi nghĩ rằng sẽ có nhiều trường hợp thử nghiệm hơn, vì dường như ai đó có thể viết một chương trình có các heuristic tốt hoạt động cho tất cả các trường hợp thử nghiệm nhưng nói chung không tối ưu. Đặc biệt, không có trường hợp thử nghiệm nào có nhiều dòng vô tính hoặc dòng vô tính không bắt đầu. Tôi nghĩ cũng sẽ tốt nếu có một ví dụ trong đó việc thay đổi chỉ là chi phí thay đổi đầu ra.
xnor

6
Nhân tiện, thử thách đầu tiên!
Erik the Outgolfer

Là nhân bản một chữ cái vẫn được coi là một hoạt động nhân bản?
digEmAll

Câu trả lời:


2

Husk , 25 byte

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

Hãy thử trực tuyến!

Đầu vào theo thứ tự nối thêm chi phí, chi phí nhân bản, mục tiêu.

Giải trình

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

Đưa đầu vào là (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

Hãy thử trực tuyến!

Đã bình luận

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 byte

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

Hãy thử trực tuyến!

Mã không được kiểm soát và giải thích:

# 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
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.