Bei dieser Herausforderung geht es darum, die kleinste Festplatte zu finden, die bestimmte Punkte enthält. Dies wird jedoch dadurch etwas schwieriger, dass bei dieser Herausforderung die Koordinaten und der Radius der Platte ganze Zahlen sein müssen.
Ihre Eingabe wird eine Liste von Punkten mit ganzzahligen Koordinaten x
und sein y
. Sie können dies als Liste von Tupeln, als Liste von Listen oder auf eine andere Weise zur Darstellung einer Sammlung von Paaren verwenden. x
und y
werden beide (möglicherweise negative) ganze Zahlen sein. Jeder Punkt ist garantiert einzigartig und es gibt mindestens einen Punkt.
Ihr Ausgang wird eine Platte in Form von drei Zahlen, X
, Y
, und R
. X
, Y
Und R
sind alle ganzen Zahlen, X
und Y
repräsentieren die Mitte der Scheibe und R
stellt seinen Radius. Der Abstand zwischen jedem gegebenen Punkt und der Mitte muss kleiner oder gleich sein R
, und es darf keine solche Scheibe mit einer kleineren Scheibe geben R
, die auch diese Bedingung erfüllt.
Es ist möglich, dass es mehrere mögliche Lösungen für eine bestimmte Eingabe gibt. In diesem Fall muss Ihr Code mindestens eine davon ausgeben.
Sie können jede Art von Geometrie verwenden, die von Ihrer Sprache unterstützt wird, und die Eingabe / Ausgabe erfolgt möglicherweise über integrierte Punkt- / Plattenobjekte anstelle von Zahlen.
Testfälle
Input (Possible) Output(s)
(x,y) (X,Y,R)
-------------------------
(0,0) (0,0,0)
-------------------------
(0,1) (0,0,1)
(1,0) (1,1,1)
-------------------------
(1,4) (4,4,3)
(3,2)
(4,1)
(4,5)
(5,2)
(7,4)
-------------------------
(-1,0) (0,0,2)
(2,0) (1,0,2)
-------------------------
(-1,0) (1,0,2)
(2,1) (0,1,2)
-------------------------
(0,0) (1,0,1)
(1,1) (0,1,1)
Wenigste Bytes gewinnt.
Antworten:
Jelly ,
252422212018 BytesVielen Dank an @EriktheOutgolfer, der mich darüber informiert
)
hat und 1 Byte gespart hat.Vielen Dank an @Dennis für das Speichern von 2 Bytes.
Probieren Sie es online!
Erläuterung
quelle
€
?Brachylog v2, 19 Bytes
Probieren Sie es online!
Dieses Programm war einfach zu schreiben - Brachylog ist fast perfekt für diese Art von Problem - aber schwer zu golfen. Es würde mich nicht überraschen, wenn hier irgendwo ein Byte gespeichert würde, da nur wenige Dinge, die ich zu tun schien, Auswirkungen hatten (und verschachtelte Kartenanweisungen enthalten, normalerweise ein Zeichen dafür, dass Sie member / findall verwenden sollten, aber ich kann nicht siehe einen Weg, um es zu tun).
Dies ist eine Funktionsübermittlung. Die Eingabe erfolgt vom linken Argument zur Funktion im Format
[[x,y],[x,y],…]
, die Ausgabe vom rechten Argument im Formular[r,[[x,y]]]
. (Wenn Sie negative Zahlen in der Eingabe ausprobieren möchten, beachten Sie, dass Brachylog_
das Minuszeichen verwendet, nicht-
. Dies ist verwirrend, da der Funktions- → vollständige Programm-Wrapper, mit dem Brachylog geliefert wird und der über das Befehlszeilenargument angefordertZ
wird, negative Zahlen anzeigt in der Ausgabe mit einem regulären Minuszeichen.)Erläuterung
Dies ist insofern interessant, als wir Brachylog bitten, einen Wert für bestimmte Eigenschaften zu finden (in diesem Fall den Radius einer Scheibe, der auf einen Punkt zentriert ist
A
, der für alle Eingabepunkte passt), aber kaum Anforderungen an sie stellen (alles, was wir benötigen, ist dass der Radius eine Zahl ist). Brachylog berechnet den fraglichen Radius jedoch intern symbolisch, anstatt zu versuchen, konkrete Zahlen zu verwenden. Wenn also das Endergebnis≜
erreicht ist, werden zwei Dinge gleichzeitig ausgeführt: Erstens wird sichergestellt, dass nur Ganzzahlen für die KoordinatenA
und für den Radius verwendet werden (Erzwingen, dass der quadratische Radius eine quadratische Zahl ist, und Erläutern der Verwendung von≤ᵛ
, um ein "Maximum oder mehr" zu finden); zweitens findet es den kleinstmöglichen realisierbaren Radius (da der Radius in der Ausgabe an erster Stelle steht).Eine Sache, die im Programm überhaupt nicht spezifiziert ist, ist, dass alle Punkte gegen die gleiche Mitte einer Platte gemessen werden; Wie geschrieben, gibt es keine Einschränkungen, dass wir nicht für jeden Punkt einen anderen Mittelpunkt verwenden. Die Tiebreak-Reihenfolge (die in diesem Fall durch die dritte festgelegt
ᵐ
wird und die als Strukturbedingung ausgewertet wird, bevor die Wertbedingung durch impliziert wird≜
)A
soll jedoch so kurz wie möglich sein (dh ein einzelnes Element, also verwenden wir dasselbe zentrieren Sie jedes Mal, es versucht zuerst eine Null-Länge,A
aber das funktioniert offensichtlich nicht, also versucht es als nächstes eine Singleton-Liste). Infolgedessen erhalten wir eine nützliche Einschränkung (wir haben nur eine Festplatte) "kostenlos".Diese Lösung lässt sich auf eine beliebige Anzahl von Dimensionen verallgemeinern, ohne den Quellcode zu ändern. Es gibt hier keine Annahmen, dass die Dinge zweidimensional sind. Wenn Sie also zufällig die kleinste ganzzahlige Kugel benötigen, können Sie diese auch haben.
quelle
Perl 6 , 81 Bytes
Probieren Sie es online!
Nimmt eine Liste von Punkten als Listen mit zwei Elementen auf
((X1, Y1), (X2, Y2), ...)
. Gibt eine Liste zurück(R, (X, Y))
. Verwendet den gleichen Ansatz wie Pietu1998's Jelly-Antwort:Die
minmax
Methode ist hier nützlich, da sie a zurückgibtRange
. Das kartesische Produkt der Bereiche liefert direkt alle Punkte mit ganzzahligen Koordinaten.quelle
05AB1E , 26 Bytes
Port of @ Pietu1998 ist Gelee Antwort .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Matlab, 73 Bytes
Finden Sie einfach die kleinste Lösung (Fließkomma) und runden Sie auf den nächsten Punkt und decken Sie den Radius ab (ungünstigster Fall für das Minimax-Problem). Ich weiß nicht genau, ob das die richtige Lösung für alle möglichen Fälle liefert (innerhalb der Genauigkeit), aber für die Testfälle sollte es funktionieren (wenn ich keinen Tippfehler gemacht habe).
Nennen Sie es mit
quelle
fminimax
Pyth ,
3433 BytesDie Ausgabe erfolgt in der Form
[R,x,y]
Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .
Bearbeiten: Ein Byte durch Neuanordnen des Ausgabeformats gespeichert, vorherige Version:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
quelle
Wolfram Language (Mathematica) , 66 Bytes
Hier ist ein Brute-Force-Ansatz. Ich habe die viel kürzere
BoundingRegion[#,"MinDisk"]&
Funktion in Betracht gezogen, aber es gibt keine Möglichkeit, ganzzahlige Koordinaten und Radien zu erzwingen.Probieren Sie es online!
quelle
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 Bytes-20 Bytes dank @nwellnhofs Verwendungshinweis
Math.hypot
.Das Ergebnis-Array ist in der Reihenfolge
[R,X,Y]
.Probieren Sie es online aus.
Erläuterung:
quelle
Math.hypot
.Math.hypot
, das ist perfekt für diese Herausforderung! -20 Bytes genau dort. Vielen Dank. :)Javascript, 245 Bytes
(Etwas) lesbarere Version:
Findet einfach den Begrenzungsrahmen und testet jede Koordinate in diesem Rahmen, um festzustellen, ob sie die beste ist.
Ich könnte 8 Bytes mit einer ungefähren Antwort einsparen, indem ich Folgendes ersetze:
Math.ceil(Math.sqrt(n[2]))
mit~~(n[2]+1-1e-9)
quelle
for(f=c;f<b;f++){for(g=e;g<d;g++){s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);n=n?n[2]>s?[f,g,s]:n:[f,g,s]}}
auffor(f=c;f<b;f++)for(g=e;g<d;n=n?n[2]>s?[f,g,s]:n:[f,g,s],g++)s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);
. Und ich bin mir ziemlich sicher, dass Sie das Leerzeichen entfernen könnenreturn[
.Math.hypot
.Ruby , 113 Bytes
Probieren Sie es online!
quelle
Kohle , 65 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Holen Sie sich die y-Koordinaten in
z
.Holen Sie sich die x-Koordinaten in
h
.Durchlaufen Sie die Inclusive-Bereiche vom Minimum bis zum Maximum
h
undz
generieren Sie die Liste aller potenziellen Disc-Center.Führen Sie eine Schleife über alle Disc-Zentren und dann über alle ursprünglichen Punkte durch. Führen Sie dann eine Schleife über beide Koordinaten durch, subtrahieren Sie, quadrieren Sie, summieren Sie, nehmen Sie das Maximum und speichern Sie die resultierende Liste.
Suchen Sie die Position des minimalen maximalen Durchmessers und drucken Sie die entsprechende Disc-Mitte.
Geben Sie den minimalen maximalen Durchmesser aus, runden Sie ihn jedoch auf die nächste Ganzzahl auf.
quelle