Halte diese Herausforderung kurz.
Sie erhalten 4 Zahlen: p1, p2, p3 und p4.
Die magische Summe der Zahlen ist wie folgt definiert:
magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|
Sie dürfen nur einen der obigen ganzzahligen Werte (p1, p2, p3 oder p4) ändern. Sie müssen den Wert so ändern, dass die magische Summe der Werte ihren Mindestwert erreicht.
Beispielsweise:
p1, p2, p3, p4 = 17, -6, 15, 33. Der Wert der magischen Summe beträgt in diesem Fall 78.
Sie können hier -6 in 16 ändern, und der Wert der magischen Summe wird zu 36, was dem minimal erreichbaren Wert entspricht.
Denken Sie daran, dass Zahlen positive oder negative ganze Zahlen sein können.
Das ist Code-Golf, also gewinnen die wenigsten Byte im Code. Brownie-Punkte für die Verwendung einer praktischen Sprache gegenüber einer Freizeitsprache. Möge der 4. mit dir sein.
Wiederholen:
Probe 1
Eingang 1
17 -6 15 33
Ausgang 1
36
Erklärung 1
Die -6 kann durch 16 ersetzt werden und das gibt uns die minimal erreichbare magische Summe, die möglich ist.
Probe 2
Eingang 2
10 10 10 10
Ausgang 2
0 or 2
beides ist akzeptabel
Erklärung 2
Die minimal erreichbare magische Summe ist 0, da die minimale Summe von 4 positiven ganzen Zahlen 0 ist. Wenn eine Zahl geändert werden muss, kann eine der 10 in eine 9 geändert werden und somit die Ausgabe 2 ergeben.
Probe 3
Eingang 3
1 2 3 4
Ausgang 3
4
Erklärung 3
Die Eingabe selbst ergibt 6 als magische Summe. Durch Ändern der 4 in 1 wird die minimale magische Summe erreicht, die 4 ist.
quelle
+1
von mir.Antworten:
Gelee , 6 Bytes
Probieren Sie es online!
Ein Port meiner Python-Antwort .
quelle
Python 2 , 44 Bytes
Probieren Sie es online!
Sortiert die Eingabe
a,b,c,d,
in aufsteigender Reihenfolge, nimmt das kleinere vonc-a
undd-b
und verdoppelt es. Warum funktioniert das?Beachten Sie zunächst, dass es beim Ändern eines Elements zur Maximierung auf die zyklische Gesamtsumme der Abstände optimal (oder für das Optimum gebunden) ist, es so zu ändern, dass es einem Nachbarn entspricht, z
17, -6, 15, 33 -> 17, 17, 15, 33
. Das liegt daran, dass die neue Gesamtentfernung zu den linken und rechten zyklischen Nachbarn mindestens der Abstand zwischen diesen Nachbarn ist. Daher ist es das Beste, diese gleich zu machen.Wenn Sie nun eine von zwei benachbarten Kopien einer Zahl löschen, erhalten Sie dieselbe zyklische Summe von Entfernungen. Im Beispiel ist dies die
17, 15, 33
Angabe von Entfernungen2 + 18 + 16
. Anstatt also eine der vier Zahlen zu ersetzen, ist es gleichbedeutend damit, sie zu löschen und drei Zahlen zu belassen und die Summe ihrer zyklischen Abstände zu verwenden.Beachten Sie, dass bei 3 Zahlen der größte Abstand die Summe der beiden kleineren ist. Dies liegt daran, wenn wir die Zahlen sortieren
a ≤ b ≤ c
, um dann zu haben|a - c| = |a - b| + |b - c|
. Mit anderen Worten, wir bewegen uns zweimal zwischen der größten und der kleinsten Zahl, wobei wir die mittlere Zahl einmal als Boxenstopp verwenden. Die Summe der drei Abstände ist also nur doppelt so groß wie der Abstand zwischen Minimum und Maximum(c-a)*2
.Die Frage ist also, welche Zahl wir löschen, um den kleinsten Abstand zwischen dem Minimum und dem Maximum der drei verbleibenden Zahlen zu erhalten. Es ist klar, dass wir entweder die kleinste oder die größte Zahl löschen. Wenn Sie sie
a, b, c, d
in sortierter Reihenfolge aufrufen,a
Blätter löschend - b
undd
Blätter löschenc - a
, ist das Endergebnis doppelt so hoch, je nachdem, welcher Wert kleiner ist.quelle
p1
durchp5
, und nach wie vor nur eine Nummer erlaubt zu ändern? Der Fall mit vier Ziffern scheint zu einfach zu sein (erst nachdem Sie Ihre Antwort gesehen haben).R ,
6633 BytesProbieren Sie es online!
Viel kürzer mit dem Algorithmus von xnor (lies ihre Erklärung und stimme ihrem Beitrag zu!).
Alte Version:
R , 66 Bytes
Probieren Sie es online!
Nimmt die Eingabe als einen Vektor von 4 ganzen Zahlen.
Es gibt 4 Möglichkeiten, die zu ändernde Nummer auszuwählen. für jedes von diesen müssen wir nur die Summe von 3 absoluten Differenzen berechnen.
rbind
quelle
Jelly ,
11 bis10 BytesProbieren Sie es online!
Ein monadischer Link, der eine Liste mit ganzen Zahlen als Eingabe verwendet. Sollte bei beliebiger Listengröße funktionieren. Arbeitet auf der Grundlage, dass die minimale Summe erhalten werden kann, indem jede Zahl aus der Liste entfernt, die magische Summe berechnet und das Minimum genommen wird.
quelle
Gelee , 8 Bytes
Ein monadischer Link, der eine Liste von Ganzzahlen * akzeptiert, die eine Ganzzahl ergibt
* kann eine beliebige Zahl sein, solange es mehr als 1 gibt; Verwenden der gleichen Zauberformel, um die Unterschiede der Nachbarn zu summieren.
Probieren Sie es online!
Wie?
quelle
Japt
-Q
, 11 BytesVerwendet den @ xnor-Algorithmus, der mir 4 Bytes erspart hat.
5 Bytes gespart dank @Shaggy
Versuch es
quelle
ÃÃ
durch eine neue Zeile ersetzen.J ,
24,20,18,17 Bytesalternative Version unter Verwendung des xnor-Algorithmus:
Wie
Das Zweifache
2 *
der min[:<./
der 2. Zeile wird von der ersten Zeile[:-/
der 2x2-Matrix subtrahiert, die durch2 2$
die nach unten sortierte Formung der Eingabe gebildet wird\:~
Probieren Sie es online!
ursprüngliche Antwort: J , 24 Bytes
Probieren Sie es online!
Mit Nick Kennedys Idee.
1(...)\.]
wende das Verb in Parens auf alle Outfixes der Länge 1 an (ein Outfix der Länge n ist eine Liste mit n entfernten zusammenhängenden Elementen, so dass jede mögliche Liste mit 1 entfernten Ulme erzeugt wird)(1 #. 2 |@-/\ ] , {.)
Dies berechnet die magische Summe, indem die erste Ulme an die Eingabe] , {.
angehängt und die abs-Differenz|@-/
auf Infixe der Länge 22 ...\
angewendet und das Ergebnis summiert wird1 #.
.[:<./
gibt die minquelle
05AB1E ,
117 BytesPort von @xnors Gelee Antwort .
-4 Bytes dank @Emigna und @Grimy .
Probieren Sie es online aus.
7 Bytes Alternative , die nur in der alten Version von 05AB1E arbeitet (wäre erforderlich ,
€
bevor die¥
in der neuen Version):Probieren Sie es online aus.
Erläuterung:
quelle
{2ôø¥W·
oder 8 bei€
der Neuschreibung.{2ô`αW·
C ++ (gcc)
Volles Programm: 138 Bytes
Probieren Sie es online!
Kernfunktion: 84 Bytes
Probieren Sie es online!
Verwenden Sie auch den Algorithmus xnor , der in seinem Beitrag zu Python 2 erläutert wurde.
quelle
Holzkohle , 20 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Es stellte sich heraus, dass ich die Idee von @ NickKennedy verwende. Erläuterung:
quelle
JavaScript (ES6), 51 Byte
Mit der viel clevereren Methode von xnor :
Probieren Sie es online!
Ursprüngliche Antwort, 96 Bytes
Nimmt die Eingabe als Array von 4 ganzen Zahlen.
Wahrscheinlichdefinitiv nicht der kürzeste Weg.Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 29 Byte
Ein Port von @ xnors Algorithmus
Probieren Sie es online!
quelle
Java 8 , 235 Bytes
Ein Port von @ xnors Python-Antwort und -Algorithmus
Probieren Sie es online!
Java 10 , nicht bewiesen, 222 Bytes
Mit Java 10 sollte es mir möglich sein, die linke Seite der Scanner-Deklaration durch zu ersetzen
var
, obwohl ich sie nicht online kompilieren konnte und sie daher nur als Trivia hinzufügen kann. Es tut uns leid.quelle