Làm trống một bể bơi. . . Chỉ với một ly Solo đỏ


14

Bạn có một hồ bơi được đổ đầy nước. Bạn cần làm trống nó, nhưng bạn không thể nghĩ ra một phương pháp hiệu quả. Vì vậy, bạn quyết định sử dụng cốc solo màu đỏ của bạn. Bạn sẽ liên tục đổ đầy cốc và đổ nó ra ngoài bể bơi.

Thử thách

Sẽ mất bao lâu để làm trống hồ bơi?

Đầu vào

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

  • shape of poolsẽ là một trong những chuỗi: circle, triangle, hoặc rectangle. Lưu ý rằng những cái này thực sự đề cập đến các hình dạng 3 chiều: hình trụ, hình lăng trụ tam giác và hình lăng trụ hình chữ nhật.
  • dimensions sẽ khác nhau tùy thuộc vào hình dạng.
    • vòng tròn : [radius] [height]. Âm lượng = π r 2 h
    • tam giác : [base] [height] [length]. Âm lượng = 1/2 (bh) * chiều dài
    • hình chữ nhật: [width] [length] [height]Khối lượng = lwh
  • shape of cupdimensionslàm việc theo cách tương tự. Chiếc cốc cũng có thể là hình tròn, hình tam giác hoặc hình chữ nhật.
  • speedlà lượng thời gian cần thiết để đổ một cốc đầy nước trong vài giây .

Đầu ra

Số giây cần thiết để làm trống bể bơi. Điều này có thể được làm tròn đến giây gần nhất.

Ghi chú

  • Sẽ không có đơn vị trong đầu vào. Tất cả các đơn vị khoảng cách được coi là giống nhau (một hình dạng sẽ không có chiều cao tính bằng inch và chiều rộng tính bằng feet).
  • Sử dụng 3.14 cho pi.
  • Đầu vào sẽ được tạo thành từ các chuỗi và số dấu phẩy động.
  • Trời sẽ không bao giờ mưa. Không có nước sẽ được thêm vào.
  • Bạn có một bàn tay rất vững vàng. Bạn sẽ đổ đầy cốc chính xác đến miệng mỗi lần, và bạn sẽ không bao giờ làm đổ bất kỳ.
  • Một khi bạn đã đến gần cuối, sẽ rất khó để múc một cốc nước đầy. Bạn không cần phải lo lắng về điều này. Bạn rất khỏe, vì vậy bạn có thể nghiêng hồ bơi sang một bên (mà không cần sử dụng thêm thời gian nữa).
  • Bất cứ khi nào bạn thực hiện một phép tính, bạn có thể làm tròn đến hàng trăm gần nhất . Câu trả lời cuối cùng của bạn sẽ không cần phải chính xác.

Các trường hợp thử nghiệm

Đầu vào: triangle 10 12.25 3 circle 5 2.2 5
Đầu ra: 10
Mặc dù chỉ còn ít hơn 172,7 trên muỗng cuối cùng, nhưng vẫn mất toàn bộ năm giây để làm trống nó.

Đầu vào: triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
Đầu ra:804.2

  • Bạn nên làm tròn đến hàng trăm gần nhất sau mỗi phép tính.
  • Tính toán cuối cùng được làm tròn từ 804.05567 đến 804.2. Điều này là do chút nước cuối cùng phải được làm trống.

Quy tắc

  • Bạn có thể viết một chương trình hoặc chức năng đầy đủ.
  • Đầu vào nên được lấy từ stdin hoặc tham số chức năng. Đầu ra phải được in qua thiết bị xuất chuẩn hoặc trả lại.
  • Định dạng đầu vào có thể được sắp xếp lại, miễn là bạn chỉ định điều đó trong bài nộp. Bạn cũng có thể rút ngắn các chuỗi "hình tròn", "hình tam giác" và "hình chữ nhật".
  • Thư viện và các chức năng tích hợp liên quan đến khối lượng hoặc diện tích không được phép.

Chấm điểm

Đây là . Đệ trình với số byte ít nhất sẽ thắng.


3
Cuối cùng, bạn sẽ gặp vấn đề, một khi mực nước dưới đáy hồ thấp hơn chiều cao của cốc. Tại thời điểm đó, càng ngày càng khó để có được một cốc đầy. Có nên bỏ qua vấn đề này?
Darrel Hoffman

8
Có @DarrelHoffman, hãy giả vờ rằng bạn thực sự mạnh mẽ và có thể nghiêng bể bơi sang một bên (mà không cần sử dụng thêm thời gian nữa).
Nick B.

Câu trả lời:


6

JavaScript ES6, 100 78 82 81 74 byte

Cảm ơn @Und xác định chức năng đã giúp chơi golf 4 byte

(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

Sử dụng:

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

Thay vì .5*v, bạn không thể làm gì v/2?
Alex A.

@AlexA. oh yeah ... hoàn toàn quên mất điều đó
Downgoat

@vihan Điều gì xảy ra nếu thể tích bể là bội số chính xác của thể tích cốc, như trong t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? Tôi nhận được 10nhưng không nên trả lời 5? EDIT: vừa bị edc65 đánh bại, cùng một vấn đề.
jrich

Hãy xem giải pháp của tôi, tôi không thể đăng nó vì nó quá giống với giải pháp của bạn ...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 Tôi nghĩ rằng điều này nên làm việc bây giờ. -~có vấn đề với các số thập phân và sẽ dẫn đến làm tròn thêm một bước. Tôi đã phải thêm a<'t'?1:2(1+(a>'t'))không hoạt động vì một số lý do.
Hạ cấp

5

CJam, 46 byte

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

Giải trình:

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

Hãy thử trực tuyến .


3

Python 3, 340 304 byte

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

Sử dụng:

q(i)

Đâu ilà chuỗi thông tin.

Ví dụ:

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

Lưu ý: Tên của các hình đã được rút ngắn thành chữ cái đầu tiên của chúng, tương ứng.


Bạn có thể lưu một byte bằng cách thay thế "0,5" bằng ".5".
Potatomato

Các dấu ngoặc trong "(Z [0] ** 2)" là không cần thiết. Thay thế "(Z [0] ** 2)" bằng "Z [0] ** 2" sẽ lưu 2 ký tự mà không ảnh hưởng đến kết quả của chức năng. Ngoài ra, có thể xóa
khoảng trắng

Tôi đã thử điều này và nó ảnh hưởng đến kết quả. @Potatomato
Zach Gates

Các thay đổi tôi đã đề xuất dường như hoạt động tốt ( repl.it/BBNh/1 cho thấy các giá trị tương tự được trả về).
Khoai tây

3

Javascript (ES6), 91

Lấy đầu vào làm chuỗi cho hình dạng, mảng số cho kích thước và một số duy nhất cho tốc độ:

(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

Điều này xác định một hàm ẩn danh, vì vậy để sử dụng thêm g=trước nó. Sau đó, nó có thể được gọi là nhưalert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

Giải trình:

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



Giải pháp ban đầu của tôi lấy một chuỗi, và là dài 111 byte:

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]

Điều này cũng xác định một hàm ẩn danh, vì vậy để sử dụng thêm f=trước nó. Sau đó, nó có thể được gọi là nhưalert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))


3

K5 (oK), 123 byte

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 byte

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)

Điều này giả định rằng chỉ chữ cái đầu tiên của tên hình dạng sẽ được đưa ra. Nếu không, giải pháp dài hơn 6 byte.

Ungolfed + giải thích:

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

Đã lưu 21 byte nhờ edc65 và 10 nhờ Không xác định!


Bạn không có một ceilJulia, để sử dụng thay vì floor, cắt tất cả các kiểm tra về kết quả số nguyên?
edc65

@ edc65 Làm sao tôi không thấy điều đó?! Cảm ơn, đã lưu 21 byte!
Alex A.

Nó sẽ có thể thay thế a>'s'?prod(x)/2:prod(x)bằng prod(x)/(a>'s'?2:1)? (có thể ngay cả khi không có dấu ngoặc đơn, tôi không có ide juilia trên tay và không thể kiểm tra điều này)
jrich

Hoặc thậm chí có khả năng thay thế a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)bằng prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)? (Một lần nữa, chưa được kiểm tra)
jrich

@Und xác định chức năng Yep, hoạt động! Cảm ơn, đã cạo đi 10 byte!
Alex A.

3

F #, 217 186 184 160 byte

Yêu cầu thụt đầu dòng chết tiệt!

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

Sử dụng:

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

Cập nhật

Cảm ơn Alex vì đã nhận xét về thụt lề không gian duy nhất, mà F # dường như hỗ trợ

Được quản lý để giảm tải nhiều hơn bằng cách thay đổi từ arraythành listloại trong matchcâu lệnh


1
Nếu bạn có thể sử dụng một khoảng trắng hoặc tab để thụt lề, bạn có thể giảm xuống còn 186 byte. Nhưng những gì bạn có bây giờ thực sự là 211, không phải 217.
Alex A.

@ AlexA.A không gian duy nhất hoạt động, tôi sẽ cập nhật - cảm ơn! Tại sao lại là 211 chứ không phải 217, khi tôi đặt nó vào notepad, nó hiển thị là 217 ký tự và lưu nó vào một tệp cũng hiển thị 217 (Xin lỗi, lần đầu tiên chơi golf, vì vậy có thể sai về cách tính kích thước)
Psytronic

Tôi đã đếm byte bằng công cụ tiện dụng này . Windows sử dụng ngắt dòng hai byte để có thể giải thích sự khác biệt.
Alex A.

@AlexA. Ahh, cảm ơn, điều đó có ý nghĩa! Phiên bản này nên là 180 thì tôi đoán.
Psytronic

Thay vì x**2.bạn có thể làm gì x*x? Điều đó có thể tiết kiệm 2 byte.
Alex A.

2

Python 2.7 306 byte

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

Lấy đầu vào từ stdin.
Kiểm tra nó-

$ 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

Trăn 2, 222 146 139 119 103 93 byte

Thực hiện khá đơn giản. Cảm ơn Sp3000 cho -(-n//1)thủ thuật trần, nên làm việc trong mọi trường hợp (tức là đã không tìm thấy một vấn đề với nó chưa).

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

Đầu vào phải được định dạng như vậy:

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

Sử dụng:

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

Ung dung:

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

Giải pháp gốc, 222 byte

Điều này được thực hiện khi các quy tắc vẫn cần bạn nhập toàn bộ từ chứ không phải là một chữ cái. Tôi đã sử dụng thực tế là hash(s)%5ánh xạ chúng đến circle -> 2, triangle -> 3, rectangle -> 1, tuy nhiên nếu tôi chỉ lấy một chữ cái làm đầu vào, tôi nghĩ rằng tôi có thể rút ngắn nó lại.

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

Sử dụng:

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

Chà, nếu bạn muốn lừa dối ..;)
Cyphase

@Cyphase Thế nào là gian lận? Tất cả những gì tôi đã làm là sắp xếp lại đầu vào, giống như những gì nhiều người đã làm ở đây ..
Kade

(Ồ này, không thấy đó là bạn.) Tôi chỉ đùa thôi :). Tôi cũng sẽ thử nó với đầu vào tùy chỉnh.
Cyphase

1

Python 2/3, 252 249 byte

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

Ví dụ sử dụng:

$ 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

Các phiên bản chỉ dành cho Python 2 và Python 3 chỉ khác nhau về cách chúng nhận đầu vào; raw_input()cho Python 2 và input()cho Python 3, trái ngược vớire.sys.stdin.readline() phiên bản Python2 / 3.

Python 2, 240 237 byte

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 byte

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

Thay đổi:

Thay đổi for o in[0,3if i[0]<'d'else 4]:thành for o in[0,[4,3][i[0]<'d']]:. Cảm ơn Vioz đã truyền cảm hứng :).


Không, chờ đợi, đừng bận tâm. Điều đó sẽ không hoạt động, vì vòng lặp for đã kết thúc [0, 3 if i[0] < 'd' else 4]. Muộn rồi (sớm?): P.
Cyphase

Ồ, tôi đã bỏ lỡ nó: P Nevermind.
Kade

Nhưng tôi có thể sử dụng kỹ thuật đó trong fortuyên bố :).
Cyphase

1

Bình - 40 39 36 35 34 byte

Sử dụng phương pháp đơn giản, ánh xạ trên cả hai container và sau đó giảm bằng cách chia.

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

Có dấu phẩy đầu vào được phân tách từ stdin, với chữ cái đầu tiên của mỗi hình dạng như : "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Phòng thử nghiệm .


Đây là RÚT GỌN! Công việc tuyệt vời :)
Nick B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.