Videz une piscine. . . Avec seulement une Red Solo Cup

14

Vous avez une piscine remplie à ras bord d'eau. Vous devez le vider, mais vous ne pouvez pas penser à une méthode efficace. Vous décidez donc d'utiliser votre tasse solo rouge. Vous remplissez la tasse à plusieurs reprises et la jetez à l'extérieur de la piscine.

Défi

Combien de temps faut-il pour vider la piscine?

Contribution

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

  • shape of poolsera l'une de ces chaînes: circle, triangleou rectangle. Notez que ceux-ci se réfèrent en fait aux formes tridimensionnelles: cylindre, prisme triangulaire et prisme rectangulaire.
  • dimensions sera différent selon la forme.
    • cercle: [radius] [height]. Volume = π r 2 h
    • triangle: [base] [height] [length]. Volume = 1/2 (bh) * longueur
    • rectangle: [width] [length] [height]Volume = lwh
  • shape of cupet dimensionstravailler de la même manière. La coupe peut également être un cercle, un triangle ou un rectangle.
  • speedest le temps qu'il faut pour vider une tasse pleine d'eau en quelques secondes .

Production

Le nombre de secondes qu'il faut pour vider la piscine. Cela peut être arrondi à la seconde près.

Remarques

  • Il n'y aura pas d'unités dans l'entrée. Toutes les unités de distance sont supposées être les mêmes (une forme n'aura pas une hauteur en pouces et une largeur en pieds).
  • Utilisez 3.14 pour pi.
  • L'entrée sera composée de chaînes et de nombres à virgule flottante.
  • Il ne pleuvra jamais. Aucune eau ne sera jamais ajoutée.
  • Vous avez une main très stable. Vous remplirez la tasse exactement à ras bord à chaque fois et vous n'en renverserez jamais.
  • Une fois que vous approchez de la fin, il sera difficile de ramasser une tasse pleine d'eau. Vous n'avez pas à vous en préoccuper. Vous êtes très fort, vous pouvez donc incliner la piscine sur le côté (sans utiliser plus de temps).
  • Chaque fois que vous effectuez un calcul, vous pouvez arrondir au centième près . Votre réponse finale n'aura pas besoin d'être exacte.

Cas de test

Entrée: triangle 10 12.25 3 circle 5 2.2 5
Sortie: 10
Même s'il reste moins de 172,7 sur le dernier scoop, il faut tout de même cinq secondes pour le vider.

Entrée: triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
Sortie:804.2

  • Vous devez arrondir au centième près après chaque calcul.
  • Le calcul final est arrondi de 804.05567 à 804.2. En effet, ce dernier peu d'eau doit être vidé.

Règles

  • Vous pouvez écrire un programme ou une fonction complète.
  • L'entrée doit être prise à partir de paramètres stdin ou de fonction. La sortie doit être imprimée via stdout ou renvoyée.
  • Le format d'entrée peut être réorganisé, tant que vous le spécifiez dans la soumission. Vous pouvez également raccourcir les chaînes "cercle", "triangle" et "rectangle".
  • Les bibliothèques et les fonctions intégrées qui impliquent un volume ou une zone ne sont pas autorisées.

Notation

C'est du . La soumission avec le moins d'octets gagne.

Nick B.
la source
3
Vous auriez des problèmes à la fin, une fois que le niveau d'eau au fond de la piscine était inférieur à la hauteur de la tasse. À ce stade, il deviendrait de plus en plus difficile d'obtenir une tasse pleine. Faut-il ignorer ce problème?
Darrel Hoffman
8
Oui @DarrelHoffman, supposons que vous êtes vraiment fort et que vous pouvez incliner la piscine sur le côté (sans utiliser plus de temps).
Nick B.

Réponses:

6

JavaScript ES6, 100 78 82 81 74 octets

Merci à @UndefinedFunction pour avoir aidé le golf sur 4 octets

(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

Usage:

t(["triangle",10,12.25,3],["circle",5,2.2],5);
Downgoat
la source
Plutôt que .5*vtu ne pourrais pas faire v/2?
Alex A.
@AlexA. oh ouais ... complètement oublié
Downgoat
@vihan Que se passe-t-il si le volume de la piscine est un multiple exact du volume de la tasse, comme dans t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? J'obtiens 10mais la réponse ne devrait-elle pas être 5? EDIT: juste battu par edc65, même problème.
jrich
Jetez un œil à ma solution, je ne peux pas la poster car elle est bien trop similaire à la vôtre ...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 Je pense que cela devrait fonctionner maintenant. -~avait des problèmes avec les nombres décimaux et entraînerait l'arrondi d'une étape supplémentaire. J'ai dû ajouter a<'t'?1:2car (1+(a>'t'))cela ne fonctionne pas pour une raison quelconque.
Downgoat
5

CJam, 46 octets

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

Explication:

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

Essayez-le en ligne .

Andrea Biondo
la source
3

Python 3, 340 304 octets

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

Usage:

q(i)

iest la chaîne d'informations.

Exemples:

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

Remarque: Les noms des formes ont été raccourcis respectivement dans leurs premières lettres.

Portes Zach
la source
Vous pouvez enregistrer un octet en remplaçant "0,5" par "0,5".
Potatomato
Les parenthèses entre "(Z [0] ** 2)" sont inutiles. Le remplacement de "(Z [0] ** 2)" par "Z [0] ** 2" devrait enregistrer 2 caractères sans affecter les résultats de la fonction. De plus, l'espace dans "/ 2 si" (de "return r / 2 if Y [0] ...) peut être supprimé, en économisant un caractère.
Potatomato
J'ai essayé cela et cela a affecté les résultats. @Potatomato
Zach Gates
Les changements que j'ai proposés semblent bien fonctionner ( repl.it/BBNh/1 montre que les mêmes valeurs sont retournées).
Potatomato
3

Javascript (ES6), 91

Prendre l'entrée sous forme de chaînes pour les formes, de tableaux de nombres pour les dimensions et d'un nombre unique pour la vitesse:

(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

Cela définit une fonction anonyme, donc utilisez add g=avant. Ensuite, il peut être appelé commealert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

Explication:

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



Ma solution d'origine prenait une seule chaîne et mesurait 111 octets:

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]

Cela définit également une fonction anonyme, donc utilisez add f=avant. Ensuite, il peut être appelé commealert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))

jrich
la source
3

K5 (oK), 123 octets

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
la source
3

Julia, 122 116 95 89 79 octets

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)

Cela suppose que seule la première lettre des noms de forme sera donnée. Sinon, la solution est plus longue de 6 octets.

Non golfé + explication:

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

Enregistré 21 octets grâce à edc65 et 10 grâce à UndefinedFunction!

Alex A.
la source
N'avez-vous pas un ceildans Julia, à utiliser au lieu de floor, couper tout le contrôle sur le résultat entier?
edc65
@ edc65 Comment n'ai-je pas vu ça?! Merci, cela a sauvé 21 octets!
Alex A.
Serait-il possible de remplacer a>'s'?prod(x)/2:prod(x)par prod(x)/(a>'s'?2:1)? (peut-être même sans les parenthèses, je n'ai pas d'idée de juilia sous la main et je n'ai pas pu tester cela)
jrich
Ou peut-être même remplacer a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)par prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)? (Encore une fois, non testé)
jrich
@UndefinedFunction Yep, ça marche! Merci, cela a rasé 10 octets!
Alex A.
3

F #, 217 186 184 160 160 octets

Foutues exigences d'indentation!

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

Usage:

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

Mise à jour

Merci à Alex d'avoir remarqué l'indentation d'un seul espace, que F # semble prendre en charge

Géré pour réduire la charge en changeant de arrayen listtypes dans l' matchinstruction

Psytronique
la source
1
Si vous pouvez utiliser un seul espace ou une seule tabulation pour l'indentation, vous pouvez le réduire à 186 octets. Mais ce que vous avez maintenant est en réalité 211, pas 217.
Alex A.
@ AlexA.Un espace unique fonctionne, je vais mettre à jour - merci! Pourquoi est-ce que c'était 211, pas 217, quand je l'ai mis dans le bloc-notes, il s'affiche en tant que 217 caractères, et l'enregistrer dans un fichier affiche 217 aussi (Désolé, premier golf, donc il pourrait être faux de calculer la taille)
Psytronic
Je comptais les octets à l'aide de cet outil pratique . Windows utilise des sauts de ligne sur deux octets, ce qui peut expliquer la différence.
Alex A.
@AlexA. Ahh, merci, ça a du sens! Cette version devrait être 180 alors je suppose.
Psytronic
Plutôt que de le x**2.faire x*x? Cela pourrait économiser 2 octets.
Alex A.
2

Python 2,7 306 octets

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

Prend l'entrée de stdin.
Le tester-

$ 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
la source
2

Python 2, 222 146 139 139 119 103 93 octets

Mise en œuvre assez simple. Merci à Sp3000 pour l' -(-n//1)astuce pour le plafond, qui devrait fonctionner dans tous les cas (c'est-à-dire qui n'a pas encore trouvé de problème).

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

L'entrée doit être formatée comme suit:

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

Usage:

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

Non golfé:

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

Solution d'origine, 222 octets

Cela a été fait lorsque les règles exigeaient toujours que vous entriez le mot entier plutôt qu'une lettre. J'ai utilisé le fait de les hash(s)%5mapper circle -> 2, triangle -> 3, rectangle -> 1, mais si je ne prends qu'une lettre comme entrée, je pense que je peux raccourcir cela.

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

Usage:

>>> 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
la source
Eh bien, si vous voulez tricher ..;)
Cyphase
@Cyphase Comment triche-t-il? Tout ce que j'ai fait, c'est réorganiser l'entrée, ce qui est le même que ce que beaucoup de gens ont fait ici ..
Kade
(Oh hé, je n'ai pas vu que c'était toi.) Je plaisantais :). Je vais également l'essayer avec une entrée personnalisée.
Cyphase
1

Python 2/3, 252 249 octets

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

Exemples d'utilisation:

$ 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

Les versions Python 2 uniquement et Python 3 uniquement ne sont différentes que dans la façon dont elles reçoivent les entrées; raw_input()pour Python 2 et input()pour Python 3, par opposition à re.sys.stdin.readline()pour la version Python2 / 3.

Python 2, 240 237 octets

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 octets

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

Changements:

Changé for o in[0,3if i[0]<'d'else 4]:en for o in[0,[4,3][i[0]<'d']]:. Merci à Vioz pour l'inspiration :).

Cyphase
la source
Non, attendez, tant pis. Cela ne fonctionnera pas, car la boucle for est terminée [0, 3 if i[0] < 'd' else 4]. Il est tard (tôt?): P.
Cyphase
Oh, je l'ai raté: P Nevermind.
Kade
Mais je peux utiliser cette technique dans la fordéclaration :).
Cyphase du
1

Pyth - 40 39 36 35 34 octets

Utilise une méthode simple, mappant sur les deux conteneurs, puis réduisant par division.

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

Prend virgule entrée séparée de l' entrée standard, avec la première lettre de chaque forme comme: "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Suite de tests .

Maltysen
la source
C'est tellement court! Super boulot! :)
Nick B.