In Kanada wird der Penny nicht mehr in Umlauf gebracht. Barzahlungen werden auf die nächsten 5 Cent gerundet.
Durch die Aufteilung der Einkäufe kann Geld gespart werden. Zum Beispiel kosten zwei Artikel im Wert von 1,02 US-Dollar 2,04 US-Dollar, was sich auf 2,05 US-Dollar aufrundet. Wenn Sie die Artikel jedoch in separaten Käufen kaufen, wird jeder Preis auf 1,00 US-Dollar gerundet, was einem Gesamtbetrag von 2,00 US-Dollar entspricht. Wenn Sie jedoch zwei Artikel zu einem Preis von jeweils 1,03 USD kaufen, ist es besser, sie in einem einzigen Einkauf zu kaufen.
Eine andere Möglichkeit, Geld zu sparen, ist die Verwendung einer Kreditkarte, wenn die Rundung ungünstig ist, da Kreditzahlungen nicht gerundet werden. Wenn wir zwei Artikel im Wert von 1,04 USD haben möchten, wird der Gesamtpreis auf 2,10 USD aufgerundet, unabhängig davon, wie wir die Käufe aufgeteilt haben. Daher sollten wir diese Artikel mit einer Kreditkarte bezahlen.
Schreiben Sie eine Funktion oder ein Programm, das eine Liste der Artikelpreise als Ganzzahl in Cent akzeptiert und den niedrigstmöglichen Gesamtpreis (in Cent) für die Artikel ausgibt, die durch eine Abfolge von Einkäufen entweder in bar oder per Gutschrift erzielt werden können.
Kürzester Code gewinnt.
Testfälle
[] : 0
[48] : 48
[92, 20] : 110
[47, 56, 45] : 145
[55, 6, 98, 69] : 225
[6, 39, 85, 84, 7] : 218
[95, 14, 28, 49, 41, 39] : 263
[92, 6, 28, 30, 39, 93, 53] : 335
[83, 33, 62, 12, 34, 29, 18, 12] : 273
[23, 46, 54, 69, 64, 73, 58, 92, 26] : 495
[19, 56, 84, 23, 20, 53, 96, 92, 91, 58] : 583
[3, 3, 19, 56, 3, 84, 3, 23, 20, 53, 96, 92, 91, 58, 3, 3] : 598
[2, 3, 4, 4, 4, 4, 4] : 19
s.reduce(:+)
(normalerweise brauchen Sie sogar keine Klammern, aber in Ihrem Fall ...) und inline wechseln,m
um weitere 2 Zeichen zu erhalten.a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
.0,
aus demreduce
Anruf entferne , bricht der Code für die leere Eingabe. Das habe ich in der Antwort erwähnt. Inlining m scheint nicht zu helfen. Danke für den letzten Vorschlag - das war blöd von mir.(c-m=c>d ?d:c)
, was Ihnen zwei Zeichen gibt.-
das höhere Priorität hat als=
. Hat die Zuweisung auf der linken Seite eine hohe Priorität (wie in, um sicherzustellen, dass der linke Operand ein l-Wert ist)?GolfScript (54 Zeichen)
Dies ist ein Programm, das Eingaben von stdin als durch Leerzeichen getrennte Werte akzeptiert. Sie können ein Zeichen speichern, indem Sie das Eingabeformat als GolfScript-Arrays festlegen.
Testfälle online
Der interessanteste Trick ist
.2$>$
für einen zerstörungsfreienmin
Bediener.Meine Analyse der Mathematik ist im Wesentlichen dieselbe wie die von Jan und Ray: Wenn man die Werte von Mod 5 betrachtet, spart man nur bei Transaktionen im Wert von 1 oder 2. Die Kreditkartenoption bedeutet, dass wir niemals aufrunden. Ein Artikel, der 5n + 2 Cent kostet, kann also nicht vom Bündeln profitieren. Ein Artikel im Wert von 5 n + 1 Cent kann auch nicht verkauft werden (da die Kombination von zwei Einsparungen von 1 Cent zu einer Einsparung von 2 Cent keinen Nutzen bringt). 0 ist die additive Identität, daher handelt es sich bei den einzig interessanten Fällen um Werte von 3 und 4.
3+3 = 1
und3+4 = 4+4+4 = 2
; wenn wir gemischte 3s und 4s haben dann optimieren wir lieber3+4
über3+3
(streng besser) oder4+4+4
(äquivalent).quelle
~):m
) speichern, leider ohne die Anzahl der Zeichen zu verringern.C ++: 126 Zeichen
Willkommen, um eine Anleitung zu geben, damit dieses Programm kürzer wird. Hier ist das Testprogramm, kompilieren Sie mit dem Compiler tdm-gcc 4.7.1 und führen Sie es normal aus.
quelle
R 143
Tests (wo
P
ist ein Alias für den obigen Code)quelle
Mathematica
112 126 167157Bearbeiten : Fälle von {3, 3} und {4,4,4} werden jetzt dank Peter Taylor und cardboard_box bearbeitet.
Hinweis: Nichtkäufe (Testfall Nr. 1) werden als eingegeben
f[{0}]
.Wie es funktioniert
Mod[n, 5]
wird dann verarbeitet: 1 und 2 werden zu 0. Nullen bleiben unverändert.Testen
a12
passt für {3,3} ana13
passt für {4,4,4} anquelle
Python 3 (115 Zeichen)
Python 2 (106 Zeichen)
quelle
[3,4,9]
geben14
, weil Sie die 3 und 4-Cent-Artikel kombinieren können, um einen 7-Cent-Kauf zu erhalten, den Sie bar mit 5 Cent bezahlen, und die restlichen 9-Cent-Artikel, die Sie mit Gutschrift bezahlen, weil sie sich sonst aufrunden würden.1, 2, 3, 4, 5, 6, 7, 8, 9, 10
, das gibt0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0
, welche Summen46.66
. Die richtige Antwort lautet jedoch45
, sodass die Summe der von Ihnen ausgedruckten Zahlen nicht die richtige Antwort ist. Daher ist diese Lösung falsch.APL, 58 Zeichen
Das Programm ist im Wesentlichen eine direkte Übersetzung von Jan Dvoraks Ruby-Lösung .
⍬
ist der leere Vektor.quelle
Julia 83C
Erklärung:
Bei einem Einkauf können Sie maximal 2 Cent sparen.
Wenn Sie also eine Kombination haben, mit der Sie 2 Cent sparen können, kaufen Sie sie einfach auf diese Weise und sie ist optimistisch. Wenn Sie beispielsweisex
Artikel mit Preis 3 (Mod 5) undy
Artikel mit Preis 4 (Mod 5) haben, können Sie einemin(x, y)
Anzahl von (3, 4) Paaren erstellen, wodurch Sie2 min(x, y)
Cent sparen . Dann verwenden Sie die restlichen 3, falls vorhanden, ummax(0, x-min(x,y)) / 2
Cent zu sparen . Dies kann auch mit berechnet werden(max(x,y)-y)/2
Bearbeiten
Diese Lösung ist falsch.
quelle
4 4 4 3 3
dann4 4 4
ist eine Kombination , die 2 Cent sparen kann, aber es auf diese Weise zu kaufen ist nicht optimal. (Tatsächlich scheinen Sie das überhaupt nicht4 4 4
zu berücksichtigen. Scheitert dieser Code nicht am letzten Testfall?)