จับแกะเหล่านั้น!


16

คุณเป็นเกษตรกรและฝูงแกะของคุณได้หลบหนีไป! ไม่นะ!

ล้อมรอบแกะเหล่านั้นด้วยการสร้างรั้วเพื่อเก็บไว้ ในฐานะเกษตรกรที่มีงบประมาณ จำกัด คุณต้องการใช้รั้วน้อยที่สุดเท่าที่จะเป็นไปได้ โชคดีสำหรับคุณพวกเขาไม่ใช่แกะที่ฉลาดที่สุดในโลกและไม่ต้องกังวลกับการเคลื่อนไหวหลังจากหนีรอดมาได้

งาน

รับรายการพิกัดส่งเอาต์พุตจำนวนเซ็กเมนต์รั้วน้อยที่สุดที่จำเป็นเพื่อให้มีแกะ

กฎระเบียบ

  • มีแกะอยู่หากไม่สามารถเดินได้ (ไม่มีรูในรั้ว)
  • คุณไม่จำเป็นต้องมีแกะทั้งหมดในรั้วหนึ่งบล็อก - อาจมีหลายพื้นที่ที่ไม่พอใจไม่เป็นอิสระจากกัน
  • ส่วนของรั้วนั้นเน้นไปในทิศทางที่สำคัญ
  • tuple พิกัดแต่ละอันแสดงถึงแกะตัวเดียว
  • ข้อมูลที่ป้อนจะต้องเป็นจำนวนเต็มบวกx>0และy>0สามารถจัดรูปแบบอย่างเหมาะสมสำหรับภาษาของคุณ
    • เช่น: {{1,1},{2,1},{3,7}, .. }หรือ[1,2],[2,1],[3,7], ..
  • ช่องว่างภายในพื้นที่ไม่พอใจไม่เป็นไร
  • คุณไม่สามารถสันนิษฐานได้ว่าพิกัดป้อนเข้าในลำดับเฉพาะใด ๆ

ตัวอย่างเช่นแกะเดียวต้องมี4ส่วนรั้วที่จะถูกบรรจุอย่างเต็มที่

กรณีทดสอบ

[1,1]
4

[1,1],[1,2],[2,2]
8

[2,1],[3,1],[2,3],[1,1],[1,3],[3,2],[1,2],[3,3]
12

[1,1],[1,2],[2,2],[3,7],[4,9],[4,10],[4,11],[5,10]
22

[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]
36

[1,1],[2,2],[3,3],[4,4],[6,6],[7,7],[8,8],[9,9]
32

[2,1],[8,3],[8,4]
10

หมายเหตุ

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!


อินพุตสามารถเป็นรายการของพิกัด x ตามด้วยรายการพิกัด y หรือไม่? เช่น{1,2,3,4},{5,6,7,8} -> {1,5},{2,6},{3,7},{4,8}
Pavel

@Phoenix Nope แต่ละx,yอินพุตต้องอยู่ด้วยกัน คิดดีแม้ว่าฉันไม่ได้คิดว่าตัวเอง
CzarMatt

ขอบเขตของพิกัดคืออะไร? 0s และเนกาทีฟเป็นไปได้หรือไม่
AGourd

3
มันยากอย่างน่าประหลาดใจ ทุกครั้งที่ฉันคิดว่าฉันมีวิธีแก้ปัญหาที่จัดการทุกกรณีมีบางอย่างที่ฉันพลาด
xnor

1
ว้าวสิ่งที่ท้าทาย ฉันยอมรับการสูญเสียของฉัน; สกรูทำสิ่งนี้ใน 05AB1E
Magic Octopus Urn

คำตอบ:


5

JavaScript (ES6), 251 244 275 ไบต์

a=>Math.min(...(P=(a,r=[[a]],c=a[0])=>(a[1]&&P(a.slice(1)).map(l=>(r.push([[c],...l]),l.map((_,i)=>r.push([[c,...l[i]],...((b=[...l]).splice(i,1),b)])))),r))(a).map(L=>L.reduce((p,l)=>l.map(([h,v])=>(x=h<x?h:x,X=h<X?X:h,y=v<y?v:y,Y=v<Y?Y:v),x=y=1/0,X=Y=0)&&p+X-x+Y-y+2,0)))*2

อย่างไร?

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

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

กรณีทดสอบ


เกี่ยวกับขั้นตอนที่ 2 ทำไม[ [1,1],[2,2] ] , [ [1,2] ]ล่ะ
edc65

@ edc65 หวังว่าจะได้รับการแก้ไขแล้ว
Arnauld

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.