Учитывая список неотрицательных целочисленных высот горизонта, ответьте, сколько непрерывных горизонтальных мазков кистью в 1 единицу необходимо, чтобы покрыть его.
[1,3,2,1,2,1,5,3,3,4,2]
визуализируется как:
5
5 4
3 5334
32 2 53342
13212153342
нужно девять мазков:
1
2 3
4 5555
66 7 88888
99999999999
Примеры
[1,3,2,1,2,1,5,3,3,4,2]
→ 9
[5,8]
→ 8
[1,1,1,1]
→ 1
[]
→ 0
[0,0]
→ 0
[2]
→ 2
[2,0,2]
→ 4
[10,9,8,9]
→ 11
Ответы:
JavaScript (Node.js) , 38 байт
Попробуйте онлайн!
Просто жадный алгоритм, который сканирует слева направо, рисует только линии, если это необходимо, и рисует его как можно дольше.
Спасибо Арно, сэкономь
23 байтаисточник
05AB1E ,
8 75 байтСохранено 2 байта благодаря @Adnan
Попробуйте онлайн!
Как?
Это использует алгоритм, который был впервые найден @tsh . Если вам понравился этот ответ, не забудьте также подтвердить его ответ !
Каждый раз, когда небоскреб ниже или выше предыдущего, его можно покрасить «бесплатно», просто растягивая мазки.
Например, рисование небоскребов и на рисунке ниже ничего не стоит.B C
С другой стороны, нам нужно 2 новых мазка, чтобы нарисовать небоскреб , независимо от того, будут ли они использоваться повторно после этого или нет.E
Для первого небоскреба нам всегда нужно столько мазков, сколько в нем этажей.
Превращая это в математику:
Если мы добавим к списку, это можно упростить до:0
комментарии
источник
0š¥ʒd}O
экономит вам байт.ʒd}
наþ
должна сэкономить вам два байта.Python 3 , 37 байт
Попробуйте онлайн!
-5 байт при переходе на Python 3, благодаря Sarien
Python 2 ,
474342 байтаПопробуйте онлайн!
Alt:
Попробуйте онлайн!
источник
Haskell , 32 байта
Попробуйте онлайн!
Улучшение решения Линн, которое отслеживает предыдущий элемент,
p
а не смотрит на следующий элемент. Это делает базовый случай и рекурсивный вызов короче в обмен на необходимость вызова(0%)
.max(h-p)0
может бытьmax h p-p
для той же длины.источник
Haskell , 35 байт
Попробуйте онлайн!
Строка 2 могла бы быть,
f[a]=a
если бы мне тоже не пришлось заниматься делом[]
.источник
K (ок) ,
127 байт-5 байт благодаря ngn!
К (ок) порт решения 05AB1E Arnauld (и решение JavaScript TSH в):
Попробуйте онлайн!
J 15 байт
Порт AJ решения 05AB1E Арнаулда (и решения JavaScript от tsh):
Попробуйте онлайн!
Мое наивное решение:
J , 27 байт
Попробуйте онлайн!
источник
':
) использует неявный элемент тождества (0
for-
) перед списком, поэтому в0,
этом нет необходимости. Вы можете опустить{
x}
состав:+/0|-':
Some primitive verbs result in a different special-cased initial value: +, *, - and & are provided with 0, 1, 0 or the first element of the sequence, respectively
Haskell ,
3432 байта2 байта обрезаны Линн
Попробуйте онлайн!
Итак, для начала у нас есть
zipWith(-)
. Это берет два списка и производит новый список их попарных различий. Затем мы объединяем это сx
и(0:x)
.(0:)
это функция, которая добавляет ноль в начало списка и, комбинируя его с,zipWith(-)
мы получаем различия между последовательными элементами этого списка с нулем в начале. Затем мы обращаем все отрицательные в ноль с помощью(max 0<$>)
. Это создает новый список, где каждый элемент - это число новых штрихов, которые должны быть запущены в каждой башне. Чтобы получить общую сумму, мы просто суммируем ихsum
.источник
g x=sum$max 0<$>zipWith(-)x(0:x)
составляет 32 байта :)sum.zipWith((max 0.).(-))<*>(0:)
.
приоритет имеет более высокий, чем<*>
.Japt , 8 байт
-2 байта от @Shaggy
объяснение
Попробуйте онлайн!
источник
mîT Õ¸¸è
A.y()
прочим, приятное использование отступов.MATL , 8 байт
Попробуйте онлайн!
В значительной степени алгоритм Арно. Сохраненный один байт (спасибо @LuisMendo) путем приведения
uint64
вместо того, чтобы выбирать)
положительные записи.источник
Желе , 5 байт
Порт моего ответа 05AB1E , который похож на ответ @tsh JS .
Попробуйте онлайн!
комментарии
источник
Japt ,
76 байтПопытайся
1 байт сохранен благодаря Оливеру.
источник
R , 30 байт
Попробуйте онлайн!
Портирование решения @Arnauld, которое, в свою очередь, происходит от великолепного решения @tsh
источник
Сетчатка 0.8.2 , 21 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать в одинарный.
Удалите все перекрытия со следующей башней, которая не требует нового удара.
Подсчитайте оставшиеся удары.
источник
Common Lisp,
8887 байтбез уменьшенная
Попробуй это
Когда одна башня окрашена, она берет количество мазков, равное ее высоте. Эти мазки преобразуются во все последующие, что обозначается здесь вычитанием высоты текущей башни из всех других башен (и самой себя, но это не имеет значения). Если следующая башня короче, она будет выталкиваться к отрицательному числу, и это отрицательное число будет впоследствии вычитаться из последующих башен (указывая на мазки кисти, которые не могли быть переведены из предыдущей башни в следующую). На самом деле это просто вычитает число из всех высот башни, включая предыдущие, но это не имеет значения, потому что мы больше не смотрим на предыдущие.
источник
05AB1E ,
1310 байтПопробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
C # (интерактивный компилятор Visual C #) с флагом
/u:System.Math
, 47 байтовПопробуйте онлайн!
Старая версия, с флагом
/u:System.Math
, 63 байтаЯ чувствую, что это решение более элегантно, чем первое. Он проходит через массив с кортежем из двух значений в качестве начального значения, собирает значения и сохраняет перед ним значение во второй части кортежа.
Попробуйте онлайн!
источник
Pyth, 8 байт
Еще один порт изумительного ответа @ tsh . Принимает сумму (
s
) положительных значений (>#0
) дельт (. +) Входных данных с добавленным 0 (+0Q
конечный Q выводится).Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
Метод соединения строк, 10 байтов
Это было решение, которое я написал, прежде чем просматривать другие ответы.
Тестирование.
источник
Clojure, 50 байтов
Попробуйте онлайн! (Почему это ничего не печатает?)
источник
Java (JDK) , 57 байт
Попробуйте онлайн!
Другой порт TSH «s Javascript ответ . Поэтому убедитесь, что вы проголосовали за них.
Обратите внимание, что я использовал вычитание вместо сложения, потому что это позволило мне написать
(p=x)
правильный операнд в том же выражении.источник
MATL ,
151413 байтВвод - это вектор-столбец, использующий в
;
качестве разделителя.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Perl 5, 21 байт
TIO
Как
-p
+}{
+$\
трюк//
соответствует пустой строке, так что для следующей строки postmatch$'
будет содержать предыдущую строку$\+=$_>$'&&$_-$'
накапливать разницу между текущей строкой и предыдущей, если current больше, чем предыдущая (также может быть записано$\+=$_-$' if$_>$'
, но perl не анализирует$\+=$_-$'if$_>$'
то же самое)источник
Stax , 8 байт
Запустите и отладьте его
Использует широко используемый подход из решения JavaScript от tsh.
источник
Wolfram Language (Mathematica) , 34 байта
Порт @Arnauld «ы раствора .
Попробуйте онлайн!
источник