Номер - Мини-Гольф По Понедельникам № 7: Упростите Измерение Ингредиентов

  • Автор темы Teotem
  • Обновлено
  • 17, Oct 2024
  • #1

Понедельник, мини-гольф: Серия коротких заданий, публикуемых (надеюсь!) каждый понедельник.
Извините, уже поздно; На 90% пути написания другой идеи я понял, что это дубликат.

Моя семья довольно большая, поэтому мы едим много. Обычно нам нужно удвоить, утроить или даже учетверить рецепты, чтобы приготовить достаточно еды! Но поскольку умножение измерений может оказаться затруднительным, было бы неплохо иметь программу, которая могла бы сделать это за нас.

Испытание

Ваша задача — создать программу или функцию, которая принимает измерение в виде числа. Н и письмо ли возвращает то же измерение, максимально упрощенное. Вот необходимые единицы измерения (все американские, как и моя семья) и соответствующие им буквы:

 
 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
 

«Максимально упрощенный» означает:

  • Использование максимально возможной единицы измерения. Каждая единица может иметь остаток 1/4, 1/3, 1/2, 2/3 или 3/4.
  • Преобразование результата в смешанное число, если необходимо.

Например, Tcfglopqt is four ounces, which becomes 1.5 T , четверть фунта. 1 1/8 T , 8 teaspoons, becomes 4 .

Подробности

  • Входные данные могут быть приняты в любом разумном формате; то же самое с выводом. ( 3 , 2 , 1 1/4 , etc.)
  • Убедитесь, что любая дробная часть обработана правильно. ( 11/4 in place of 1\nt не допускается.)
  • Число всегда будет смешанным числом и всегда будет иметь знаменатель 1,"t" , 1 t , или 2 2/3 T (or none). (no 8 t , нет 1/4 l , etc.)
  • В результате вышеизложенного никаких нисходящих преобразований (например, чашек в столовые ложки) не требуется.
  • Буква всегда будет одной из букв, перечисленных выше ( 4 o ).

Тест-кейсы

Вот большой список, надеюсь, охватывающий все типы случаев:

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)

Подсчет очков

Кухня у нас очень маленькая, поэтому код должен быть как можно короче, чтобы не делать кухню более тесной. Выигрывает самый короткий действительный код в байтах; Тай-брейкер переходит к отправке, которая первой достигла конечного количества байтов. Победитель будет выбран в следующий понедельник, 9 ноября. Удачи!

Обратите внимание, что это задание похоже, но не дублирует, Мировая Большая Доса.

#код-гольф #код-гольф #номер #конверсия

Teotem


Рег
07 Jan, 2006

Тем
77

Постов
183

Баллов
608
  • 26, Oct 2024
  • #2

Математика, 349 334 330 322 байт

В этом разделе ответов было немного одиноко. Итак, вот моя попытка. Входные данные следует вводить так же, как в тестовых примерах.

 {x,y,z} 

Объяснение

Сначала получите пользовательский ввод, разделите его на пробелы и назначьте его Print@Row[{x,y,z}/. 0->””] . v создает функцию, которая получает дробную часть числа, принимая ее по модулю 1. z will simply get the first item in z ; это будет все, вплоть до первого пробела.

Если r is 3 elements long, that means we have an integer, a fraction, и единица. a will assign y , a и x быть тремя частями v . The other case is that a не имеет длины 3 элементов; это означает, что вместо этого он будет иметь длину 2 элемента. Чтобы оставаться в соответствии с вышеизложенным, мы хотим z to be the integer part, s быть дробью, и y the unit. So in this case, we need to check:

  • Если x (the first element of If[v~MemberQ~i[a = (x + y)/s@z], {x, y, z} = {Floor@a, i@a, r@z}]~Do~3 ) — целое число, тогда T -> c , r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|> и o -> 16 (the last element of s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|> ).
  • Если v = {0, 1/4, 1/3, 1/2, 2/3, 3/4} isn’t an integer, that means we only have a fraction with no integer. So we want to swap z and y=b from above; instead, x=0 , y , and x то же самое, что и выше.

Теперь нам нужно настроить несколько списков:

b is the list of acceptable fractions, as stated in the question.

n is an association (key-value pair, like a dictionary in Python) that represents the amount needed of a given unit to go “up” to one of the next largest unit. For example, z=Last@n потому что требуется 16 унций, прежде чем мы поднимемся до 1 фунта.

y=0 is the association that actually represents what the next unit up is. For example, x=b означает, что одна единица больше столовой ложки — это чашки.

n

Теперь максимальное количество раз, которое нам нужно подняться на единицу, равно 3; это будут жидкие унции (f) -> пинты (p) -> кварты (q) -> галлоны (г). Итак, теперь делаем следующее 3 раза:

  • Добавлять b and z , (целая и дробная части)
  • Из y association above, get element x ; то есть получить доступ к текущему блоку и получить соответствующее значение в этой ассоциации.
  • Разделите (x+y) на полученное выше значение и присвойте его n , then get its fractional part.
  • Если эта часть есть в списке n , then we can go up one unit; set z к y rounded down (integer part), set x дробной части {x,y,z}=n , then access the association n с текущим блоком n to get the next unit up, and set that to b=#&@@n .
  • Если это нет часть i=#~Mod~1& instead, we don’t do anything, since it can’t be simplified.

Как только это будет сделано 3 раза, мы распечатаем результат:

n

Это просто распечатывает 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->""] in a row, but replaces any zeroes (if there’s no integer, or no fraction), with an empty string, so those don’t print out.

 

Alex_Lot


Рег
18 Oct, 2007

Тем
72

Постов
180

Баллов
560
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно