Учитывая список натуральных чисел, найдите количество треугольников, которые мы можем сформировать так, чтобы их стороны были представлены тремя различными записями входного списка.
(Вдохновение исходит от ЧР .)
Детали
- Треугольник может быть сформирован, если все перестановки трех сторон длины удовлетворяют строгому неравенству треугольника(Это означает, что a + b> c , a + c> b и b + c> a должны быть выполнены).
- Три длины сторон должны появляться в разных позициях в списке, но не обязательно должны быть попарно разными.
- Порядок трех чисел в списке ввода не имеет значения. Если мы рассмотрим список
a
и три числаa[i], a[j], a[k]
(гдеi,j,k
они попарно различны), то(a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])
и т. Д. Все они рассматриваются как один и тот же треугольник. - Предполагается, что входной список содержит не менее 3 записей.
- Можно предположить, что входной список отсортирован в порядке возрастания.
Примеры
Небольшая тестовая программа может быть найдена здесь на Попробуй онлайн!
Input, Output:
[1,2,3] 0
[1,1,1] 1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50
Для ввода [1,2,3,...,n-1,n]
это A002623 .
Для ввода [1,1,...,1]
(длина n
) это A000292 .
[1,1,1,1]
4 «разных» треугольника, все[1,1,1]
, используя любые три из 1? Но это не 24, потому что три 1 выбраны неупорядоченными, то есть это подмножество трех индексов, а не упорядоченный список?Ответы:
R ,
62524034 байтПопробуйте онлайн!
Порт Луиса Мендо октавного решения
Поскольку
a<=b<=c
условие треугольника эквивалентноa+b-c>0
. Этоa+b-c
сжато захвачено матричным произведением[1,1,-1] * X
, гдеX
3-комбинации входного массива.В комментариях было много предложений по улучшению, сделанных 3 разными людьми:
Роберту С. за внушение
scan
.Робину Райдеру за предложения по улучшению неравенства треугольника и этого странного, который требует, чтобы вход был в порядке убывания (который просто показывает, насколько важен гибкий формат ввода).
и наконец Ник Кеннеди за следующее:
R , 40 байт
Попробуйте онлайн!
источник
x[3]<x[1]+x[2]
эквивалентно2*x[3]<sum(x)
: 51 байт[
псевдоним гладко, действительно очищает подход.Stax ,
87 байтСпасибо за рекурсию за -1!
Запустите и отладьте его на staxlang.xyz!
Распаковывается (8 байт) и пояснение:
Это хитрый трюк. Если у вас есть последовательность инструкций, которая всегда будет приводить к 0 или 1, и вам нужно посчитать элементы из массива, которые дают достоверный результат в конце вашей программы,
F..+
это на байт меньше, чем{..f%
.Предполагается, что начальный список отсортирован по возрастанию. Без этого предположения вставьте
o
в начале 8 байтов.источник
r3SFE+<+
Пакеты до 7. Он использует цикл foreach для добавления результатов фильтра. Добавление - это одна из операций, которая запрещена, когда присутствует только один элемент.Haskell , 49 байтов
Попробуйте онлайн!
Рекурсивно генерирует все подпоследовательности
l
(обратные) и проверяет, какие из них длиной 3 образуют треугольники.50 байтов
Попробуйте онлайн!
Та же идея - генерировать подпоследовательности с
mapM
помощью сопоставления каждого значенияl
либо с самим собой (включить), либо0
(исключить).50 байтов
Попробуйте онлайн!
Пытается каждая точка разбиения взять средний элемент
b
.51 байт
Попробуйте онлайн!
Функция
q=scanr(:)[]
генерирует список суффиксов. Много проблем возникает из-за необходимости учитывать равные элементы нужное количество раз.52 байта
Попробуйте онлайн!
Вспомогательная функция
q=scanr(:)[]
генерирует список суффиксов.57 байт
Попробуйте онлайн!
источник
Брахилог , 11 байт
Попробуйте онлайн!
Возможно, я забыл воспользоваться отсортированным вводом в моем старом решении:
Брахилог ,
181715 байтПопробуйте онлайн!
источник
Perl 6 , 35 байт
Попробуйте онлайн!
объяснение
Это какой-то код, то есть краткая запись лямбда-функций (которая работает только в очень простых случаях). Каждый
*
является заполнителем для одного аргумента. Итак, мы берем список длин (который появляется в начале*
), создаем все комбинации из 3 элементов (они всегда выходят в том же порядке, что и в исходном списке, что означает, что комбинации также сортируются), сглаживаем список, и затем возьмите список 3 на 3, и filter (grep
) только те триплеты, которые удовлетворяют*+*>*
, то есть, что сумма первых двух аргументов больше, чем третий. Это дает все триплеты, и мы, наконец, посчитаем их с помощью числового контекста с помощью a+
.(Конечно, нам нужно проверить это только для случая «сумма двух меньших> самых больших». Если это так, то другой тривиально выполняется, если нет, триплет не обозначает правильные длины треугольника, и мы не надо смотреть дальше.)
источник
Сетчатка , 55 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи, но с значениями в 5-м случае уменьшены, чтобы позволить его завершить сегодня. Предполагает отсортированный ввод. Объяснение: Регулярные выражения на самом деле не любят сопоставлять более чем одно. Нормальное регулярное выражение сможет найти все значения, которые могут быть кратчайшим отрезком треугольника. Выбор Retina
v
здесь не помогает, за исключением того, чтобы избежать заглядывания. Однакоw
вариант Retina немного более полезен, так как он может найти как самую короткую, так и самую длинную ногу одновременно. Этого недостаточно для этой задачи, так как может быть несколько средних ног.Преобразовать ввод в унарный.
Для каждого входного номера ...
... создайте строку, исходный массив которой будет обрезан, чтобы начать с этого числа.
$'
обычно означает строку после совпадения, но<
модифицирует ее, чтобы обозначить строку после предыдущего разделителя, избегая траты 2 байтов на$&
. Поэтому каждая строка представляет все потенциальные решения с использованием этого числа в качестве кратчайшего этапа.Для каждой из этих линий найдите все возможные средние и самые длинные ноги, но убедитесь, что разница меньше, чем у первой ноги. Выведите a
_
для каждой соответствующей комбинации ног.Подсчитайте общее количество найденных треугольников.
источник
Python 3 , 73 байта
Попробуйте онлайн!
источник
Python 2 , 72 байта
Попробуйте онлайн!
73 байта
Попробуйте онлайн!
источник
05AB1E ,
12109 байтМой первый раз с использованием 05AB1E! Спасибо Грими за -1!
Попробуйте онлайн! или набор тестов
Прямой порт моего ответа Stax. Получить все комбинации из трех записей и подсчитать те, которые могут образовывать треугольники. Это та часть счета, которая действительно получила меня. Я трачу кучу байтов там. Там должно быть какая-то ошибка новичка.
источник
ì
(обратный каждый) перед фильтром вместоŠ
(тройной своп) внутри фильтра. В качестве альтернативы, вы также можете использоватьε...}O
вместоʒ...}g
, но количество байтов остается тем же. PS: Ваш счетчик байтов 10 и TIO верны, но ваш фактический ответ все еще содержит ненужное явное выражение,y
которое можно удалить. :) Хороший первый ответ, так что +1 от меня.3.ÆʒRÆd_}g
, это то же самое bytecount.3.Æʒ`α›}g
это 9.JavaScript (ES6), 63 байта
Попробуйте онлайн!
источник
Октава / MATLAB, 33 байта
Попробуйте онлайн!
источник
Zsh , 66 байт
Попробуйте онлайн!
Относительно просто, используя преимущества отсортированного ввода и увеличивая
for
заголовок (увеличение происходит один раз за родительский цикл).источник
Excel VBA,
171164152 байта-26 байт благодаря TaylorScott
Вход находится в диапазоне
A:A
активного листа. Вывод в ближайшее окно.Так как он рассматривает каждую комбинацию каждой ячейки в столбце высотой 2 20 ячеек (что составляет почти 2 60 комбинаций), этот код ... не быстрый. Вы можете сделать это намного быстрее, но за счет байтов.
источник
()
в подпункте, пробел вDebug.? r
и может опускатьсяNext:Next:Next
доNext k,j,i
. кроме этого - хорошо, что он все еще делает 2 ** 60 комбинаций, но это работаетr=r-(a+b>c)*(b+c>a)*(c+a>b)
Древесный уголь , 17 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Предполагает отсортированный ввод. Объяснение:
источник
Japt
-x
, 9 байтПопытайся
Попытайся
источник
Wolfram Language (Mathematica) ,
3735 байтПопробуйте онлайн!
источник
Рубин , 41 байт
Попробуйте онлайн!
источник
Pyth , 14 байт
Попробуйте онлайн!
Альтернатива (также 14 байтов):
источник
Perl 5 (
-p
),5552 байтас помощью обратного отслеживания регулярных выражений, -3 байта благодаря использованию кряка @Cows
^
вместо(?!)
сбоя и возврата.или
TIO
источник
(?!)
быть^
?Желе , 9 байт
Попробуйте онлайн!
Монадическая ссылка, принимающая отсортированный список целых чисел в качестве аргумента и возвращающая количество треугольников.
объяснение
Альтернатива 9:
источник
J , 40 байт
Попробуйте онлайн!
источник
Баш , 123 байта
Попробуйте онлайн!
Весёлый.
источник
SNOBOL4 (CSNOBOL4) , 181 байт
Попробуйте онлайн!
0
0
источник
C (лязг) , 83 байта
Попробуйте онлайн!
Сохранено 1 благодаря @ceilingcat
источник