กลายเป็นผู้ฆ่าไฮดรา


13

คุณเป็นฮีโร่ที่ดีที่สุดและมีชื่อเสียงที่สุดในพื้นที่ เมื่อไม่นานมานี้มีข่าวลือว่าไฮดราถูกแขวนอยู่ในหุบเขาใกล้เคียง เป็นฮีโร่ที่กล้าหาญและมีคุณธรรมที่คุณเป็นคุณจะต้องไปตรวจสอบในวันนี้

ปัญหาของไฮดราคือทุกครั้งที่คุณพยายามที่จะตัดหัวของพวกเขาบางคนก็งอกใหม่ โชคดีสำหรับคุณคุณมีดาบที่สามารถตัดหัวได้หลายหัวในครั้งเดียว แต่มีการจับถ้าไฮดรามีหัวน้อยกว่าการตัดดาบของคุณคุณจะไม่สามารถโจมตีไฮดรา เมื่อไฮดรามีหัวเป็นศูนย์แน่นอนคุณได้ฆ่ามัน

นอกจากนี้ยังมีดาบพิเศษที่เรียกว่าThe Bisectorซึ่งจะตัดหัวของไฮดราออกครึ่งหนึ่ง แต่ถ้าจำนวนหัวเท่ากัน Bisector ไม่สามารถใช้งานได้เลยเมื่อจำนวนของหัวเป็นเลขคี่ สิ่งนี้แตกต่างจากการตัดศูนย์หัว

ดังนั้นคุณตัดสินใจว่าคุณจะเขียนโปรแกรมคอมพิวเตอร์เพื่อหาวิธีที่ดีที่สุดในการสังหารไฮดรา

งาน

คุณจะได้รับเป็นอินพุต

  • จำนวนหัวที่ไฮดราเริ่มต้นด้วย
  • จำนวนของหัวที่ไฮดรางอกใหม่ในแต่ละเทิร์น
  • รายการดาบที่มีให้ใช้งานแต่ละอัน (แต่ละอันคือเส้นแบ่งครึ่งหรือตัดจำนวนคงที่ของหัวแต่ละตา)

คุณควรแสดงรายการการเคลื่อนไหวที่จะฆ่าไฮดราในจำนวนรอบที่น้อยที่สุดที่เป็นไปได้ หากไม่มีวิธีที่จะฆ่าไฮดราคุณต้องส่งออกค่าอื่น ๆ ที่ระบุดังนี้ หากมีหลายวิธีที่ดีที่สุดในการฆ่าไฮดราคุณสามารถส่งออกหนึ่งในนั้นหรือทั้งหมด

นี่เป็นคำถามเกี่ยวกับดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยมีจำนวนไบต์น้อยกว่าดีกว่า

กรณีทดสอบ

เพิ่มเติมตามคำขอ

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 ถูกต้อง
Ad Hoc Garf Hunter

ถ้า bisector ใช้งานได้ถ้าหัวยังคงอยู่นั่นหมายความว่ามันไม่ทำอะไรเลยถ้ามันแปลก ๆ ? โซลูชันสำหรับ @ThePirateBay จะเป็น [/ 2, -26]
dj0wns

1
@ dj0wns ไม่สามารถใช้ Bisector ได้เมื่อมันแปลก
Ad Hoc Garf Hunter

@Nnnes ที่ดูเหมือนว่าจะถูกต้องบังเอิญ[/2, -2, /2, -2, -4]ยังทำงานได้
Ad Hoc Garf Hunter

คำตอบ:


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

bisector 0จะแสดงเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.