Найдите самое длинное значение true в списке логических значений. Возвратите тот же список со всеми другими фальсификациями.
Ввод, вывод
Список; любой обычный формат (например, список с разделителями в виде строки).
Детали
Истина и ложь могут быть любым, что ваш язык обычно использует для этих значений, или целыми числами 1 и 0. Если вы используете одиночные символы, список может быть конкатенацией (например, 10001
).
Если есть связь для самого длинного пробега, сохраняйте все пробежки связывания истинными и фальсифицируйте все короткие пробежки
Примеры
input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
(прямо с /programming//q/37447114 )
code-golf
array-manipulation
msh210
источник
источник
Haskell,
59,58,55, 64 байтаЗабавное примечание, это работает для любого списка значений, где
falsy < truthy
. ТакFalse/True
,0/1
,'f'/'t'
и т.д.Заметка:
Как указали несколько человек (включая
@proud haskeller
и@nimi
), предыдущая версия не удалась в списке всех ложных значений. Добавление.([1<2]:)
исправило это, как предложено@proud haskeller
. Сейчас я оставляю объяснение таким же, потому что я думаю, что оно все еще имеет смысл. Если кто-то прокомментирует, попросив объяснения правки, я отредактирую.Объяснение:
Я сначала desugar без
group
, а затем добавлю его обратно. Во-первых, я нахожу, что слова часто проще для глаз, чем символы, поэтому я сделаю несколько замен. (Обратите внимание, что=<<
это «классный», поэтому он применяется по-разному для списков и функций. Я вызываюbind
версию=<<
для функций.)Последние детали - это то, что
x <$ list
заменяет каждый элементlist
сx
иgroup list
разбиваетlist
его на куски равных элементов. Такgroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]
.Подводя итог, функция разбивает список значений на группы только true и группы только false. Затем для каждой группы замените каждый элемент результатом оператора
this is the biggest group
(самая большая группаtrue
будет самой большой) и объедините группы.Четыре байта сохранены
@Zgarb
источник
(\y->(maximum g==y)<$y)
на((<$)=<<(==maximum g))
. Я не проверял это все же.f
на функцию без точек((=<<)=<<(=<<)(<$).(==).maximum).group
. Сохраняет три байта и совершенно нечитаем!b=(=<<);b b(b(<$).(==).maximum).group
еще на один байт короче. Я никогда не видел ничего подобного в гольфе на Haskell :)(:[t])
перед максимумом или что-то подобноеСетчатка,
474336Попробуйте онлайн! или попробуйте все контрольные примеры
Спасибо msh210 за игру в гольф 4 байта!
Также большое спасибо Мартину за 7 байтов!
Объяснение:
Заменить все
0
s на!
s. Это сделано для того, чтобы сделать соответствующие группы1
s короче, как сейчас,1!
и между ними!1
будет иметь слово border (\b
), которое также соответствует либо началу, либо концу строки.Это параметр конфигурации, который говорит о том, что после применения регулярного выражения после обратного кавычки ко входу в каждом совпадении переводить каждый печатный символ ascii в
0
символ.Это регулярное выражение соответствует группам
1
s, которые окружены нулями, но не могут соответствовать ни одному из них,1
за которым следует строка в строке. Это немаксимальные группы, которые будут сфальсифицированы. Кроме того, это также соответствует!
символам, которые мы добавили, чтобы преобразовать их обратно в0
s.источник
MATL, 14 байтов
Попробуйте онлайн!
Модифицированная версия со всеми тестами
объяснение
источник
Python 2, 62 байта
Проверьте это на Ideone .
Как это работает
s.split('0')
разбивает входной строки S в пробегов нуля или более 1 -хДля каждого прогона t мы проверяем,
t+'1'
является ли подстрока s .Если это так, цикл не максимален,
t+'1'in s
верните True ,1-(t+'1'in s)
верните 1 - True = 0, и цикл будет заменен серией 0 той же длины.Если это не так, прогон максимальный,
t+'1'in s
верните False ,1-(t+'1'in s)
верните 1 - False = 1, и прогон будет заменен на прогон 1 с той же длины, т.е. сам по себе.Наконец,
'0'.join
восстанавливает все удаленные 0 .источник
J, 25 байт
Это монадический глагол, который принимает и возвращает массив 0-1. Используйте это так:
объяснение
источник
;.
.Pyth,
26242321 байтТестирование.
1/0
илиtrue/false
на входе.true/false
в выводе.объяснение
Предыдущий 23-байтовый
Тестирование.
1/0
илиtrue/false
на входе.1/0
в выводе.Предыдущий 24-байтовый
Тестирование.
1/0
илиtrue/false
на входе.1/0
в выводе.Предыдущий 26 байт
Тестирование.
1/0
илиtrue/false
на входе.1/0
в выводе.источник
Jr.b,N&YNrQ8)9qReSJJ
илиJrm,hd*FdrQ8 9qReSJJ
. Обе версии сохраняют один байт. Или пойти еще безумнее сJrXR1*FdrQ8 9qReSJJ
и сохранить два. ;-)Oracle SQL 12.1,
137135 байтовUn-golfed
Для ввода используйте одиночные символы. Пример: «1100111»
источник
Математика ,
4641Работает по спискам
0
и1
. Я думал, что у меня все получилось, пока не посмотрел другие ответы!Пояснения к 46-символьной версии; Я буду обновлять, когда я не могу улучшить его дальше.
Было запрошено объяснение этого кода.
Эквивалент, не относящийся к коду для гольфа (с использованием форм оператора версии 10)
Это означает, что функция состоит из пяти шагов (подфункций), применяемых по порядку сверху вниз.
Split
: разбить на серии одинаковых элементов: {1,1,0,1,1,0,1} ↦ {{1,1}, {0}, {1,1}, {0,0}}Map[# Tr@# &]
: Для каждого подсписка (Map
) умножьте его (#
) на его сумму (векторная трассировкаTr
): {1,1} ↦ {2, 2}# - Max[1, #] &
вычтите из каждого элемента максимальное значение, отображаемое в любом месте списка списков, или единицу, в зависимости от того, какое значение больше. (Один обрабатывает случай всех нулей.)UnitStep
: равно 0 для x <0 и 1 для x> = 0, применяется к каждому элементу.Apply[Join]
: объединить подсписки в один список. Можно также сделать сFlatten
илиCatenate
, но в краткой формеJoin@@
является более кратким.источник
C
135129 байтПопробуйте онлайн
Ungolfed
источник
JavaScript (ES6), 56 байт
Работает, проверяя все серии 1 и заменяя символы на 0, за исключением случаев, когда последовательность (одинаково) самая длинная, что измеряется поиском строки для более длинной серии 1.
Предыдущее 72-байтовое рекурсивное решение:
Ничего не делает, если нет прогонов 1с (т.е. не более 1). В противном случае вычитает по одному
1
из каждого1
или из каждого прогона, затем рекурсивно вызывает себя при более коротких прогонах, а затем добавляет один1
обратно в прогоны (теперь такие же самые длинные). Количество рекурсивных вызовов на один меньше длины самого длинного прогона.источник
Юлия, 51 байт
Попробуйте онлайн!
Как это работает
replace
находит все все пробеги один или более 1 «S в строку ввода с помощью регулярного выраженияr"1+"
и называет лямбда ,t->map(c->c-contains(s,"1"t),t)
чтобы определить строку замены.Лямбда отображает
c->c-contains(s,"1"t)
все символы подряд t .Если
"1"t
(сцепление) является подстрокой s , прогон не максимален,contains
возвращает true иc-contains(s,"1"t)
возвращает '1' - true = '0' , заменяя все 1 в этом прогоне на 0 .Если
"1"t
(сцепление) не является подстрокой s , цикл является максимальным,contains
возвращает false иc-contains(s,"1"t)
возвращает «1» - false = «1» , оставляя цикл без изменений.источник
APL, 22 символа
На английском языке (справа налево блоками):
источник
Java 8, 205 байт
Это лямбда-выражение для
Function<String,String>
:вход / выход - это
String
где истина представлена 1, а ложь - 0. Нет разделительных символов, разделяющих значения.код с объяснением:
см. ideone для тестовых случаев
источник
Clojure, 137 байт
Первые делят входные данные на последовательные нули и единицы и отображают их в «кортежи» первого элемента разбиений и количества элементов. Затем он повторяет необходимое количество нулей или единиц, в зависимости от того, является ли это максимальной последовательностью единиц или нет.
Менее гольф:
источник
Perl 5, 68 байт
67, плюс 1
-pe
вместо-e
Ожидает и печатает строку (конкатенацию) 0 и 1.
источник