Напишите программу, которая принимает два числа в качестве входных данных. Первый - это число измерений - 0 для точки, 1 для прямой, 2 для круга, 3 для сферы. Второе число - это радиус объекта или, если он одномерный, само число. Выведите 0 для 0 измерений. Выходными данными являются длина / площадь / объем объекта.
Если мы позвоним по первому номеру n
, второму номеру r
и выводу x
, мы получим это:
для n = 0, x = 1
для n = 1, x = 2 × r
для n = 2 x = r 2 × π
при п = 3, х = ( 4 / 3 ) × г 3 × π
и так далее ... если хочешь.
Примечания:
Случаи, когда одно или оба числа являются отрицательными, или когда первое число не является целым, не нужно покрывать.
Программа не должна читать из какого-либо файла, и единственным вводом являются эти два числа.
Выходные данные должны использовать только цифры (например, не «14 * pi») и должны быть с точностью не менее двух десятичных цифр.
Что касается n = 0, вы можете вывести 0, если это делает код короче.
Дополнительный swag для ответа, охватывающего даже 4 и более мерных "сфер"!
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
Примеры:
1 1 -> 2
2 3 -> 28,27
3 1 -> 4,19
3 4,5 -> 381,70
1 9.379 -> 18.758
0 48 -> 1
== r
- это сфера, множество точек с расстоянием от начала координат<= r
- это шар. Тогда это 0-шар = точка, 1-шар = сегмент, 2-шар = диск, 3-шар = шар, 4-шар, 5-шар и т.д. (указан как "n
-ball = общее имя").Ответы:
Желе , 13 байт + дополнительная добыча
Попробуйте онлайн!
Работает для любого измерения, при условии, что фиксированное значение π, полученное с помощью
ØP
(3.141592653589793
), является достаточно точным.Как?
источник
Mathematica, 18 байтов, до ~ 168,15 триллионов измерений
Анонимная функция. Принимает два числа в качестве входных данных и возвращает неточное число в качестве выходных данных. Работает с любым количеством измерений. Выходы
1.
для n = 0. Использует формулу из тома n-шара в Википедии.объяснение
Мы пытаемся вычислить π n / 2 / Γ ( n / 2 + 1) · R n или
N[Pi^(n/2)/Gamma[n/2 + 1] R^n]
в Mathematica. В нашем случае#
(первый аргумент) является п и#2
(второй аргумент) является R . Это оставляет нас сN[Pi^(#/2)/Gamma[#/2 + 1] #2^#] &
, что можно играть в гольф следующим образом:и, таким образом, наша оригинальная программа.
источник
!
работает и для нецелых. Использование Mathematica для этого почти похоже на обман… :)JavaScript (ES6), 45 байт + дополнительная замена
Рекурсивная формула из Википедии , должна работать для любого числа измерений
источник
R,
754038 байт (плюс дополнительный свэг)Ну, похоже, я мог бы проиграть это, отдавая и используя гамма-функцию, а не рекурсивные функции.
Определяет анонимную функцию для вычисления объема
n
многомерной гиперсферы радиусаr
.Несколько примеров:
Бесшабашное решение,
3834 байтаНа несколько байт меньше у вас может быть анонимная функция, которая работает только для измерений с 1 по 3. Возвращает
numeric(0)
дляn=0
иNA
дляn>3
. (numeric(0)
является числовым вектором длины 0;NA
предназначен для «недоступен».) В остальном производительность аналогична общему решению, приведенному выше.источник
Haskell,
746536 байт + дополнительная добычаРекурсивная формула, работает для всех измерений, которые могут быть представлены точно как число с плавающей запятой двойной точности, но будут бесконечно циклическими для нецелых измерений. Старая версия для потомства:
Работает для всех размеров. Использует формулу из манифеста Тау .product[n,n-2..1.1]
это двойной факторный хак, который не будет считать ноль дляn==2
источник
JavaScript,
61514943 байтаПоддерживаются 0-3 измерения, потому что нет 4-го измерения .
Спасибо @Hedi за сохранение 7 байтов
Создает функцию
d
. Затем возводитсяr
вn
степень и затем умножается на число в зависимости отn
использования троичных операторов. Выходы1
дляn=0
Дает вывод как минимум до 2 десятичных знаков (10+ dp)
Вот фрагмент закуски!
источник
3 dimensions that behave in the same way and one that behaves in a different way
- В этот момент он, кажется, говорит, что есть 4-е измерение, но нет 1-го, 2-го или 3-го!MATL , 17 байт
Это работает только до 3-х измерений. Входы в обратном порядке, то есть:,
r
затемn
.Попробуйте онлайн!
Рассмотрим
r=3
, вn=2
качестве примера.источник
Java / C / C ++ / C #,
6967 байт + дополнительная замена!Редактировать: 2 байта сохранены благодаря @AlexRacer
Диадическая функция - первый аргумент - число измерений, второй - радиус n-шара.
float v(int n,float r){return n<1?1:n<2?2*r:6.283f*r*r*v(n-2,r)/n;}
Рекурсивная формула для объема n-шара: V n = (2πr 2 V n-2 ) ⁄ n
Вау! Java (мой тестовый язык) превосходит Scala здесь, благодаря краткому
?:
троичному синтаксису! Эта функция синтаксически верна на всех 4 языках в заголовке, и я протестировал ее с C (MinGW GCC 5.4.0) и C # (VS Ultimate 2016, C # 6.0). Я предполагаю, что это будет работать и в C ++, так что там. Поскольку эта функция практически не зависит от библиотеки, она должна работать на любом C-подобном языке с похожим синтаксисом.источник
n==0
может быть сокращен до ,n<1
а такжеn==1
кn<2
Haskell,
52 байта для отступа табуляции42 байта + дополнительная заменаИзменить: 10 байтов сохранено благодаря @WChargin
Диадическая функция карри - первый аргумент - число измерений, второй - радиус n-шара.
Рекурсивная формула для объема n-шара: V n = (2πr 2 V n-2 ) ⁄ n
Сохраните это как отдельный файл сценария и запустите с GHCi, с функцией для проверки
v
вывода, например,show (v 3 4.5)
. Я не проверял это, пожалуйста, дайте мне знать, если это не работает.Старая программа с аппроксимацией 6.2832 для замены 2π (50 байтов с отступом табуляции):
Это может использоваться с GHCi в многострочном режиме (с использованием
:set +m
или заключением кода между:{
&:}
, вложения находятся в своих собственных строках. Требуется функция тестера.Здесь вступает в игру статическая типизация с полным выводом типа программы, что позволяет Haskell работать намного лучше, чем Scala, и приближается к Groovy, но не совсем превосходит его благодаря сопоставлению с шаблоном вместо троичного, включая некоторое повторение символов.
источник
2*pi
на6.2832
, и 47 , если отбросить скобки вокруг рекурсивного вызова:let{v 0 r=1;v 1 r=2*r;v n r=2*pi*r*r*v(n-2)r/n}
...let{}
и замените мои точки с запятой переводом строки, чтобы получить только 42 байта (без завершающего символа новой строки).Ракетка 69 байт (плюс дополнительная добыча)
Использует рекурсивную формулу из https://en.wikipedia.org/w/index.php?title=Volume_of_an_n-ball§ion=3#Recursions
Включая предложения @wchargin
Ungolfed (v = объем, d = размеры, r = радиус):
Тестирование:
Выход:
источник
v
является несвязанным (не говоря уже о других параметрах). Конечно, вам нужно посчитать,(define(v d r))
а? Это приносит вам до 82 байт ...cond
вложенныеif
выражения, уменьшив до 78 байтов(define(v d r)(if(= d 0)1(if(= d 1)(* 2 r)(*(/(* 2 pi(* r r))d)(v(- d 2)r)))))
.match
чтобы получить(define(v d r)(match d[0 1][1(* 2 r)][_(*(/(* 2 pi(* r r))d)(v(- d 2)r))]))
.Perl, 63 байта + дополнительная замена
Принимает два целых числа n и r, по одному за раз, затем выводит n-объем для заданного радиуса r n-сферы. Когда n = 0, V = 1, а когда n = 1, V = 2r. Все дальнейшие размеры рассчитываются по следующей формуле:
Так как г п является коэффициентом радиуса в каждой формуле, я оставляю его вне базового расчета и применяю его только в конце.
2π аппроксимируется в коде 6,283.
источник
Scala, 53 байта
Извините, для меня нет дополнительной добычи :(
Объяснение:
источник
JavaScript (ES6), 39 байт, без разборчивости
источник
Python 3,
767268 байт + дополнительная добыча!Рекурсивное решение с дополнительной добычей!
Возвращает
0
заn=0
Старый подход (
1
дляn=1
):Рекурсивная формула из Википедии .
Попробуйте онлайн.
источник
Python 3, 56 байт + дополнительная добыча!
Просто с дополнительной добычей!
Стандартная формула.
Попробуйте онлайн
источник
Scala,
8179 байт + дополнительная добыча!Редактировать: 2 байта сохранены благодаря @AlexRacer
Диадическая функция - первый аргумент - число измерений, второй - радиус n-шара.
def v(n:Int,r:Float):Float=if n<1 1 else if n<2 2*r else 6.2832f*r*r*v(n-2,r)/n
Рекурсивная формула для объема n-шара: V n = (2πr 2 V n-2 ) ⁄ n
Отсутствие в Scala вывода типов для возвращаемых типов рекурсивных функций и параметров функций, а также многословный троичный синтаксис вредит здесь :(
источник
Groovy,
4947 байт + дополнительная добыча!Редактировать: 2 байта сохранены благодаря @AlexRacer
Диадическая функция - первый аргумент - число измерений, второй - радиус n-шара.
def v(n,r){n<1?1:n<2?2*r:6.2832*r*r*v(n-2,r)/n}
Рекурсивная формула для объема n-шара: V n = (2πr 2 V n-2 ) ⁄ n
Динамический набор текста FTW!
Мои ответы Scala и Java используют ту же логику, но со статической типизацией, поэтому большее количество байтов из-за аннотаций типов :(. Однако Scala и Groovy позволяют опустить
return
точку с запятой и, таким образом, помогает подсчет байтов, в отличие от Java / C ...источник
Lithp , 96 символов + дополнительная добыча
Строка разделена на 2 для удобства чтения:
Думая, что мне нужно обновить парсер, чтобы он занимал меньше места. Размер кода будет сокращен, особенно в этом
((/ (* (* (* (*
разделе.Использование:
Спасибо Рудольфу за то, что он сбрил несколько байтов.
источник
3.141592653589793
" до "3.1416
", сохранения 11 байтов и при этом соответствия правилам?CJam (27 байт с дополнительным кредитом)
Набор онлайн-тестов . Это анонимный блок (функция), который принимает аргументы
d r
в стеке и оставляет результат в стеке.рассечение
Общая n-мерная формула может быть переписана как
источник