Menjadi Hydra Slayer

13

Anda adalah pahlawan terbaik dan paling terkenal di daerah tersebut. Akhir-akhir ini ada desas-desus bahwa seekor Hydra telah nongkrong di jurang terdekat. Menjadi pahlawan pemberani dan berbudi luhur bahwa Anda adalah Anda akan pergi memeriksanya nanti hari ini.

Masalah dengan hydrae adalah bahwa setiap kali Anda mencoba memotong kepala mereka, beberapa yang baru tumbuh kembali. Beruntung bagi Anda, Anda memiliki pedang yang dapat memotong beberapa kepala sekaligus. Tapi ada yang menangkap, jika hydra memiliki kepala lebih sedikit daripada pedangmu, kamu tidak akan bisa menyerang hydra. Ketika hydra memiliki nol kepala, Anda telah membunuhnya.

Ada juga pedang khusus yang disebut The Bisector yang akan memotong setengah kepala Hydra, tetapi hanya jika jumlah kepala genap. Bisector tidak dapat digunakan sama sekali ketika jumlah kepala ganjil. Ini berbeda dari memotong nol kepala.

Jadi Anda telah memutuskan Anda akan menulis sebuah program komputer untuk mencari cara terbaik untuk membunuh hydra.

Tugas

Anda akan diberikan sebagai input

  • jumlah kepala Hydra dimulai dengan
  • jumlah kepala Hydra yang tumbuh kembali setiap belokan
  • daftar pedang yang tersedia untuk digunakan masing-masing (masing-masing adalah bisector atau memotong sejumlah kepala tetap setiap belokan)

Anda harus menampilkan daftar gerakan yang akan membunuh hydra dalam jumlah putaran paling sedikit. Jika tidak ada cara untuk membunuh hydra, Anda harus menampilkan beberapa nilai lain yang menunjukkan demikian (dan daftar kosong tidak masalah jika bahasa Anda diketik dengan kuat). Jika ada beberapa cara optimal untuk membunuh hydra, Anda dapat mengeluarkan salah satu dari mereka atau semuanya.

Ini adalah pertanyaan sehingga jawaban akan dinilai dalam byte, dengan lebih sedikit byte yang lebih baik.

Uji Kasus

Lebih banyak tersedia berdasarkan permintaan

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]

Pertanyaan ini adalah versi sederhana dari mekanik utama HydraSlayer . Jika Anda menyukai jenis teka-teki ini, saya sarankan memeriksanya, cukup menyenangkan. Saya tidak memiliki afiliasi dengan permainan.

Posting Rock Garf Hunter
sumber
1
Jumlah kepala yang tumbuh setiap belokan adalah konstan, ya? Tidak tergantung pada jumlah kepala terputus?
KSmarts
1
@KSmarts Itu benar.
Post Rock Garf Hunter
Jika uskup hanya bekerja jika kepala itu bahkan apakah itu berarti tidak ada artinya jika mereka aneh? Solusi untuk @ThePirateBay akan menjadi [/ 2, -26]
dj0wns
1
@ dj0wns Bisector tidak dapat digunakan saat ganjil.
Post Rock Garf Hunter
@Nnnes Itu sepertinya benar, kebetulan [/2, -2, /2, -2, -4]juga berfungsi.
Posting Rock Garf Hunter

Jawaban:

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

Versi tidak disatukan:

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

Uskup diwakili sebagai 0.


sumber