Mini-golf n. 7 di lunedì: semplifica la misurazione degli ingredienti


12

Mini-golf del lunedì: una serie di sfide da corto , pubblicate (si spera!) Ogni lunedì.
Scusa è tardi; Mi sono reso conto del 90% del tutto scrivendo un'idea diversa che si trattava di un duplicato.

La mia famiglia è piuttosto numerosa, quindi mangiamo molto cibo. Di solito abbiamo bisogno di raddoppiare, triplicare o addirittura quadruplicare le ricette per fare abbastanza cibo! Ma poiché moltiplicare le misurazioni può essere una seccatura, sarebbe bello avere un programma per farlo per noi.

Sfida

La tua sfida è quella di creare un programma o una funzione che esegua una misurazione come un numero N e una lettera L e restituisca la stessa misurazione, il più semplificata possibile. Ecco le unità di misura richieste (tutte sono americane, come la mia famiglia) e le lettere corrispondenti:

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)

"semplificato il più possibile" significa:

  • Utilizzando la più grande unità di misura possibile. Ogni unità può avere un resto di 1/4, 1/3, 1/2, 2/3 o 3/4.
  • Trasformare il risultato in un numero misto, se necessario.

Ad esempio, 4 osono quattro once, che diventano 1/4 l, un quarto di sterlina. 8 t, 8 cucchiaini, diventa 2 2/3 T.

Dettagli

  • L'input può essere preso in qualsiasi formato ragionevole; lo stesso con l'output. ( 1 t, 1,"t", 1\nt, Etc.)
  • Assicurarsi che qualsiasi parte frazionaria sia trattata correttamente. ( 11/4al posto di 1 1/4non è permesso.)
  • Il numero sarà sempre un numero misto, e avrà sempre un denominatore 2, 3o 4(o nessuno). (no 1 1/8 T, no 1.5 T, ecc.)
  • Come risultato di quanto sopra, non sono mai necessarie conversioni al ribasso (ad esempio tazze in cucchiai).
  • La lettera sarà sempre una delle lettere sopra elencate ( Tcfglopqt).

Casi test

Ecco un grande elenco, che si spera copra tutti i tipi di casi:

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

punteggio

La nostra cucina è molto piccola, quindi il codice dovrebbe essere il più breve possibile, in modo da non rendere la cucina più stretta. Vince il codice valido più breve in byte; tiebreaker va all'invio che per primo ha raggiunto il conteggio dei byte finali. Il vincitore verrà scelto lunedì prossimo, 9 novembre. Buona fortuna!

Questa sfida è simile a World Big Dosa , ma non è una sua copia .



@AlexA. Ah, sì, ho dimenticato di collegarmi a quello. IMHO, è sufficientemente diverso: 1) richiede un formato di input diverso. 2) l'output è leggermente diverso. 3) sono richiesti più tipi di conversione. 3a) la misura 1/8 non viene utilizzata.
ETHproductions

@ETHproductions spirito simile equivale a duplicato.
Akangka,

9
Ciò non accadrebbe mai in modo corretto, mi scusi, unità metriche;)
Adriaan,

5
I tuoi golf stanno diventando sempre meno mini.
Dennis,

Risposte:


2

Mathematica, 349 334 330 322 byte

Questa sezione di risposta sembrava un po 'solitaria. Quindi, ecco il mio tentativo. L'input deve essere fornito come nei casi di test.

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->""]

Spiegazione

Prima ottenere l'input dell'utente, dividere quell'input su uno spazio bianco e assegnarlo a n. i=#~Mod~1&crea una funzione che ottiene la parte frazionaria di un numero, prendendolo mod 1. b=#&@@notterrà semplicemente il primo oggetto n; sarebbe tutto fino al primo spazio.

Se nè lungo 3 elementi, significa che abbiamo un numero intero, una frazione e un'unità. {x,y,z}=nassegnerà x, ye zdi essere le tre parti di n. L'altro caso è che nnon è lungo 3 elementi; ciò significa che saranno invece lunghi 2 elementi. Per rimanere coerenti con quanto sopra, vogliamo xessere la parte intera, yla frazione e zl'unità. Quindi in questo caso, dobbiamo controllare:

  • Se b(il primo elemento di n) è un intero, quindi x=b, y=0e z=Last@n(l'ultimo elemento n).
  • Se bnon è un numero intero, significa che abbiamo solo una frazione senza numero intero. Quindi vogliamo scambiare xe ydall'alto; invece, x=0, y=b, ed zè lo stesso come sopra.

Ora dobbiamo impostare alcuni elenchi:

v = {0, 1/4, 1/3, 1/2, 2/3, 3/4} è l'elenco delle frazioni accettabili, come indicato nella domanda.

s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|>è un'associazione (coppia chiave-valore, come un dizionario in Python) che rappresenta la quantità necessaria di una determinata unità per andare "su" a una delle unità più grandi successive. Ad esempio, o -> 16è perché sono necessarie 16 once prima di salire a 1 sterlina.

r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>è l'associazione che rappresenta effettivamente la prossima unità in alto. Ad esempio, T -> csignifica che un'unità più grande di un cucchiaio è una tazza.

If[v~MemberQ~i[a = (x + y)/s@z], {x, y, z} = {Floor@a, i@a, r@z}]~Do~3

Ora, il numero massimo di volte in cui dobbiamo salire di un'unità è 3; sarebbero le once fluide (f) -> pinte (p) -> quarti (q) -> gallone (g). Quindi, ora facciamo le seguenti 3 volte:

  • Aggiungi xe y, (le parti intere e frazionarie)
  • Dalla sassociazione sopra, ottenere elemento z; vale a dire, accedere all'unità corrente e ottenere il valore corrispondente in tale associazione.
  • Dividi (x + y) per quel valore che abbiamo sopra, assegnalo a, quindi ottieni la sua parte frazionaria.
  • Se quella parte è nella lista v, allora possiamo salire di un'unità; impostato xsu aarrotondato per difetto (parte intera), impostato ysulla parte frazionaria di a, quindi accedere all'associazione rcon l'unità corrente zper aumentare l'unità successiva e impostarla su z.
  • Se invece non fa parte di vnoi, non facciamo nulla, poiché non può essere semplificato.

Una volta fatto 3 volte, stampiamo il risultato:

Print@Row[{x,y,z}/. 0->””]

Questo viene semplicemente stampato {x,y,z}in una riga, ma sostituisce qualsiasi zero (se non c'è un numero intero o nessuna frazione), con una stringa vuota, quindi quelli non vengono stampati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.