Trở thành Sát thủ Hydra


13

Bạn là anh hùng tốt nhất và nổi tiếng nhất của khu vực. Gần đây đã có tin đồn rằng một con Hydra đang lang thang trong khe núi gần đó. Trở thành người hùng dũng cảm và đức độ mà bạn là bạn sẽ thấy bạn sẽ kiểm tra nó vào ngày hôm nay.

Vấn đề với hydrae là mỗi khi bạn cố gắng cắt đầu chúng, một số cái mới mọc lại. May mắn cho bạn, bạn có những thanh kiếm có thể cắt nhiều đầu cùng một lúc. Nhưng có một nhược điểm, nếu hydra có ít đầu hơn thanh kiếm của bạn, bạn sẽ không thể tấn công hydra. Khi hydra có đầu không chính xác, bạn đã giết nó.

Ngoài ra còn có một thanh kiếm đặc biệt gọi là The Bisector sẽ cắt đứt một nửa số đầu của Hydra, nhưng chỉ khi số lượng đầu là chẵn. Bisector hoàn toàn không thể được sử dụng khi số lượng đầu là số lẻ. Điều này khác với việc cắt đầu không.

Vì vậy, bạn đã quyết định bạn sẽ viết một chương trình máy tính để tìm ra cách tốt nhất để giết hydra.

Bài tập

Bạn sẽ được cung cấp như là đầu vào

  • số lượng đầu của Hydra bắt đầu bằng
  • số lượng người đứng đầu Hydra rút lại mỗi lượt
  • một danh sách các thanh kiếm có sẵn để sử dụng mỗi loại (mỗi thanh kiếm là một thanh kiếm hoặc cắt một số lượng đầu cố định mỗi lượt)

Bạn nên đưa ra một danh sách các chiêu thức sẽ giết chết hydra trong số lượt ít nhất có thể. Nếu không có cách nào để giết hydra, bạn phải xuất một số giá trị khác cho biết như vậy (và danh sách trống sẽ ổn nếu ngôn ngữ của bạn được gõ mạnh). Nếu có nhiều cách tối ưu để tiêu diệt hydra, bạn có thể xuất ra bất kỳ một trong số chúng hoặc tất cả chúng.

Đây là một câu hỏi vì vậy câu trả lời sẽ được tính bằng byte, với ít byte hơn sẽ tốt hơn.

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

Có sẵn theo yêu cầu

5 heads, 9 each turn,  [-1,-2,-5] -> [-5]
12 heads, 1 each turn, [/2,-1] -> No solution
8 heads, 2 each turn,  [-9, -1] -> [-1,-9]
3 heads, 23 each turn, [/2,-1,-26] -> [-1,-1,-26,-26,-26,-26,-26,-26,-26,-26]
16 heads, 1 each turn, [/2, 4, 2] -> [/2,-4,/2,-4]

Câu hỏi này là một phiên bản đơn giản hóa của cơ chế chính của HydraSlayer . Nếu bạn thích loại câu đố này, tôi khuyên bạn nên kiểm tra nó, nó khá thú vị. Tôi không có bất kỳ liên kết với trò chơi.


1
Số lượng đầu tăng mỗi lượt là không đổi, đúng không? Không phụ thuộc vào số lượng đầu cắt?
KSmarts

1
@KSmarts Đúng vậy.
Đăng Rock Garf Hunter

Nếu bisector chỉ hoạt động nếu các đầu thậm chí có nghĩa là nó không làm gì nếu chúng là số lẻ? Giải pháp cho @ThePirateBay sau đó sẽ là [/ 2, -26]
dj0wns

1
@ dj0wns Không thể sử dụng Bisector khi chúng là số lẻ.
Đăng Rock Garf Hunter

@Nnnes Điều đó có vẻ đúng, ngẫu nhiên [/2, -2, /2, -2, -4]cũng hoạt động.
Đăng Rock Garf Hunter

Câu trả lời:


3

JavaScript, 230 223 byte

f=(h,t,s)=>{m=h-Math.min(...s),d=1,q=[],s.map(a=>q.push([],h));while(q.length){p=q.shift(),h=q.shift(),s.map(w=>!(a=w?h+w:h/2)?d=w:!(a%1)&a>0&a<m&!f[a+=t]?f[q.push([...p,w],a),a]=1:0);d<1?(q=[],p).push(d):0}return d<1?p:[]}

_=_=>f=(h,t,s)=>{m=h-Math.min(...s),d=1,q=[],s.map(a=>q.push([],h));while(q.length){p=q.shift(),h=q.shift(),s.map(w=>!(a=w?h+w:h/2)?d=w:!(a%1)&a>0&a<m&!f[a+=t]?f[q.push([...p,w],a),a]=1:0);d<1?(q=[],p).push(d):0}return d<1?p:[]}

console.log(`[${_()(5, 9,  [-1,-2,-5])}]`);
console.log(`[${_()(12, 1, [0,-1])}]`);
console.log(`[${_()(8, 2,  [-9,-1])}]`);
console.log(`[${_()(1, 2,  [0,-4])}]`);
console.log(`[${_()(3, 2,  [0,-4,-1])}]`);
console.log(`[${_()(3, 4,  [0,-4,-1])}]`);
console.log(`[${_()(3, 23, [0,-1,-26])}]`);
console.log(`[${_()(16, 1, [0,-4,-2])}]`);

Phiên bản bị đánh cắp:

f=(heads,turn,swords)=>{
  max=heads-Math.min(...swords);

  found=1;
  flags=[];
  queue=[];
  swords.map(a=>queue.push([],heads));

  while(queue.length){
    path=queue.shift();
    heads=queue.shift();

    swords.map(sword=>{
      after=sword?heads+sword:heads/2;

      if(!after){
        found=sword;
      }else if(!(after%1)&after>0&after<max&!flags[after+=turn]){
        flags[after]=1;
        queue.push([...path,sword],after);
      }
    });

    if(found<1){
      path.push(found);
      break;
    }
  }

  return found<1?path:[];
}

Các bisector được đại diện là 0.

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.