Opróżnij basen. . . Tylko z czerwonym pucharem solo

14

Masz basen wypełniony po brzegi wodą. Musisz go opróżnić, ale nie możesz wymyślić skutecznej metody. Więc decydujesz się użyć czerwonego kubka solo. Będziesz kilkakrotnie napełniał kubek do końca i zrzucał go na zewnątrz basenu.

Wyzwanie

Jak długo potrwa opróżnienie basenu?

Wejście

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

  • shape of poolbędzie jednym z tych ciągów: circle, triangle, lub rectangle. Zauważ, że faktycznie odnoszą się one do trójwymiarowych kształtów: cylindra, trójkątnego pryzmatu i prostokątnego pryzmatu.
  • dimensions będą się różnić w zależności od kształtu.
    • koło: [radius] [height]. Objętość = π r 2 godz
    • trójkąt: [base] [height] [length]. Objętość = 1/2 (bh) * długość
    • prostokąt: [width] [length] [height]Objętość = lwh
  • shape of cupi dimensionsdziała w ten sam sposób. Kielich może być również kołem, trójkątem lub prostokątem.
  • speedto czas potrzebny do opróżnienia jednej filiżanki pełnej wody w kilka sekund .

Wynik

Liczba sekund potrzebnych do opróżnienia basenu. Można to zaokrąglić do najbliższej sekundy.

Notatki

  • Na wejściu nie będzie żadnych jednostek. Zakłada się, że wszystkie jednostki odległości są takie same (kształt nie będzie miał wysokości w calach i szerokości w stopach).
  • Użyj 3.14 dla pi.
  • Dane wejściowe będą się składać z ciągów i liczb zmiennoprzecinkowych.
  • Nigdy nie będzie padać. Nigdy nie zostanie dodana woda.
  • Masz bardzo pewną rękę. Za każdym razem napełnisz kubek dokładnie po brzegi i nigdy go nie rozlejesz.
  • Gdy zbliżysz się do końca, trudno będzie zebrać pełną szklankę wody. Nie musisz się o to martwić. Jesteś bardzo silny, więc możesz przechylić basen na bok (nie zużywając więcej czasu).
  • Za każdym razem, gdy wykonujesz obliczenia, możesz zaokrąglić do najbliższej setnej . Twoja ostateczna odpowiedź nie musi być dokładna.

Przypadki testowe

Dane wejściowe: Dane triangle 10 12.25 3 circle 5 2.2 5
wyjściowe: 10
Mimo że na ostatniej miarce pozostało mniej niż 172,7, opróżnienie zajmuje jeszcze całe pięć sekund.

Wejście: triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
Wyjście:804.2

  • Po każdym obliczeniu powinieneś zaokrąglić do najbliższej setnej.
  • Końcowe obliczanie zaokrągla się z 804.05567 do 804.2. To dlatego, że ostatnia odrobina wody musi zostać opróżniona.

Zasady

  • Możesz napisać pełny program lub funkcję.
  • Dane wejściowe należy pobierać z parametrów stdin lub funkcji. Wyjście powinno zostać wydrukowane przez standardowe wyjście lub zwrócone.
  • Format wejściowy można zmienić, pod warunkiem, że określisz go we wniosku. Możesz także skrócić ciągi „koło”, „trójkąt” i „prostokąt”.
  • Biblioteki i wbudowane funkcje obejmujące wolumin lub obszar są niedozwolone.

Punktacja

To jest . Zgłoszenie z najmniejszą liczbą bajtów wygrywa.

Nick B.
źródło
3
Na końcu będziesz mieć problemy, gdy poziom wody w dnie basenu będzie niższy niż wysokość kubka. W tym momencie coraz trudniej byłoby zdobyć pełny puchar. Czy ten problem należy zignorować?
Darrel Hoffman,
8
Tak @DarrelHoffman, udawajmy, że jesteś naprawdę silny i możesz przechylić basen na bok (nie marnując więcej czasu).
Nick B.

Odpowiedzi:

6

JavaScript ES6, 100 78 82 81 74 bajty

Dzięki @UndefinedFunction za pomoc w golfa z 4 bajtów

(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

Stosowanie:

t(["triangle",10,12.25,3],["circle",5,2.2],5);
Downgoat
źródło
Zamiast .5*vtego nie mógłbyś tego zrobić v/2?
Alex A.,
@AlexA. o tak ... zupełnie o tym zapomniałem
Downgoat
@vihan Co się stanie, jeśli objętość puli jest dokładną wielokrotnością objętości kubka, np. w t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? Rozumiem, 10ale czy nie powinna być odpowiedź 5? EDYCJA: właśnie pobity przez edc65, ten sam problem.
jrich
Spójrz na moje rozwiązanie, nie mogę go opublikować, ponieważ jest zbyt podobne do twojego ...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 Myślę, że to powinno działać teraz. -~miał problemy z liczbami dziesiętnymi i spowodowałby zaokrąglenie w górę dodatkowego kroku. Musiałem dodać, a<'t'?1:2ponieważ (1+(a>'t'))z jakiegoś powodu nie działa.
Downgoat,
5

CJam, 46 bajtów

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

Wyjaśnienie:

{                                    }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

Wypróbuj online .

Andrea Biondo
źródło
3

Python 3, 340 304 bajtów

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))

Stosowanie:

q(i)

Gdzie ijest ciąg informacji.

Przykłady:

  • 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")

Uwaga: Nazwy kształtów zostały odpowiednio skrócone do ich pierwszych liter.

Zach Gates
źródło
Możesz zapisać jeden bajt, zastępując „0,5” słowem „.5”.
Potatomato
Nawiasy w „(Z [0] ** 2)” są niepotrzebne. Zastąpienie „(Z [0] ** 2)” przez „Z [0] ** 2” powinno zapisać 2 znaki bez wpływu na wyniki funkcji. Dodatkowo spację w „/ 2 if” (z „return r / 2 if Y [0] ...)” można usunąć, zapisując jedną postać.
Potatomato
Próbowałem tego i to wpłynęło na wyniki. @Potatomato
Zach Gates
Zmiany, które zaproponowałem, wydają się działać dobrze ( repl.it/BBNh/1 pokazuje, że zwracane są te same wartości).
Potatomato
3

JavaScript (ES6), 91

Przyjmowanie danych wejściowych jako ciągów kształtów, tablic liczb dla wymiarów i pojedynczej liczby dla prędkości:

(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

Definiuje to funkcję anonimową, więc g=przed dodaniem należy użyć add . Następnie można go nazwać jakalert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

Wyjaśnienie:

(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)



Moje oryginalne rozwiązanie zajęło jeden ciąg i miało długość 111 bajtów:

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]

Definiuje to także funkcję anonimową, więc f=przed dodaniem należy użyć add . Następnie można go nazwać jakalert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))

jrich
źródło
3

K5 (oK), 123 bajty

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]}
kirbyfan64sos
źródło
3

Julia, 122 116 95 89 79 bajtów

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)

Zakłada się, że podana zostanie tylko pierwsza litera nazw kształtów. W przeciwnym razie rozwiązanie jest o 6 bajtów dłuższe.

Niegolfowane + wyjaśnienie:

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

Zaoszczędzono 21 bajtów dzięki edc65 i 10 dzięki UndefinedFunction!

Alex A.
źródło
Czy nie masz ceilw Julii, aby użyć zamiast floorwycinać wszystkie informacje o wyniku liczby całkowitej?
edc65,
@ edc65 Jak tego nie widziałem ?! Dzięki, zaoszczędziłeś 21 bajtów!
Alex A.,
Byłoby możliwe do zastąpienia a>'s'?prod(x)/2:prod(x)z prod(x)/(a>'s'?2:1)? (być może nawet bez nawiasów nie mam pod ręką ideu juili i nie byłem w stanie tego przetestować)
jrich
Lub potencjalnie nawet zastąpienie a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)ze prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)? (Ponownie, niesprawdzone)
jrich
@UndefinedFunction Tak, to działa! Dzięki, że zgoliłem 10 bajtów!
Alex A.,
3

F #, 217 186 184 160 bajtów

Cholerne wymagania dotyczące wcięć!

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

Stosowanie:

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

Aktualizacja

Dzięki Alex za uwagę na wcięcie pojedynczej przestrzeni, które F # wydaje się wspierać

Udało się zwalić ładunek bardziej, zmieniając z arrayna listtypy w matchinstrukcji

Psytronic
źródło
1
Jeśli możesz użyć pojedynczej spacji lub tabulacji do wcięcia, możesz sprowadzić ją do 186 bajtów. Ale teraz masz 211, a nie 217.
Alex A.
@ AlexA. Pojedyncza przestrzeń działa, zaktualizuję - dzięki! Dlaczego jest / było 211, a nie 217, kiedy wkładam go do notatnika, pokazuje się go jako 217 znaków, a zapisanie go do pliku pokazuje również 217 (Przepraszam, pierwszy golf, więc może być źle, jak obliczyć rozmiar)
Psytronic
Liczę bajty za pomocą tego poręcznego narzędzia . System Windows używa dwubajtowych podziałów linii, co może wyjaśniać rozbieżność.
Alex A.,
@AlexA. Ach, dzięki, to ma sens! Ta wersja powinna mieć 180, to chyba.
Psytronic,
Zamiast x**2.tego możesz x*x? To mogłoby zaoszczędzić 2 bajty.
Alex A.,
2

Python 2.7 306 bajtów

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

Pobiera dane wejściowe ze standardowego wejścia.
Testowanie

$ 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
Kamehameha
źródło
2

Python 2, 222 146 139 119 103 93 bajtów

Dość prosta implementacja. Dzięki Sp3000 za -(-n//1)podstęp do sufitu, który powinien działać we wszystkich przypadkach (tj. Nie znalazłem jeszcze z nim problemu).

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

Dane wejściowe powinny być sformatowane w następujący sposób:

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

Stosowanie:

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

Nie golfowany:

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

Oryginalne rozwiązanie, 222 bajty

Stało się tak, gdy reguły wciąż wymagały wprowadzenia całego słowa zamiast litery. Wykorzystałem fakt, że hash(s)%5zmapowałem je circle -> 2, triangle -> 3, rectangle -> 1, ale jeśli wezmę tylko jedną literę jako dane wejściowe, myślę, że mogę to skrócić.

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

Stosowanie:

>>> 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
Kade
źródło
Cóż, jeśli chcesz oszukiwać ..;)
Cyphase
@Cyphase Jak to jest oszukiwanie? Wszystko, co zrobiłem, to zmiana kolejności danych wejściowych, co jest tym samym, co wiele osób tutaj zrobiło ..
Kade
(Och, hej, nie widziałem, że to ty.) Żartowałem :). Spróbuję również z niestandardowymi danymi wejściowymi.
Cyphase,
1

Python 2/3, 252 249 bajtów

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

Przykłady użycia:

$ 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

Wersje tylko Python 2 i tylko Python 3 różnią się tylko sposobem otrzymywania danych wejściowych; raw_input()dla Python 2 i input()Python 3, w przeciwieństwie dore.sys.stdin.readline() wersji Python2 / 3.

Python 2, 240 237 bajtów

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 bajtów

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

Zmiany:

Zmieniono for o in[0,3if i[0]<'d'else 4]:na for o in[0,[4,3][i[0]<'d']]:. Dzięki Vioz za inspirację :).

Cyphase
źródło
Nie, czekaj, nieważne. To nie zadziała, ponieważ pętla for się skończyła [0, 3 if i[0] < 'd' else 4]. Jest późno (wcześnie?): P.
Cyphase,
Och, tęskniłem za tym: P Nevermind.
Kade,
Ale mogę użyć tej techniki w foroświadczeniu :).
Cyphase,
1

Pyth - 40 39 36 35 34 bajtów

Używa prostej metody, mapując oba kontenery, a następnie redukując według podziału.

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

Staje wejście przecinek oddziela się od standardowego wejścia z pierwszej litery każdego kształtu, takich jak: "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Pakiet testowy .

Maltysen
źródło
To jest TAK KRÓTKO! Wspaniała praca! :)
Nick B.