プールを空にします。。。レッドソロカップのみ


14

あなたは水でいっぱいに満たされているスイミングプールを持っています。空にする必要がありますが、効率的な方法を考えることはできません。あなたは赤いソロカップを使うことにしました。カップをいっぱいまで繰り返し満たし、プールの外に捨てます。

チャレンジ

プールを空にするのにどれくらい時間がかかりますか?

入力

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

  • shape of pool:これらの文字列のいずれかになりますcircletriangleまたはrectangle。これらは実際には、円柱、三角柱、四角柱の3次元形状を指していることに注意してください。
  • dimensions 形状によって異なります。
    • サークル:[radius] [height]。体積=πr 2 h
    • 三角形:[base] [height] [length]。体積= 1/2(bh)*長さ
    • 長方形:[width] [length] [height]ボリューム= lwh
  • shape of cupそして、dimensions同じように動作します。カップは、円、三角形、または長方形のいずれかです。
  • speed数秒で1杯の水いっぱいにするのに要する時間です。

出力

プールを空にするのにかかる数。これは、最も近い秒に丸めることができます。

ノート

  • 入力に単位はありません。すべての距離単位は同じであると想定されます(形状の高さはインチで、幅はフィートではありません)。
  • には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、あなたが本当に強いふりをして、プールをその側に傾けることができます(これ以上時間を使い果たすことなく)。
ニックB.

回答:


6

JavaScriptの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
アレックスA.

@AlexA。そうそう...完全にそれを忘れていた
-Downgoat

@vihanプールボリュームがカップボリュームの正確な倍数である場合、次のようになりt(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)ます。私は得ます10が、答えはそうではありません5か?編集:ちょうどedc65、同じ問題にproblemられた。
-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これでうまくいくと思う。-~10進数に問題があり、余分なステップを切り上げることになります。何らかの理由で機能しないa<'t'?1:2ため、追加する必要(1+(a>'t'))がありました。
ダウンゴート

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」に置き換えることで1バイトを節約できます。
ジャガイモ

「(Z [0] ** 2)」の括弧は不要です。「(Z [0] ** 2)」を「Z [0] ** 2」に置き換えると、関数の結果に影響を与えずに2文字を節約できます。さらに、「/ 2 if」のスペース(「return r / 2 if Y [0] ...」)を削除して、1文字を保存できます
。–ジャガイモ

私はこれを試しましたが、結果に影響しました。@ポテトトマト
ザックゲイツ

私が提案した変更はうまくいくようです(repl.it/BBNh/1は同じ値が返されることを示しています)。
ジャガイモ

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バイト長くなります。

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

edc65のおかげで21バイト、UndefinedFunctionのおかげで10バイト節約されました!


ceil代わりに使用するJuliaがあり、floor整数結果に関するすべてのチェックを削減しませんか?
edc65

@ edc65どうして見なかったの?!おかげで、21バイト節約できました!
アレックスA.

交換することが可能だろうa>'s'?prod(x)/2:prod(x)prod(x)/(a>'s'?2:1)?(おそらくは括弧なしで、私は手にjuiliaのIDEを持っていない、とこれをテストすることができていない)
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バイト削減されました!
アレックス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に感謝

ステートメントのタイプをarrayからlistタイプに変更することで、負荷をさらに軽減することができましたmatch


1
インデントに単一のスペースまたはタブを使用できる場合、これを186バイトまで減らすことができます。しかし、あなたが今持っていることは実際には211ではなく217です
アレックスA.

@ AlexA.A単一スペースで動作します、更新します-ありがとう!なぜ217ではなく211なのか、メモ帳に入れると217文字で表示され、ファイルに保存すると217も表示されます(申し訳ありませんが、最初のゴルフなので、サイズの計算方法が間違っている可能性があります)
Psytronic

この便利なツールを使用しバイト数を数えていました。Windowsは2バイトの改行を使用しているため、矛盾を説明できます。
アレックスA.

@AlexA。ああ、ありがとう、それは理にかなっています!このバージョンは180になるはずです。
Psytronic

むしろx**2.あなたが行うことができますかx*x?これで2バイト節約できます。
アレックス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バイト

かなり簡単な実装。-(-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にマッピングするという事実を使用しましたが、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それはいかがですか?多くの人々がここでやったことと同じであるすべてのIやった再配置入力..
カーデ

(ああ、それはあなただとは見ていませんでした。)冗談でした:)。カスタマイズされた入力でも試してみます。
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 Nevermind。
カデ

しかし、私はforステートメントでそのテクニックを使用できます:)。
Cyphase

1

パイス-40 39 36 35 34バイト

単純な方法を使用して、両方のコンテナーにマッピングし、分割して削減します。

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

stdinから分離された入力コンマを使用します"t", 10, 12.25, 3, "c", 5, 2.2, 5。各形状の最初の文字は次のようになります。

テストスイート


これはとても短い!素晴らしい仕事!:)
ニックB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.