Пустой бассейн. , , Только с красной чашкой соло


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 (чч) * длина
    • прямоугольник: [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. Это потому, что этот последний кусочек воды должен быть опорожнен.

правила

  • Вы можете написать полную программу или функцию.
  • Ввод должен быть взят из стандартных параметров или параметров функции. Вывод должен быть распечатан через стандартный вывод или возвращен.
  • Формат ввода можно изменить, если вы укажете его в представлении. Вы также можете сократить строки «круг», «треугольник» и «прямоугольник».
  • Библиотеки и встроенные функции, связанные с объемом или областью, не допускаются.

счет

Это . Представление с наименьшим количеством байтов выигрывает.


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. о да ... совсем забыл об этом
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».
Картофель

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

Я попробовал это, и это повлияло на результаты. @Patatomato
Зак Гейтс,

Кажется, что предложенные изменения работают нормально ( 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

Это определяет анонимную функцию, так что используйте 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 (ок), 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

Сохранено 21 байт благодаря edc65 и 10 благодаря UndefinedFunction!


Разве у вас нет ceilЮлии, чтобы использовать вместо того 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])

Принимает ввод от стандартного ввода.
Тестирование

$ 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 завершен [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

Принимает входную разделенная запятую от стандартного ввода, с первой буквой каждой формы , как: "t", 10, 12.25, 3, "c", 5, 2.2, 5.

Тестирование .


Это так коротко! Хорошая работа! :)
Ник Б.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.