ハイドラスレイヤーになる


13

あなたはこの地域の最高で最も有名なヒーローです。最近、ヒドラが近くの渓谷でぶらぶらしているという噂がありました。あなたがあなたであるという勇敢で高潔なヒーローであることは、あなたが今日いつかそれをチェックアウトすることになると考えています。

ヒドラエの問題は、頭を切り落とそうとするたびに、新しい頭が成長することです。幸いなことに、あなたは一度に複数の頭を切り落とすことができる剣を持っています。しかし、ヒドラがあなたの剣のカットよりも少ない頭を持っている場合、あなたはヒドラを攻撃することはできませんキャッチがあります。ヒドラの頭が正確にゼロになったら、あなたはそれを殺しました。

呼ばれる特殊な剣もあり等分ハイドラの頭の半分を切ったが、ヘッドの数が偶数である場合にのみします。ヘッドの数が奇数の場合、Bisector はまったく使用できません。これは、ゼロヘッドの切断とは異なります。

あなたはヒドラを殺すための最良の方法を見つけるためにコンピュータープログラムを書くことに決めました。

仕事

入力として与えられます

  • Hydraが始まる頭の数
  • Hydraが毎ターン再生する頭の数
  • それぞれが使用可能な剣のリスト(それぞれが二等分線であるか、各ターンで一定数の頭を切る)

可能な限り少ないターンでヒドラを殺す動きのリストを出力する必要があります。ヒドラを殺す方法がない場合は、そのことを示す他の値を出力する必要があります(言語が強く入力されている場合は空のリストでも構いません)。ヒドラを殺すための最適な方法が複数ある場合、それらのいずれかまたはすべてを出力できます。

これは質問なので、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。

テストケース

リクエストにより利用可能

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 Bisector は、奇数の場合は使用できません
ポストロックガーフハンター

@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ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.