Pazartesi Mini Golf # 7: Bileşen ölçümlerini basitleştirin


12

Pazartesi Mini Golf: Her Pazartesi (umarım!) Yayınlanmış bir dizi kısa mücadelesi.
Üzgünüm geç oldu; Yolun% 90'ının, bunun kopya olduğunu farklı bir fikir yazarak anladım.

Ailem oldukça büyük, bu yüzden çok yemek yiyoruz. Yeterli yiyecek hazırlamak için genellikle iki, üç veya dört kat tarifler yapmamız gerekir! Ancak ölçümleri çoğaltmak acı verici olabileceğinden, bunu bizim için yapacak bir programa sahip olmak güzel olurdu.

Meydan okuma

Zorluğunuz, bir sayı N ve L harfi gibi bir ölçümü alan ve mümkün olduğunca basitleştirilmiş aynı ölçümü döndüren bir program veya işlev oluşturmaktır . Gerekli ölçüm birimleri (hepsi Amerikan, ailem gibi) ve karşılık gelen harfleri:

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)

"olabildiğince basitleştirilmiş" şu anlama gelir:

  • Mümkün olan en büyük ölçü birimini kullanarak. Her birimin 1/4, 1/3, 1/2, 2/3 veya 3/4 kalıntısı olabilir.
  • Gerekirse sonucu karışık bir sayıya dönüştürmek.

Örneğin 4 o, dört ons, bu 1/4 lda çeyrek pound olur. 8 t, 8 çay kaşığı, olur 2 2/3 T.

ayrıntılar

  • Giriş herhangi bir makul formatta alınabilir; çıktı ile aynı. ( 1 t, 1,"t", 1\ntVs.)
  • Kesirli parçaların düzgün bir şekilde ele alındığından emin olun. ( 11/4yerine 1 1/4izin verilmez.)
  • Numarası her zaman karışık sayı olacaktır ve her zaman bir payda olacak 2, 3ya da 4(ya yok). (hayır 1 1/8 T, hayır 1.5 T, vb.)
  • Yukarıdakilerin bir sonucu olarak, aşağıya doğru dönüşümlere (örneğin, bardaktan yemek kaşığı kadar) ihtiyaç duyulmaz.
  • Harf her zaman yukarıda listelenen harflerden biri olacaktır ( Tcfglopqt).

Test-vakalar

İşte umarım her türlü vakayı kapsayan geniş bir liste:

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

puanlama

Mutfağımız çok küçük olduğundan, mutfağı daha sıkışık hale getirmemek için kod mümkün olduğunca kısa olmalıdır. Bayt cinsinden en kısa geçerli kod kazanır; tiebreaker ilk olarak son bayt sayısına ulaşan gönderime gider. Kazanan önümüzdeki 9 Kasım Pazartesi günü seçilecek. İyi şanslar!

Lütfen bu zorluğun Dünya Büyük Dosa'ya benzediğini, ancak bunun bir kopyası olmadığını unutmayın .



@AlexA. Ah, evet, buna bağlanmayı unuttum. IMHO, yeterince farklı: 1) farklı bir giriş formatı alıyor. 2) çıktı biraz farklı. 3) daha fazla dönüşüm türü gereklidir. 3a) 1/8 ölçümü kullanılmaz.
ETHproductions

@ETHproductions benzer ruh yinelenen ile eşdeğerdir.
Akangka

9
Bu asla uygun olmazdı, affedersiniz, metrik birimler;)
Adriaan

5
Golfleriniz gittikçe daha az mini oluyor.
Dennis

Yanıtlar:


2

Mathematica, 349334 330322 bayt

Bu cevap bölümü biraz yalnız hissetti. İşte benim girişimim. Giriş, test durumlarında olduğu gibi verilmelidir.

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

açıklama

Öncelikle kullanıcı girişini alın, bu girişi boşlukta bölün ve bunu atayın n. i=#~Mod~1&mod 1 alarak bir sayının kesirli kısmını alır bir işlev oluşturur. b=#&@@nbasitçe ilk öğe alır n; ilk alana kadar her şey bu olurdu.

Eğer n3 elemanları uzunluğunda, bu araçlar, biz bir tamsayı, bir fraksiyon, sahip ve bir birim. {x,y,z}=natar x, yve züç parça olması n. Diğer durum, n3 eleman uzunluğunda olmamasıdır; Bu, bunun yerine 2 öğe uzunluğunda olacağı anlamına gelir. Yukarıdakilerle tutarlı kalmak xiçin tamsayı kısmı, ykesir ve zbirim olmak istiyoruz. Bu durumda, kontrol etmeliyiz:

  • Eğer b(ilk elemanı n) daha sonra bir tam sayı olduğu x=b, y=0ve z=Last@n(son elemanı n).
  • Eğer btamsayı değil, demekse biz sadece hayır tamsayı olan bir bölüm vardır. Biz takas istiyorum Yani xve yyukarıdan; Bunun yerine, x=0, y=bve zyukarıdaki ile aynıdır.

Şimdi bazı listeler oluşturmamız gerekiyor:

v = {0, 1/4, 1/3, 1/2, 2/3, 3/4} soruda belirtildiği gibi kabul edilebilir kesirlerin listesidir.

s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|>verilen bir birimin bir sonraki en büyük birimden birine "yukarı" gitmesi için gereken miktarı temsil eden bir ilişkilendirmedir (Python'daki bir sözlük gibi anahtar / değer çifti). Örneğin, o -> 161 pound'a kadar gitmeden önce 16 ons gereklidir.

r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|>bir sonraki ünitenin gerçekte ne olduğunu temsil eden dernektir. Örneğin, T -> cYemek Kaşığı'ndan daha büyük bir birimin bardak olduğu anlamına gelir.

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

Şimdi, bir üniteye gitmemiz gereken maksimum sayı 3'tür; akışkan ons (f) -> pint (p) -> quart (q) -> galon (g) olabilir. Şimdi, aşağıdaki 3 kez yapıyoruz:

  • Ekle xve y, (tamsayı ve kesirli parçalar)
  • Kaynaktan silişki yukarıda öğesi almak z; yani, geçerli birime erişin ve bu ilişkilendirmede karşılık gelen değeri alın.
  • (X + y) değerini yukarıda bulduğumuz değere bölün, atayın a, sonra kesirli kısmını alın.
  • Bu parça listede yer alıyorsa v, bir birim yukarı gidebiliriz; grubu xiçin ayuvarlak aşağı (tam sayı parçası), resim grubu ykesirli kısmı a, daha sonra ilişki erişmek rmevcut birimi ile zyanındadır birimini elde etmek için, ve set z.
  • E? Er değil parçası vbunun yerine basitleştirilmiş edilemez çünkü biz bir şey yapmıyoruz.

Bu 3 kez yapıldıktan sonra sonucu yazdırırız:

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

Bu, yalnızca {x,y,z}bir satırda yazdırılır , ancak sıfırları (tamsayı yoksa veya kesir yoksa) boş bir dize ile değiştirir, böylece bunlar yazdırılmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.