Giúp tôi ép bơ


14

Trong thử thách này, tôi có một cánh đồng bơ mà tôi muốn ép nhanh nhất và hoàn toàn có thể. Bạn có thể viết một chương trình hoặc chức năng để giúp tôi tìm ra cách ép tất cả bơ một cách hoàn hảo không?

Là đầu vào, bạn sẽ lấy bơ dưới dạng lưới mx mvuông, trong đó mmột số nguyên nằm trong khoảng từ 3 đến 6. Mỗi ô vuông chứa chính xác một quả bơ. Bơ có một số giai đoạn của nước ép:

Giai đoạn 1: Bơ chưa được ép nước.
Giai đoạn 2: Bơ đã được ép một phần.
Giai đoạn 3: Quả bơ đã được ép hoàn toàn.
Giai đoạn 4: Quả bơ đã phát nổ do quá nhiều nước.

Khi bạn sử dụng một công cụ ép, bơ trong vùng tác dụng của công cụ ép đó sẽ chuyển sang giai đoạn tiếp theo. Bơ nổ có rất nhiều lực và sẽ phá hủy toàn bộ cánh đồng bơ, vì vậy hãy chắc chắn rằng không có quả bơ nào phát nổ!

Dưới đây là một ví dụ về một lưới bơ. Trong các ví dụ này, tôi đã sử dụng tọa độ 0,0cho góc dưới bên trái và tọa độ 2,2cho góc trên bên phải, mặc dù bạn có thể điều chỉnh hệ tọa độ cho phù hợp với ngôn ngữ của mình.

112
221
231

Mục tiêu là làm cho tất cả các loại bơ được ép hoàn hảo (tức là giai đoạn 3). Để đạt được điều này, bạn có ba công cụ ép khác nhau trong sở hữu của bạn. Mỗi công cụ ép có một khu vực hiệu quả khác nhau, nhưng tất cả đều làm tăng độ ngon ngọt của bơ bị ảnh hưởng lên 1.

Dưới đây là tất cả các công cụ bạn có theo ý của bạn. Bạn sử dụng máy ép bằng cách chỉ định chữ cái đầu tiên của công cụ, sau đó là tọa độ mà bạn muốn ép. Ví dụ: để sử dụng Bộ cắt trên hình vuông 5,2, bạn sẽ xuất ra S 5,2.

Máy thái : Tách tọa độ đích và quả bơ ở hai bên.

112     112     112
221 --> XXX --> 332
231     231     231

Vắt : Tách tọa độ đích và quả bơ bên trên và bên dưới.

112     1X2     122
221 --> 2X1 --> 231 --> kaboom!
231     2X1     241

Rocket Launcher : Tách tọa độ mục tiêu và tất cả các quả bơ liền kề.

112     1X2     122
221 --> XXX --> 332
221     2X1     231

Đầu vào và đầu ra mẫu

323
212
323

G 1,1
S 1,1

3312
3121
1213
2133

R 0,0
R 1,1
R 2,2
R 3,3

22322
22222
22222
33233
33333

G 0,3
G 1,3
G 2,2
G 3,3
G 4,3

222332
333221
222332
333222
222333
333222

S 1,5
S 1,3
S 1,1
S 4,5
S 4,3
S 4,1
G 5,4

Bạn dường như không nói rõ ràng điều này, nhưng giải pháp có nhất thiết phải thực hiện ít động tác nhất không?
FryAmTheEggman

1
Điều này đã bỏ qua một số ý kiến ​​xây dựng từ hộp cát. Đây là một: Tôi cho rằng bạn nên linh hoạt cho phép người dùng chọn hệ tọa độ của họ (ví dụ: nguồn gốc là 0, được lập chỉ mục hoặc 1 chỉ mục).
Greg Martin

3
@Pavel cảm ơn rất nhiều vì đã không đăng nó dưới dạng câu trả lời hoặc câu hỏi.
NoOneIsHãy

1
Tôi thấy câu hỏi này và tôi đã sẵn sàng hạ cấp, VTC và gắn cờ là thư rác. Thay vào đó, +1.
NoOneIsHãy

1
@Pavel Tôi đã rất muốn đặt tiêu đề đó ...
absinthe

Câu trả lời:


1

Toán học - 350 byte

Không phải là một giải pháp rất ngắn, nhưng tốt hơn là không có giải pháp nào cả, phải không?

t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}];""<>Cases[StringReplace[(First@Solve[(Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]/.(G|S|R)[___,0|n+1,___]->0)==3-#&&And@@t[#[i,j]>=0&],t[#[i,j]&],Integers])/.{(x_->m_):>ToString[m x]},{"["->" ","]"->"\n",", "->","}],Except@"0"]&

Một phiên bản dễ đọc hơn (có thêm khoảng trắng và thụt lề và nội dung):

t[x_] := Flatten@Table[x /@ {G, S, R}, {i, n}, {j, n}]; 
"" <> Cases[
   StringReplace[(First@
       Solve[(Table[
             G[i, j] + G[i - 1, j] + G[i + 1, j] + S[i, j] + 
              S[i, j - 1] + S[i, j + 1] + R[i, j] + R[i - 1, j] + 
              R[i + 1, j] + R[i, j - 1] + R[i, j + 1], {i, 
              n = Length@#}, {j, n}] /. (G | S | R)[___, 
              0 | n + 1, ___] -> 0) == 3 - # && 
         And @@ t[#[i, j] >= 0 &], t[#[i, j] &], 
        Integers]) /. {(x_ -> m_) :> ToString[m x]}, {"[" -> " ", 
     "]" -> "\n", ", " -> ","}], Except@"0"] &

Đầu vào là một mảng (ví dụ {{3,2,3},{2,2,2},{3,2,3}}), đầu ra là một chuỗi (với một dòng mới ở cuối - nếu điều này không được chấp nhận, hãy đóng hàm vào StringDrop[...,-1]thêm 15 byte). Tôi đã sử dụng hệ tọa độ cho biết (1,1) là góc trên cùng bên trái, (n, n) là góc dưới bên phải (trong đó n là thứ nguyên của ma trận). Đôi khi, nếu giải pháp yêu cầu thực hiện cùng một thao tác nhiều lần, thì đầu ra bao gồm những thứ như 3 G 2,2(đối với "sử dụng vắt ở (2,2) ba lần") - vì bạn không nói phải làm gì trong trường hợp này, tôi hy vọng vậy là được rồi.

Giải trình:

  • Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]tạo một mảng với các biến G [i, j] ở mỗi nơi bị ảnh hưởng bằng cách sử dụng vắt tại (i, j) và tương tự cho S [i, j] và R [i, j]. Các biến này đại diện cho số lần công cụ được sử dụng tại vị trí đó.
  • .../.(G|S|R)[___,0|n+1,___]->0 loại bỏ ảnh hưởng của việc sử dụng các công cụ tại các vị trí bên ngoài trường bơ.
  • ...==3-# so sánh điều này với sự khác biệt giữa đầu vào và một lĩnh vực bơ ép hoàn hảo.
  • ...&&And@@t[#[i,j]>=0&]cho biết các biến G [i, j], S [i, j], R [i, j] phải không âm (bạn không thể bỏ nước ép bơ!), bằng cách sử dụng tốc ký t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] tìm giải pháp số nguyên đầu tiên cho các phương trình của chúng tôi theo các biến G [i, j], S [i, j], R [i, j].
  • /.{(x_->m_):>ToString[m x]} ẩn các biến bằng 0, đồng thời đặt giải pháp ở dạng chuỗi đẹp.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]biến các chuỗi như "2 G[1, 4]"thành chuỗi như "2 G 1,4"và thêm một dòng mới vào cuối.
  • ""<>Cases[...,Except@"0"]loại bỏ tất cả các phần còn lại "0"và nối tất cả các chuỗi lại với nhau.
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.