Monday Mini-Golf # 7 : 성분 측정 간소화


12

Monday Mini-Golf : 매주 월요일에 게시 되는 일련의 짧은 과제입니다.
늦어서 죄송합니다. 나는 그것이 중복이라는 다른 아이디어를 작성함으로써 90 %의 방법을 깨달았습니다.

우리 가족은 다소 크므로 많은 음식을 먹습니다. 우리는 충분한 음식을 만들기 위해 보통 두 배, 세 배, 심지어 네 배의 요리법이 필요합니다! 그러나 측정 값을 곱하는 것이 어려울 수 있으므로이를 위해 프로그램을 작성하는 것이 좋습니다.

도전

문제는 숫자 N 과 문자 L로 측정을 수행하고 가능한 한 단순화 된 동일한 측정 값을 반환 하는 프로그램이나 함수를 만드는 것 입니다. 필요한 측정 단위 (모두 미국 가족과 마찬가지로)와 해당 문자는 다음과 같습니다.

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)

"가능한 한 단순화"는 다음을 의미합니다.

  • 가장 큰 측정 단위 사용. 각 장치는 1/4, 1/3, 1/2, 2/3 또는 3/4의 나머지를 가질 수 있습니다.
  • 필요한 경우 결과를 혼합 된 숫자로 바꿉니다.

예를 들어 4 o4 온스 1/4 l는 1/4 파운드가됩니다. 8 t, 8 티스푼이됩니다 2 2/3 T.

세부

  • 입력은 임의의 합리적인 형식으로 취해질 수 있습니다. 출력과 동일합니다. ( 1 t, 1,"t", 1\nt등)
  • 분수 부분이 올바르게 처리되었는지 확인하십시오. ( 11/4대신에 1 1/4사용할 수 없습니다.)
  • 수는 항상 혼합 수있을 것입니다, 항상의 분모 것 2, 3또는 4(또는 없음)을. (아니요 1 1/8 T, 아니오 1.5 T등)
  • 위의 결과로 하향 변환 (예 : 컵에서 큰 스푼)이 필요하지 않습니다.
  • 문자는 항상 위에 나열된 문자 중 하나입니다 ( Tcfglopqt).

테스트 사례

다음은 모든 유형의 사례를 다루는 큰 목록입니다.

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

채점

우리 부엌은 매우 작기 때문에 부엌이 더 비좁아지지 않도록 코드는 가능한 짧아야합니다. 바이트 단위의 가장 짧은 유효한 코드가 이깁니다. tiebreaker는 최종 바이트 수에 먼저 도달 한 제출에갑니다. 우승자는 다음주 11 월 9 일 월요일에 선발됩니다. 행운을 빌어 요!

이 과제는 World Big Dosa 와 유사하지만 복제되지는 않습니다 .



@AlexA. 아, 그렇습니다. IMHO, 그것은 충분히 다릅니다 : 1) 다른 입력 형식을 취합니다. 2) 출력이 약간 다릅니다. 3) 더 많은 변환 유형이 필요합니다. 3a) 1/8 측정은 사용되지 않습니다.
ETHproductions

@ETHproductions 비슷한 정신은 복제와 동일합니다.
Akangka

9
이것은 결코 적절하지 않습니다. 실례합니다, 미터법;;
Adriaan

5
당신의 골프는 점점 작아지고 있습니다.
Dennis

답변:


2

Mathematica, 349334330322 바이트

이 답변 섹션은 약간 외로웠습니다. 자, 여기 내 시도가 있습니다. 테스트 사례와 같이 입력해야합니다.

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

설명

먼저 사용자 입력을 가져 와서 해당 입력을 공백으로 나누고에 할당하십시오 n. i=#~Mod~1&mod 1을 취하여 숫자의 소수 부분을 얻는 함수를 만듭니다. b=#&@@n단순히 첫 번째 항목을 가져옵니다 n. 그것은 첫 번째 공간까지 모든 것이 될 것입니다.

경우 n3 개 요소 긴 것을 의미 우리는 정수이고, 분수 가질 단위를. {x,y,z}=n할당 할 것이다 x, y그리고 z의 세 부분으로 n. 다른 경우는 n3 요소 길이가 아닙니다. 즉, 대신 2 요소 길이가됩니다. 위와 일관성을 유지하기 위해 x정수 부분, y분수 및 z단위 가되고 싶습니다 . 따라서이 경우 다음을 확인해야합니다.

  • 경우 b(첫 소자 n) 다음의 정수이며 x=b, y=0z=Last@n(마지막 요소 n).
  • 경우 b정수가 아닌, 그 의미는 우리는 어떤 정수와 분수가있다. 우리가 스왑 원하는 그래서 x하고 y위에서; 대신 x=0, y=b그리고 z상기와 동일하다.

이제 몇 가지 목록을 설정해야합니다.

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|>주어진 단위가 다음으로 큰 단위 중 하나로 올라 가기 위해 필요한 단위의 양을 나타내는 연관 (파이썬의 사전과 같은 키-값 쌍)입니다. 예를 들어, o -> 161 파운드까지 올라가려면 16 온스가 필요하기 때문입니다.

r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>다음 유닛의 실제 모습을 나타내는 연관성입니다. 예를 들어, T -> c큰 스푼보다 큰 1 컵이 컵임을 의미합니다.

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

이제 우리가 한 단위 위로 올라 가야하는 최대 횟수는 3입니다. 그것은 액체 온스 (f)-> 파인트 (p)-> 쿼트 (q)-> 갤런 (g)입니다. 이제 우리는 다음 3 번을 수행합니다.

  • 더하기 xy(정수 및 분수 부분)
  • s위 의 연관성 에서 요소를 가져옵니다 z. 즉, 현재 단위에 액세스하고 해당 연관에서 해당 값을 가져옵니다.
  • 위에서 얻은 값으로 (x + y)를 나누고에 할당 a한 다음 분수 부분을 얻습니다.
  • 해당 부분이 목록에 있으면 v한 단위 위로 올라갈 수 있습니다. 세트 xa라운딩 다운 (정수부) 세트 y의 분수 부분은 a다음 연관 액세스 r현재 유닛 z것과 후속 유닛을 얻을 수있는 한 세트 z.
  • 그것의 경우 하지 의 일부 v대신 단순화 할 수 없기 때문에, 우리는 아무것도하지 않습니다.

3 번 완료되면 결과를 출력합니다.

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

이것은 단순히 {x,y,z}행으로 인쇄 되지만 0 (정수가 없거나 분수가없는 경우)을 빈 문자열로 바꾸므로 인쇄되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.