Montag Minigolf: Eine Reihe von kurzen Code-Golf- Herausforderungen, die (hoffentlich!) Jeden Montag veröffentlicht werden.
Entschuldigung, es ist spät; Ich erkannte 90% des Weges, indem ich eine andere Idee aufschrieb, dass es sich um ein Duplikat handelte.
Meine Familie ist ziemlich groß, deshalb essen wir viel. Normalerweise müssen wir Rezepte verdoppeln, verdreifachen oder sogar vervierfachen, um genug Essen zuzubereiten! Aber da das Multiplizieren der Messungen ein Problem sein kann, wäre es schön, ein Programm zu haben, das dies für uns erledigt.
Herausforderung
Ihre Herausforderung besteht darin, ein Programm oder eine Funktion zu erstellen, die eine Messung als Zahl N und einen Buchstaben L aufnimmt und dieselbe Messung möglichst vereinfacht zurückgibt. Hier sind die erforderlichen Maßeinheiten (alle sind amerikanisch, wie meine Familie) und die entsprechenden Buchstaben:
1 cup (c) = 16 tablespoons (T) = 48 teaspoons (t)
1 pound (l) = 16 ounces (o)
1 gallon (g) = 4 quarts (q) = 8 pints (p) = 128 fluid ounces (f)
"So weit wie möglich vereinfacht" bedeutet:
- Verwenden Sie die größtmögliche Maßeinheit. Jede Einheit kann einen Rest von 1/4, 1/3, 1/2, 2/3 oder 3/4 haben.
- Wenn nötig, verwandeln Sie das Ergebnis in eine gemischte Zahl.
Zum Beispiel 4 o
ist vier Unzen, was 1/4 l
ein Viertel Pfund wird. 8 t
8 Teelöffel werden 2 2/3 T
.
Einzelheiten
- Die Eingabe kann in jedem vernünftigen Format erfolgen. Gleiches gilt für die Ausgabe. (
1 t
,1,"t"
,1\nt
, Etc.) - Stellen Sie sicher, dass alle Bruchteile ordnungsgemäß behandelt werden. (
11/4
anstelle von1 1/4
ist nicht erlaubt.) - Die Zahl wird immer eine gemischte Zahl, und wird immer einen Nenner von
2
,3
oder4
(oder keine). (nein1 1/8 T
, nein1.5 T
, etc.) - Infolgedessen sind niemals Umrechnungen nach unten (z. B. Tassen in Esslöffel) erforderlich.
- Der Buchstabe wird immer einer der oben aufgelisteten Buchstaben sein (
Tcfglopqt
).
Testfälle
Hier ist eine große Liste, die hoffentlich alle Arten von Fällen abdeckt:
Input | Output
--------+--------
1/2 t | 1/2 t
3/4 t | 1/4 T
1 t | 1/3 T
1 1/2 t | 1/2 T
2 t | 2/3 T
2 1/4 t | 3/4 T
2 1/2 t | 2 1/2 t
3 t | 1 T
10 t | 3 1/3 T
16 t | 1/3 c
5 1/3 T | 1/3 c
8 T | 1/2 c
16 T | 1 c
36 T | 2 1/4 c
1/4 c | 1/4 c
1024 c | 1024 c
1 o | 1 o
4 o | 1/4 l
5 1/3 o | 1/3 l
5 2/3 o | 5 2/3 o
8 o | 1/2 l
28 o | 1 3/4 l
28 l | 28 l
2 f | 2 f
4 f | 1/4 p
8 f | 1/4 q
16 f | 1/2 q
32 f | 1/4 g
64 f | 1/2 g
128 f | 1 g
2/3 p | 1/3 q
1 1/3 p | 2/3 q
2 p | 1/4 g
1 q | 1/4 g
Wertung
Unsere Küche ist sehr klein, daher sollte der Code so kurz wie möglich sein, um die Küche nicht enger zu machen. Kürzester gültiger Code in Bytes gewinnt; tiebreaker geht zur Übermittlung, die als erste ihre letzte Bytezahl erreicht hat. Der Gewinner wird am kommenden Montag, dem 9. November, ermittelt. Viel Glück!
Bitte beachte, dass diese Herausforderung World Big Dosa ähnelt, aber kein Duplikat davon ist .
quelle
Antworten:
Mathematica,
349 334 330322 BytesDieser Antwortabschnitt fühlte sich ein wenig einsam an. Also, hier ist mein Versuch. Die Eingabe sollte wie in den Testfällen erfolgen.
Erläuterung
Holen Sie sich zuerst die Benutzereingabe, teilen Sie diese Eingabe in Leerzeichen und weisen Sie diese zu
n
.i=#~Mod~1&
erstellt eine Funktion, die den Bruchteil einer Zahl erhält, indem sie Mod 1b=#&@@n
annimmtn
. das wäre alles bis zum ersten raum.Wenn
n
3 Elemente lang sind, haben wir eine ganze Zahl, einen Bruch und eine Einheit.{x,y,z}=n
wird zuweisenx
,y
undz
die drei Teile von seinn
. Der andere Fall ist, dassn
nicht 3 Elemente lang ist; Das bedeutet, dass es stattdessen 2 Elemente lang sein wird. Um mit dem oben Gesagten in Einklang zu bleiben, möchten wirx
der ganzzahlige Teil,y
der Bruch undz
die Einheit sein. In diesem Fall müssen wir also Folgendes überprüfen:b
(das erste Elementn
) eine ganze Zahl ist , dannx=b
,y=0
undz=Last@n
(das letzte Elementn
).b
es sich nicht um eine Ganzzahl handelt, haben wir nur einen Bruch ohne Ganzzahl. Also wollen wir tauschenx
undy
von oben; Stattdessen istx=0
,,y=b
undz
dasselbe wie oben.Nun müssen wir einige Listen erstellen:
v = {0, 1/4, 1/3, 1/2, 2/3, 3/4}
ist die Liste der akzeptablen Brüche, wie in der Frage angegeben.s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|>
ist eine Assoziation (Schlüssel-Wert-Paar, wie ein Wörterbuch in Python), die den Betrag angibt, den eine bestimmte Einheit benötigt, um zu einer der nächstgrößeren Einheiten aufzusteigen. Zum Beispiel,o -> 16
weil 16 Unzen benötigt werden, bevor wir auf 1 Pfund aufsteigen.r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>
ist die Assoziation, die tatsächlich die nächste Einheit darstellt. Zum BeispielT -> c
bedeutet eine Einheit größer als Esslöffel Tassen.If[v~MemberQ~i[a = (x + y)/s@z], {x, y, z} = {Floor@a, i@a, r@z}]~Do~3
Jetzt müssen wir höchstens 3 Mal eine Einheit hinaufsteigen. das wären fließende Unzen (f) -> Pints (p) -> Quarts (q) -> Gallonen (g). Also machen wir jetzt 3 mal folgendes:
x
undy
, (der ganzzahlige und der gebrochene Teil)s
obigen Assoziation das Elementz
; Das heißt, greifen Sie auf die aktuelle Einheit zu, und rufen Sie den entsprechenden Wert in dieser Zuordnung ab.a
und erhalten Sie dann seinen Bruchteil.v
, können wir eine Einheit aufsteigen; setx
zua
abgerundet (ganzzahliger Teil), Satzy
mit dem Bruchteila
, greift dann die Assoziierungr
mit der aktuellen Einheitz
die nächste Einheit nach oben, und auf das zu bekommenz
.v
, tun wir nichts, da es nicht vereinfacht werden kann.Sobald dies dreimal erledigt ist, drucken wir das Ergebnis aus:
Print@Row[{x,y,z}/. 0->””]
Dies wird einfach
{x,y,z}
in einer Reihe ausgedruckt, ersetzt aber alle Nullen (wenn es keine Ganzzahl oder keinen Bruch gibt) durch eine leere Zeichenfolge, sodass diese nicht ausgedruckt werden.quelle