Thứ hai Mini-Golf # 7: Đơn giản hóa các phép đo thành phần


12

Thứ hai Mini-Golf: Một loạt các thử thách ngắn , được đăng (hy vọng!) Vào mỗi thứ Hai.
Xin lỗi vì đến muộn; Tôi nhận ra 90% cách viết ra một ý tưởng khác rằng đó là một bản sao.

Gia đình tôi khá lớn nên chúng tôi ăn rất nhiều thức ăn. Chúng ta thường cần phải tăng gấp đôi, gấp ba hoặc thậm chí gấp bốn lần công thức nấu ăn để tạo ra đủ thực phẩm! Nhưng khi nhân các phép đo có thể là một nỗi đau, thật tuyệt khi có một chương trình để làm điều này cho chúng tôi.

Thử thách

Thách thức của bạn là tạo ra một chương trình hoặc hàm lấy số đo là số N và chữ L và trả về cùng một phép đo, đơn giản hóa càng nhiều càng tốt. Đây là các đơn vị đo lường cần thiết (tất cả đều là người Mỹ, giống như gia đình tôi) và các chữ cái tương ứng của chúng:

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)

"Đơn giản hóa càng nhiều càng tốt" có nghĩa là:

  • Sử dụng đơn vị đo lường lớn nhất có thể. Mỗi đơn vị có thể có phần còn lại là 1/4, 1/3, 1/2, 2/3 hoặc 3/4.
  • Biến kết quả thành một số hỗn hợp, nếu cần thiết.

Ví dụ, 4 olà bốn ounce, trở thành 1/4 l, một phần tư pound. 8 t, 8 muỗng cà phê, trở thành 2 2/3 T.

Chi tiết

  • Đầu vào có thể được thực hiện trong bất kỳ định dạng hợp lý; tương tự với đầu ra. ( 1 t, 1,"t", 1\nt, Vv)
  • Hãy chắc chắn rằng bất kỳ phần phân đoạn được xử lý đúng. ( 11/4thay vì 1 1/4không được phép.)
  • Con số đó sẽ luôn là một hỗn số, và sẽ luôn luôn có một mẫu số 2, 3hoặc 4(hoặc không có). (không 1 1/8 T, không 1.5 T, v.v.)
  • Do kết quả của những điều trên, không bao giờ chuyển đổi đi xuống (ví dụ như cốc sang muỗng) là cần thiết.
  • Bức thư sẽ luôn là một trong những chữ cái được liệt kê ở trên ( Tcfglopqt).

Các trường hợp thử nghiệm

Đây là một danh sách lớn, hy vọng bao gồm tất cả các loại trường hợp:

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

Chấm điểm

Nhà bếp của chúng tôi rất nhỏ, vì vậy mã phải càng ngắn càng tốt, để không làm cho nhà bếp trở nên chật chội hơn. Mã hợp lệ ngắn nhất tính bằng byte thắng; tiebreaker đi đến trình mà đạt đến số byte cuối cùng của nó đầu tiên. Người chiến thắng sẽ được chọn vào thứ Hai tới, ngày 9 tháng 11. Chúc may mắn!

Xin lưu ý rằng thử thách này tương tự, nhưng không phải là bản sao của World Big Dosa .



@AlexA. À, vâng, tôi quên liên kết đến đó. IMHO, nó đủ khác nhau: 1) nó có một định dạng đầu vào khác nhau. 2) đầu ra khá khác nhau một chút. 3) nhiều loại chuyển đổi được yêu cầu. 3a) phép đo 1/8 không được sử dụng.
Sản phẩm ETH

@ETHproductions tinh thần tương tự tương đương với bản sao.
Akangka

9
Điều này sẽ không bao giờ xảy ra trong trường hợp thích hợp, xin lỗi, đơn vị số liệu;)
Adriaan

5
Golf của bạn đang ngày càng ít mini.
Dennis

Câu trả lời:


2

Toán học, 349 334 330 322 byte

Phần trả lời này cảm thấy một chút cô đơn. Vì vậy, đây là nỗ lực của tôi. Đầu vào nên được đưa ra như trong các trường hợp thử nghiệm.

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

Giải trình

Trước tiên hãy lấy đầu vào của người dùng, phân tách đầu vào đó trên khoảng trắng và gán nó cho n. i=#~Mod~1&tạo một hàm lấy phần phân số của một số, bằng cách lấy nó mod 1. b=#&@@nsẽ chỉ cần lấy mục đầu tiên vào n; đó sẽ là tất cả mọi thứ cho đến không gian đầu tiên.

Nếu ndài 3 phần tử, điều đó có nghĩa là chúng ta có một số nguyên, một phân số một đơn vị. {x,y,z}=nsẽ chỉ định x, yzlà ba phần của n. Trường hợp khác nlà không dài 3 yếu tố; điều đó có nghĩa là nó sẽ dài 2 yếu tố. Để phù hợp với ở trên, chúng tôi muốn xlà phần nguyên, ylà phân số và zđơn vị. Vì vậy, trong trường hợp này, chúng ta cần kiểm tra:

  • Nếu b(các yếu tố đầu tiên của n) là một số nguyên, sau đó x=b, y=0z=Last@n(yếu tố cuối cùng của n).
  • Nếu bkhông phải là số nguyên, điều đó có nghĩa là chúng ta chỉ có một phân số không có số nguyên. Vì vậy, chúng tôi muốn trao đổi xytừ trên cao; thay vào đó, x=0, y=b, và zlà tương tự như trên.

Bây giờ chúng tôi cần thiết lập một số danh sách:

v = {0, 1/4, 1/3, 1/2, 2/3, 3/4} là danh sách các phân số có thể chấp nhận, như đã nêu trong câu hỏi.

s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|>là một liên kết (cặp khóa-giá trị, giống như một từ điển trong Python) đại diện cho số lượng cần thiết của một đơn vị nhất định để chuyển lên Up một trong những đơn vị lớn nhất tiếp theo. Ví dụ, o -> 16là bởi vì 16 ounces được yêu cầu trước khi chúng tôi tăng lên 1 pound.

r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>là hiệp hội thực sự đại diện cho những gì đơn vị tiếp theo lên. Ví dụ: T -> ccó nghĩa là một đơn vị lớn hơn muỗng canh là cốc.

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

Bây giờ, số lần tối đa chúng tôi cần để tăng một đơn vị là 3; đó sẽ là chất lỏng ounce (f) -> pint (p) -> quarts (q) -> gallon (g). Vì vậy, bây giờ chúng tôi làm 3 lần sau đây:

  • Thêm xy, (phần nguyên và phần)
  • Từ shiệp hội trên, có được yếu tố z; nghĩa là truy cập vào đơn vị hiện tại và nhận giá trị tương ứng trong liên kết đó.
  • Chia (x + y) cho giá trị mà chúng tôi nhận được ở trên, gán nó cho a, sau đó lấy phần phân số của nó.
  • Nếu phần đó nằm trong danh sách v, thì chúng ta có thể tăng lên một đơn vị; được đặt xthành alàm tròn xuống (phần nguyên), được đặt thành yphần phân số của a, sau đó truy cập liên kết rvới đơn vị hiện tại zđể đưa đơn vị tiếp theo lên và đặt thành đơn vị đó z.
  • Nếu đó không phải là một phần của vthay vào đó, chúng tôi không làm gì cả, vì nó không thể được đơn giản hóa.

Khi đã xong 3 lần, chúng tôi sẽ in ra kết quả:

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

Điều này chỉ đơn giản là in ra {x,y,z}một hàng, nhưng thay thế bất kỳ số 0 nào (nếu không có số nguyên hoặc không có phân số), bằng một chuỗi rỗng, vì vậy những số này không được in ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.