清空一个游泳池。。。只带一个红色独奏杯


14

您有一个充满水的游泳池。您需要清空它,但您无法想到一种有效的方法。因此,您决定使用红色的独奏杯。您将一路重复装满杯子并将其倾倒在游泳池外。

挑战

清空游泳池需要多长时间?

输入值

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

  • shape of pool将这些字符串之一:circletrianglerectangle。请注意,这些实际上是指3维形状:圆柱,三角形棱柱和矩形棱柱。
  • dimensions 会因形状而异。
    • 圈子:[radius] [height]。体积=πr 2 h
    • 三角形:[base] [height] [length]。体积= 1/2(bh)*长度
    • 矩形:[width] [length] [height]体积= lwh
  • shape of cupdimensions以相同的方式工作。杯子也可以是圆形,三角形或矩形。
  • speed几秒钟内倒空一杯水所需的时间

输出量

清空游泳池所需的秒数。可以四舍五入到最接近的秒数。

笔记

  • 输入中将没有单位。假定所有距离单位都相同(形状不会以英寸为单位的高度和以英尺为单位的宽度)。
  • 将3.14用于pi
  • 输入将由字符串和浮点数组成。
  • 永远不会下雨。永远不会添加水。
  • 您的手非常稳固。每次您都将杯子完全塞满边缘,而且绝对不会溢出。
  • 一旦接近尾声,将很难捞出一整杯水。您无需为此担心。您非常强壮,因此您可以将游泳池倾斜到其一侧(无需花费更多时间)。
  • 每次进行计算时,都可以四舍五入到最接近的百分之一。您的最终答案将不一定是准确的。

测试用例

输入:triangle 10 12.25 3 circle 5 2.2 5
输出:10
即使最后一个瓢还不到172.7,仍然需要整整五秒钟将其清空。

输入:triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
输出:804.2

  • 每次计算后,应四舍五入到最接近的百分之一。
  • 最终的计算四舍五入从804.05567至804.2。这是因为必须倒掉最后一点水。

规则

  • 您可以编写完整的程序或功能。
  • 输入应从标准输入或函数参数中获取。输出应通过标准输出打印或返回。
  • 只要您在提交中指定输入格式,就可以重新排列输入格式。您还可以缩短字符串“圆形”,“三角形”和“矩形”。
  • 不允许涉及体积或面积的库和内置函数。

计分

这是。提交的字节数最少者获胜。


3
一旦池底的水位低于杯子的高度,您最终就会遇到问题。到那时,获得一整杯咖啡的难度会越来越大。应该忽略这个问题吗?
Darrel Hoffman

8
是的,@ DarrelHoffman,让我们假装你真的很强壮,可以将游泳池倾斜到它的侧面(不用花更多的时间)。
尼克B.

Answers:


6

的JavaScript ES6,100个 78 82 81 74字节

感谢@UndefinedFunction帮助打高尔夫球4个字节

(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

用法:

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

而不是.5*v,你不能v/2吗?
Alex A.

@AlexA。哦,是的...完全忘记了这一点
Downgoat 2015年

@vihan如果池体积是杯子体积的精确倍数,会发生什么t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)?我明白了,10但答案不应该5吗?编辑:刚刚被edc65打败,同样的问题。
jrich 2015年

看看我的解决方案,我无法发布,因为它与您的解决方案太相似...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我认为现在应该可以使用。-~十进制数字有问题,将导致四舍五入。我必须添加,a<'t'?1:2因为(1+(a>'t'))某些原因无法正常工作。
Downgoat,2015年

5

CJam,46个字节

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

说明:

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

在线尝试


3

Python 3中,340个 304字节

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

用法:

q(i)

i信息串在哪里。

例子:

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

注意:形状的名称分别缩短为首字母。


通过将“ 0.5”替换为“ .5”,可以节省一个字节。
Potatomato

“(Z [0] ** 2)”中的括号是不必要的。用“ Z [0] ** 2”替换“(Z [0] ** 2)”应保存2个字符,而不会影响函数的结果。此外,可以删除“ / 2 if”中的空格(从“如果Y [0]则返回r / 2 ...”中删除),从而节省一个字符
。– Potatomato

我已经尝试过了,它影响了结果。@Potatomato
Zach Gates

我建议的更改似乎工作正常(repl.it/BBNh/1显示返回相同的值)。
Potatomato

3

Javascript(ES6),91

将输入作为形状的字符串,将尺寸作为数字数组,将速度作为单个数字:

(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

这定义了一个匿名函数,因此要g=在其之前使用add 。然后,它可以像alert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

说明:

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



我最初的解决方案采用了一个字符串,长度111个字节:

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]

这也定义了一个匿名函数,因此要f=在其之前使用add 。然后,它可以像alert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))


3

K5(oK),123字节

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

朱莉娅122 116 95 89 79字节

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)

假设仅给出形状名称的第一个字母。否则,解决方案要长6个字节。

取消+说明:

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节省了21个字节,而由于UndefinedFunction节省了10个字节!


您是否没有ceil在Julia中使用来代替floor,而将所有关于整数结果的检查都删掉了?
edc65

@ edc65我怎么没看到那个?谢谢,节省了21个字节!
Alex A.

是否可以替换a>'s'?prod(x)/2:prod(x)prod(x)/(a>'s'?2:1)?(即使没有括号,我手头也没有朱莉娅的想法,也无法对此进行测试)
jrich,2015年

甚至可能替换a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)?(再次未经测试)
jrich,2015年

@UndefinedFunction是的,行得通!谢谢,减少了10个字节!
Alex A.

3

F#,217个 186 184 160字节

该死的压痕要求!

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

用法:

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

更新资料

感谢Alex对F#似乎支持的单空格缩进的评论

通过将语句中的from更改arraylisttype 来设法减轻负载match


1
如果可以使用单个空格或制表符进行缩进,则可以将其减少到186个字节。但是,你现在有什么是真正的211,而不是217
亚历A.

@AlexA。一个空格有效,我会更新-谢谢!为什么是/是211,而不是217,当我将其放在记事本中时,它显示为217个字符,并将其保存到文件中也显示为217个字符(对不起,第一次打高尔夫球,所以在计算尺寸时可能会出错)
Psytronic

我使用这个方便的工具来计数字节。Windows使用两个字节的换行符,以便可以解释差异。
Alex A.

@AlexA。啊,谢谢,这很有道理!我猜这个版本应该是180。
Psytronic

而不是x**2.你能做x*x什么?那节省了2个字节。
Alex A.

2

Python 2.7 306字节

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的输入。
测试它

$ 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字节

相当简单的实现。由于SP3000的-(-n//1)伎俩上限,这应该在所有情况下工作(即还没有发现它的问题还没有)。

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

输入应采用以下格式:

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

用法:

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

取消高尔夫:

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

原始解决方案,222字节

当规则仍然需要您输入整个单词而不是字母时,便进行了此操作。我使用了将hash(s)%5它们映射到的事实circle -> 2, triangle -> 3, rectangle -> 1,但是如果我只输入一个字母,我想我可以将其缩短。

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

用法:

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

好吧,如果你想作弊..;)
Cyphase

@Cyphase它是怎么作弊的?我所做的只是重新排列输入,这是一样的东西,很多人在这里做..
卡德

(哦,嘿,没看到是你。)我只是在开玩笑:)。我还将尝试使用自定义输入。
Cyphase

1

Python 2 / 3,252 249字节

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

用法示例:

$ 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

仅Python 2和仅Python 3版本在输入接收方式上有所不同。 raw_input()适用于Python 2和input()Python 3,而不re.sys.stdin.readline()适用于Python2 / 3版本。

Python 2中,240个 237字节

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

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

变化:

更改for o in[0,3if i[0]<'d'else 4]:for o in[0,[4,3][i[0]<'d']]:。感谢Vioz的启发:)。


不,等等,没关系。因为for循环已经结束,所以那是行不通的[0, 3 if i[0] < 'd' else 4]。(很早):P。
Cyphase

哦,我想念它:P没关系。
卡德2015年

但是我可以在for声明中使用该技术:)。
Cyphase 2015年

1

Pyth- 40 39 36 35 34字节

使用简单的方法,在两个容器上进行映射,然后按除法进行缩小。

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

接受与标准输入(stdin)分开的输入逗号,每个形状的首字母如下:"t", 10, 12.25, 3, "c", 5, 2.2, 5

测试套件


这太短了!好工作!:)
Nick B.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.