Montag Minigolf Nr. 7: Vereinfachen Sie die Messung der Inhaltsstoffe

12

Montag Minigolf: Eine Reihe von kurzen 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 oist vier Unzen, was 1/4 lein Viertel Pfund wird. 8 t8 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/4anstelle von 1 1/4ist nicht erlaubt.)
  • Die Zahl wird immer eine gemischte Zahl, und wird immer einen Nenner von 2, 3oder 4(oder keine). (nein 1 1/8 T, nein 1.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 .

ETHproductions
quelle
Eng verwandt .
Alex A.
@AlexA. Ah, ja, ich habe vergessen, darauf zu verlinken. IMHO ist es ausreichend anders: 1) es nimmt ein anderes Eingabeformat an. 2) Die Ausgabe ist ziemlich unterschiedlich. 3) Weitere Konvertierungsarten sind erforderlich. 3a) das 1/8 Maß wird nicht verwendet.
ETHproductions
@ETHproductions ähnlicher Geist ist gleichbedeutend mit duplizieren.
Akangka
9
Das würde nie passieren, entschuldigen Sie, metrische Einheiten;)
Adriaan
5
Ihre Golfplätze werden immer kleiner.
Dennis

Antworten:

2

Mathematica, 349 334 330 322 Bytes

Dieser Antwortabschnitt fühlte sich ein wenig einsam an. Also, hier ist mein Versuch. Die Eingabe sollte wie in den Testfällen erfolgen.

n=ToExpression@StringSplit@InputString[];i=#~Mod~1&;b=#&@@n;If[Length@n==3,{x,y,z}=n,{x,y,z}=If[IntegerQ@b,{b,0,Last@n},{0,b,Last@n}]];v={0,1/4,1/3,1/2,2/3,3/4};s=<|T->16,t->3,o->16,q->4,p->2,f->16|>;r=<|T->c,t->T,o->l,f->p,p->q,q->g|>;If[v~MemberQ~i[a=(x+y)/s@z],{x,y,z}={Floor@a,i@a,r@z}]~Do~3;Print@Row[{x,y,z}/. 0->""]

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 1 b=#&@@nannimmt n. das wäre alles bis zum ersten raum.

Wenn n3 Elemente lang sind, haben wir eine ganze Zahl, einen Bruch und eine Einheit. {x,y,z}=nwird zuweisen x, yund zdie drei Teile von sein n. Der andere Fall ist, dass nnicht 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 wir xder ganzzahlige Teil, yder Bruch und zdie Einheit sein. In diesem Fall müssen wir also Folgendes überprüfen:

  • Wenn b(das erste Element n) eine ganze Zahl ist , dann x=b, y=0und z=Last@n(das letzte Element n).
  • Wenn bes sich nicht um eine Ganzzahl handelt, haben wir nur einen Bruch ohne Ganzzahl. Also wollen wir tauschen xund yvon oben; Stattdessen ist x=0,, y=bund zdasselbe 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 -> 16weil 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 Beispiel T -> cbedeutet 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:

  • Addiere xund y, (der ganzzahlige und der gebrochene Teil)
  • Holen Sie sich aus der sobigen Assoziation das Element z; Das heißt, greifen Sie auf die aktuelle Einheit zu, und rufen Sie den entsprechenden Wert in dieser Zuordnung ab.
  • Teilen Sie (x + y) durch den oben angegebenen Wert, ordnen Sie ihn zu aund erhalten Sie dann seinen Bruchteil.
  • Wenn dieser Teil in der Liste ist v, können wir eine Einheit aufsteigen; set xzu aabgerundet (ganzzahliger Teil), Satz ymit dem Bruchteil a, greift dann die Assoziierung rmit der aktuellen Einheit zdie nächste Einheit nach oben, und auf das zu bekommen z.
  • Wenn es stattdessen nicht Teil von ist 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.

numbermaniac
quelle