Порожній басейн. . . З кубком червоного соло


14

У вас є басейн, який наповнений водою до краю. Потрібно його спорожнити, але ви не можете придумати ефективний метод. Тож ви вирішили використовувати свою червону сольну чашку. Ви будете неодноразово наповнювати чашку до кінця і скидати її за межі басейну.

Виклик

Скільки часу буде потрібно для спорожнення басейну?

Вхідні дані

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

  • shape of poolбуде одна з цих рядків: circle, triangleабо rectangle. Зауважте, що вони насправді стосуються тривимірних фігур: циліндра, трикутної призми та прямокутної призми.
  • 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
У вас виникнуть проблеми наприкінці, як тільки рівень води в дні басейну був нижчим за висоту чашки. У цей момент дістати повний стаканчик буде важче і важче. Чи слід ігнорувати це питання?
Даррел Гофман

8
Так @DarrelHoffman, давайте зробимо вигляд, що ви справді сильні і можете нахилити басейн на свою сторону (не використовуючи більше часу).
Нік Б.

Відповіді:


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?
Алекс А.

@AlexA. о так ... повністю забув про це
Пуховик

@vihan Що станеться, якщо об'єм басейну точно кратний об'єму чашки, як у t(["triangle", [10, 12.25, 3]], ["triangle", [10, 12.25, 3]], 5)? Я розумію, 10але чи не повинна бути відповідь 5? EDIT: просто побили 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'))не працює чомусь.
Пуховик

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".
Картопля

Дужки в "(Z [0] ** 2)" не потрібні. Заміна "(Z [0] ** 2)" на "Z [0] ** 2" повинна зберігати 2 символи, не впливаючи на результати функції. Крім того, пробіл у "/ 2 if" (з "повернути r / 2, якщо Y [0] ...) можна видалити, зберігаючи один символ.
Potatomato

Я спробував це, і це вплинуло на результати. @Potatomato
Zach Gates

Запропоновані мною зміни, здається, працюють добре ( 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=перед цим. Тоді це можна назвати подібним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

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

Збережено 21 байт завдяки edc65 та 10 завдяки UndefinedFunction!


У вас немає ceilв Julia, щоб використовувати замість того floor, щоб скоротити всі чеки про цілий результат?
edc65

@ edc65 Як я цього не бачив ?! Дякую, що врятували 21 байт!
Олексій А.

Можна чи замінити a>'s'?prod(x)/2:prod(x)з prod(x)/(a>'s'?2:1)? (можливо навіть без дужок, у мене немає ідеї 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)? (Знову неперевірено)
jrich

@UndefinedFunction Так, це працює! Дякую, що поголив 10 байт!
Олексій А.

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.
Олексій А.

@ AlexA.Один простір працює, я оновлю - дякую! Чому це було / було 211, а не 217, коли я помістив його в блокнот, він відображається як 217 символів, а збереження його у файл показує також 217 (Вибачте, перший гольф, так що
можу

Я підраховував байти за допомогою цього зручного інструменту . Windows використовує двобайтові розриви рядків, щоб пояснити невідповідність.
Олексій А.

@AlexA. Ах, дякую, це має сенс! Ця версія повинна бути 180, то я думаю.
Psytronic

Замість того, щоб x**2.зробити x*x? Це могло б зекономити 2 байти.
Олексій А.

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

Пітон 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

Безголівки:

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 Як це обман? Все, що я зробив, було переставити вхід, що те саме, що багато людей тут зробили ..
Кейд,

(О, ага, не бачив, що це ти.) Я просто жартував :). Я також спробую це зробити з налаштованим входом.
Цифаза

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.

Пітон 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']]:. Дякую Віоз за натхнення :).


Ні, чекайте, неважливо. Це не спрацює, оскільки цикл for for закінчився [0, 3 if i[0] < 'd' else 4]. Пізно (рано?): P.
Цифаза

О, я пропустив це: P Nevermind.
Кейд

Але я можу використовувати цю техніку у forвикладі :).
Цифаза

1

Піт - 40 39 36 35 34 байт

Використовується простий метод, картографуючи обидва контейнери, а потім зменшуючи їх поділом.

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

Приймає коду для введення, відокремлену від stdin, причому перша літера кожної форми на зразок: "t", 10, 12.25, 3, "c", 5, 2.2, 5 .

Тестовий сюїт .


Це ТАКЕ КОРОТКО! Дивовижна робота! :)
Нік Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.