Да как много , не то, сколько ...
Как мы все знаем, большой подарок намного лучше, чем маленький. Поэтому стоимость подарков всегда должна измеряться в общем объеме, а не в количестве подарков, весе или даже в совокупной цене.
Поскольку вам не нравится сравнивать количество получаемых подарков, вам не нужен длинный сценарий, который легко увидеть и прочитать другим на рождественской вечеринке. Поэтому вам нужно сохранить как минимум количество байтов в вашем скрипте.
Ваша задача проста: создать программу, которая принимает список измерений в качестве входных данных в любом подходящем формате и выводит объединенный объем ваших подарков. Измерением каждого подарка будет либо набор из трех чисел, либо одно число. Если ввод трех чисел ( 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
var QUESTION_ID=67027,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
(5)
это только частичный пример, и наш код должен обрабатывать только((5))
.Ответы:
Желе ,
1918 байтПопробуйте онлайн!
К сожалению, у Jelly еще нет π- константы, а векторизатор не обрабатывает плавающие объекты должным образом.
Чтобы преодолеть эти проблемы, вместо умножения на 4/3 , мы умножаем на 1420 и делим на 339 . С 1420 ÷ 339 = 4,18879056… и 4π / 3 = 4,18879020… , это достаточно точно, чтобы соответствовать правилам.
Новейшая версия Jelly могла бы выполнить эту задачу в 14 байтов с большей точностью.
Попробуйте онлайн!
Как это работает
×240°
Вместо этого используется неконкурентная версия×1420÷339
, которая умножается на 240 и преобразует продукты в радианы.источник
Haskell, 40 байт
Пример использования:
sum.map q $ [[1,4,3],[2,2,2],[3],[4,4,4]]
->197.09733552923254
.Как это работает: Для каждого элемента входного списка: если у него есть один элемент,
x
вычислите объем сферы, иначе возьмитеproduct
. Подводя итог.источник
p=sum.map q
(а затем сказал, чтобы использоватьp
в списке списков номеров)sum.map q
это безымянная функция, от которой зависитq
, так что я думаю, это нормально.Pyth,
1918 байт1 байт благодаря Денису
демонстрация
Формат ввода - список списков:
Он просто умножает размеры вместе, чтобы вычислить объем куба. Если это выходит на ноль, он рассчитывает объем сферы.
Константа сферы,
4/3*pi
рассчитывается как 240 градусов в радианах..t ... 7
преобразует вход в градусах в радианы иC\ð
вычисляет кодовую точкуð
, которая составляет 240.источник
Python 2,
8670 байтисточник
3.14159265358979323
безубыточностиMathematica, 34 байта
Безымянная функция, которая принимает вложенный список длин и возвращает объем в виде действительного числа.
Сначала мы заменяем отдельные значения объемом соответствующей сферы на
/.{r_}:>{4r^3/3Pi}
. Затем мы умножаем содержимое каждого списка на1.##&@@@
. Наконец, мы вычисляем сумму как след вектора сTr[...]
.источник
JavaScript (ES6), 56
Более разумная
.reduce
версия на 1 байт длиннееисточник
4.11879
вместо4/3*Math.PI
, так как это должно быть достаточно точным, чтобы претендовать.In case your language doesn't have a Pi-constant,
мой язык имеет константу PI, поэтому я не знаю, соответствует ли она требованиямPython, 49 байт
Использует представление сфер как
(a,0,0)
. Рассматриваемый как кубоид, он имеет объем 0, в этом случае вместо него используется объем сферы. Мне не ясно, насколько точной должна быть константа, поэтому я надеюсь, что этого достаточно.источник
MATL , 20 байтов
Формат ввода - это матрица, в которой каждая строка описывает куб или сферу. Сфера определяется только первым числом в этой строке; два других числа равны нулю. Итак, первый пример из задачи будет:
При этом используется текущая версия языка 2.0.2 , которая является более ранней, чем эта проблема.
Примеры:
Объяснение:
источник
Пролог,
115100 байтКод:
Разъяснение:
Примеры:
Попробуйте онлайн здесь
Изменить: 15 байтов сохранены путем определения диадического предиката.
источник
Perl,
5247 байт46 + 1 для
-p
(это было обычным делом; дайте мне знать, если здесь все по-другому, и я обновлю)Использование: положить в файл и
echo 1,4,3 2,2,2 3 4,4,4 | perl -p x.pl
С комментариями:
обновление 47 Спасибо @Dennis за сохранение некоторых байтов с помощью этого трюка .
источник
s/,/*/g||s@$@**3*4.18879@,$\+=eval for/\S+/g;}{
сохраняет несколько байтов.$_
стоимости так же. Все еще неясно, почему$_
сбрасывается в новом блоке, хотя .. Является ли$_
блок локальным вwhile(<>){}
?$_
это переменная по умолчанию для текущей области. В блоке END он не определен.CJam,
2421 байтПроверьте это здесь.
объяснение
источник
PowerShell, 67 байт
Некоторая черная магия происходит здесь. Я постараюсь пройти через это гладко.
Сначала мы берем наш ввод, ожидаемый как отдельные массивы, разделенные запятыми, например
(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
выражения для расчета результата.Уф.
источник
Рубин, 58 знаков
Образец прогона:
Рубин, 50 знаков
Улучшение идея бесстыдно украдена из edc65 «s JavaScript ответа .
Образец прогона:
источник
Japt,
2722 байтаПринимает ввод как разделенные пробелами массивы. Попробуйте онлайн!
Как это работает
источник
R 70 байт
Попробуйте онлайн!
источник
Пип , 23 байта
Есть несколько способов внести свой вклад в эту программу. Он может принимать каждый подарок в качестве аргумента командной строки из трех чисел, разделенных пробелами (которые нужно будет заключить в кавычки:)
pip.py present.pip "1 4 3" "3 0 0"
. В качестве альтернативы, укажите-r
флаг и дайте каждому подарок в виде строки стандартного ввода, состоящей из трех разделенных пробелами чисел.Попробуйте онлайн!Как?
источник
Perl 5, 142 байта
Запустите с
-p
помощью командной строки и введите числа, разделенные запятой, например:5,0,0
или(5,0,0)
будет производить
523.598820058997
В
pi
Perl нет ключевого слова. В большинстве случаев это точно соответствует указанным значимым цифрам, однако даже если бы я набрал все известные мне числа пи, это было бы не очень точно для некоторых вычислений. Так что я оставил это с3.1415
. Я не уверен, является ли это приемлемым или нет.Код:
Отредактировано для большей точности по совету Денниса, который лучше в базовой математике, чем я, и по предложению MichaelT сэкономить байты, оставаясь при этом точным.
источник
1511
? 2. 3.1415 не является ни округленным должным образом, ни достаточно точным. Если мои расчеты верны, ошибка не должна превышать 0,0000017 . 3.(4/3)*3.1415
можно заменить одним поплавком.1420/339
, даст ли выполнение несколько байтов назад с разумным приближением. (это 4/3 * 355/113). Разница между дробью и значением, которое у вас есть, составляет -8,49130615e-8Луа,
115104 байтаПростое решение, я должен заключить псевдо-троичную операцию
<condition> and <non-false> or <value if false>
в круглые скобки, иначе b будет суммироваться с обеими областями.Ввод должен быть в форме,
array={{1,4,3},{2,2,2},{3},{4,4,4}}
а результат можно увидеть, выполнивprint(f(array))
.источник
05AB1E ,
1816 байтПопробуйте онлайн.
Объяснение:
источник
Р,
3836 байтИспользует аргументы по умолчанию для переключения между случаями: с тремя аргументами вычисляет произведение, а с одним аргументом вычисляет формулу сферы.
источник
f<-
и то{}
?(5,0,0)
. Кроме того, он не учитывает контрольный пример, в котором есть несколько подарков, а объемы необходимо суммировать вместе.sum
(и удалил некоторые вещи, которые не были необходимы по предложению Джузеппе)