Рассмотрим кусок строки (как в «веревке», а не в «группе символов»), который сложен взад-вперед на реальной линии. Мы можем описать форму строки с помощью списка точек, через которые она проходит (по порядку). Для простоты мы будем предполагать, что все эти точки являются целыми числами.
Возьмите в качестве примера [-1, 3, 1, -2, 5, 2, 3, 4]
(обратите внимание, что не каждая запись подразумевает фолд):
Строка, идущая вдоль вертикального направления, предназначена только для визуализации. Представьте, что все нити сплющены на реальной линии.
Теперь возникает вопрос: какое наибольшее количество кусочков может быть разрезано на эту строку за один разрез (который должен быть вертикальным на рисунке выше). В этом случае ответ 6 с разрезом где-нибудь между 2
и 3
:
Чтобы избежать неясностей, разрез должен быть выполнен в нецелочисленном положении.
Соревнование
Учитывая список целочисленных позиций, через которые складывается строка, вы должны определить наибольшее количество фрагментов, в которые строка может быть разрезана с одним разрезом в нецелочисленной позиции.
Вы можете написать полную программу или функцию. Вы можете получить ввод через STDIN, аргумент командной строки, приглашение или параметр функции. Вы можете записать вывод в STDOUT, отобразить его в диалоговом окне или вернуть из функции.
Вы можете предположить, что список находится в любом удобном формате списка или строки.
Список будет содержать не менее 2 и не более 100 записей. Записи будут целыми числами, каждое в диапазоне -2 31 ≤ p i <2 31 . Вы можете предположить, что никакие две последовательные записи не являются идентичными.
Ваш код должен обработать любой такой ввод (включая тестовые примеры ниже) менее чем за 10 секунд на приемлемом настольном ПК.
Тестовые случаи
Все контрольные примеры просто вводятся, а затем выводятся.
[0, 1]
2
[2147483647, -2147483648]
2
[0, 1, -1]
3
[1, 0, -1]
2
[-1, 3, 1, -2, 5, 2, 3, 4]
6
[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405, 473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141, 1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064]
53
[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893, -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543, -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053, -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785, 102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648, 400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051, 640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868, 1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157, 1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281, 1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2
источник
a reasonable desktop PC
довольно двусмысленно?Ответы:
APL,
1614 байтовСпасибо @ngn за сохранение 2 байта.
На
⎕
самом деле это символ коробки, а не ошибка отсутствующего шрифта. Вы можете попробовать программу на сайте tryapl.org , но, поскольку⎕
он там не поддерживается полностью, вы должны заменить его на входное значение:объяснение
Программу лучше всего объяснить на примере ввода
s = ¯1 3 1 ¯2 5 2 3 4
, который взят из STDIN⎕
. Во-первых, мы вычисляем произведение≤
-утерs
с помощью самого себя∘.≤⍨
. Это приводит к булевой матрице, чьяi
строка указывает, какие элементыs
меньше или равныs[i]
:Вхождения
0 1
и1 0
в строкеi
отмечают места, где строка проходит над точкойs[i] + 0.5
. Мы сопоставляем их в каждой строке, используя2≠/
«уменьшить 2-подсписки≠
»:Осталось взять суммы строк с
+/
и один плюс максимум из них с
1+⌈/
:Результат автоматически выводится на STDOUT в большинстве реализаций APL.
источник
×
умножение, и очень простыми правилами синтаксиса. Google "освоение Dyalog APL" для хорошего руководства.Python,
887573 байтаПросто прямая лямбда
Просто чтобы показать другой подход:
Pyth,
2827 байтовЭто примерно эквивалентно
применяется к списку ввода из STDIN. Попробуйте это на онлайн-переводчике .
источник
def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
+.5
s, чтобы сохранить некоторые символы. Я понял, что они бессмысленны в моем.a = point + .5
и подсчитывает количество строго содержащих интерваловa
. Без этого у.5
вас будут проблемы с[1, 0, -1]
примерами.Pyth :
313029282423 символа (Python 68 символов)Попробуйте это здесь: Pyth Compiler / Executor
Ожидается список целых чисел в качестве входных данных
[-1, 3, 1, -2, 5, 2, 3, 4]
Это простой перевод моей программы на Python:
Старое решение: Pyth 28 char
Просто по причинам архивации.
Соответствующий код Python будет:
источник
,QtQ
вместо[QtQ)
i
не линия пересечения,i - 0.5
это. И поэтому1
(на самом деле1 - 0.5 = 0.5
) находится внутри(-1, 1)
.min(a)<i<=max(a)
эквивалентноmin(a) < i - 0.5 < max(a)
, которая решается в Pyth сmin(a) < i < max(a)+1
(обратите внимание наh
вheSk
).g
, что>=
, если заменить<dheSk
сgeSkd
.CJam,
36 34 3330 байтЯ считаю, что в природе существует лучший алгоритм. Тем не менее, это работает в рамках ограничения, необходимого для всех тестовых случаев (даже на онлайн-компиляторе)
Ввод как
Выход (для вышеприведенного случая)
Как это работает
Теперь предположим, что входной массив имеет следующие
[-1 3 1 -2 5 2 3 4]
шаги:Второй массив в последней строке - это сгибы строки.
Теперь мы перебираем
[-1 3 1 -2 5 2 3 4]
и вычисляем количество наборов, в которых лежит каждый из них. Получите максимальное из этого числа, увеличьте его, и мы получим наш ответ.Попробуйте онлайн здесь
источник
Матлаб
(123) (97)(85)Yay, наконец, использование для XNOR =) Я уверен, что это может быть гораздо лучше.
Но, честно говоря, я немного смущен тем, что MatLab становится языком, который я знаю лучше всего = /
Приблизительное время выполнения есть
O(n^2)
.EDIT2:
РЕДАКТИРОВАТЬ: Новая версия для гольфа (включая подсказки от @DennisJaheruddin, спасибо!)
Старая версия:
@ MartinBüttner: Мне действительно нравятся твои милые маленькие проблемы перед сном!
источник
c=sort(a)-.5
Конечно, первая точка выходит за пределы диапазона, но, конечно, с этим легче справиться. В худшем случае вы можете сделатьc(1)=[];
. - Также вы можете удалить команду disp, просто подсчитав что-то, запишете это в стандартный вывод .-- Наконец, в этом случаеnumel
его можно заменить наnnz
conv
подходом ... = D. Я всегда забываю оnnz
, большое спасибо!disp
так как кто-то однажды раскритиковал, что с помощью предложенного вами метода вы также получите другие символы (имяans
Mathematica
134 133104Весело решать, несмотря на размер кода. Далее игра в гольф все еще может быть достигнуто путем замены идеи
IntervalMemberQ[Interval[a,b],n]
сa<n<b
.объяснение
list1
является ли данный список точекlist2
сокращенным списком, который удаляет числа, которые не были в сгибах; они не имеют значения. В этом нет необходимости, но это приводит к более четкому и эффективному решению.Интервалы в
list1
иlist2
показаны на графиках ниже:Нам нужно проверить только одну линию в каждом интервале, определяемом точками сгиба. Тестовые линии - это пунктирные вертикальные линии на графике.
f
находит количество порезов или пересечений каждой тестовой линии. Линия при х = 2,5 составляет 5 пересечений. Это оставляет 5 + 1 кусочков нити.источник
Pyth, 21 байт
Попробуй это здесь.
Предоставить ввод в виде списка в стиле Python, например
[-1, 3, 1, -2, 5, 2, 3, 4]
Близко основано на программе @ jakube, но с улучшенным центральным алгоритмом. Вместо того, чтобы делать
>
проверку и>=
проверку, я делаю a.index()
на трех числах вместе и проверяю, что индекс равен 1, что означает, что он больше минимального и меньше или равен максимальному.источник
R
8683Работал над этим, а потом понял, что по сути я придумал то же решение, что и Оптимизатор и другие, которые я подозреваю.
Во всяком случае здесь это как функция, которая принимает вектор
источник
R
. FWIW вы могли бы сохранить 3 символа, используяT
для «ИСТИНА»GolfScript (43 байта)
С точки зрения эффективности это O (n ^ 2), если предположить, что сравнение занимает O (1) время. Он разбивает входные данные на отрезки и для каждой начальной точки подсчитывает полуоткрытые отрезки, которые пересекают его.
Онлайн демо
источник
Питон - 161
Это, вероятно, может быть в гольф больше. Гнибблер очень помог гольфу.
источник
Руби, 63
Аналогично решениям Python по концепции.
Добавьте 2 символа перед кодом, например,
f=
если вы хотите именованную функцию. Thx в MarkReed .источник
C #,
7365 байтЧитая правила, я подумал, что C # лямбда должна работать довольно хорошо.
Изменить: только что найденный
Count
имеет полезную перегрузку для фильтрации!Вы можете проверить это, определив соответствующий
delegate
тип:А потом
источник
Матлаб (
6343)Входные данные даны как вектор строки, переданный функции
f
. Так напримерf([-1, 3, 1, -2, 5, 2, 3, 4])
возвращается6
.Более короткая версия:
Октава (31)
В Octave
bsxfun
можно удалить благодаря автоматической трансляции:источник
JavaScript (ES6) 80
82См. Комментарии - в число байтов не входит присвоение F (это все еще необходимо для проверки)
Тест в консоли FireFox / FireBug
Выход
источник
lambda
решениях Python , вам не нужно присваивать значение функции фактической переменной, поэтому вы можете выбить два символа.Желе , 10 байт
Попробуйте онлайн!
Как это работает
источник
05AB1E , 6 байтов
Попробуйте онлайн!
Объяснение:
источник
JavaScript (Node.js) , 71 байт
Попробуйте онлайн!
источник
Добавить ++ , 27 байт
Попробуйте онлайн!
Подход, спасибо Zgarb за ответ APL
Ключевой частью этой задачи является реализация команды внешнего продукта. К сожалению, Add ++ не имеет встроенной функции для этого, и не имеет никакого способа определения функций, которые принимают другие функции в качестве аргументов. Тем не менее, мы все равно можем сделать обобщенную функцию внешнего произведения. Поскольку единственный доступ к функции внутри другой функции заключается в обращении к существующей функции, определенной пользователем или встроенной, мы должны создать «встроенную», которая ссылается на такую функцию.
Обобщенная табличная функция будет выглядеть примерно так:
Попробуйте онлайн!
где
func
диадическая функция, которая содержит наш операнд. Вы можете увидеть слабые сходства этой структуры в исходном представлении, в начале функции w , но здесь мы хотим, прежде всего, монадическую внешнюю функцию продукта - внешнюю функцию продукта, которая принимает одинаковый аргумент с обеих сторон.Общая табличная функция использует преимущества
€
быстрого достижения диадических функций. Если стек выглядиткогда
€{func}
встречается,€
popse
связывает это как левый аргумент с диадой и отображает эту частичную функцию поверхa, b, c, d
. Тем не менее,€
быстрые карты по всему стеку, а не по спискам. Поэтому сначала нам нужно сгладить массивы, переданные в качестве аргументов.Таблица функция работает в целом , как это
Тем не менее, мы можем значительно сократить это из-за того, что наша внешняя таблица должна быть монадической , и нам нужно применять ее только к переданному аргументу. Команда
A
помещает каждый аргумент в стек по отдельности, поэтому нам не нужно возиться с какими-либо манипуляциями со стеком. Короче говоря, если нашим аргументом является массив[a b c d]
, нам нужно превратить стек вВерхнее значение, конечно же, является аргументом. Вы, возможно, заметили из общего примера, что
bU
это команда unpack, т.е. она разбивает верхний массив на стек. Таким образом, чтобы сделать вышеуказанную конфигурацию, мы можем использовать кодПопробуйте онлайн!
Однако это может быть сокращено байтом. В качестве псевдонима
L,bU
мы можем использовать~
флаг, чтобы заранее разбить аргументы на стек, превратив наш пример конфигурации вПопробуйте онлайн!
который является началом второй строки в программе. Теперь мы реализовали монадический внешний продукт, нам просто нужно реализовать остальную часть алгоритма. После получения результата таблицы с
<
(меньше чем) и подсчитать количество[0 1]
и[1 0]
пар в каждой строке. Наконец, мы берем максимум этих отсчетов и увеличиваем его.Полный шаг для пошаговой прогулки -
источник