Сколько подарков ты получил на Рождество?


32

Да как много , не то, сколько ...

Как мы все знаем, большой подарок намного лучше, чем маленький. Поэтому стоимость подарков всегда должна измеряться в общем объеме, а не в количестве подарков, весе или даже в совокупной цене.

Поскольку вам не нравится сравнивать количество получаемых подарков, вам не нужен длинный сценарий, который легко увидеть и прочитать другим на рождественской вечеринке. Поэтому вам нужно сохранить как минимум количество байтов в вашем скрипте.

Ваша задача проста: создать программу, которая принимает список измерений в качестве входных данных в любом подходящем формате и выводит объединенный объем ваших подарков. Измерением каждого подарка будет либо набор из трех чисел, либо одно число. Если ввод трех чисел ( L, W, H), настоящее представляет собой кубоид измерений L x W x H. Если это одно число ( R), то это сфера радиуса R.

Правила:

  • Это может быть полная программа или функция
  • Ввод может быть в любом удобном формате
    • Если желательно, сфера может быть представлена ​​числом, за которым следуют два нуля
    • Кубоид всегда будет иметь все ненулевые размеры.
  • На выходе должно быть одно десятичное число
    • Дополнительный вывод принимается, если очевидно, что ответ
    • Вывод должен содержать как минимум две цифры после десятичной точки
    • Вывод может быть в стандартной форме / научной записи, если число больше 1000.
    • Если ваш язык не имеет Pi-константы, ответ должен быть точным до 9999,99.

Примеры:

((1,4,3),(2,2,2),(3),(4,4,4))
197.0973    // (1*4*3 + 2*2*2 + 4/3*pi*3^3 + 4*4*4)

(5)
523.5988

(5,0,0)
523.5988

Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

## Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


3
Ни одна леди не надевает шляпу в одной из этих забавных цилиндрических коробок ?
manatwork

2
@manatwork, нет, все дамы получат шляпы-котелки, и вы легко можете поместить их в сферу = P
Stewie Griffin

1
Я предполагаю, что (5)это только частичный пример, и наш код должен обрабатывать только ((5)).
manatwork

2
Если наш язык выбора не имеет константы Pi, какая точность требуется?
Деннис

1
@manatwork, + и * в порядке, если они не означают сложение и умножение (или другие операции) на языке, который вы используете.
Стьюи Гриффин

Ответы:


10

Желе , 19 18 байт

Zµ*3×1420÷339Ḣo@PS

Попробуйте онлайн!

К сожалению, у Jelly еще нет π- константы, а векторизатор не обрабатывает плавающие объекты должным образом.

Чтобы преодолеть эти проблемы, вместо умножения на 4/3 , мы умножаем на 1420 и делим на 339 . С 1420 ÷ 339 = 4,18879056… и 4π / 3 = 4,18879020… , это достаточно точно, чтобы соответствовать правилам.

Новейшая версия Jelly могла бы выполнить эту задачу в 14 байтов с большей точностью.

Zµ*3×240°Ḣo@PS

Попробуйте онлайн!

Как это работает

Zµ*3×1420÷339Ḣo@PS  Left argument: A, e.g., [[1, 2, 3], [4, 0, 0]]

Z                   Zip A; turn A into [[1, 4], [2, 0], [3, 0]].
 µ                  Begin a new, monadic chain with zip(A) as left argument.
  *3                Cube all involved numbers.
    ×1420           Multiply all involved numbers by 1420.
         ÷339       Divide all involved numbers by 339.
                    This calculates [[4.19, 268.08], [33.51, 0], [113.10, 0]]
             Ḣ      Head; retrieve the first array.
                    This yields [4.19, 268.08].
                P   Take the product across the columns of zip(A).
                    This yields [6, 0].
              o@    Apply logical OR with swapped argument order to the results.
                    This replaces zeroes in the product with the corresponding
                    results from the left, yielding [6, 268.08].
                 S  Compute the sum of the resulting numbers.

×240°Вместо этого используется неконкурентная версия ×1420÷339, которая умножается на 240 и преобразует продукты в радианы.


9

Haskell, 40 байт

q[x]=4/3*pi*x^^3
q x=product x
sum.map q

Пример использования: sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]-> 197.09733552923254.

Как это работает: Для каждого элемента входного списка: если у него есть один элемент, xвычислите объем сферы, иначе возьмите product. Подводя итог.


1
Является ли этот способ подсчета байтов в целом допустимым? Я бы сказал p=sum.map q(а затем сказал, чтобы использовать pв списке списков номеров)
Лейф Виллертс

1
@LeifWillerts: недавно появилась тема мета, которая позволяет неназванным функциям передавать глобальные определения. sum.map qэто безымянная функция, от которой зависит q, так что я думаю, это нормально.
Ними

9

Pyth, 19 18 байт

sm|*Fd*.tC\ð7^hd3Q

1 байт благодаря Денису

демонстрация

Формат ввода - список списков:

[[1,4,3],[2,2,2],[3,0,0],[4,4,4]]

Он просто умножает размеры вместе, чтобы вычислить объем куба. Если это выходит на ноль, он рассчитывает объем сферы.

Константа сферы, 4/3*piрассчитывается как 240 градусов в радианах. .t ... 7преобразует вход в градусах в радианы и C\ðвычисляет кодовую точку ð, которая составляет 240.


7

Python 2, 86 70 байт

lambda i:sum(x[0]*x[1]*x[2]if len(x)>1 else x[0]**3*4.18879for x in i)

Я получил твой счет 86, как ты получил свой?
wnnmaw

Кроме того, вы можете сохранить байты, просто вручную введя значение для пи, вы можете использовать до 3.14159265358979323безубыточности
wnnmaw

@wnnmaw Я забыл посчитать импорт -.-
TFeld

Я считаю, что твое жестко запрограммированное значение для пи немного не
подходит

4
@wnnmaw Это не Пи; это 4Pi / 3.
Деннис

5

Mathematica, 34 байта

Tr[1.##&@@@(#/.{r_}:>{4r^3/3Pi})]&

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

Сначала мы заменяем отдельные значения объемом соответствующей сферы на /.{r_}:>{4r^3/3Pi}. Затем мы умножаем содержимое каждого списка на 1.##&@@@. Наконец, мы вычисляем сумму как след вектора с Tr[...].


5

JavaScript (ES6), 56

l=>l.map(([x,y,z])=>t+=y?x*y*z:x*x*x*4/3*Math.PI,t=0)&&t

Более разумная .reduce версия на 1 байт длиннее

l=>l.reduce((t,[x,y,z])=>t+(y?x*y*z:x*x*x*4/3*Math.PI),0)

Вы можете сэкономить пару байтов, используя 4.11879вместо 4/3*Math.PI, так как это должно быть достаточно точным, чтобы претендовать.
ETHproductions

@ETHproductions да, но In case your language doesn't have a Pi-constant,мой язык имеет константу PI, поэтому я не знаю, соответствует ли она требованиям
edc65

5

Python, 49 байт

lambda l:sum(a*b*c or a**3*4.18879for a,b,c in l)

Использует представление сфер как (a,0,0). Рассматриваемый как кубоид, он имеет объем 0, в этом случае вместо него используется объем сферы. Мне не ясно, насколько точной должна быть константа, поэтому я надеюсь, что этого достаточно.


4

MATL , 20 байтов

it!ptbw~)3^4*3/XT*hs

Формат ввода - это матрица, в которой каждая строка описывает куб или сферу. Сфера определяется только первым числом в этой строке; два других числа равны нулю. Итак, первый пример из задачи будет:

[1 4 3; 2 2 2; 3 0 0; 4 4 4]

При этом используется текущая версия языка 2.0.2 , которая является более ранней, чем эта проблема.

Примеры:

>> matl it!ptbw~)3^4*3/XT*hs
> [1 4 3; 2 2 2; 3 0 0; 4 4 4]
197.0973355292326

>> matl it!ptbw~)3^4*3/XT*hs
> [5 0 0]
523.5987755982989

Объяснение:

i             % input matrix
t!            % duplicate and transpose: each object is now a column
p             % product of elements in each column
t             % duplicate                                               
b             % bubble up top-third element in stack                              
w             % swap top two elements in stack                                  
~             % logical 'not'. This gives logical index of speheres                 
)             % reference () indexing. This is a logical-linear index to get sphere radii
3^4*3/XT*     % formula for volume of spehere; element-wise operations
h             % horizontal concatenation                                
s             % sum                

3

Пролог, 115 100 байт

Код:

[]*0.
[[L,W,H]|T]*V:-W=0,X is 4*pi*L^3/3,T*Y,V is X+Y;X is L*W*H,T*Y,V is X+Y.
p(L):-L*V,write(V).

Разъяснение:

[]*0.
[[L,W,H]|T]*V:-W=0,                           % When 2nd dimension is 0
                  X is 4*pi*L^3/3,            % Calc volume of sphere
                  T*Y,                        % Recurse over list
                  V is X+Y                    % Sum volumes
                  ;                           % When we have a cube
                  X is L*W*H,                 % Calc cube volume
                  T*Y                         % Recurse over list
                  V is X+Y.                   % Sum volumes
p(L):-L*V,                                    % Get combined volume of list of lists
      write(V).                               % Print volume

Примеры:

p([[1,4,3],[2,2,2],[3,0,0],[4,4,4]]).
197.09733552923257

p([[5,0,0]]).
523.5987755982989

Попробуйте онлайн здесь

Изменить: 15 байтов сохранены путем определения диадического предиката.


3

Perl, 52 47 байт

s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g}{

46 + 1 для -p (это было обычным делом; дайте мне знать, если здесь все по-другому, и я обновлю)

Использование: положить в файл и echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl

С комментариями:

s/,/*/g                # x,y,z becomes x*y*z
||                     # if that fails,
s@$@**3*1420/339@      # x becomes x**3 * 1420/339
,                      # 
$\+=eval               # evaluate the expression and accumulate
for/\S+/g              # iterate groups of non-whitespace
}{                     # -p adds while(<>){...}continue{print}; resets $_

обновление 47 Спасибо @Dennis за сохранение некоторых байтов с помощью этого трюка .


s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{сохраняет несколько байтов.
Деннис

@ Деннис Спасибо! Я пытался с $ \ раньше, но сброс $_стоимости так же. Все еще неясно, почему $_сбрасывается в новом блоке, хотя .. Является ли $_блок локальным в while(<>){}?
Кенни

Да, $_это переменная по умолчанию для текущей области. В блоке END он не определен.
Деннис

2

CJam, 24 21 байт

q~{3*)4P*3/*+3<:*}%:+

Проверьте это здесь.

объяснение

q~       e# Read and evaluate input.
{        e# Map this block over the list of presents...
  3*     e#   Repeat the list of lengths 3 times. This will expand cuboids to 9 elements
         e#   and spheres to three copies of the radius.
  )      e#   Pull off the last element.
  4P*3/* e#   Multiply by 4 pi / 3.
  +      e#   Add it back to the list of lengths.
  3<     e#   Truncate to 3 elements. This is a no-op for spheres, which now have three
         e#   elements [r r 4*pi/3*r] but discards everything we've done to cuboids, such
         e#   that they're reduced to their three side lengths again.
  :*     e#   Multiply the three numbers in the list.
}%
:+       e# Sum all the individual volumes.

2

PowerShell, 67 байт

($args|%{($_,((,$_*3)+4.18879))[$_.count-eq1]-join'*'})-join'+'|iex

Некоторая черная магия происходит здесь. Я постараюсь пройти через это гладко.

Сначала мы берем наш ввод, ожидаемый как отдельные массивы, разделенные запятыми, например (1,4,3) (2,2,2) (3) (4,4,4), и направляем их в цикл |%{}.

Внутри цикла мы сначала проверяем, имеет ли $_конкретный рассматриваемый массив только один элемент, и используем его для индексации в массив (по существу, более короткую конструкцию if / else). Если это более одного элемента, предположим, в (1,4,3)качестве входных данных, мы выполняем первую половину, которая просто выплевывает массив $_, например (1,4,3). В противном случае, мы создаем новый динамический массив, состоящий из элемента три раза, (,$_*3)и добавляем приближение 4/3 * Pi. Для ввода(3) это приведет к (3,3,3,4.18879)выводу.

Да, PowerShell имеет константу Pi, доступ к которой осуществляется через вызов .NET [math]::PI , но это больше, и я не хочу ее использовать. :п

Несмотря на это, мы объединяем этот выходной массив со звездочками через -join'*', так что "1*4*3". Как только мы полностью пройдем цикл, у нас теперь есть коллекция строк. Мы -join'+'все вместе для нашего дополнения, иiex выражения для расчета результата.

Уф.


1

Рубин, 58 знаков

->b{b.reduce(0){|t,s|a,b,c=*s;t+(c ?a*b*c :a**3*4.18879)}}

Образец прогона:

2.1.5 :001 ->b{b.reduce(0){|t,s|a,b,c=*s;t+(c ?a*b*c :a**3*4.18879)}}[[[1,4,3],[2,2,2],[3],[4,4,4]]]
 => 197.09733

Рубин, 50 знаков

Улучшение идея бесстыдно украдена из edc65 «s JavaScript ответа .

->b{t=0;b.map{|a,b,c|t+=c ?a*b*c :a**3*4.18879};t}

Образец прогона:

2.1.5 :001 > ->b{t=0;b.map{|a,b,c|t+=c ?a*b*c :a**3*4.18879};t}[[[1,4,3],[2,2,2],[3],[4,4,4]]]
 => 197.09733

1

Japt, 27 22 байта

N®r*1 ª4/3*M.P*Zg ³} x

Принимает ввод как разделенные пробелами массивы. Попробуйте онлайн!

Как это работает

N®   r*1 ª 4/3*M.P*Zg ³  } x
NmZ{Zr*1 ||4/3*M.P*Zg p3 } x

          // Implicit: N = array of input arrays
NmZ{   }  // Map each item Z in N to:
Zr*1      //  Reduce Z with multiplication.
||4/3*M.P //  If this is falsy, calculate 4/3 times Pi
*Zg p3    //  times the first item in Z to the 3rd power.
x         // Sum the result.
          // Implicit: output last expression


1

Пип , 23 байта

{$*a|4/3*PI*@a**3}MSg^s

Есть несколько способов внести свой вклад в эту программу. Он может принимать каждый подарок в качестве аргумента командной строки из трех чисел, разделенных пробелами (которые нужно будет заключить в кавычки:) pip.py present.pip "1 4 3" "3 0 0". В качестве альтернативы, укажите -rфлаг и дайте каждому подарок в виде строки стандартного ввода, состоящей из трех разделенных пробелами чисел.Попробуйте онлайн!

Как?

                         g is list of cmdline args (or lines of stdin, if using -r flag)
                         s is space, PI is what it says on the tin (implicit)
                    g^s  Split each argument on spaces, so we have a list of lists
{                }MS     Map this function to each sublist and sum the results:
 $*a                      Fold the list on * (i.e. take the product)
    |                     Logical OR: if the above value is zero, use this value instead:
     4/3*PI*              4/3 pi, times
            @a            First element of the list
              **3         Cubed
                         Autoprint the result

0

Perl 5, 142 байта

Запустите с -pпомощью командной строки и введите числа, разделенные запятой, например:

5,0,0 или (5,0,0)

будет производить

523.598820058997

В piPerl нет ключевого слова. В большинстве случаев это точно соответствует указанным значимым цифрам, однако даже если бы я набрал все известные мне числа пи, это было бы не очень точно для некоторых вычислений. Так что я оставил это с3.1415 . Я не уверен, является ли это приемлемым или нет.

Код:

@a=$_=~/(\d+,*)/g;$_=0;@n = map(split(/\D/),@a);for($i=0;$i<$#n;$i+=3){$x=$n[$i];$n[$i+1]==0?$_+=1420/339*$x**3:$_+=($x*$n[$i+1]*$n[$i+2]);}

Отредактировано для большей точности по совету Денниса, который лучше в базовой математике, чем я, и по предложению MichaelT сэкономить байты, оставаясь при этом точным.


2
1. Как бы вы разобрались 1511? 2. 3.1415 не является ни округленным должным образом, ни достаточно точным. Если мои расчеты верны, ошибка не должна превышать 0,0000017 . 3. (4/3)*3.1415можно заменить одним поплавком.
Деннис

1. ОП говорит, что мы можем принять конечные нули для сфер (что фактически является примером ввода, который я предоставил), 2. Я не знаю, какие вычисления вы используете, но уверен, я увеличу точность, и 3 Хорошее предложение, я пропустил это. Благодарность!
Codefun64

У меня нет ресурсов передо мной в данный момент, хотя мне интересно 1420/339, даст ли выполнение несколько байтов назад с разумным приближением. (это 4/3 * 355/113). Разница между дробью и значением, которое у вас есть, составляет -8,49130615e-8

@MichaelT Это самая интересная вещь. У вас есть скрипт, который находит наименьшее дробное представление чисел? ;)
Codefun64

Codefun64 Я только что работал от другого общего приближения для пи. 22/7 не в пределах допустимого, поэтому я заглянул на en.wikipedia.org/wiki/Approximations_of_%CF%80 и использовал следующий, чтобы увидеть, имеет ли он допуск лучше, чем тот, который запрашивал @Dennis.

0

Луа, 115 104 байта

function f(a)b=0 for i=1,#a do c=a[i]b=b+(1<#c and c[1]*c[2]*c[3]or(4/3)*math.pi*c[1]^3)end return b end

Простое решение, я должен заключить псевдо-троичную операцию <condition> and <non-false> or <value if false>в круглые скобки, иначе b будет суммироваться с обеими областями.

Ввод должен быть в форме, array={{1,4,3},{2,2,2},{3},{4,4,4}}а результат можно увидеть, выполнив print(f(array)).


0

05AB1E , 18 16 байт

εDgi3m4žq*3/*]PO

Попробуйте онлайн.

Объяснение:

ε                # Map each inner list of the (implicit) input to:
 D               #  Duplicate the current inner list
  gi             #  Is the length 1 (is it an `R`):
    3m           #   Take the duplicated current item and take its cube
                 #    i.e. [3] → [27]
      žq         #   PI
        4*       #   Multiplied by 4
          3/     #   Divided by 3
                 #    → 4.1887902047863905
            *    #   And multiply it with the current cubed `R`
                 #    [27] and 4.1887902047863905 → [113.09733552923254]
]                # Close both the if and map
 P               # Take the product of each inner list
                 #  i.e. [[1,4,3],[2,2,2],[113.09733552923254],[4,4,4]]
                 #   → [12,8,113.09733552923254,64]
  O              # Take the total sum (and output implicitly)
                 #  i.e. [12,8,113.09733552923254,64] → 197.09733552923254

0

Р, 38 36 байт

function(x,y=4*pi/3*x,z=x)sum(x*y*z)

Использует аргументы по умолчанию для переключения между случаями: с тремя аргументами вычисляет произведение, а с одним аргументом вычисляет формулу сферы.


тебе нужно f<-и то {}?
Джузеппе

Этот код не выводится правильно для теста (5,0,0). Кроме того, он не учитывает контрольный пример, в котором есть несколько подарков, а объемы необходимо суммировать вместе.
Роберт С.

Для (5,0,0) я получаю ноль - это не правильно? Отредактировал для использования sum(и удалил некоторые вещи, которые не были необходимы по предложению Джузеппе)
JDL
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.