Inspiriert von /puzzling//q/626
In deinen Abenteuern kommst du an eine Reihe von 7 Brücken, die du überqueren musst. Unter jeder Brücke lebt ein Troll. Um die Brücke zu überqueren, müssen Sie dem Troll zuerst eine Anzahl Kuchen als Prozentsatz der Anzahl Kuchen geben, die Sie tragen. Da es sich um nette Trolle handelt, geben sie Ihnen eine bestimmte Anzahl Kuchen zurück.
Zu Beginn eines jeden Tages legt der örtliche Trollkönig die prozentuale Kuchensteuer fest, die jeder Reisende zahlen muss, und die Rückerstattung des Trollkuchens - die Anzahl der Kuchen, die jeder Troll den Reisenden zurückgeben muss.
Ihre Aufgabe ist es, die minimale Anzahl von Kuchen zu berechnen, die erforderlich sind, um alle 7 Trollbrücken für die gegebenen Bedingungen an diesem Tag zu passieren.
Annehmen:
- Zwei Eingabeparameter: Prozentuale Kuchensteuer (Ganzzahl von 0 bis 100) und Trollkuchenrückerstattung.
- Niemand, nicht einmal Trolle, möchte einen Kuchen, der teilweise von einem anderen Troll gefressen wird. Wenn du einen Bruchteil eines Kuchens übrig hast, bekommt der Troll ihn.
- Wenn ein Troll eine Kuchensteuer akzeptiert, Ihnen dann aber alle Kuchen zurückgeben muss (es verbleiben die gleichen oder weniger Kuchen als zuvor), wird er wütend und frisst Sie und Ihre Kuchen.
- Jeder Troll muss mindestens einen vollständigen Kuchen behalten.
- Sie können maximal 100 Kuchen mitnehmen.
- Sie müssen den Tag beenden, an dem Sie sich gerade befinden oder auf der anderen Seite aller 7 Brücken.
Herausforderung:
Schreiben Sie ein komplettes Programm, um die Mindestanzahl an Kuchen für den aktuellen Tag oder Null auszugeben, wenn es heute nicht möglich ist, sicher zu reisen. Sie werden warten, bis die Zahlen morgen vorliegen.
Die Eingabe sollte als stdin, Befehlszeilenargumente oder Dateieingabe übergeben werden.
Der kürzeste Code (Byteanzahl) gewinnt.
Beispiel:
25% Kuchensteuer, 2 Trollkuchen Rückerstattung.
Beginnen Sie mit 19 Kuchen
vor Troll 1: (19 * 0,75) = 14,25
nach Troll 1: (14 + 2) = 16
vor Troll 2: (16 * 0,75) = 12
nach Troll 2: (12 + 2) = 14
etc.
19 Kuchen -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 Kuchen -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (Regel 3)
Für 18 Kuchen würde der letzte Troll keine Kuchen behalten. Daher beträgt die Mindestanzahl an Kuchen pro 25% / 2 Tag 19.
input: 25 2
output: 19
Beispiel 2:
90% Kuchensteuer, 1 Trollkuchenrückerstattung
100 Kuchen -> 11 -> 2 -> 1 (Regel 4)
Der dritte Troll durfte keinen Kuchen behalten. Daher ist es nicht möglich, an einem 90% / 1 Tag zu reisen, auch wenn die maximale Anzahl an Kuchen erreicht ist.
input: 90 1
output: 0
Daten
Stellen Sie ein kurzes Diagramm der Eingabe- und Ausgabewerte zusammen. Ich war überrascht, dass dies nicht "glatt" war (wie eine Glockenkurve oder ähnliches); Es gibt mehrere auffällige Inseln.
Daten für Interessenten. Die Spalten sind in 5% -Intervalle unterteilt, die Zeilen sind Einheiten von 1-Kuchen-Erstattungsintervallen (excel hat das Bild gedreht). Sie können sehen, dass eine Rückerstattung von mehr als 28 Kuchen nicht möglich ist.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
11-Kuchen-Box geben Sie dem Troll 2,75 Kuchen und erhalten 2 zurück, damit der Troll 0,75 (+ 25) behält und Sie überleben. Im90 1
2-Kuchen-Fall geben Sie dem Troll 1,8 und erhalten 1 zurück, sodass der Troll 0,8 (+2) behält, aber Sie sterben.Antworten:
CJam,
46434139383633 BytesEingabe über ARGV.
Es gibt einen Online-Interpreter, der jedoch leider keine Befehlszeilenargumente unterstützt. Zum Testen können Sie es mit dieser Version von STDIN nachahmen:
Erklärung der ARGV-basierten Version:
Der Inhalt des Stapels wird am Ende des Programms automatisch ausgedruckt.
quelle
55 2
(0
anstelle von100
) und56 5
(98
anstelle von94
). Dies liegt daran ,100_0.55*-i
und zum25_0.56*-i
Opfer fallen Gleitkomma Unschärfen. Soweit ich das beurteilen kann,31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
liefern die Paare auch falsche Ergebnisse.CJam,
44 40 38 3735 BytesOder bei Verwendung von Befehlszeilenargumenten und
{}#
Tricks 33 Byte :{}#
Die Antwort von Martin inspiriert mich, diesen Ansatz nicht zu meinem Hauptansatz zu machen .Beispiellauf:
Eingang:
Ausgabe:
Ein weiterer:
Eingang:
Ausgabe:
Wie es funktioniert
Probieren Sie es hier online aus
quelle
]W=
Trick wirklich , aber bisher habe ich bei jedem Versuch, ihn zu verwenden, die gleiche Zeichenanzahl.APL (39)
Erläuterung:
T R←⎕
: Lesen Sie zwei Zahlen von der Tastatur und speichern Sie sie inT
(Steuer) undR
(Rückgabe).Z←⍳M←100
: Speichern Sie die Nummer100
inM
und alle Nummern von1
bis100
inZ
.{
...}⍣7¨
:Z
Führen Sie für jedes Element in die folgende Funktion siebenmal aus:R+⌊1-T÷M
: Berechnen Sie, wie viele Kuchen bezahlt werden müssen,⍵(⊢×>)
: Multipliziere diesen Betrag mit 1, wenn der Troll mehr Kuchen hat als er begonnen hat, oder mit 0, wenn nicht.⊃Z/⍨
: Für jedes Element inZ
replizieren Sie es mit der Zahl, die diese Funktion angegeben hat. (Alle Nummern, für die die Funktion zurückgegeben wurde,0
verschwinden.) Wählen Sie dann den ersten Eintrag aus dieser Liste aus. Wenn die Liste leer ist, gibt dies0
.quelle
C 83 Bytes
Wenn es funktioniert, funktioniert es für alle möglichen Startcakes, nicht nur für 1 bis 100.
EDIT: Es funktioniert. Golf gespielt:
Mit der Höchstgrenze von 100 Kuchen:
91 Bytes.
quelle
CJam, 36 Bytes
quelle
C ++ - 202 Zeichen
Wie immer hat mein C ++ das Schlimmste getan:
quelle
APL, 36
Erläuterung
Beachten Sie, dass es eine "Kuchenschwelle" gibt. Für den Steuersatz
x
und die Rückerstattungy
benötigen Sie unbedingt mehr alsy÷x
Kuchen, um die nächste Brücke zu passieren.x y←⎕
Nehmen Sie die Eingabe und weisen Siex
(Steuer-) undy
(Rückgabe-)⍳x÷←100
Divisionx
durch 100 zu, und generieren Sie dann ein Array von 1 bis 100{y+⍵-⌈⍵×x}⍣6
rufen Sie die „Pass - Brücke“ Funktion 6 mal:⌈⍵×x
Die Anzahl der Kuchen Sie, mal Steuersatz, aufrunden (der Betrag , den Sie bezahlen) haben⍵-
subtrahieren aus der Anzahl der Kuchen Sie habeny+
Fügen Sie die RückerstattungDann erhalten Sie ein 100-Elemente-Array mit der Anzahl der verbleibenden Kuchen, nachdem Sie 6 Brücken überquert haben, wenn Sie mit 1 bis 100 Kuchen beginnen. Um festzustellen, ob Sie die letzte Brücke überqueren können, prüfen Sie, ob Sie über der Schwelle liegen
y÷x
. Alternativ:x×
Multiplizieren Sie das Array, indem Siex
y<
prüfen, ob größer alsy
Schließlich
1⍳⍨
finden Sie den Index des ersten Auftretens von1
(true), gibt zurück,101
wenn nicht gefunden101|
mod 101quelle
C 128
Ziemlich ähnlich wie die andere C-Lösung, aber ich denke, das ist unvermeidlich. Der Haupttrick besteht darin, mit unterschiedlichen Werten aus der inneren Schleife auszubrechen, je nachdem, ob sie abgeschlossen ist oder nicht. Dies erlaubt mir? Zu benutzen: wenn ich nicht könnte, wenn ich break benutzt hätte;
Ungolfed
quelle