Hydra Avcısı Olun


13

Bölgenin en iyi ve en ünlü kahramanısın. Son zamanlarda, bir Hydra'nın yakındaki bir vadide asılı olduğu söylentileri var . Eğer sen cesur ve erdemli kahraman olarak, bugün bir süre sonra kontrol gidersiniz anlamaya.

Hydrae ile ilgili sorun, kafalarını her kesmeye çalıştığınızda bazı yenilerinin büyümesidir. Neyse ki sizin için aynı anda birden fazla kafa kesebilen kılıçlarınız var. Ama bir av var, eğer hidra kılıcı kesimlerinden daha az başa sahipse, hidraya saldıramazsın. Hidra tamamen sıfır kafaya sahip olduğunda, onu öldürdün.

Ayrıca Hydra'nın kafalarının yarısını kesecek olan Bisektör adı verilen özel bir kılıç da var, ancak sadece kafa sayısı eşitse. Bisektör , kafa sayısı tek olduğunda hiç kullanılamaz . Bu sıfır kafaları kesmekten farklıdır.

Hydra'yı öldürmenin en iyi yolunu bulmak için bir bilgisayar programı yazmaya karar verdiniz.

Görev

Size giriş olarak verilecektir

  • Hydra'nın başladığı kafa sayısı
  • Hydra'nın her turda aldığı kafa sayısı
  • her biri kullanım için mevcut olan kılıçların listesi

Hydra'yı mümkün olan en az dönüşle öldürecek bir hamle listesi çıkarmalısınız. Hidrayı öldürmenin bir yolu yoksa, bunu gösteren başka bir değer çıkarmanız gerekir (ve diliniz güçlü bir şekilde yazıldıysa boş liste iyidir). Hidra'yı öldürmenin birden fazla optimal yolu varsa, bunlardan herhangi birini veya hepsini çıktısını alabilirsiniz.

Bu bir sorusudur, bu nedenle cevaplar bayt cinsinden puanlandırılacak, daha az bayt daha iyi olacaktır.

Test Durumları

Talep üzerine daha fazlası

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]

Bu soru HydraSlayer'ın ana tamircisinin basitleştirilmiş bir versiyonudur . Eğer bu tür bir bulmaca isterseniz, kontrol etmenizi öneririz, oldukça eğlenceli. Oyunla herhangi bir bağlantım yok.


1
Her turda yetiştirilen kafa sayısı sabittir, değil mi? Kesilen kafa sayısına bağlı değil misiniz?
KSmarts

1
@KSmarts Doğru.
Ad Hoc Garf Hunter

Bisektör sadece kafalar bile çalışıyorsa, bu garipse hiçbir şey yapmaz anlamına mı geliyor? @ThePirateBay için çözüm daha sonra [/ 2, -26] olacaktır
dj0wns

1
@ dj0wns Bisektör garip olduklarında kullanılamaz .
Ad Hoc Garf Hunter

@Nnnes Doğru gibi görünüyor, tesadüfen [/2, -2, /2, -2, -4]de çalışıyor.
Ad Hoc Garf Hunter

Yanıtlar:


3

JavaScript, 230 223 bayt

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

Ungolfed sürümü:

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

Bisektör, olarak temsil edilir 0.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.