Скільки подарунка ви отримали на Різдво?


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

Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## 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
Жодна леді не отримує капелюха в одній із тих кумедних циліндричних коробок ?
манастирство

2
@manatwork, ні, всі дами отримають капелюшки з боулером, і ви можете легко помістити ті, хто знаходиться у кулі = P
Стюі Гріффін

1
Я припускаю, що (5)це лише частковий приклад, і наш код повинен лише обробляти ((5)).
манатура

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

Піт, 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 Я забув порахувати імпорт -.-
TFeld

Я вважаю, що ваше
твердо кодоване

4
@wnnmaw Це не Пі; це 4Pi / 3.
Денніс

5

Математика, 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

Пітон, 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;}{економить кілька байт.
Денніс

@Dennis Дякую! Я намагався з $ \ раніше, але скидання $_коштувало стільки ж. Досі незрозуміло, чому $_скидається в новий блок, хоча .. $_Блок локальний у 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 / 3rd * Pi. Для введення (3)це призведе до (3,3,3,4.18879)виходу.

Так, у PowerShell є константа Pi, доступ до якої здійснюється через виклик .NET [math]::PI, але це довше, і я не хочу її використовувати. : с

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

Phew.


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прапор і подаруйте кожному присутнім рядок stdin, що складається з трьох розділених пробілами чисел. Спробуйте в Інтернеті!

Як?

                         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]);}

Відредагований для більшої точності за порадою Денніса, який краще займається базовою математикою, ніж я, і за пропозицією Майклта зберегти байти, залишаючись точними.


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 Я щойно працював над іншим загальним наближенням для pi. 22/7 не в достатній толерантності, тому я поглянув на en.wikipedia.org/wiki/Approximations_of_%CF%80 a, використовуючи наступний, щоб побачити, чи має він допуск краще, ніж те, про що просив @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

R, 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.