Стань Убийцей Гидры


13

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

Проблема с гидрами в том, что каждый раз, когда вы пытаетесь отрезать им голову, отрастают новые. К счастью для вас, у вас есть мечи, которые могут отрезать сразу несколько голов. Но есть одна загвоздка: если у гидры меньше голов, чем у ваших порезов мечом, вы не сможете атаковать гидру. Когда у гидры ровно ноль голов, вы ее убили.

Существует также специальный меч под названием Бисектор , который отрезает половину головы Гидры, но только если количество голов четное. Бисектор не может быть использован вообще, если количество голов нечетное. Это отличается от отрезания нулевых головок.

Итак, вы решили, что напишете компьютерную программу, чтобы выяснить лучший способ убить гидру.

задача

Вам будет дано в качестве ввода

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

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

Это вопрос по поэтому ответы будут оцениваться в байтах, при этом меньшее количество байтов будет лучше.

Тестовые случаи

Более доступны по запросу

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 Это правильно.
Пост Рок Гарф Хантер

Если биссектриса работает только при четных головах, значит ли это, что они ничего не делают, если они нечетные? Тогда решением @ThePirateBay будет [/ 2, -26]
dj0wns

1
@ dj0wns Бисектор нельзя использовать, если они нечетные.
Опубликовать Рок Гарф Хантер

@Nnnes Это, кажется, правильно, кстати, [/2, -2, /2, -2, -4]тоже работает.
Пост Рок Гарф Хантер

Ответы:


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.