Nuggets of Code
Es ist eine hypothetische Situation, in der es Freitagabend ist und Sie über die üblichen Golfkameraden eingeladen haben, an Ihrem Lieblingshobby teilzunehmen: Code-Golf. Da dies jedoch eine hirntreibende Aufgabe ist, müssen Sie etwas Gehirnfutter für die Gruppe aufheben, damit Sie so viel wie möglich aus Ihrem Code heraus Golf spielen können.
Heutzutage sind Hühnernuggets die beliebtesten Snacks für jedermann, aber es gibt ein Problem: Es gibt keine einzige Packung, die alle Bedürfnisse abdeckt. Da Sie also bereits in Golfstimmung sind, entscheiden Sie sich für ein Programm, das genau herausfindet, welche Packs Sie kaufen müssen, um die Nugget-Bedürfnisse aller zu decken.
Hühnernugget-Packungsgrößen gibt es überall, und je nachdem, wo Sie auf der Welt leben, ändern sich auch die Standardgrößen. Der nächstgelegene [Ort, an dem Nuggets serviert werden] verfügt jedoch über die folgenden Größen von Nugget-Paketen:
4, 6, 9, 10, 20, 40
Jetzt stellen Sie möglicherweise fest, dass Sie bestimmte Kombinationen von Nuggets nicht bestellen können. Zum Beispiel sind 11
Nuggets nicht möglich, da es keine 11
genau gleiche Kombination gibt . Sie können jedoch 43
1 Packung mit 20
, 1 Packung mit 10
, 1 Packung mit 9
und 1 Packung mit 4
,
20 + 10 + 9 + 4 = 43 (597)
wo 597
wird jeder Term quadriert und addiert (Hinweis: die optimale Lösung hat dies als höchsten Wert) . Es gibt natürlich auch andere Herstellungsmethoden 43
, aber wie Sie wissen, wird die Herstellung eines Nuggets umso billiger, je mehr Nuggets es pro Packung gibt. Sie möchten also im Idealfall die geringste Anzahl von Packungen und die größten Mengen kaufen, um Ihre Kosten zu minimieren.
Die Aufgabe
Sie sollten ein Programm oder eine Funktion erstellen, die eine Liste von ganzen Zahlen enthält, die den Anforderungen jeder Person entsprechen. Sie sollten dann die kostengünstigste α- Bestellung berechnen und ausdrucken , um die Hühnernuggets zu kaufen. Die kostengünstigste α- Bestellung ist die Kombination, bei der die Summe der Quadrate jeder Größe die höchste ist. Wenn es absolut keine Möglichkeit , die Nuggets zu kaufen ist perfekt, müssen Sie drucken einen falsy Wert wie , , oder was auch immer in Ihrer Sprache zur Verfügung steht.0
False
Impossible!
Beispiel I / O:
[2 7 12 4 15 3] => [20 10 9 4]
1, 1, 2, 1 => False
6 5 5 5 5 5 9 => 40
[6, 4, 9] => 9 10
1 => 0
199 => 40, 40, 40, 40, 20, 10, 9
2 => Impossible!
Hier ist die Liste der idealen Lösungen für den ersten 400. Hinweis diese nicht formatiert , wie ich würde erwarten , dass bei Ihnen sein, die jeweils tuple
in Form (N lots of M)
.
Regeln
- Keine Standardlücken.
- Keine Verwendung von integrierten Funktionen, die die gesamte Aufgabe oder den größten Teil der Aufgabe erledigen, wie
FrobeniusSolve
in Mathematica.
α - Um dies an einem Beispiel zu verdeutlichen, könnten Sie auch 43 machen 4 + 6 + 6 + 9 + 9 + 9 = 43 (319)
, aber dies wäre nicht optimal und daher eine falsche Ausgabe, da die Summe der Quadrate kleiner ist als die Kombination, die ich in der Einleitung notiert habe. Im Wesentlichen ist eine höhere Quadratsumme = niedrigere Kosten = die kostengünstigste.
Antworten:
Pyth,
2625 BytesBeachten Sie, dass einige nicht druckbare Zeichen vorhanden sind. Probieren Sie es online aus: Demonstration . Es ist ziemlich langsam (aber nicht so langsam wie meine 26-Byte-Lösung).
Erläuterung:
Pyth, 32 Bytes
Beachten Sie, dass einige nicht druckbare Zeichen vorhanden sind. Probieren Sie es online aus: Demonstration Diese Version ist viel schneller. Es findet die Lösung für die Eingabe
[6,7,8]
in ungefähr einer Sekunde und die Lösung für die Eingabe[30]
in ungefähr 90 Sekunden.Erläuterung:
quelle
.a
Methode ist kürzer als Quadrieren und Summierens^R2
.Perl,
175153Nimmt seine Eingabe von den Programmargumenten. Gibt ein :( aus, wenn keine perfekte Lösung gefunden werden kann.
Ungolfed Code:
PS: Dies ist wahrscheinlich der erste Eintrag, für den 10 Minuten vergehen
1 2
;)Schau es dir hier an.
quelle
18
sollte gedruckt werden9 9
, nicht4 4 10
.9
und vertauschen10
.CJam,
452928 BytesBeachten Sie, dass dieser Ansatz sehr langsam und speicherintensiv ist.
Probieren Sie es online im CJam-Interpreter aus .
Es kann auf Kosten von 5 Bytes erheblich beschleunigt werden:
Die Komplexität ist in der Summe der Eingaben immer noch exponentiell, dies sollte jedoch in wenigen Sekunden Testfälle bis zu 159 mit dem Online-Interpreter und bis zu 199 mit dem Java-Interpreter bewältigen.
Probieren Sie es online im CJam-Interpreter aus .
Idee
Ein optimaler Kauf (maximale Summe der Quadrate) ist ein gültiger Kauf (richtige Anzahl von Nuggets) , die so viele hat 40 sind wie möglich, dann , wie viele 20 ist wie möglich, so viele 9 ist wie möglich ( zum Beispiel
9 9
ist vorzuziehen10 4 4
) und so weiter für 10 's, 6 ' s und 4 's.In diesem Ansatz erzeugen wir das kartesische Produkt von N Kopien des Arrays [40 20 9 10 6 4 0] , wobei N die gewünschte Anzahl von Nuggets ist. N ist eine (schlechte) Obergrenze für die Anzahl der Käufe, die wir tätigen müssen. In der beschleunigten Version des Codes verwenden wir stattdessen N / 40 + 4 .
Aufgrund der Anordnung des Arrays beginnt das kartesische Produkt mit dem Vektor [40 ... 40] und endet mit dem Vektor [0 ... 0] . Wir berechnen den Index des ersten Vektors mit der korrekten Summe (der auch die optimale Quadratsumme enthält), rufen das entsprechende Array-Element ab, entfernen die als Platzhalter dienenden Nullen und drucken das Ergebnis.
Wenn kein Vektor gefunden werden konnte, ist der Index -1. Daher rufen wir [0 ... 0] ab , wodurch stattdessen ein leeres Array ausgegeben wird.
Code
quelle
Julia, 126 Bytes
Dadurch wird eine unbenannte Funktion erstellt, die ein Array als Eingabe akzeptiert und ein Array oder einen Booleschen Wert an STDOUT ausgibt, je nachdem, ob eine Lösung vorhanden ist. Um es zu nennen, geben Sie ihm einen Namen, z
f=n->...
.Ungolfed + Erklärung:
Beispiele:
quelle
Python 3 - 265 Zeichen
Abstand anzeigen:
Besteht alle Testfälle
Hinweis: Ich weiß nicht, ob dies alle Fälle bestehen wird, weil es so langsam ist ... Aber es sollte ...
quelle
from blah import*
ist es immer am besten. Die einzige Ausnahme, an die ich denken kann, ist, wenn Sie mehrereimport
s haben. Dies ist die einzige Zeit, die mir in den Sinn kommt, wo diesas
tatsächlich nützlich ist.JavaScript,
261256261Ich bin mir nicht sicher, ob das in Ordnung ist, es scheint zu funktionieren, aber mir fehlen sicherlich Dinge.
Es scheint jedoch nicht langsam zu sein, bis
123456
es[40 x 3086, 10, 6]
fast sofort ausgibt .Erläuterung:
Durchlaufen der Nugget-Größen (größte zuerst)
Für 199 | 1 sieht der gebaute Stack so aus
Für 1
quelle
11
druckt[6]
und18
druckt[10, 4]
.[10,4]
weil mir ein Paar Eltern fehlte. Die Prüfung war in der Tat falsch. Ich habe nur geprüft, ob mindestens ein Element in der Ergebnismenge vorhanden ist, nicht, ob es richtig zusammengefasst wurde. Ich weiß nicht, was ich dort gedacht habe