ช่วยน้ำผลไม้อะโวคาโดของฉัน


14

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

ในฐานะที่เป็นข้อมูลเข้าคุณจะได้รับอะโวคาโดเป็นตารางสี่เหลี่ยมmx mซึ่งmเป็นจำนวนเต็มระหว่าง 3 ถึง 6 แต่ละตารางประกอบด้วยอะโวคาโดหนึ่งอัน อะโวคาโดมีความฉ่ำหลายขั้นตอน:

ขั้นตอนที่ 1:อะโวคาโดยังไม่ได้ดื่มเลย
ด่าน 2:อะโวคาโดถูกน้ำท่วมบางส่วน
ขั้นตอนที่ 3:อะโวคาโดได้รับผลกระทบอย่างสมบูรณ์
ขั้นตอนที่ 4:อะโวคาโดระเบิดเนื่องจากน้ำผลไม้มากเกินไป

เมื่อคุณใช้เครื่องมือคั้นน้ำอะโวคาโดในพื้นที่ของเครื่องมือทำให้เกิดการเคลื่อนย้ายไปยังขั้นต่อไป อะโวคาโดการระเบิดมีพลังมากมายและจะทำลายฟิลด์อะโวคาโดทั้งหมดดังนั้นอย่าให้อะโวคาโดระเบิด!

นี่คือตัวอย่างของตารางอะโวคาโด ในตัวอย่างเหล่านี้ฉันใช้พิกัด0,0สำหรับมุมล่างซ้ายและพิกัด2,2สำหรับมุมบนขวาแม้ว่าคุณสามารถปรับระบบพิกัดให้เหมาะกับภาษาของคุณ

112
221
231

เป้าหมายคือเพื่อให้อะโวคาโดทุกคนมีน้ำผลไม้ที่สมบูรณ์แบบ (เช่นขั้นตอนที่ 3) เพื่อให้บรรลุเป้าหมายนี้คุณมีเครื่องมือคั้นน้ำสามแบบที่คุณมีอยู่ เครื่องมือคั้นน้ำแต่ละเครื่องมีพื้นที่ของเอฟเฟกต์ที่แตกต่างกัน แต่พวกมันทั้งหมดเพิ่มความชุ่มชื่นของอะโวคาโดที่ได้รับผลกระทบโดย 1

นี่คือเครื่องมือทั้งหมดที่คุณมีในการกำจัดของคุณ คุณใช้เครื่องคั้นน้ำโดยระบุอักษรตัวแรกของเครื่องมือจากนั้นพิกัดที่คุณต้องการคั้น ยกตัวอย่างเช่นการใช้เครื่องตัดบนตารางคุณจะเอาท์พุท5,2S 5,2

ตัวแบ่งส่วนข้อมูล : ทำนายการประสานงานเป้าหมายและอะโวคาโดทั้งสองด้าน

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

กระต่ายขูด : น้ำผลไม้ประสานงานเป้าหมายและอะโวคาโดด้านบนและด้านล่าง

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

Rocket Launcher : ยิงเป้าหมายพิกัดและอะโวคาโดที่อยู่ติดกันทั้งหมด

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

ตัวอย่างอินพุตและเอาต์พุต

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

คุณดูเหมือนจะไม่พูดอย่างชัดเจน แต่วิธีการแก้ปัญหาต้องดำเนินการน้อยที่สุดอย่างแน่นอนหรือไม่?
FryAmTheEggman

1
สิ่งนี้ได้เพิกเฉยต่อความคิดเห็นที่สร้างสรรค์จากกล่องทราย นี่คือข้อเสนอหนึ่ง: ฉันคิดว่าคุณควรอนุญาตให้ผู้ใช้เลือกระบบพิกัดได้อย่างยืดหยุ่น (เช่นที่ต้นกำเนิดคือ 0-indexed หรือ 1-indexed)
Greg Martin

3
@Pavel ขอบคุณมากที่ไม่ได้โพสต์ว่าเป็นคำตอบหรือคำถาม
NoOneIsHere

1
ฉันเห็นคำถามนี้และพร้อมที่จะลงคะแนน VTC และตั้งค่าสถานะเป็นสแปม +1
NoOneIsHere

1
@Pavel ฉันถูกล่อลวงให้สร้างชื่อนั้นขึ้นมา ...
absinthe

คำตอบ:


1

Mathematica - 350 ไบต์

ไม่ใช่ทางออกที่สั้นมาก แต่ดีกว่าไม่มีวิธีแก้ปัญหาเลยใช่ไหม

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"]&

รุ่นที่อ่านได้มากขึ้น (พร้อมช่องว่างพิเศษและเยื้องและเนื้อหา):

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"] &

อินพุตเป็นอาร์เรย์ (เช่น{{3,2,3},{2,2,2},{3,2,3}}) เอาต์พุตเป็นสตริง (ที่มีบรรทัดใหม่ต่อท้าย - หากไม่สามารถยอมรับได้ให้ล้อมรอบฟังก์ชันไว้StringDrop[...,-1]สำหรับ 15 ไบต์พิเศษ) ฉันใช้ระบบพิกัดที่บอกว่า (1,1) เป็นมุมบนซ้าย (n, n) คือมุมล่างขวา (โดยที่ n คือมิติของเมทริกซ์) บางครั้งหากวิธีการแก้ปัญหาต้องดำเนินการเดียวกันหลายครั้งผลลัพธ์รวมถึงสิ่งที่ต้องการ3 G 2,2 (สำหรับ "ใช้ตัวขูดที่ (2,2) สามครั้ง") - เนื่องจากคุณไม่ได้พูดว่าจะทำอย่างไรในกรณีนี้ฉันหวังว่า ไม่เป็นไร.

คำอธิบาย:

  • 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 [i, j] ในแต่ละสถานที่ที่ได้รับผลกระทบจากการใช้เครื่องขูดที่ (i, j) และในทำนองเดียวกันสำหรับ S [i, j] และ R [i, j] ตัวแปรเหล่านี้แสดงจำนวนครั้งที่เครื่องมือใช้ในตำแหน่งนั้น
  • .../.(G|S|R)[___,0|n+1,___]->0 ลบผลกระทบของการใช้เครื่องมือที่ตำแหน่งนอกเขตอะโวคาโด
  • ...==3-# เปรียบเทียบสิ่งนี้กับความแตกต่างระหว่างอินพุทและฟิลด์ของอะโวคาโดที่มีน้ำผลไม้สมบูรณ์แบบ
  • ...&&And@@t[#[i,j]>=0&]กล่าวว่าตัวแปร G [i, เจ], S [I, J] R [i, เจ] จะต้องไม่เป็นลบ (คุณไม่สามารถยกเลิกการน้ำอะโวคาโด!) t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}]โดยใช้ชวเลข
  • First@Solve[...,t[#[i,j]&],Integers] ค้นหาคำตอบจำนวนเต็มแรกของสมการของเราในรูปของตัวแปร G [i, j], S [i, j], R [i, j]
  • /.{(x_->m_):>ToString[m x]} ซ่อนตัวแปรที่มีค่าเท่ากับศูนย์ในขณะที่วางโซลูชันในรูปแบบสตริงที่ดี
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]เปลี่ยนสตริง"2 G[1, 4]"ให้เป็นสตริงเช่น"2 G 1,4"และเพิ่มขึ้นบรรทัดใหม่ในตอนท้าย
  • ""<>Cases[...,Except@"0"]ลบ"0"s ที่เหลือทั้งหมดและรวมสตริงทั้งหมดเข้าด้วยกัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.