Devenez le tueur d'hydre

13

Vous êtes le héros le meilleur et le plus célèbre de la région. Dernièrement, il y a eu des rumeurs selon lesquelles une Hydre traînait dans un ravin à proximité. En étant le héros courageux et vertueux que vous êtes, vous allez le vérifier un peu plus tard dans la journée.

Le problème avec l'hydre est que chaque fois que vous essayez de vous couper la tête, de nouvelles poussent. Heureusement pour vous, vous avez des épées qui peuvent couper plusieurs têtes à la fois. Mais il y a un hic, si l'hydre a moins de têtes que vos coupes d'épée, vous ne pourrez pas attaquer l'hydre. Lorsque l'hydre a exactement zéro tête, vous l'avez tuée.

Il y a aussi une épée spéciale appelée The Bisector qui coupera la moitié des têtes de l'Hydra, mais seulement si le nombre de têtes est pair. Le Bisector ne peut pas être utilisé du tout lorsque le nombre de têtes est impair. C'est différent de couper zéro têtes.

Vous avez donc décidé d'écrire un programme informatique pour trouver la meilleure façon de tuer l'hydre.

Tâche

Vous recevrez en entrée

  • le nombre de têtes de l'Hydra commence par
  • le nombre de têtes que l'hydre repousse à chaque tour
  • une liste d'épées disponibles pour utilisation chacune (chacune est une bissectrice ou coupe un nombre fixe de têtes à chaque tour)

Vous devez produire une liste de mouvements qui tueront l'hydre dans le moins de tours possible. S'il n'y a aucun moyen de tuer l'hydre, vous devez sortir une autre valeur indiquant cela (et une liste vide est très bien si votre langue est fortement typée). S'il existe plusieurs façons optimales de tuer l'hydre, vous pouvez en générer une ou toutes.

Il s'agit d'une question de donc les réponses seront notées en octets, avec moins d'octets étant mieux.

Cas de test

Plus disponible sur demande

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]

Cette question est une version simplifiée du mécanisme principal d' HydraSlayer . Si vous aimez ce type de puzzle, je vous recommande de le vérifier, c'est assez amusant. Je n'ai aucune affiliation avec le jeu.

Post Rock Garf Hunter
la source
1
Le nombre de têtes cultivées à chaque tour est constant, oui? Pas dépendant du nombre de têtes coupées?
KSmarts
1
@KSmarts C'est exact.
Post Rock Garf Hunter
Si la bissectrice ne fonctionne que si les têtes sont égales, cela signifie-t-il qu'elle ne fait rien si elles sont bizarres? La solution à @ThePirateBay serait alors [/ 2, -26]
dj0wns
1
@ dj0wns Le Bisector ne peut pas être utilisé lorsqu'il est impair.
Post Rock Garf Hunter
@Nnnes Cela semble être correct, d'ailleurs [/2, -2, /2, -2, -4]fonctionne également.
Post Rock Garf Hunter

Réponses:

3

JavaScript, 230 223 octets

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

Version non golfée:

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

La bissectrice est représentée par 0.


la source