Esvazie uma piscina. . . Com apenas um copo solo vermelho

14

Você tem uma piscina cheia de água. Você precisa esvaziá-lo, mas não consegue pensar em um método eficiente. Então você decide usar seu copo solo vermelho. Você enche repetidamente o copo até o fim e o joga fora da piscina.

Desafio

Quanto tempo leva para esvaziar a piscina?

Entrada

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

  • shape of poolvai ser uma dessas cordas: circle, triangleou rectangle. Observe que na verdade elas se referem às formas tridimensionais: cilindro, prisma triangular e prisma retangular.
  • dimensions será diferente dependendo da forma.
    • círculo: [radius] [height]. Volume = π r 2 h
    • triângulo: [base] [height] [length]. Volume = 1/2 (bh) * comprimento
    • retângulo: [width] [length] [height]Volume = lwh
  • shape of cupe dimensionsfunciona da mesma maneira. O copo também pode ser um círculo, triângulo ou retângulo.
  • speedé a quantidade de tempo que leva para esvaziar um copo cheio de água em segundos .

Resultado

O número de segundos que leva para esvaziar a piscina. Isso pode ser arredondado para o segundo mais próximo.

Notas

  • Não haverá unidades na entrada. Presume-se que todas as unidades de distância sejam iguais (uma forma não terá altura em polegadas e largura em pés).
  • Use 3.14 para pi.
  • A entrada será composta de strings e números de ponto flutuante.
  • Nunca vai chover. Nunca será adicionada água.
  • Você tem uma mão muito firme. Você sempre encherá o copo até a borda e nunca derramará nada.
  • Quando você chegar perto do fim, será difícil colher um copo cheio de água. Você não precisa se preocupar com isso. Você é muito forte e pode inclinar a piscina para o lado (sem gastar mais tempo).
  • Sempre que você faz um cálculo, não há problema em arredondar para o centésimo mais próximo . Sua resposta final não precisará ser exata.

Casos de teste

Entrada: triangle 10 12.25 3 circle 5 2.2 5
Saída: 10
Mesmo que haja menos de 172,7 na última concha, ainda leva cinco segundos para esvaziá-la.

Entrada: triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
Saída:804.2

  • Você deve arredondar para o centésimo mais próximo após cada cálculo.
  • O cálculo final é arredondado de 804.05567 para 804.2. Isso ocorre porque esse último pedacinho de água deve ser esvaziado.

Regras

  • Você pode escrever um programa ou função completo.
  • A entrada deve ser obtida dos parâmetros stdin ou de função. A saída deve ser impressa através de stdout ou retornada.
  • O formato de entrada pode ser reorganizado, desde que você o especifique no envio. Você também pode encurtar as cordas "círculo", "triângulo" e "retângulo".
  • Bibliotecas e funções internas que envolvem volume ou área não são permitidas.

Pontuação

Isso é . Vitórias no envio com o menor número de bytes.

Nick B.
fonte
3
Você teria problemas no final, uma vez que o nível da água no fundo da piscina era inferior à altura do copo. Nesse ponto, seria cada vez mais difícil obter um copo cheio. Esse problema deve ser ignorado?
Darrel Hoffman
8
Sim @DarrelHoffman, vamos fingir que você é realmente forte e pode inclinar a piscina para o lado (sem gastar mais tempo).
Nick B.

Respostas:

6

JavaScript ES6, 100 78 82 81 74 bytes

Obrigado a @UndefinedFunction por ajudar no golfe a 4 bytes

(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

Uso:

t(["triangle",10,12.25,3],["circle",5,2.2],5);
Downgoat
fonte
Em vez de .5*v, você não poderia fazer v/2?
Alex A.
@AlexA. oh sim ... esqueci completamente sobre isso
Downgoat
@vihan O que acontece se o volume da piscina for um múltiplo exato do volume da xícara, como em t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? Eu recebo, 10mas não deveria ser a resposta 5? EDIT: apenas batido por edc65, mesmo problema.
jrich
Dê uma olhada na minha solução, não posso publicá-la porque é muito parecida com a sua ...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 Acho que isso deve funcionar agora. -~teve problemas com os números decimais e resultaria no arredondamento de uma etapa extra. Eu tive que adicionar a<'t'?1:2porque (1+(a>'t'))não funciona por algum motivo.
Downgoat
5

CJam, 46 bytes

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

Explicação:

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

Experimente online .

Andrea Biondo
fonte
3

Python 3, 340 304 bytes

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

Uso:

q(i)

Onde iestá a cadeia de informações.

Exemplos:

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

Nota: Os nomes das formas foram abreviados para as primeiras letras, respectivamente.

Zach Gates
fonte
Você pode salvar um byte, substituindo "0.5" por ".5".
Potatomato 11/08/2015
Os parênteses em "(Z [0] ** 2)" são desnecessários. Substituir "(Z [0] ** 2)" por "Z [0] ** 2" deve salvar 2 caracteres sem afetar os resultados da função. Além disso, o espaço em "/ 2 se" (de "retorno r / 2 se Y [0] ...) pode ser removido, poupando um personagem.
Potatomato
Eu tentei isso e isso afetou os resultados. @Potatomato
Zach Gates
As alterações que propus parecem funcionar bem ( repl.it/BBNh/1 mostra que os mesmos valores são retornados).
Potatomato 11/08/2015
3

Javascript (ES6), 91

Tomando entrada como seqüências de caracteres para as formas, matrizes de números para as dimensões e um único número para a velocidade:

(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

Isso define uma função anônima, portanto, use add g=antes dele. Então, pode ser chamado comoalert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

Explicação:

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



Minha solução original possuía uma única sequência e tinha 111 bytes de comprimento:

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]

Isso também define uma função anônima, portanto, use add f=antes dele. Então, pode ser chamado comoalert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))

jrich
fonte
3

K5 (oK), 123 bytes

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

Julia, 122 116 95 89 79 bytes

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)

Isso pressupõe que apenas a primeira letra dos nomes das formas será fornecida. Caso contrário, a solução é 6 bytes mais longa.

Ungolfed + explicação:

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

Economizou 21 bytes graças ao edc65 e 10 graças ao UndefinedFunction!

Alex A.
fonte
Você não tem um ceilem Julia, para usar em vez de floor, cortando toda a verificação do resultado inteiro?
edc65
@ edc65 Como eu não vi isso ?! Obrigado, isso salvou 21 bytes!
Alex A.
Seria possível substituir a>'s'?prod(x)/2:prod(x)por prod(x)/(a>'s'?2:1)? (possivelmente até mesmo sem os parênteses, eu não tenho um ide juilia na mão, e não ter sido capaz de testar isso)
jrich
Ou potencialmente até substituindo a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)por prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)? (Novamente, não testado)
jrich
@UndefinedFunction Sim, isso funciona! Obrigado, isso reduziu 10 bytes!
Alex A.
3

F #, 217 186 184 160 bytes

Malditos requisitos de indentação!

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

Uso:

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

Atualizar

Agradecimentos a Alex por comentar sobre recuo de espaço único, que o F # parece suportar

Conseguiu interromper um carregamento mais, alterando de arraypara listtipos na matchinstrução

Psytronic
fonte
1
Se você pode usar um único espaço ou guia para recuo, reduza para 186 bytes. Mas o que você tem agora é realmente 211, não 217.
Alex A.
@ AlexA.A espaço único funciona, eu vou atualizar - obrigado! Por que é / foi 211, e não 217, quando eu o coloquei no bloco de notas, está mostrando como 217 caracteres e salvá-lo em um arquivo também mostra 217 (Desculpe, primeiro golfe, por isso pode estar errado em como calcular o tamanho)
Psytronic
Eu estava contando bytes usando esta ferramenta útil . O Windows usa quebras de linha de dois bytes, o que pode explicar a discrepância.
Alex A.
@AlexA. Ahh, obrigado, isso faz sentido! Esta versão deve ser 180, então eu acho.
Psytronic
Em vez de x**2.você pode fazer x*x? Isso deve economizar 2 bytes.
12385 Alex A.
2

Python 2.7 306 bytes

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

Recebe entrada de stdin.
Testando

$ 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
fonte
2

Python 2, 222 146 139 119 103 93 bytes

Implementação bastante direta. Agradecemos ao Sp3000 pelo -(-n//1)truque do teto, que deve funcionar em todos os casos (ou seja, ainda não foi encontrado um problema).

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

A entrada deve ser formatada da seguinte forma:

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

Uso:

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

Solução original, 222 bytes

Isso foi feito quando as regras ainda precisavam que você inserisse a palavra inteira em vez de uma letra. Eu usei o fato de que hash(s)%5eles foram mapeados circle -> 2, triangle -> 3, rectangle -> 1, no entanto, se eu pegar apenas uma letra como entrada, acho que posso diminuir isso.

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

Uso:

>>> 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
fonte
Bem, se você quer enganar ..;)
Cyphase
@Cyphase Como é trapacear? Tudo que fiz foi de entrada reorganizar, que é a mesma coisa que um monte de gente fez aqui ..
Kade
(Oh, ei, não vi que era você.) Eu estava apenas brincando :). Vou tentar com entrada personalizada também.
Cifásica
1

Python 2/3, 252 249 bytes

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

Exemplos de uso:

$ 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

As versões somente do Python 2 e somente do Python 3 são diferentes apenas na maneira como recebem entrada; raw_input()para Python 2 e input()para Python 3, em oposição are.sys.stdin.readline() versão Python2 / 3.

Python 2, 240 237 bytes

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 bytes

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

Alterar:

Alterado for o in[0,3if i[0]<'d'else 4]:para for o in[0,[4,3][i[0]<'d']]:. Obrigado a Vioz pela inspiração :).

Cifase
fonte
Não, espere, não importa. Isso não vai funcionar, já que o loop for acabou [0, 3 if i[0] < 'd' else 4]. É tarde (cedo?): P.
Cyphase #
Ah, eu perdi: P Deixa pra lá.
Kade
Mas eu posso usar essa técnica na fordeclaração :).
Cyphase
1

Pitão - 40 39 36 35 34 bytes

Usa um método simples, mapeando os dois contêineres e depois reduzindo por divisão.

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

Toma vírgula entrada separada da entrada padrão, com a primeira letra de cada forma como: "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Conjunto de Teste .

Maltysen
fonte
Isso é TÃO CURTO! Trabalho incrível! :)
Nick B.