Một túi bánh mì lười biếng


11

Tôi làm việc tại một tiệm bánh phục vụ lúa mì, lúa mạch đen, lúa mạch, ngũ cốc và bánh mì Pháp, nhưng người thợ làm bánh hơi kỳ lạ - anh ta xếp các ổ bánh theo thứ tự ngẫu nhiên, và đôi khi chỉ để một số kệ ở cuối.

Mỗi ngày, cùng một khách hàng đến và yêu cầu một trong từng ổ bánh mì, nhưng điều khó khăn là, anh ta là một mầm cây, vì vậy khi tôi đổ đầy túi của anh ta, tôi không thể lấy ổ bánh từ hai kệ liền kề trong các lựa chọn liên tiếp.

Phải mất một giây để đi bộ giữa các kệ liền kề. Đó là một cửa hàng bận rộn; đối với bất kỳ cấu hình ngẫu nhiên nào của các ổ bánh, tôi muốn giảm thiểu thời gian cần thiết để có được một trong mỗi ổ bánh duy nhất. Tôi có thể bắt đầu và kết thúc tại bất kỳ kệ.

Nếu đặt hàng ngày hôm nay W B W G F R W, một đường dẫn có thể là 0, 3, 5, 1, 4, trong tổng cộng 12 giây:abs(3-0) + abs(5-3) + abs(1-5) + abs(4-1) = 12

( 1, 2, 3, 4, 5không hoạt động, vì bánh mì được chọn liên tiếp từ các kệ liền kề.)

Nếu đó B W B G B F B R B W B F, một con đường có thể là 1, 3, 5, 7, 10, trong tổng cộng 9 giây.

Người quản lý luôn đảm bảo có một giải pháp khả thi, vì vậy tôi không cần phải lo lắng về việc bắt các đầu vào xấu. Anh ấy thường gửi cho tôi thứ tự trong một tập tin, nhưng nếu tôi muốn, tôi có thể gõ nó vào STDIN hoặc đọc nó theo một cách khác. Tôi muốn chương trình in ra các chỉ số của đường dẫn tốt nhất, cũng như thời gian của nó, theo quy tắc I / O mặc định .

Nói ngắn gọn:

  1. 5 loại bánh mì.
  2. Đơn đặt hàng Loaf xuất hiện dưới dạng chuỗi của thứ tự ngẫu nhiên và độ dài.
  3. Phải chọn một trong mỗi ổ duy nhất.
  4. Không thể thực hiện các lựa chọn liên tiếp liền kề.
  5. Giảm thiểu khoảng cách giữa các chỉ số lựa chọn.
  6. Đừng lo lắng về đầu vào không hợp lệ.
  7. Quy tắc I / O mặc định được áp dụng.

Đây là , số byte ngắn nhất sẽ thắng.


0+3+5+1+4=13nhưng 1+3+5+7+10=26, không phải 9.
Shaggy

2
@LuisfelipeDejesusMunoz Không hoàn toàn, một vài trong số các phân liên tiếp đó liền kề nhau.
Nick Reed

4
Chào mừng bạn đến với PPCG, và thử thách đầu tiên tốt đẹp!
dùng202729

2
Điều này không quan trọng đối với nhiệm vụ thực tế, nhưng tôi tò mò: tại sao anh ta là một mầm bệnh có nghĩa là bạn không thể lấy ổ bánh từ hai kệ liền kề trong các lựa chọn liên tiếp?
- Phục hồi lại

1
Có thể có bất kỳ kệ trống không ở cuối? (ví dụ: cũng là 'WBWG FRW'một đầu vào hợp lệ?
Jonathan Allan

Câu trả lời:


3

JavaScript (ES6), 114 byte

Đã lưu 1 byte nhờ @Oliver

Đưa đầu vào như một mảng các ký tự. Xuất ra một chuỗi được phân tách bằng dấu phẩy trong đó giá trị đầu tiên là tổng thời gian và các chuỗi tiếp theo mô tả đường dẫn.

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)``

Hãy thử trực tuyến!

Đã bình luận

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 = [""]

0

Python 2 , 212 210 byte

lambda s:min((sum(h(p)),p)for b in combinations(range(len(s)),5)for p in permutations(b)if(len(set(s[i]for i in p))==5)&all(d>1for d in h(p)))
h=lambda p:[abs(y-x)for x,y in zip(p,p[1:])]
from itertools import*

Hãy thử trực tuyến!

2 byte thx cho Jonathan Frech .


if len(...)==5and all(...)có thể if(len(...)==5)&all(...)để lưu hai byte.
Jonathan Frech
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.