Diventa l'idra assassina


13

Sei l'eroe migliore e più famoso della zona. Ultimamente ci sono state voci secondo cui un'Idra si è ritrovata in un burrone vicino. Essendo l'eroe coraggioso e virtuoso che sei, immagina che andrai a dare un'occhiata più tardi oggi.

Il problema con gli hydrae è che ogni volta che provi a tagliargli la testa alcuni nuovi ricrescono. Fortunatamente per te hai le spade che possono tagliare più teste contemporaneamente. Ma c'è un problema, se l'idra ha meno teste dei tagli della tua spada, non sarai in grado di attaccare l'idra. Quando l'idra ha esattamente zero teste, l'hai uccisa.

C'è anche una spada speciale chiamata The Bisector che taglierà metà delle teste dell'Hydra, ma solo se il numero di teste sarà pari. Il Bisettore non può essere usato affatto quando il numero di teste è dispari. Ciò è diverso dal taglio di zero teste.

Quindi hai deciso di scrivere un programma per computer per capire il modo migliore per uccidere l'idra.

Compito

Ti verrà dato come input

  • il numero di teste con cui Hydra inizia
  • il numero di teste che l'Idra ricresce ogni turno
  • un elenco di spade disponibili per l'uso ciascuna (ognuna è una bisettrice o taglia un numero fisso di teste ogni turno)

Dovresti produrre un elenco di mosse che uccideranno l'idra nel minor numero di turni possibili. Se non c'è modo di uccidere l'idra, devi emettere qualche altro valore che lo indichi (e l'elenco vuoto va bene se la tua lingua è fortemente tipizzata). Se ci sono diversi modi ottimali per uccidere l'idra, puoi produrre uno di essi o tutti.

Questa è una domanda di quindi le risposte verranno classificate in byte, con un numero inferiore di byte migliori.

Casi test

Altre disponibili su richiesta

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]

Questa domanda è una versione semplificata del meccanico principale di HydraSlayer . Se ti piace questo tipo di puzzle ti consiglio di provarlo, è abbastanza divertente. Non ho alcuna affiliazione con il gioco.


1
Il numero di teste cresciute ad ogni turno è costante, sì? Non dipende dal numero di teste tagliate?
KSmarts il

1
@KSmarts È corretto.
Post Rock Garf Hunter,

Se la bisettrice funziona solo se le teste sono pari, significa che non fa nulla se sono dispari? La soluzione a @ThePirateBay sarebbe quindi [/ 2, -26]
dj0wns

1
@ dj0wns I Bisettori non possono essere usati quando sono dispari.
Post Rock Garf Hunter,

@Nnnes Sembra corretto, per inciso [/2, -2, /2, -2, -4]funziona anche.
Post Rock Garf Hunter,

Risposte:


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

Versione non golfata:

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 bisettrice è rappresentata come 0.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.