히드라 슬레이어가 되십시오


13

당신은이 지역에서 가장 유명하고 유명한 영웅입니다. 최근에 이드 라 가 근처 계곡에서 놀고 있다는 소문 이있었습니다. 당신이 당신의 용감하고 고결한 영웅이기 때문에 오늘 나중에 언젠가 그것을 확인할 것입니다.

수국의 문제는 머리를자를 때마다 새로운 머리가 자라는 것입니다. 운 좋게도 여러 머리를 한 번에 잘라낼 수있는 칼이 있습니다. 그러나 히드라가 칼로 자르는 것보다 머리가 적 으면 히드라를 공격 할 수 없습니다. 히드라의 머리가 정확히 제로가되면 당신은 그것을 죽였습니다.

히드라의 머리 절반을 깎을 수 있는 이등분 이라는 특수한 칼도 있지만 머리 수는 짝수입니다. 헤드 수가 홀수이면 이등분선 을 전혀 사용할 수 없습니다 . 이것은 제로 헤드를 절단하는 것과 다릅니다.

그래서 당신은 hydra를 죽이는 가장 좋은 방법을 알아 내기 위해 컴퓨터 프로그램을 작성하기로 결정했습니다.

직무

당신은 입력으로 제공됩니다

  • 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 맞습니다.
Ad Hoc Garf Hunter

머리가 짝수 인 경우에만 이등분자가 작동한다면, 그것이 이상하다면 아무것도하지 않습니까? @ThePirateBay에 대한 해결 방법은 [/ 2, -26] 것
dj0wns

1
@ dj0wns 이등분선 이 홀수이면 사용할 수 없습니다 .
애드혹 가프 헌터

@Nnnes 맞습니다. 우연히도 [/2, -2, /2, -2, -4]작동합니다.
애드혹 가프 헌터

답변:


3

자바 스크립트, 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.