Fang die Schafe!

16

Du bist ein Bauer und deine Schafherde ist geflohen! Ach nein!

Runden Sie diese Schafe auf, indem Sie Zäune bauen, um sie einzudämmen. Als Landwirt mit kleinem Budget möchten Sie möglichst wenig Zaun verwenden. Glücklicherweise sind sie nicht die klügsten Schafe der Welt und bewegen sich nicht, nachdem sie entkommen sind.

Aufgabe

Geben Sie anhand einer Koordinatenliste die geringste Anzahl von Zaunsegmenten aus, die zur Aufnahme der Schafe erforderlich sind.

Regeln

  • Schafe sind enthalten, wenn sie nicht abwandern können (keine Löcher im Zaun).
  • Sie müssen nicht alle Schafe in einem Block Zaun enthalten - es können mehrere voneinander unabhängige, umzäunte Bereiche vorhanden sein.
  • Zaunsegmente sind in Hauptrichtungen ausgerichtet.
  • Jedes Koordinatentupel repräsentiert ein einzelnes Schaf.
  • Die Eingabe muss aus positiven Ganzzahlpaaren x>0& bestehen y>0, kann jedoch für Ihre Sprache entsprechend formatiert werden.
    • dh: {{1,1},{2,1},{3,7}, .. }oder[1,2],[2,1],[3,7], ..
  • Leerstellen in einem abgegrenzten Bereich sind in Ordnung.
  • Sie können nicht davon ausgehen, dass Koordinaten in einer bestimmten Reihenfolge eingegeben werden.

Zum Beispiel erfordert ein einzelnes Schaf, dass 4Zaunsegmente vollständig eingeschlossen sind.

Testfälle

[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

Anmerkungen

  • Sie können davon ausgehen, dass die eingegebenen Koordinaten gültig sind.
  • Ihr Algorithmus sollte theoretisch für alle relativ großen Ganzzahlkoordinaten (bis zum maximal unterstützten Wert Ihrer Sprache) funktionieren.
  • Entweder vollständige Programm- oder Funktionsantworten sind in Ordnung.

Das ist , also gewinnt die kürzeste Antwort in Bytes!

CzarMatt
quelle
Kann die Eingabe eine Liste von x-Koordinaten gefolgt von einer Liste von y-Koordinaten sein? zB{1,2,3,4},{5,6,7,8} -> {1,5},{2,6},{3,7},{4,8}
Pavel
@Phoenix Nein, jeder x,yEingang muss zusammen sein. Netter Gedanke, daran hatte ich selbst nicht gedacht.
CzarMatt
Was sind die Grenzen der Koordinaten? Sind Nullen und Negative möglich?
AGourd
3
Das ist überraschend schwer. Jedes Mal, wenn ich denke, ich habe eine Heuristik, die alle Fälle behandelt, habe ich etwas übersehen.
15.
1
Wow, was für eine Herausforderung. Ich gebe meinen Verlust zu; Schraube dies in 05AB1E zu tun.
Magic Octopus Urn

Antworten:

5

JavaScript (ES6), 251 244 275 Byte

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

Wie?

Wir verwenden die rekursive Funktion P () , um eine Liste aller möglichen Partitionen der Eingabeliste zu erstellen. Diese Funktion ist momentan nicht optimal, da sie einige doppelte Partitionen zurückgibt - was jedoch das Endergebnis nicht verändert.

Für jede Partition berechnen wir die Anzahl der Zäune, die erforderlich sind, um alle Schafe in jeder Gruppe mit einem Rechteck zu umgeben. Die Summe dieser Zäune ergibt die Punktzahl der Trennwand. Wir geben schließlich die niedrigste Punktzahl zurück.

Testfälle

Arnauld
quelle
Über Schritt 2, warum nicht [ [1,1],[2,2] ] , [ [1,2] ]?
Edc65
@ edc65 Hoffentlich sollte es jetzt behoben sein.
Arnauld
2

k , 62 58 57 55 Bytes

{+//2*1+{(|/x)-&/x}'(x@?(&|/2>(|/'{x|-x}x-\:)')')/,:'x}

Probieren Sie es online!

zgrep
quelle