수영장을 비 웁니다. . . 레드 솔로 컵만


14

물이 가득 찬 수영장이 있습니다. 비워야하지만 효율적인 방법을 생각할 수 없습니다. 그래서 당신은 당신의 빨간 솔로 컵을 사용하기로 결정했습니다. 컵을 반복해서 채우고 수영장 밖으로 버립니다.

도전

수영장을 비우는 데 얼마나 걸립니까?

입력

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

  • shape of pool이러한 문자열 중 하나가 될 것입니다 circle, triangle또는 rectangle. 이들은 실제로 3 차원 형태 (실린더, 삼각 프리즘 및 직사각형 프리즘)를 나타냅니다.
  • dimensions 모양에 따라 다릅니다.
    • 서클 : [radius] [height]. 부피 = π r 2 h
    • 삼각형 : [base] [height] [length]. 음량 = 1/2 (bh) * 길이
    • 직사각형 : [width] [length] [height]음량 = lwh
  • shape of cupdimensions같은 방식으로 작동합니다. 컵은 원, 삼각형 또는 사각형 일 수도 있습니다.
  • speed한 컵의 물 을 몇 초 안에 비우는 데 걸리는 시간 입니다.

산출

는 수영장을 비워야합니다. 가장 가까운 초로 반올림 할 수 있습니다.

노트

  • 입력에 단위가 없습니다. 모든 거리 단위는 동일하다고 가정합니다 (모양의 높이는 인치, 너비는 피트가 아님).
  • 에 3.14를 사용하십시오 pi.
  • 입력은 문자열과 부동 소수점 숫자로 구성됩니다.
  • 결코 비가 내리지 않을 것입니다. 물이 추가되지 않습니다.
  • 당신은 매우 꾸준한 손을 가지고 있습니다. 매번 컵을 정확하게 테두리에 채우고 어떤 것도 흘리지 않습니다.
  • 끝이 가까워지면 물 한 컵을 퍼 뜨리기가 어려워집니다. 당신은 이것에 대해 걱정할 필요가 없습니다. 당신은 매우 강해서 수영장을 옆으로 기울일 수 있습니다 (더 이상 사용하지 않고).
  • 계산을 할 때마다 가장 가까운 100 분의 1반올림 해도됩니다 . 최종 답변은 정확하지 않아도됩니다.

테스트 사례

입력 : triangle 10 12.25 3 circle 5 2.2 5
출력 : 10
마지막 국자에 172.7 미만이 남았지 만 비우려면 여전히 5 초가 걸립니다.

입력 : triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
출력 :804.2

  • 각 계산 후 가장 가까운 100 분의 1로 반올림해야합니다.
  • 최종 계산은 반올림 804.2로 804.05567에서. 마지막 물을 조금 비워야하기 때문입니다.

규칙

  • 전체 프로그램 또는 기능을 작성할 수 있습니다.
  • 입력은 stdin 또는 함수 매개 변수에서 가져와야합니다. 출력은 stdout을 통해 인쇄되거나 반환되어야합니다.
  • 제출에서 입력 형식을 지정하는 한 입력 형식을 다시 정렬 할 수 있습니다. 문자열 "circle", "triangle"및 "rectangle"을 줄일 수도 있습니다.
  • 볼륨 또는 영역과 관련된 라이브러리 및 내장 기능은 허용되지 않습니다.

채점

이것은 입니다. 최소 바이트 수의 제출이 이깁니다.


3
수영장 바닥의 수위가 컵 높이보다 낮아지면 결국 문제가 발생합니다. 그 시점에서 전체 컵을 얻는 것이 점점 어려워 질 것입니다. 이 문제를 무시해야합니까?
대럴 호프만

8
예 @DarrelHoffman, 당신이 정말로 강하다고 가정하고 더 이상 시간을 사용하지 않고 수영장을 옆으로 기울일 수 있습니다.
Nick B.

답변:


6

자바 스크립트 ES6, 100 78 82 81 74 바이트

4 바이트의 골프 오프를 돕는 @UndefinedFunction 덕분에

(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

파이썬 3, 340304 바이트

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"로 바꾸면 1 바이트를 절약 할 수 있습니다.
Potatomato

"(Z [0] ** 2)"의 괄호는 필요하지 않습니다. "(Z [0] ** 2)"를 "Z [0] ** 2"로 바꾸면 함수 결과에 영향을주지 않으면 서 2자가 저장됩니다. 또한 "/ 2 if"( "return r / 2 if Y [0] ...")의 공백을 제거하여 한 문자를 저장할 수 있습니다.
Potatomato

나는 이것을 시도했고 결과에 영향을 미쳤다. @ Potatomato
Zach 게이츠

내가 제안한 변경 사항은 제대로 작동하는 것 같습니다 ( repl.it/BBNh/1 은 동일한 값이 반환 됨을 보여줍니다).
Potatomato

3

자바 스크립트 (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

익명 함수를 정의하므로 add를 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]

또한 익명 함수를 정의하므로 add를 f=먼저 사용하십시오 . 그런 다음 호출 할 수 있습니다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대신에 사용하는, 줄리아의 floor정수 결과에 대한 모든 검사를 절단?
edc65 6

@ edc65 어떻게 보지 못했습니까?! 감사합니다. 21 바이트를 절약했습니다!
Alex A.

로 교체 a>'s'?prod(x)/2:prod(x)할 수 prod(x)/(a>'s'?2:1)있습니까? (아마도 괄호가 없어도 줄리아가 없어서 이것을 테스트 할 수 없었습니다)
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)? (다시 테스트되지 않음)
jrich

@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 #이 지원하는 단일 공백 ​​들여 쓰기에 대해 언급 한 Alex에게 감사합니다.

에서 변경하면 더 많은 오프로드를 노크 관리 arraylist에 유형 match


1
들여 쓰기에 단일 공백이나 탭을 사용할 수있는 경우이를 186 바이트로 줄일 수 있습니다. 그러나 지금 가지고있는 것은 실제로 217이 아니라 211입니다.
Alex A.

@AlexA. 단일 공간이 작동하면 업데이트하겠습니다-감사합니다! 메모장에 넣었을 때 왜 217이 아닌 211입니까? 217 문자로 표시되고 파일에 저장하면 217도 표시됩니다 (죄송합니다, 첫 골프, 크기를 계산하는 방법이 잘못 될 수 있음)
Psytronic

이 편리한 도구를 사용하여 바이트를 계산했습니다 . Windows는 2 바이트 줄 바꿈을 사용하여 불일치를 설명 할 수 있습니다.
Alex A.

@AlexA. 아, 고맙습니다. 이 버전은 180이어야합니다.
Psytronic

x**2.당신이 할 수있는 것보다 x*x? 그 영혼은 2 바이트를 절약합니다.
Alex A.

2

파이썬 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

파이썬 2 222 146 139 119 103 93 바이트

매우 간단한 구현. -(-n//1)천장 트릭에 대한 Sp3000 덕분 에 모든 경우에 작동 해야 합니다 (예 : 아직 문제가 없음).

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 부정 행위는 어떻습니까? 내가 한 것은 입력을 재배치하는 것인데, 이것은 많은 사람들이 여기서 한 것과 같습니다.
Kade

(오, 이봐, 너 인걸 몰랐어.) 농담이야. :). 맞춤 입력으로 시도해 보겠습니다.
Cyphase

1

파이썬 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 전용 버전은 입력을받는 방식이 다릅니다. Python2 / 3 버전 과 달리 raw_input()Python 2 및 input()Python 3의 경우 re.sys.stdin.readline().

파이썬 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])

파이썬 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 Nevermind.
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.

테스트 스위트 .


너무 짧습니다! 대단한 직업! :)
Nick B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.