Yüzme havuzunu boşaltın. . . Sadece Kırmızı Solo Kupası ile


14

Su ağzına kadar dolu bir yüzme havuzunuz var. Boşaltmanız gerekiyor, ancak etkili bir yöntem düşünemezsiniz. Yani kırmızı solo bardağını kullanmaya karar verdin. Bardağı defalarca dolduracak ve havuzun dışına dökeceksiniz.

Meydan okuma

Havuzu boşaltmak ne kadar sürer?

Giriş

[shape of pool] [dimensions] [shape of cup] [dimensions] [speed]

  • shape of pool: Bu dizeleri biri olacak circle, triangleya da rectangle. Bunların aslında 3 boyutlu şekilleri ifade ettiğini unutmayın: silindir, üçgen prizma ve dikdörtgen prizma.
  • dimensions şekle bağlı olarak farklı olacaktır.
    • daire: [radius] [height]. Hacim = π r 2 sa
    • Üçgen: [base] [height] [length]. Hacim = 1/2 (bh) * uzunluk
    • dikdörtgen: [width] [length] [height]Hacim = lwh
  • shape of cupve dimensionsaynı şekilde çalışır. Kupa ayrıca bir daire, üçgen veya dikdörtgen olabilir.
  • speedsaniyede bir bardak su ile doldurulması gereken süredir .

Çıktı

Yüzme havuzunu boşaltmak için geçen saniye sayısı . Bu en yakın saniyeye yuvarlanabilir.

notlar

  • Girişte birim olmayacak. Tüm mesafe birimlerinin aynı olduğu varsayılır (bir şeklin inç cinsinden yüksekliği ve feet cinsinden genişliği olmaz).
  • İçin 3.14 kullanın pi.
  • Girdi karakter dizilerinden ve kayan nokta sayılarından oluşacaktır.
  • Asla yağmur yağmaz. Su ilave edilmeyecektir.
  • Bir var çok sabit bir el. Her seferinde bardağı ağzına kadar dolduracaksınız ve asla dökmeyeceksiniz.
  • Sonuna yaklaştığınızda, bir bardak su doldurmak zorlaşacaktır. Bu konuda endişelenmenize gerek yok. Çok güçlüsün, böylece havuzu daha fazla kullanmadan yana yatırın.
  • Ne zaman bir hesaplama yaparsanız , en yakın yüzde birliğe yuvarlamanız uygun olur . Son cevabınızın kesin olması gerekmeyecek.

Test Durumları

Girdi: triangle 10 12.25 3 circle 5 2.2 5
Çıktı: 10
Son kepçede 172,7'den az kalmış olsa da, boşaltmak yine de beş saniyenin tamamını alır.

Giriş: triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
Çıkış:804.2

  • Her hesaplamadan sonra en yakın yüzüncü yüzyıla gelmelisiniz.
  • Son hesaplama yuvarlanır 804,2 için 804.05567 den. Bunun nedeni, son küçük suyun boşaltılması gerektiğidir.

kurallar

  • Tam bir program veya işlev yazabilirsiniz.
  • Giriş stdin veya fonksiyon parametrelerinden alınmalıdır. Çıktı stdout aracılığıyla yazdırılmalı veya iade edilmelidir.
  • Giriş biçimi, gönderimde belirttiğiniz sürece yeniden düzenlenebilir. Ayrıca "daire", "üçgen" ve "dikdörtgen" dizelerini kısaltabilirsiniz.
  • Birim veya alan içeren kütüphanelere ve yerleşik işlevlere izin verilmez.

puanlama

Bu . En az bayt ile gönderme kazanır.


3
Havuzun dibindeki su seviyesi bardağın yüksekliğinden daha düşük olduğunda, sonunda problemleriniz olurdu. Bu noktada bir bardak almak zorlaşıyor. Bu sorun göz ardı edilmeli mi?
Darrel Hoffman

8
Evet @DarrelHoffman, hadi gerçekten güçlü olduğunuzu farzedelim ve havuzu daha fazla kullanmadan yana yatırın.
Nick

Yanıtlar:


6

JavaScript ES6, 100 78 82 81 74 bayt

4 baytlık golf için yardımcı olan @UndefinedFunction sayesinde

(a,z,d,f=([a,g,k,p])=>g*k*(a[6]?p/-~!a[8]:3.14*g))=>Math.ceil(f(a)/f(z))*d

Kullanımı:

t(["triangle",10,12.25,3],["circle",5,2.2],5);

Aksine .5*v, yapamaz v/2mısın?
Alex

@AlexA. oh evet ... bunu tamamen unuttum
Downgoat

@vihan Havuz hacmi, kaptaki hacminin tam katı gibi, ne olur t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? Anladım 10ama cevap olmamalı 5mı? EDIT: edc65 tarafından dayak, aynı sorun.
jrich

Benim çözüm bir göz atın, ben bunu size çok benzer çünkü gönderemiyorum ...f=(p,c,s,v=([s,a,b,c])=>s<'r'?a*a*b*3.14:a*b*c/(s<'t'?1:2))=>Math.ceil(v(p)/v(c))*s
edc65

@ edc65 Sanırım bunun şimdi çalışması gerekiyor. -~ondalık sayılarla ilgili sorunlar vardı ve fazladan bir adımın yuvarlanmasıyla sonuçlanacaktır. Eklemek zorundaydım a<'t'?1:2çünkü (1+(a>'t'))bir sebepten dolayı çalışmıyor.
Downgoat

5

CJam, 46 bayt

{rc:Xr~r~@'c={\_**3.14*}{r~**X't=)/}?}2*/m]r~*

Açıklama:

{                                    }2*       e# Repeat two times:
 rc:X                                          e#   Read a token, take first char, assign to X
     r~r~                                      e#   Read and eval two tokens
         @'c={         }            ?          e#   If the char was 'c':
              \_*                              e#     Square the first token (radius)
                 *                             e#     Multiply by the second one (height)
                  3.14*                        e#     Multiply by 3.14
                        {          }           e#   Else:
                         r~                    e#     Read and eval a token
                           **                  e#     Multiply the three together
                             X't=)/            e#     Divide by 2 if X == 't'
                                               e# Now the two volumes are on the stack
                                        /m]    e# ceil(pool_volume / cup_volume)
                                           r~* e# Read and evaluate token (time) and multiply

Çevrimiçi deneyin .


3

Python 3, 340304 bayt

def l(Y,Z):r=Z[1]*3.14*(Z[0]**2)if Y[0]in'c'else Z[0]*Z[1]*Z[2];return r/2 if Y[0]is't'else r
def q(i):import re,math;M,L,F,C=map,list,float,math.ceil;p,d,c,g,s=re.match("(\w)\s([\d .]+)\s(\w)\s([\d .]+)\s([\d.]+)",i).groups();k=lambda j:L(M(F,j.split(' ')));d,g=k(d),k(g);return C(C(l(p,d)/l(c,g))*F(s))

Kullanımı:

q(i)

iBilgi dizisi nerede .

Örnekler:

  • q("t 10 12.25 3 c 5 2.2 5")
  • q("t 5 87.3 20001 r 5.14 2 105.623 0.2")

Not: Şekillerin adları sırasıyla ilk harflerine kısaltılmıştır.


"0,5" yerine "0,5" yerine bir bayt kaydedebilirsiniz.
Patates Domates

"(Z [0] ** 2)" içindeki parantezler gereksizdir. "(Z [0] ** 2)" yerine "Z [0] ** 2" kullanılması, işlevin sonuçlarını etkilemeden 2 karakter kaydetmelidir. Kaldırılabilir Ayrıca, "/ 2 ise" boşluk (E [0] ..., dönüş r" den / 2), tek bir karakter tasarruf sağlar.
Potatomato

Bunu denedim ve sonuçları etkiledi. Patomatoma
Zach Gates

Önerdiğim değişiklikler iyi çalışıyor gibi görünüyor ( repl.it/BBNh/1 aynı değerlerin döndürüldüğünü gösterir).
Patates Domates

3

Javascript (ES6), 91

Şekiller için dize, boyutlar için sayı dizileri ve hız için tek bir sayı olarak girdi alma:

(a,b,c,d,e)=>(1+(v=(y,x)=>x[0]*x[1]*(y[6]?x[2]/(y[8]?1:2):x[0]*3.14))(a,b)/v(c,d)-1e-9|0)*e

Bu anonim bir işlevi tanımlar, bu yüzden g=önce add kullanmak için. Sonra şöyle denebiliralert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

Açıklama:

(a,b,c,d,e)=>    //define function
                   //a = pool shape, b = pool dimensions
                   //c = cup shape, d = cup dimensions
                   //e = speed

( 1+     //part of the rounding up below

  (v=(y,x)=>       //define volume function

      x[0] * x[1] *     //multiply first 2 values of dimension by:

          (y[6] ?
               x[2] /     //if rectangle or triangle, the 3rd dimension
                   (y[8] ? 1 : 2)     //but if triangle divide by 2
                :
               x[0] * 3.14     //or if circle the radius * pi
          )    //(implicit return)

  )(a,b) / v(c,d)     //call the volume function for the pool/cup, and divide

         -1e-9 |0    //but round up the result

) * e     //and multiply by e
//(implicit return)



Orijinal çözümüm tek bir dizge aldı ve 111 bayt uzunluğundaydı:

s=>(1+(v=x=>s[i++]*s[i++]*(s[x][6]?s[i++]/(s[x][8]?1:2):s[i-2]*3.14))((i=1)-1,s=s.split` `)/v(i++)-1e-9|0)*s[i]

Bu aynı zamanda anonim bir işlevi tanımlar, bu yüzden f=önce add kullanmak için. Sonra şöyle denebiliralert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))


3

K5 (ok), 123 bayt

v:{((({y*3.14*x*x};{z*(x*y)%2};{x*y*z})@"ctr"?s)..:'t#1_x;(1+t:2+~"c"=s:**x)_x)};f:{{(.**|r)*_(~w=_w)+w:x%*r:v y}.v[" "\x]}

3

Julia, 122 116 95 89 79 bayt

f(p,P,c,C,s)=(V(a,x)=prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1);ceil(V(p,P)/V(c,C))*s)

Bu, şekil adlarının yalnızca ilk harfinin verileceğini varsayar. Aksi takdirde, çözüm 6 bayt daha uzundur.

Ungolfed + açıklaması:

function f(p::Char, P::Array, c::Char, C::Array, s)
    # p - Pool shape (first character only)
    # P - Pool dimensions
    # c - Cup shape (first character only)
    # C - Cup dimensions
    # s - Speed

    # Define a function to compute volume
    function V(a::Char, x::Array)
        prod(x) * (a < 'd' ? 3.14x[1] : a > 's' ? 0.5 : 1)
    end

    # Return the ceiling of the number of cups in the pool
    # times the number of seconds per cup
    ceil(V(p, P) / V(c, C)) * s
end

Edc65 sayesinde 21 bayt ve UndefinedFunction sayesinde 10 bayt!


Tamsayı sonucu ile ilgili tüm kontrolü kesmek ceilyerine kullanmak için Julia'da bir tane yok floormu?
edc65

@ edc65 Bunu nasıl görmedim ?! Teşekkürler, bu 21 bayt kurtardı!
Alex

O değiştirmek mümkün olabilir mi a>'s'?prod(x)/2:prod(x)sahip prod(x)/(a>'s'?2:1)? (muhtemelen parantez olmadan, elimde bir juilia ide yok ve bunu test
edemedim

Veya potansiyel olarak bile değiştirilmesi a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)ile prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)? (Tekrar, denenmemiş)
jrich

@UndefinedFunction Evet, işe yarıyor! Teşekkürler, bu 10 bayt tıraş!
Alex

3

F #, 217 186 184 160 bayt

Kahretsin girintisi gereksinimleri!

let e(p,P,c,C,s)=
 let V(s:string)d=
  match(s.[0],d)with
  |('c',[x;y])->3.14*x*x*y
  |('t',[x;y;z])->((x*y)/2.)*z
  |('r',[x;y;z])->x*y*z
 ceil(V p P/V c C)*s

Kullanımı:

e("triangle",[5.;87.3;20001.],"rectangle",[5.14;2.;105.623],0.2);;

Güncelleme

Alex'e, F #'ın desteklediği göründüğü tek boşluk girintisine dikkat çektiği için teşekkürler

Dan değiştirerek daha kapalı bir yük vurmak için Yönetilen arrayiçin listde türleri matchaçıklamada


1
Girinti için tek bir boşluk veya sekme kullanabiliyorsanız, bunu 186 bayta düşürebilirsiniz. Ama şu an sahip olduğunuz şey aslında 211 değil, 211.
Alex A.

@ AlexA.Tek bir alan çalışıyor, güncelleyeceğim - teşekkürler! Neden 211 değil, 217, not defterine koyduğumda, 217 karakter olarak gösteriliyor ve bir dosyaya kaydedilmesi de
217'yi

Bu kullanışlı aracı kullanarak bayt sayıyordum . Windows tutarsızlığı açıklayabilmesi için iki baytlık satır sonları kullanır.
Alex

@AlexA. Ahh, teşekkürler, bu mantıklı! Bu sürüm 180 olmalı sanırım.
Psytronic

x**2.Yapabileceğinizden ziyade x*x? Bu 2 bayt tasarruf.
Alex

2

Python 2.7 306 Bayt

import math as z,re
t,m,r,w=float,map,reduce,[e.split() for e in re.split(' (?=[a-z])| (?=\d+(?:\.\d+)?$)',raw_input())]
def f(S,D):i=r(lambda x,y:x*y,D);return((i,i*.5)[S[0]=='t'],3.14*i*D[0])[S[0]=="c"]
print z.ceil(r(lambda x,y:x/y,m(lambda q:f(q[0],q[1:]),m(lambda x:[x[0]]+m(t,x[1:]),w[:-1]))))*t(*w[-1])

Stdin'den girdi alır.
Test etme

$ python pool.py
triangle 10 12.25 3 circle 5 2.2 5
10.0
$ python pool.py
triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
804.2

2

Python 2, 222 146 139 119 103 93 bayt

Oldukça basit uygulama. Her durumda çalışması gereken-(-n//1) tavan hilesi için Sp3000'e teşekkürler (yani henüz bir sorun bulamadı).

u=lambda q,k,l,m=1:k*l*[3.14*k,m][q>'c']*-~(q<'t')/2.
f=lambda a,b,c,d,s:-u(a,*c)//u(b,*d)*-s

Giriş şu şekilde biçimlendirilmelidir:

f(shape1, shape2, dimensions1, dimensions2, speed)
"Where shape1 and shape2 are one of 'c','r','t', dimensions1 is a list of the dimensions
 of the first shape, dimensions 2 is a list of the dimensions for the second shape, and
 speed is the speed of emptying in seconds."

Kullanımı:

>>> f('t', 'r', [5, 87.3, 20001], [5.14, 2, 105.623], 0.2)
804.2
>>> f('t', 'c', [10, 12.25, 3], [5, 2.2], 5)
10.0

Ungolfed:

import math

def volume(shape, dimensions):
    out = dimensions[0] * dimensions[1]
    if shape == 'c':
        out *= 3.14 * dimensions[0]
    else:
        out *= dimensions[2]
    if shape == 't':
        out /= 2.0
    return out

def do(shape1, shape2, dimensions1, dimensions2, speed):
    volume1 = volume(shape1, dimensions1)
    volume2 = volume(shape2, dimensions2)
    return math.ceil(volume1 / volume2) * speed

Orijinal çözüm, 222 bayt

Bu, kurallar hala bir harf yerine tüm kelimeyi girmeniz gerektiğinde yapıldı. hash(s)%5Onları eşleyen gerçeği kullandım circle -> 2, triangle -> 3, rectangle -> 1, ancak girdi olarak sadece bir harf alırsam, bu kadar kısaltabilirim.

from math import*
u=lambda p,q:[[p[0]*p[1]*p[-1],3.14*p[0]**2*p[1]][1<q<3],0.5*p[0]*p[1]*p[-1]][q>2]
def f(*l):k=hash(l[0])%5;d=4-(1<k<3);v=l[1:d];r=hash(l[d])%5;g=4-(1<r<3);h=l[1+d:d+g];s=l[-1];print ceil(u(v,k)/u(h,r))*s

Kullanımı:

>>> f('triangle',10,12.25,3,'circle',5,2.2,5)
10.0
>>> f('triangle',5,87.3,20001,'rectangle',5.14,2,105.623,0.2)
804.2

Hile yapmak istiyorsanız ..;)
Cyphase

@Cyphase Nasıl hile yapıyor? Yaptığım tek şey girişi yeniden düzenlemekti, bu da burada birçok insanın yaptığı ile aynı ..
Kade

(Oh hey, sen olduğunu görmedim.) Sadece şaka yapıyordum :). Ben de özelleştirilmiş girdi ile deneyeceğim.
Cyphase

1

Python 2/3, 252249 bayt

import re,math;i=[float(x)if re.match('[\d.]+',x)else x for x in re.sys.stdin.readline().split()]
for o in[0,[4,3][i[0]<'d']]:
 w=i[o+1]*i[o+2]*i[o+3]
 if i[o]<'d':w*=3.14*i[o+1]/i[o+3]
 if i[o]>'s':w*=.5
 a=a/w if o else w
print(math.ceil(a)*i[-1])

Kullanım örnekleri:

$ echo 'triangle 10 12.25 3 circle 5 2.2 5' | python stack_codegolf_54454.py
10.0
$ echo 'triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2' | python stack_codegolf_54454.py
804.2

Yalnızca Python 2 ve yalnızca Python 3 sürümleri yalnızca girdi alma yöntemlerinden farklıdır; raw_input()Python 2 ve input()Python 3 re.sys.stdin.readline()için, Python2 / 3 sürümünün aksine .

Piton 2, 240 237 bayt

import re,math;i=[float(x)if re.match('[\d.]+',x)else x for x in raw_input().split()]
for o in[0,[4,3][i[0]<'d']]:
 w=i[o+1]*i[o+2]*i[o+3]
 if i[o]<'d':w*=3.14*i[o+1]/i[o+3]
 if i[o]>'s':w*=.5
 a=a/w if o else w
print(math.ceil(a)*i[-1])

Python 3, 236 233 bayt

import re,math;i=[float(x)if re.match('[\d.]+',x)else x for x in input().split()]
for o in[0,[4,3][i[0]<'d']]:
 w=i[o+1]*i[o+2]*i[o+3]
 if i[o]<'d':w*=3.14*i[o+1]/i[o+3]
 if i[o]>'s':w*=.5
 a=a/w if o else w
print(math.ceil(a)*i[-1])

değişiklikler:

Değişti for o in[0,3if i[0]<'d'else 4]:için for o in[0,[4,3][i[0]<'d']]:. İlham için Vioz'a teşekkürler :).


Hayır, bekle, boş ver. Bu işe yaramaz, çünkü for döngüsü bitti [0, 3 if i[0] < 'd' else 4]. Geç oldu (erken mi?): S.
Cyphase

Oh, kaçırdım: P Nevermind.
Kade

Ama bu tekniği foraçıklamada kullanabilirim :).
Cyphase

1

Pyth - 40 39 36 35 34 bayt

Her iki kapsayıcı üzerinde eşleştirme ve daha sonra bölme ile azaltma gibi basit bir yöntem kullanır.

*h/Fmc*Ftd@,/JChd58c.318@d1Jc2PQeQ

Giriş virgül gibi her şekli ilk harfi ile standart girdiden ayrılmış alır: "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Test Takımı .


Bu çok kısa! Harika iş! :)
Nick
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.