Вы должны написать программу или функцию, которая получает список различных целых чисел в качестве входных и выходных данных или возвращает количество вхождений входных чисел в следующей перевернутой числовой пирамиде.
Начиная с исходного списка на каждом шаге, мы создаем новый с максимальными значениями каждой пары соседних чисел (например, 5 1 2 6
становится 5 2 6
). Мы останавливаемся, когда в списке только один номер.
Полная пирамида для 5 1 2 6
IS
5 1 2 6
5 2 6
5 6
6
Результирующее количество вхождений есть 3 1 2 4
( 5 1 2 6
соответственно).
вход
- Список из одного или нескольких целых чисел без повторений. (например
1 5 1 6
, неверно.)
Выход
- Список целых положительных чисел.
i
Й элемент списка является числом вхожденийi
го входного числа в пирамидах.
Примеры
Вход => Выход
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
Это код-гольф, поэтому выигрывает самый короткий вход.
Бонусная головоломка: вы можете решить проблему O(n*log n)
вовремя?
Ответы:
Pyth,
1917 байтПроверьте онлайн-демонстрацию или полный комплект тестов (первые 4 байта повторяются в примерах).
Этот немного умнее, чем наивный подход. Каждое число треугольника может быть представлено как максимальное значение связного подмножества
Q
. В первой строке используются подмножества длины 1, во второй строке треугольника используются подмножества длины 2, ...объяснение
Чтобы визуализировать это немного.
m.:QhdUQ
и ввод[5, 1, 2, 6]
дает мне все возможные подмножества:И
mmeSk.:QhdUQ
дает мне каждый из их максимумов (который точно соответствует строкам в пирамиде):Pyth,
2322 байтаЭто простой подход «делай то, что тебе говорят».
Проверьте онлайн-демонстрацию или полный комплект тестов (первые 4 байта повторяются в примерах).
объяснение
meSd.:G2
сопоставляет каждую пару[(G[0], G[1]), (G[1], G[2]), ...]
с максимальным элементом.Y
это пустой список, поэтомуaYG
добавляетсяG
вY
.u...QQ
повторно применяет эти две функции (len(Q)
время), начиная сG = Q
и обновляяG
после каждого запуска.m/sYdQ
сопоставляет каждый элемент входного списка с их количеством в плоскомY
списке.источник
Python, 81
Решение «разделяй и властвуй». Элемент максимума
M
просачивается вниз по всей пирамиде, разбивая его на прямоугольникM
с двумя подпирамидами.Итак, общий результат - это вывод для левого подсписка, за которым следует область прямоугольника, а затем вывод для правого подсписка.
Входная переменная
L
используется повторно для сохранения результата, так что пустой список отображается на пустой список.Конструкции в решении многословны в Python. Может быть, какой-нибудь язык с сопоставлением с образцом может реализовать следующий псевдокод?
источник
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 байтаВсе еще ищу варианты игры в гольф.
Это функция CJam (вроде). Это ожидает входные числа в стеке и возвращает соответствующие выходные значения в стеке. Пример:
уходит
в стеке.
Уверен, что это не
O(n log n)
вовремя.Расширение кода :
Давайте посмотрим, как это работает, на примере
5 1 2 6
Во втором ряду
5 1 2 6
становится5 2 6
потому , что5, 2 and 6
это максимум[5 1], [1 2] and [2 6]
соответственно. В третьем ряду это делается5 6
потому5 and 6
, что максимально[5 2] and [2 6]
соответственно. Это также может быть записано как максимум[5 1 2] and [1 2 6]
соответственно. Аналогично для последней строки,6
это максимум[5 1 2 6]
.Таким образом, мы в основном создаем срезы правильной длины, начиная от среза длины
1
, который в основном является исходными числами, каждый из которых заключен в массив, и, наконец, срезом длиныN
для последней строки, гдеN
находится число входных целых чисел.Попробуйте это онлайн здесь
источник
Mathematica, 72 байта
источник
Python, 81
Каждая запись пирамиды является максимумом подсписка наверху его конуса. Итак, мы генерируем все эти подсписки, индексируемые интервалами
[i,j]
с0 < i < j <= len(L)
, и подсчитываем, сколько раз каждый элемент появляется как максимум.Более короткий способ перечисления подинтервалов, скорее всего, сохранит символы. Одноиндексная параметризация пар
[i,j]
была бы правдоподобным подходом.источник
Пип , 56 + 1 = 57 байт
Боюсь, я не очень-то конкурирую с CJam вуду. Похоже, мне нужен лучший алгоритм. Запустите с
-s
флагом, чтобы получить разделенный пробелами вывод.Ungolfed, с комментариями:
Переопределение
r
каждого времени через работает следующим образом:источник
APL (24)
Это функция, которая принимает список, вот так;
Объяснение:
{
...}⍵
: применить следующую функцию к ⍵:⍵≡⍬:⍵
: если empty пусто, вернуть ⍵2⌈/⍵
: создать следующий список⍵,∇
: return ⍵, а затем результат применения этой функции к следующему списку⍵∘.=
: сравнить каждый элемент в ⍵ с каждым элементом в результате функции+/
: сумма строк (представляющих элементы в ⍵)источник
Haskell, 78 байт
Использование:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Как это устроено
источник
JavaScript, 109 байт
Я думаю, что нашел интересный способ сделать это, но только после того, как я понял, код был слишком длинным, чтобы конкурировать. О, хорошо, в любом случае, опубликовать это на тот случай, если кто-то увидит дальнейший гольф-потенциал.
Я использую следующую формулу здесь:
Таким образом, не нужно фактически генерировать всю пирамиду или ее подмножества. (Именно поэтому я изначально думал, что он будет работать в O (n), но, к счастью, нам все еще нужны внутренние циклы.)
источник
МАТЛАБ: (266 б)
ВХОД
вектор должен иметь форму [abcd ...]
пример:
[2 4 7 11 3]
ВЫХОД
шаблонные случаи.
ОБЪЯСНЕНИЕ:
если [abcd] является входом, программа вычисляет результат ghij как
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d) ) = ... «упрощенный»
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a знак равно
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
источник
J (49)
Я полагаю, что есть место для улучшения ...
источник