月曜日のミニゴルフ#7:成分測定の簡素化


12

月曜日のミニゴルフ:毎週月曜日に(願わくば!)投稿された一連の短いチャレンジ。
遅れてすみません。私は、それが複製であるという別のアイデアを書き出す過程の90%を実現しました。

私の家族はかなり大きいので、たくさんの食べ物を食べます。十分な食料を作るには、通常、2倍、3倍、または4倍のレシピが必要です。しかし、測定値を乗算することは苦痛になる可能性があるため、これを行うプログラムを用意しておくと便利です。

チャレンジ

あなたの挑戦は、数値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 t1,"t"1\nt、等)
  • 小数部分が適切に処理されていることを確認してください。(の11/4代わりに1 1/4はできません。)
  • 番号は常に混合数になり、常にの分母を有するであろう23または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

得点

キッチンは非常に小さいため、キッチンをthe屈にしないために、コードはできるだけ短くする必要があります。バイト単位の最短有効コードが優先されます。タイブレーカーは、最初に最終バイトカウントに達した送信に進みます。勝者は、11月9日の次の月曜日に選ばれます。

この課題は、World Big Dosaに似ていますが、その複製ではないことに注意してください。



@AlexA。ああ、はい、それにリンクするのを忘れました。私見、それは十分に異なっています:1)それは異なる入力形式を取ります。2)出力はかなり異なります。3)より多くの変換タイプが必要です。3a)1/8測定は使用されません。
ETHproductions

@ETHproductionsの類似の精神は複製と同等です。
アカンカ

9
これは、適切な単位で発生することはありません、すみません、メートル単位;)
アドリアーン

5
あなたのゴルフはますますミニになってきています。
デニス

回答:


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ます。それが最初のスペースまでのすべてです。

n長さが3要素の場合、整数、小数部、および単位があることを意味します。{x,y,z}=n割り当てられますxyzの三つの部分であることをn。もう1つのケースは、n3要素の長さではありません。つまり、代わりに2要素の長さになります。上記との一貫性を保つxために、整数部、y小数z部、および単位になります。したがって、この場合、次のことを確認する必要があります。

  • 場合b(の最初の要素n)は、整数、次にでありx=by=0そしてz=Last@n(最後の要素n)。
  • bが整数でない場合、整数を持たない小数部しかありません。だから私たちは上から交換xしたいと思いyます。代わりに、x=0y=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|>関連付け(Pythonの辞書のようなキーと値のペア)は、指定されたユニットが次に大きなユニットの1つに「上がる」ために必要な量を表します。たとえば、o -> 161ポンドになるまで16オンスが必要だからです。

r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>次のユニットが何であるかを実際に表す関連付けです。たとえばT -> c、Tablespoonsよりも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回を実行します。

  • xおよびを追加しますy(整数部と小数部)
  • s上記の関連付けから、要素を取得しますz。つまり、現在のユニットにアクセスし、その関連付けの対応する値を取得します。
  • 上記で得た値で(x + y)を除算しa、それをに割り当て、その小数部分を取得します。
  • その部分がリストvにある場合、1ユニット上に移動できます。セットxa丸みを帯びたダウン(整数部)、セットyの小数部にはa、その後の関連付けをアクセスr現在のユニットとzそれに次の単位を取得するため、およびセットz
  • それはならないの一部vの代わりに、それは簡単にすることができないため、私たちは、何もしません。

それが3回行われると、結果を出力します。

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

これは単純に{x,y,z}行に出力されますが、ゼロ(整数または分数がない場合)を空の文字列に置き換えるため、それらは出力されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.