Kosongkan Kolam Renang. . . Dengan Hanya Piala Solo Merah

14

Anda memiliki kolam renang yang diisi sampai penuh dengan air. Anda perlu mengosongkannya, tetapi Anda tidak dapat memikirkan metode yang efisien. Jadi, Anda memutuskan untuk menggunakan cangkir solo merah Anda. Anda akan berulang kali mengisi cangkir dan membuangnya di luar kolam.

Tantangan

Berapa lama untuk mengosongkan kolam?

Memasukkan

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

  • shape of poolakan menjadi salah satu dari string ini: circle, triangle, atau rectangle. Perhatikan bahwa ini sebenarnya merujuk pada bentuk 3 dimensi: silinder, prisma segitiga, dan prisma persegi panjang.
  • dimensions akan berbeda tergantung bentuknya.
    • lingkaran: [radius] [height]. Volume = π r 2 h
    • segitiga: [base] [height] [length]. Volume = 1/2 (bh) * panjang
    • persegi panjang: [width] [length] [height]Volume = lwh
  • shape of cupdan dimensionsbekerja dengan cara yang sama. Cangkir juga bisa berupa lingkaran, segitiga, atau persegi panjang.
  • speedadalah jumlah waktu yang diperlukan untuk mengosongkan satu gelas penuh air dalam hitungan detik .

Keluaran

Jumlah detik yang diperlukan untuk mengosongkan kolam renang. Ini dapat dibulatkan ke detik terdekat.

Catatan

  • Tidak akan ada unit dalam input. Semua unit jarak diasumsikan sama (bentuk tidak akan memiliki tinggi dalam inci dan lebar kaki).
  • Gunakan 3,14 untuk pi.
  • Input akan terdiri dari string dan angka floating-point.
  • Tidak akan pernah hujan. Tidak akan ada air yang ditambahkan.
  • Anda memiliki tangan yang sangat mantap. Anda akan mengisi cangkir sampai penuh setiap saat, dan Anda tidak akan pernah menumpahkannya.
  • Begitu Anda mendekati akhir, akan sulit untuk mengambil secangkir penuh air. Anda tidak perlu khawatir tentang ini. Anda sangat kuat, sehingga Anda dapat memiringkan kolam ke sisinya (tanpa menghabiskan waktu lagi).
  • Setiap kali Anda membuat perhitungan, tidak apa-apa untuk membulatkan ke seperseratus terdekat . Jawaban akhir Anda tidak perlu tepat.

Uji Kasus

Input: triangle 10 12.25 3 circle 5 2.2 5
Keluaran:10
Meskipun tersisa kurang dari 172,7 pada sendok terakhir, masih butuh lima detik untuk mengosongkannya.

Input: triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2
Keluaran:804.2

  • Anda harus membulatkan ke seratus terdekat setelah setiap perhitungan.
  • The perhitungan akhir dibulatkan 804,05567-804,2. Ini karena sedikit air yang terakhir harus dikosongkan.

Aturan

  • Anda dapat menulis program atau fungsi lengkap.
  • Input harus diambil dari stdin atau parameter fungsi. Output harus dicetak melalui stdout atau dikembalikan.
  • Format input dapat disusun ulang, selama Anda menentukannya dalam pengiriman. Anda juga dapat mempersingkat string "lingkaran", "segitiga", dan "persegi panjang."
  • Perpustakaan dan fungsi bawaan yang melibatkan volume atau area tidak diizinkan.

Mencetak gol

Ini adalah . Kiriman dengan jumlah byte terkecil menang.

Nick B.
sumber
3
Anda akan memiliki masalah pada akhirnya, setelah tingkat air di dasar kolam lebih rendah dari ketinggian cangkir. Pada titik itu akan semakin sulit untuk mendapatkan secangkir penuh. Haruskah masalah ini diabaikan?
Darrel Hoffman
8
Ya @DarrelHoffman, mari kita berpura-pura Anda benar-benar kuat dan dapat memiringkan kolam ke sisi itu (tanpa menghabiskan waktu lagi).
Nick B.

Jawaban:

6

JavaScript ES6, 100 78 82 81 74 byte

Terima kasih kepada @UndefinedFunction untuk membantu golf dari 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

Pemakaian:

t(["triangle",10,12.25,3],["circle",5,2.2],5);
Downgoat
sumber
Daripada .5*v, tidak bisakah kamu lakukan v/2?
Alex A.
@AlexA. oh ya ... benar-benar lupa tentang itu
Downgoat
@ Vihan Apa yang terjadi jika volume kumpulan adalah kelipatan tepat dari volume cangkir, seperti di t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? Saya mendapatkan 10tetapi bukankah seharusnya jawabannya 5? EDIT: baru saja dikalahkan oleh edc65, masalah yang sama.
jrich
Lihatlah solusi saya, saya tidak dapat mempostingnya karena terlalu mirip dengan milik Anda ...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 Saya pikir ini harus berfungsi sekarang. -~memiliki masalah dengan angka desimal dan akan menghasilkan langkah tambahan. Saya harus menambahkan a<'t'?1:2karena (1+(a>'t'))tidak berfungsi karena suatu alasan.
Downgoat
5

CJam, 46 byte

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

Penjelasan:

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

Cobalah online .

Andrea Biondo
sumber
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))

Pemakaian:

q(i)

Di mana ideretan informasi.

Contoh:

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

Catatan: Nama masing-masing bentuk telah disingkat menjadi huruf pertama.

Zach Gates
sumber
Anda dapat menyimpan satu byte dengan mengganti "0,5" dengan ".5".
Potatomato
Tanda kurung di "(Z [0] ** 2)" tidak perlu. Mengganti "(Z [0] ** 2)" dengan "Z [0] ** 2" harus menyimpan 2 karakter tanpa memengaruhi hasil fungsi. Selain itu, ruang dalam "/ 2 jika" (dari "return r / 2 jika Y [0] ...) dapat dihapus, menyimpan satu karakter
Potatomato
Saya sudah mencoba ini dan itu mempengaruhi hasilnya. @Patatomato
Zach Gates
Perubahan yang saya usulkan tampaknya berfungsi dengan baik ( repl.it/BBNh/1 menunjukkan bahwa nilai yang sama dikembalikan).
Potatomato
3

Javascript (ES6), 91

Mengambil input sebagai string untuk bentuk, array angka untuk dimensi, dan angka tunggal untuk kecepatan:

(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

Ini mendefinisikan fungsi anonim, jadi gunakan add g=sebelum itu. Kemudian, itu bisa disebut sepertialert(g("triangle", [10, 12.25, 3], "circle", [5, 2.2], 5))

Penjelasan:

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



Solusi asli saya mengambil satu string, dan panjangnya 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]

Ini juga mendefinisikan fungsi anonim, jadi gunakan add f=sebelum itu. Kemudian, itu bisa disebut sepertialert(f("triangle 5 87.3 20001 rectangle 5.14 2 105.623 0.2"))

Jrich
sumber
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]}
kirbyfan64sos
sumber
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)

Ini mengasumsikan bahwa hanya huruf pertama dari nama bentuk yang akan diberikan. Kalau tidak, solusinya adalah 6 byte lebih lama.

Penjelasan + tidak dikumpulkan:

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

Disimpan 21 byte berkat edc65 dan 10 berkat UndefinedFunction!

Alex A.
sumber
Apakah Anda tidak punya ceildi Julia, untuk digunakan, bukan floor, memotong semua cek tentang hasil integer?
edc65
@ edc65 Bagaimana saya tidak melihat itu ?! Terima kasih, itu menghemat 21 byte!
Alex A.
Apakah mungkin untuk mengganti a>'s'?prod(x)/2:prod(x)dengan prod(x)/(a>'s'?2:1)? (mungkin bahkan tanpa tanda kurung, saya tidak punya ide juilia di tangan, dan belum dapat menguji ini)
jrich
Atau bahkan berpotensi diganti a<'d'?3.14x[1]^2*x[2]:a>'s'?prod(x)/2:prod(x)dengan prod(x)*(a<'d'?3.14x[1]:a>'s'?.5:1)? (Lagi, belum diuji)
jrich
@UndefinedFunction Yap, itu bekerja! Terima kasih, itu mengurangi 10 byte!
Alex A.
3

F #, 217 186 184 160 byte

Persyaratan indentasi sial!

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

Pemakaian:

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

Memperbarui

Terima kasih kepada Alex karena mengomentari indentasi ruang tunggal, yang tampaknya didukung F #

Berhasil mengetuk lebih banyak beban dengan mengubah dari jenis arrayke listdalam matchpernyataan

Psytronic
sumber
1
Jika Anda bisa menggunakan satu spasi atau tab untuk indentasi, Anda bisa mendapatkan ini hingga 186 byte. Tetapi yang Anda miliki sekarang sebenarnya adalah 211, bukan 217.
Alex A.
@ AlexA. Satu ruang bekerja, saya akan memperbarui - terima kasih! Mengapa 211 adalah, bukan 217, ketika saya meletakkannya di notepad, itu ditampilkan sebagai 217 karakter, dan menyimpannya ke file menunjukkan 217 juga (Maaf, golf pertama, jadi bisa salah tentang cara menghitung ukuran)
Psytronic
Saya menghitung byte menggunakan alat praktis ini . Windows menggunakan jeda baris dua byte sehingga dapat menjelaskan perbedaan.
Alex A.
@AlexA. Ahh, terima kasih, itu masuk akal! Versi ini seharusnya 180 maka saya kira.
Psytronic
Daripada x**2.Anda bisa melakukannya x*x? Itu bisa menghemat 2 byte.
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])

Mengambil input dari stdin.
Menguji itu-

$ 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
Kamehameha
sumber
2

Python 2, 222 146 139 119 103 93 byte

Implementasi yang cukup mudah. Terima kasih kepada Sp3000 untuk-(-n//1) trik untuk plafon, yang harusnya berfungsi dalam semua kasus (yaitu belum menemukan masalah dengannya).

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

Input harus diformat seperti ini:

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

Pemakaian:

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

Tidak Disatukan:

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

Solusi asli, 222 byte

Ini dibuat ketika aturan masih mengharuskan Anda untuk memasukkan seluruh kata daripada surat. Saya menggunakan fakta yang hash(s)%5memetakan mereka circle -> 2, triangle -> 3, rectangle -> 1, namun jika saya hanya mengambil satu huruf sebagai masukan, saya pikir saya bisa mendapatkan ini lebih pendek.

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

Pemakaian:

>>> 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
Kade
sumber
Nah, jika Anda ingin menipu ..;)
Cyphase
@Cyphase Bagaimana curang? Yang saya lakukan adalah mengatur ulang input, yang sama dengan apa yang dilakukan banyak orang di sini ..
Kade
(Oh, hei, tidak melihat bahwa itu kamu.) Saya hanya bercanda :). Saya akan mencobanya dengan input khusus juga.
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])

Contoh Penggunaan:

$ 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

Versi hanya Python 2 dan Python 3 hanya berbeda dalam cara mereka menerima input; raw_input()untuk Python 2 dan input()untuk Python 3, sebagai lawan dari re.sys.stdin.readline()untuk versi 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])

Perubahan:

Diubah for o in[0,3if i[0]<'d'else 4]:menjadi for o in[0,[4,3][i[0]<'d']]:. Terima kasih kepada Vioz untuk ilhamnya :).

Cyphase
sumber
Tidak, tunggu, tidak apa-apa. Itu tidak akan berhasil, karena for loop sudah berakhir [0, 3 if i[0] < 'd' else 4]. Sudah terlambat (awal?): P.
Cyphase
Oh, saya melewatkannya: P Nevermind.
Kade
Tapi saya bisa menggunakan teknik itu dalam forpernyataan :).
Cyphase
1

Pyth - 40 39 36 35 34 byte

Menggunakan metode sederhana, memetakan kedua wadah dan kemudian mengurangi dengan pembagian.

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

Membawa koma masukan dipisahkan dari stdin, dengan huruf pertama dari setiap bentuk seperti: "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Test Suite .

Maltysen
sumber
Ini SANGAT SINGKAT! Pekerjaan yang mengagumkan! :)
Nick B.