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.


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

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 .


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)

Où 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.


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


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

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!


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


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

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

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


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 .


C'est tellement court! Super boulot! :)
— Nick B.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.