Ну, хотя этот вызов оказался огромным успехом, он также оказался очень тривиальным для решения. Поэтому для тех, кто ищет более сложную задачу, я создал продолжение этой задачи, в котором теперь необходимо подсчитать количество уникальных прямоугольников. Проверьте это!
Теперь для тех из вас, кто хочет решить эту проблему проблему, вот оно.
Ну, у нас пока нет такой задачи, так что мы здесь.
Рассмотрим эту 3 x 3
сетку прямоугольников:
Сколько есть прямоугольников? Что ж, считая визуально, мы можем видеть, что на самом деле есть 36
прямоугольники, включая всю плоскость, которые все показаны в анимированном GIF ниже:
Задание
Подсчет прямоугольников, как показано выше, является задачей. Другими словами, учитывая, что 2 целых числа больше или равны 0
, m
и n
, где m
представляет ширину и n
высоту, выведите общее количество прямоугольников в этомm x n
сетке прямоугольников.
правила
Использование любых встроенных программ, которые непосредственно решают эту проблему, явно запрещено.
Эта задача не в том, чтобы найти самый короткий ответ, а в том, чтобы найти самый короткий ответ на каждом языке. Поэтому ответ не будет принят.
Стандартные лазейки запрещены.
Тестовые случаи
Представлено в формате Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Ссылки
Помните, это код-гольф , поэтому выигрывает самый короткий код!
588
на последний тест-кейс.Ответы:
Python, 22 байта
Формула
m*n*(m+1)*(n+1)/4
сокращается с использованием битового дополнения~m=-(m+1)
, выраженного(m+1)*(n+1)
как~m*~n
.Почему количество прямоугольников
m*n*(m+1)*(n+1)/4
? Каждый прямоугольник определяется выбором двух горизонтальных линий (сверху и снизу) и двух вертикальных линий (слева и справа). Естьm+1
горизонтальные линии, из которых мы выбираем подмножество двух разных. Так что количество вариантов естьchoose(m+1,2)
, которое естьm*(m+1)/2
. Умножение наn*(n+1)/2
выбор для вертикальных линий дает результат.источник
Желе , 4 байта
Попробуйте онлайн!
Кроме того, также 4 байта
Попробуйте онлайн!
источник
בHP
и,‘c2P
возможно, другие 4-байтовые альтернативы.nth
иmth
треугольного числа.R
преобразует каждое число в 1 на основе индекса на:[1, 2, ..., n]
.S
это сумма и€
означает «каждый» , поэтому каждый список суммируются, давая список как:[nth triangle number, mth triangle number]
. ЗатемP
берется произведение этого списка, которое дает желаемый результат.Javascript (ES6), 17 байт
Вилка этого ответа .
источник
Mathematica, 15 байт
Это безымянная функция, принимающая два целочисленных аргумента и возвращающая количество прямоугольников.
объяснение
Реализация в основном представляет собой очень сложную форму произведения двух треугольных чисел. Возможно, стоит прочитать раздел «Последовательность аргументов» в этом посте , но я постараюсь обобщить суть здесь.
##
расширяется до последовательности всех аргументов. Это похоже на сплаттинг на других языках. Например, если аргументы есть3
и4
, то{1, 2, ##, 5}
даст вам{1, 2, 3, 4, 5}
. Но это не только работает в списках, но в любом выражении, напримерf[1, 2, ##, 5]
, также будетf[1, 2, 3, 4, 5]
.Это становится интересным, когда вы объединяетесь
##
с операторами. Все операторы в Mathematica - это просто короткиеf[...]
выражения для некоторого подобного выражения (возможно, вложенного). Например,a+b
этоPlus[a, b]
и есть наa-b
самом делеPlus[a, Times[-1, b]]
. Теперь, когда вы объединяете##
с операторами, Mathematica сначала расширяет операторы, обрабатывая их##
как один операнд, и расширяет их только в конце. Вставляя##
в правильные места, мы можем использовать его как для умножения, так и для добавления операндов.Давайте сделаем это для кода выше:
Развернув его до полной формы, мы получим следующее:
Давайте вставим аргументы функции
a
иb
:А теперь мы конвертируем его обратно в стандартную математическую запись:
Небольшая перестановка показывает, что это произведение треугольных чисел:
Забавный факт: эта реализация настолько игривая, она имеет ту же длину, что и встроенная для вычисления одного треугольного числа
PolygonalNumber
.источник
C, 25 байтов
Пуристическая версия (27):
Версия ISO-er (35):
источник
Медуза , 16 байт
Формат ввода есть
[x y]
, вывод - это просто результат.Попробуйте онлайн!
Альтернативное решение с тем же количеством байтов:
объяснение
Время дать медузу представление, которого она заслуживает! :)
Медуза - это язык Згарба , основанный на его 2D-синтаксисе . Семантика в значительной степени вдохновлена J, но синтаксис - произведение искусства. Все функции являются отдельными символами и расположены на сетке. Функции берут свои аргументы из следующего токена к югу и востоку от них и возвращают результат к северу и западу. Это позволит вам создать интересную сеть вызовов функций, где вы будете повторно использовать значения, передавая их в несколько функций из разных направлений.
Если мы игнорируем тот факт, что некоторые из токенов в вышеприведенной программе являются специальными операторами (высокоуровневые функции), вышеприведенная программа будет написана примерно так на нормальном языке:
Давайте рассмотрим код снизу вверх. Ввод получает от
i
, который, следовательно, оценивается в[x y]
.+
На вершине этого получает этот вход вместе с буквальным1
и , следовательно , увеличивает оба элемента , чтобы дать[(x+1) (y+1)]
(большинство операций нанизаны автоматически над списками).Другое значение
i
отправляется влево, ноE
раскол является восточным аргументом север и запад. Это означает, что входные данные на*
самом деле являются фактическими,[x y]
и[(x+1) (y+1)]
поэтому это вычисляется[x*(x+1) y*(y+1)]
.Следующий
*
шаг на самом деле изменяется предшествующим,/
что превращает его в операцию сгиба. Складывание*
пары просто умножает это, так что мы получаемx*(x+1)*y*(y+1)
.Теперь
%
это просто деление, поэтому оно вычисляетx*(x+1)*y*(y+1)/4
. К сожалению, это приводит к плавающему значению, поэтому нам нужно округлить его с одинарным|
. Наконец, передается это значение,p
которое печатает конечный результат.источник
R,
4035 байтНу что ж, пора прыгать в глубокий конец! Вот мой код R , вдохновленный ответом @xnor:
РЕДАКТИРОВАТЬ : В этой версии R будет запрашивать ввод дважды.
источник
cat(prod(choose(scan()+1,2)))
составляет 29 байт.CJam,
1210 байт2 байта сохранены благодаря Мартину.
Попробуйте онлайн!
Это блок, который берет список из 2 элементов из стека и оставляет решение в стеке. Используется полная программа для тестирования:
riari+{_:)+:*4/}~
.Основано на выдающемся решении xnor Python.
Объяснение:
источник
{_:~+:*4/}
~
в CJam вообще нет необходимости использовать . Просто используйте)
.Matlab,
2319 байтРеализация формулы
m*n*(m+1)*(n+1)/4
использования:
ans([m,n])
источник
MATL , 6 байтов
Ввод является массивом формы
[m,n]
.Попробуйте онлайн!
объяснение
Прямые вычисления по формуле
m*(m+1)*n*(n+1)/4
.источник
J, 8 байт
Использование:
источник
Java 7,
3938 байтЯва 8,
2625191817 байтОсновано на превосходном ответе @xnor . Несколько байтов сохранено благодаря @DavidConrad . Попробуй это здесь.
Тестовый код (Java 7):
Попробуй это здесь.
Выход:
источник
return
иa->b->
на один байт короче(a,b)->
.Function<Integer, Function<Integer, Integer>>
в качестве параметра, за ней не следовала бы точка с запятой.;
на одном утверждении J8 лямбда-выражений.return
.. Кроме того, я почти никогда не программирую на Java 8 (отсюда и все мои ответы на Java 7), но как мне начатьa->b->
работать? Вот идеон для текущего дела.MathOperation.operation
чтобы принимать только одинint
, то возвращаетсяFunction<Integer, Integer>
, и когда вы звоните, вы сначала пройти только первый параметр,a
и затем вызвать.apply(b)
наFunction
. Вам также необходимо импортироватьjava.util.function.Function
. Вот идеон с изменениями.Рубин, 22 байта
Кража уловки @ xnor и создание лямбды
Пример вызова:
Или как процесс, также 22 байта:
Который мы могли бы тогда назвать:
источник
Лабиринт ,
1311 байтПопробуйте онлайн!
объяснение
Это также вычисляет произведение треугольных чисел, как и большинство ответов. Ведущий блок 2x2 представляет собой небольшой цикл:
На первой итерации
*
ничего не делает, так что реальный порядок циклов такой:Оставшийся код просто линейный:
Затем Лабиринт пытается выполнить
/
снова, что завершает программу из-за деления на ноль.источник
Пайк, 6 байт
Попробуй это здесь!
источник
05AB1E, 4 байта
объяснение
Использует формулу, описанную в A096948
Принимает ввод как [n, m] .
Попробуйте онлайн
источник
Пиф,
86 байтовДва байта сохранены благодаря @DenkerAffe.
Ввод ожидается в виде списка
[m,n]
. Попробуйте это здесь .Объяснение:
источник
F
вместо.*
и удалить,Q
поскольку он добавлен неявно.F
но я не мог понять, как его использовать, и решил, что мне нужно использовать.*
вместо этого ... Спасибо!C #, 19 байт
Анонимная функция, основанная на ответе @ xnor.
источник
Луа,
7463 байтаФункция принимает входные данные в качестве числовых параметров.
Из-за того, как реализован Lua, технически это функция с переменными аргументами, которую можно вызвать, обернув ее в оператор «function» или загрузив ее из исходного кода с помощью «loadstring»
источник
Чеддер , 23 байта
источник
n*(n+1)
можно сыграть в гольфn^2+n
m->n->...
Brain-Flak ,
8480 байтовПопробуйте онлайн!
Вероятно, очень неоптимальный, особенно из-за повторного использования кода в отношении номеров треугольников, но по крайней мере у нас есть решение Brain-Flak, которое работает.
К сожалению, кажется, что это невозможно, бесконечно зацикливаясь на
0 0
тестовом примере, но все остальные работают нормально.источник
Выпуклый, 7 байт
Я знаю, что это может быть меньше, я просто не могу понять, как еще ...
Попробуйте онлайн! , Использует кодировку CP-1252.
источник
APL (Дьялог) , 9 байт
Попробуйте онлайн!
источник
Пыть , 3 байта
Объяснение:
Попробуйте онлайн!
источник