Стати вбивцею гідри


13

Ви найкращий і найвідоміший герой області. Останнім часом ходили чутки, що в сусідньому яру висіла гідра . Будучи сміливим і доброчесним героєм, який ви є, ви зрозумієте, що ви підете перевірити це десь пізніше сьогодні.

Проблема гідри полягає в тому, що кожного разу, коли ви намагаєтеся відрізати їм голови, нові нові відростають. На щастя, у вас є мечі, які можуть відрізати відразу кілька голів. Але є улов, якщо у гідри менше головок, ніж у твого різання меча, ти не зможеш напасти на гідру. Коли у гідри рівно нульові голови, ти її вбив.

Існує також спеціальний меч під назвою «Бісектриса», який відріже половину голів гідри, але тільки якщо кількість голів буде парною. Бісектрису взагалі не можна використовувати, коли кількість головок непарна. Це відрізняється від відрізання нульових головок.

Тож ви вирішили написати комп’ютерну програму, щоб визначити найкращий спосіб вбити гідру.

Завдання

Вам буде подано як вхід

  • кількість головок, з яких починається гідра
  • кількість голів Hydra відновлює кожен виток
  • список мечів, доступних для використання кожен (кожен з них є бісектрисою або ріже фіксовану кількість голів кожного витка)

Вам слід вивести список рухів, які вб'ють гідру за найменшу кількість можливих оборотів. Якщо немає можливості вбити гідру, ви повинні вивести якесь інше значення, що вказує так (і порожній список добре, якщо ваша мова сильно набрана). Якщо існує кілька оптимальних способів вбити гідру, ви можете вивести будь-який з них або всі вони.

Це питання з тому відповіді будуть набиратись у байтах, меншою кількістю байтів буде краще.

Випробування

Більш доступні за запитом

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]

Це питання є спрощеною версією головного механіка HydraSlayer . Якщо вам подобається цей тип головоломки, я рекомендую перевірити його, його дуже цікаво. Я не маю ніякої приналежності до гри.


1
Кількість голів, що вирощуються кожного витку, є постійною, так? Не залежить від кількості відрізаних головок?
KSmarts

1
@KSmarts Це правильно.
Ad Hoc Hunter Hunter

Якщо бісектриса працює лише в тому випадку, якщо голови рівні, це означає, що нічого не робить, якщо вони непарні? Тоді рішення @ThePirateBay буде [/ 2, -26]
dj0wns

1
@ dj0wns Бісектрису не можна використовувати, коли вони непарні.
Ad Hoc Garf Hunter

@Nnnes Це, мабуть, правильно, інцидент [/2, -2, /2, -2, -4]також працює.
Ad Hoc Hunter Hunter

Відповіді:


3

JavaScript, 230 223 байт

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])}]`);

Негольована версія:

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:[];
}

Бісектриса представлена ​​як 0.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.