Poniedziałek Mini-Golf: Seria krótkich golfowych wyzwań, opublikowanych (miejmy nadzieję!) W każdy poniedziałek.
Przepraszam, że jest późno; Uświadomiłem sobie, że w 90% przypadków napisałem inny pomysł, że jest to duplikat.
Moja rodzina jest raczej duża, więc jemy dużo jedzenia. Zwykle musimy podwoić, potroić, a nawet czterokrotnie przepisy, aby przygotować wystarczającą ilość jedzenia! Ale ponieważ pomnożenie pomiarów może być uciążliwe, dobrze byłoby mieć program, który to dla nas zrobi.
Wyzwanie
Wyzwanie polega na utworzeniu programu lub funkcji, która przyjmuje pomiar jako liczbę N i literę L i zwraca ten sam pomiar, maksymalnie uproszczony. Oto wymagane jednostki miary (wszystkie są amerykańskie, podobnie jak moja rodzina) i odpowiadające im litery:
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)
„maksymalnie uproszczone” oznacza:
- Korzystanie z największej możliwej jednostki miary. Każda jednostka może mieć resztę 1/4, 1/3, 1/2, 2/3 lub 3/4.
- W razie potrzeby zamieniając wynik na liczbę mieszaną.
Na przykład 4 o
wynosi cztery uncje, co staje 1/4 l
się ćwierć funta. 8 t
, 8 łyżeczek do herbaty 2 2/3 T
.
Detale
- Dane wejściowe mogą być pobierane w dowolnym rozsądnym formacie; to samo z wyjściem. (
1 t
,1,"t"
,1\nt
Etc.) - Upewnij się, że każda część ułamkowa jest odpowiednio traktowana. (
11/4
w miejsce1 1/4
nie jest dozwolone.) - Liczba zawsze będzie liczba mieszany i zawsze mają mianownik
2
,3
albo4
(lub brak). (nie1 1/8 T
, nie1.5 T
itp.) - W wyniku powyższego nie są nigdy potrzebne konwersje w dół (np. Kubki na łyżki stołowe).
- Litera zawsze będzie jedną z liter wymienionych powyżej (
Tcfglopqt
).
Przypadki testowe
Oto duża lista obejmująca wszystkie typy spraw:
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
Punktacja
Nasza kuchnia jest bardzo mała, więc kod powinien być tak krótki, jak to możliwe, aby nie utrudniać kuchni. Najkrótszy prawidłowy kod w bajtach wygrywa; tiebreaker przechodzi do przesyłania, które jako pierwsze osiągnęło końcową liczbę bajtów. Zwycięzca zostanie wybrany w poniedziałek, 9 listopada. Powodzenia!
Pamiętaj, że to wyzwanie jest podobne do World Big Dosa , ale nie jest jego duplikatem .
źródło
Odpowiedzi:
Mathematica,
349 334 330322 bajtówTa sekcja odpowiedzi była trochę samotna. Oto moja próba. Dane wejściowe należy podawać jak w przypadkach testowych.
Wyjaśnienie
Najpierw uzyskaj dane użytkownika, podziel je na białe znaki i przypisz je do
n
.i=#~Mod~1&
tworzy funkcję, która pobiera ułamkową część liczby, przyjmując ją mod 1.b=#&@@n
po prostu pobierze pierwszy elementn
; to byłoby wszystko do pierwszej przestrzeni.Jeśli
n
ma 3 elementy, oznacza to, że mamy liczbę całkowitą, ułamek i jednostkę.{x,y,z}=n
przydzielix
,y
az
za trzy częścin
. Innym przypadkiem jest to, żen
nie ma 3 elementów; oznacza to, że zamiast tego będą miały 2 elementy. Aby zachować zgodność z powyższym, chcemyx
być częścią całkowitą,y
być ułamkiem iz
jednostką. W takim przypadku musimy sprawdzić:b
(pierwszy element zn
) jest liczbą całkowitą, ax=b
,y=0
az=Last@n
(ostatni elementn
).b
nie jest liczbą całkowitą, oznacza to, że mamy tylko ułamek bez liczby całkowitej. Chcemy więc zamienićx
iy
z góry; Zamiast tegox=0
,y=b
iz
jest taka sama, jak powyżej.Teraz musimy skonfigurować kilka list:
v = {0, 1/4, 1/3, 1/2, 2/3, 3/4}
to lista dopuszczalnych frakcji, jak podano w pytaniu.s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|>
to skojarzenie (para klucz-wartość, jak słownik w Pythonie), które reprezentuje ilość potrzebną danej jednostce, aby przejść do jednej z następnych największych jednostek. Na przykłado -> 16
dlatego , że zanim przejdziemy do 1 funta, potrzeba 16 uncji.r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>
to skojarzenie, które faktycznie reprezentuje to, co jest następną jednostką w górę. Na przykładT -> c
oznacza , że jedna jednostka większa niż łyżki to kubki.If[v~MemberQ~i[a = (x + y)/s@z], {x, y, z} = {Floor@a, i@a, r@z}]~Do~3
Teraz maksymalna liczba potrzebna do przejścia o jednostkę to 3; byłyby to uncje płynu (f) -> litry (p) -> kwarty (q) -> galon (g). Tak więc teraz wykonujemy 3 razy:
x
iy
, (liczby całkowite i ułamkowe)s
powyższego powiązania pobierz elementz
; to znaczy uzyskaj dostęp do bieżącej jednostki i uzyskaj odpowiednią wartość w tym powiązaniu.a
, a następnie uzyskaj jej część ułamkową.v
, możemy przejść o jedną jednostkę w górę; ustawx
naa
zaokrągloną w dół (część całkowita), ustawy
na ułamkową częśća
, a następnie uzyskaj dostęp do powiązaniar
z bieżącą jednostką,z
aby uzyskać następną jednostkę w górę, i ustaw ją naz
.v
, nic nie robimy, ponieważ nie można tego uprościć.Po wykonaniu tego 3 razy wydrukujemy wynik:
Print@Row[{x,y,z}/. 0->””]
To po prostu drukuje
{x,y,z}
w rzędzie, ale zastępuje wszelkie zera (jeśli nie ma liczb całkowitych lub ułamków) pustym łańcuchem, więc nie są drukowane.źródło