ล้างสระว่ายน้ำ . . ด้วยถ้วยเดี่ยวสีแดงเท่านั้น


14

คุณมีสระว่ายน้ำที่เต็มไปด้วยน้ำ คุณต้องล้างมัน แต่คุณไม่สามารถคิดวิธีที่มีประสิทธิภาพได้ ดังนั้นคุณตัดสินใจที่จะใช้ถ้วยเดี่ยวสีแดงของคุณ คุณจะเติมถ้วยซ้ำ ๆ จนหมดแล้วเททิ้งไว้ข้างนอกสระ

ท้าทาย

ใช้เวลาในการล้างสระว่ายน้ำนานเท่าไหร่

อินพุต

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

  • shape of poolจะเป็นหนึ่งในสายเหล่านี้: circle, หรือtriangle rectangleโปรดทราบว่าสิ่งเหล่านี้จริงอ้างถึงรูปร่าง 3 มิติ: ทรงกระบอก, ปริซึมสามเหลี่ยมและปริซึมสี่เหลี่ยม
  • dimensions จะแตกต่างกันไปขึ้นอยู่กับรูปร่าง
    • แวดวง: [radius] [height]. ปริมาณ = π r 2ชม
    • [base] [height] [length]สามเหลี่ยม: ปริมาตร = 1/2 (bh) * ความยาว
    • สี่เหลี่ยมผืนผ้า: [width] [length] [height]ปริมาณ = lwh
  • shape of cupและdimensionsทำงานในลักษณะเดียวกัน ถ้วยยังสามารถเป็นได้ทั้งวงกลมสามเหลี่ยมหรือสี่เหลี่ยมผืนผ้า
  • 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 นี่เป็นเพราะน้ำเล็กน้อยสุดท้ายจะต้องถูกทำให้ว่างเปล่า

กฎระเบียบ

  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • อินพุตควรถูกนำมาจาก stdin หรือพารามิเตอร์ฟังก์ชัน เอาต์พุตควรถูกพิมพ์ผ่าน stdout หรือส่งคืน
  • รูปแบบอินพุตสามารถจัดใหม่ได้ตราบใดที่คุณระบุในการส่ง คุณสามารถทำให้สตริงสั้นลงด้วย "วงกลม", "สามเหลี่ยม" และ "สี่เหลี่ยมผืนผ้า"
  • ไม่อนุญาตให้ใช้ไลบรารีและฟังก์ชันในตัวที่เกี่ยวข้องกับระดับเสียงหรือพื้นที่

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟการส่งที่มีจำนวนไบต์น้อยที่สุดจะเป็นชัยชนะ


3
คุณจะมีปัญหาในตอนท้ายเมื่อระดับน้ำในก้นสระนั้นต่ำกว่าความสูงของถ้วย ณ จุดนั้นมันจะยากขึ้นและหนักขึ้นเพื่อให้ได้ถ้วยเต็ม ปัญหานี้ควรถูกเพิกเฉยหรือไม่?
Darrel Hoffman

8
ใช่ @DarrelHoffman มาทำท่าว่าคุณแข็งแกร่งมากและสามารถเอียงสระลงไปด้านข้าง (โดยไม่ต้องเสียเวลาเพิ่ม)
Nick B.

คำตอบ:


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

@vihan เกิดอะไรขึ้นถ้าปริมาณสระว่ายน้ำเป็นหลายที่แน่นอนของปริมาณถ้วยเหมือนในt(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? ฉันได้10แต่คำตอบ5ไม่ควรใช่หรือไม่ แก้ไข: เพิ่งพ่ายแพ้โดย edc65 ปัญหาเดียวกัน
jrich

ลองดูโซลูชันของฉันฉันไม่สามารถโพสต์ได้เพราะมันคล้ายกับของคุณมากเกินไป ...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

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 ถ้า" (จาก "return r / 2 ถ้า Y [0] ... ) ได้โดยบันทึกหนึ่งอักขระ
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=ก่อนมัน จากนั้นก็สามารถเรียกได้ว่าชอบ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=ก่อน จากนั้นก็สามารถเรียกได้ว่าชอบalert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))



3

Julia, 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 ไบต์อีกต่อไป

คำอธิบาย Ungolfed +:

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

21 ไบต์ที่บันทึกไว้ต้องขอบคุณ edc65 และ 10 ขอบคุณที่ UndefinedFunction


คุณไม่มีceilJulia ในการใช้แทนfloorตัดการตรวจสอบทั้งหมดเกี่ยวกับผลจำนวนเต็ม?
edc65

@ edc65 ฉันไม่เห็นว่าอย่างไร! ขอบคุณที่บันทึกไว้ 21 ไบต์!
Alex A.

มันจะเป็นไปได้ที่จะแทนที่a>'s'?prod(x)/2:prod(x)ด้วยprod(x)/(a>'s'?2:1)? (อาจจะเป็นได้โดยไม่ต้องวงเล็บที่ฉันไม่ได้มี IDE juilia ในมือและยังไม่ได้รับสามารถที่จะทดสอบนี้)
jrich

หรืออาจแทนที่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)? (ยังไม่ได้ทดสอบอีกครั้ง)
จ่อย

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

ปรับปรุง

ขอบคุณอเล็กซ์ที่กล่าวถึงการเว้นวรรคแบบเดี่ยวซึ่ง F # ดูเหมือนจะสนับสนุน

จัดการเพื่อลดการโหลดมากขึ้นโดยเปลี่ยนจากarrayเป็นlistประเภทในmatchคำสั่ง


1
หากคุณสามารถใช้เว้นวรรคหรือแท็บเดียวสำหรับการเยื้องคุณสามารถลดขนาดลงได้ถึง 186 ไบต์ แต่สิ่งที่คุณมีอยู่ตอนนี้คือ 211 ไม่ใช่ 217
อเล็กซ์ A.

@ AlexA.A ทำงานบนพื้นที่เดียวฉันจะอัปเดต - ขอบคุณ! ทำไม / เป็น 211 ไม่ใช่ 217 เมื่อฉันใส่มันลงในแผ่นจดบันทึกมันแสดงเป็น 217 chars และบันทึกลงในไฟล์ที่แสดง 217 ด้วย (ขออภัยสนามกอล์ฟแรกดังนั้นอาจผิดกับวิธีคำนวณขนาด)
Psytronic

ฉันนับไบต์ด้วยเครื่องมือที่มีประโยชน์นี้ Windows ใช้ตัวแบ่งบรรทัดสองไบต์เพื่อให้อธิบายความคลาดเคลื่อน
Alex A.

@AlexA อ่าขอบคุณที่เข้าท่า! รุ่นนี้ควรจะ 180 แล้วฉันเดา
Psytronic

x**2.คุณสามารถทำx*xอะไรได้มากกว่า? นั่นจะช่วยประหยัด 2 ไบต์
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])

รับอินพุตจาก 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

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

โซลูชันดั้งเดิม 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 มันโกงอย่างไร? ทั้งหมดที่ฉันทำคือจัดเรียงข้อมูลใหม่ซึ่งเหมือนกับสิ่งที่ผู้คนจำนวนมากทำที่นี่ ..
Kade

(เฮ้ไม่เห็นว่าเป็นคุณ) ฉันแค่ล้อเล่น :) ฉันจะลองกับอินพุตที่กำหนดเองเช่นกัน
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 for loop นั้นจบ[0, 3 if i[0] < 'd' else 4]แล้ว มาช้า (เร็วกว่านี้): P
Cyphase

โอ้ฉันคิดถึงมัน: P ไม่เป็นไร
Kade

แต่ฉันสามารถใช้เทคนิคนั้นในforแถลงการณ์ :)
Cyphase

1

Pyth - 40 39 36 35 34 ไบต์

ใช้วิธีการง่าย ๆ ทำแผนที่เหนือภาชนะทั้งสองแล้วลดตามการแบ่ง

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

ใช้เวลาจุลภาคป้อนข้อมูลแยกออกจาก stdin "t", 10, 12.25, 3, "c", 5, 2.2, 5ด้วยตัวอักษรตัวแรกของแต่ละรูปทรงที่ต้องการ:

Test Suite


นี่คือสั้น! เยี่ยมมาก! :)
Nick B.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.