게으른 빵 봉지


11

나는 밀, 호밀, 보리, 곡물 및 프랑스 빵을 제공하는 빵집에서 일하지만 빵 굽는 사람은 조금 이상합니다. 그는 빵을 무작위로 쌓아 놓고 때로는 선반 끝을 비워 둡니다.

매일 같은 고객이 들어 와서 빵 한 덩어리를 요구하지만, 까다로운 점은 그는 거대 동물이므로 가방을 채울 때 인접한 두 선반에서 덩어리를 연속으로 선택할 수는 없습니다.

인접한 선반 사이를 걷는 데 1 초가 걸립니다. 바쁜 가게입니다. 덩어리의 임의의 구성에 대해, 나는 각 독특한 덩어리 중 하나를 얻는 데 걸리는 시간을 최소화하고 싶습니다. 어떤 선반에서든 시작하고 끝낼 수 있습니다.

오늘의 주문이 W B W G F R W인 경우 가능한 경로는 0, 3, 5, 1, 4총 12 초입니다.abs(3-0) + abs(5-3) + abs(1-5) + abs(4-1) = 12

( 1, 2, 3, 4, 5빵은 인접한 선반에서 연속적으로 골라지기 때문에 작동하지 않습니다.)

인 경우 B W B G B F B R B W B F가능한 경로는 1, 3, 5, 7, 10총 9 초입니다.

관리자는 항상 가능한 해결책이 있는지 확인하므로 잘못된 입력을 잡는 것에 대해 걱정할 필요가 없습니다. 그는 보통 주문서를 파일로 보내지 만, 원하는 경우 STDIN에 입력하거나 다른 방식으로 읽을 수 있습니다. 기본 I / O 규칙 에 따라 프로그램이 최상의 경로의 색인과 시간을 인쇄하고 싶습니다 .

한마디로 :

  1. 5 종류의 빵.
  2. 로프 주문은 임의의 순서와 길이의 문자열로 나타납니다.
  3. 고유 한 덩어리 중 하나를 선택해야합니다.
  4. 인접한 연속 선택을 할 수 없습니다.
  5. 선택 지수 사이의 거리를 최소화하십시오.
  6. 유효하지 않은 입력에 대해 걱정할 필요가 없습니다.
  7. 기본 I / O 규칙이 적용됩니다.

이것은 가장 짧은 바이트 수의 입니다.


0+3+5+1+4=13하지만 1+3+5+7+10=26,하지 9.
얽히고 설킨

2
@LuisfelipeDejesusMunoz 확실하지는 않지만, 그 연속 된 몇 가지 속임수가 인접 해 있습니다.
닉 리드

4
PPCG에 오신 것을 환영합니다. 멋진 첫 도전입니다!
user202729

2
실제 작업에 중요하지는 않지만 궁금합니다. 왜 그가 거대 인이되어 연속 선택에서 두 개의 인접한 선반에서 덩어리를 가져갈 수 없다는 것을 의미합니까?
sundar-복 직원 모니카

1
끝에 없는 빈 선반이있을 수 있습니까? (예 : 'WBWG FRW'유효한 입력입니까?
Jonathan Allan

답변:


3

자바 스크립트 (ES6), 114 바이트

@Oliver 덕분에 1 바이트 절약

문자 배열로 입력을받습니다. 첫 번째 값이 총 시간이고 다음 값이 경로를 설명하는 쉼표로 구분 된 문자열을 출력합니다.

a=>(b=g=(r,s=o='',c,p)=>s[c>b|4]?o=(b=c)+r:a.map((v,i)=>s.match(v)||(d=p<i?i-p:p-i)<2||g([r,i],s+v,~~c+d,i))&&o)``

온라인으로 사용해보십시오!

댓글

a => (                          // a[] = input array
  b =                           // b = best score so far (initially a non-numeric value)
  g = (                         // g = recursive function taking:
    r,                          //   r = path
    s =                         //   s = string of collected loaves of bread
    o = '',                     //   o = final output
    c,                          //   c = current cost
    p                           //   p = index of the last visited shelf 
  ) =>                          //
    s[c > b                     // if the final cost is not greater than our best score
            | 4] ?              // and we've successfully collected 5 loaves of bread:
      o = (b = c) + r           //   update the current output and the best score
    :                           // else:
      a.map((v, i) =>           //   for each loaf of bread v at shelf i in a[]:
        s.match(v) ||           //     if we've already collected this kind of bread
        (d =                    //     or the distance d
          p < i ? i - p : p - i //     defined as the absolute value of p - i
        ) < 2 ||                //     is less than 2: stop recursion
        g(                      //     otherwise, do a recursive call to g() with:
          [r, i],               //       r updated with the index of the current shelf
          s + v,                //       s updated with the current loaf of bread
          ~~c + d,              //       c updated with the last distance
          i                     //       i as the index of the last shelf
        )                       //     end of recursive call
      )                         //   end of map()
      && o                      //   return the current output
  )``                           // initial call to g() with r = [""]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.