Вызов:
Напишите функцию или программу, которая принимает список логических значений и возвращает все диапазоны True.
Тестовые случаи:
f [F] = []
f [T] = [[0,0]]
f [T,T,F,T] = [[0,1],[3,3]]
f [F,T,T,F,F,T,T,T] = [[1,2],[5,7]]
f [F,T,T,F,F,F,T,T,T,T] = [[1,2],[6,9]]
f [T,T,F,F,F,T,T,T,T,T,T,T,T,T,T,F] = [[0,1],[5,14]]
f [F,F,T,T,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T] = [[2,3],[12,19],[33,54],[93,94]]
Правила:
- Вы можете выбрать способ кодирования ввода, например, список, массив, строку и т. Д.
- Выходные данные должны быть закодированы в виде списков подобных списков или строк, показывающих их, поэтому массивы, списки, кортежи, матрицы, векторы и т. Д.
- Логические значения должны быть закодированы как константы, но в противном случае допускается любое простое преобразование T / F в требуемые константы.
- РЕДАКТИРОВАТЬ: Eval или подобное во время выполнения IS разрешено.
- Не забудьте объяснить, как ввод передается программе / функции, и дать его ввод / вывод для тестовых случаев.
- Преобразование в желаемый формат ввода не учитывается
- Стандартные лазейки запрещены
- Если у вашего языка есть функция для этого, это не разрешено
- Я не приму мое собственное представление
- РЕДАКТИРОВАТЬ: Формат вывода является гибким. Если список не распечатывается и т. П., Значения диапазона должны быть разделены одним нечисловым символом, а также отдельными диапазонами.
Подсчет очков:
- Оценка в байтах, если не подходит для вашего языка (например, кодов в Piet)
- Наименьшее количество побед
Существует большая гибкость ввода и вывода, но решения, в которых T / F заменены функциями, выполняющими всю работу, запрещены.
Отладка:
Если вы пишете свой язык на Haskell или можете позвонить с него на Haskell, ваша функция / программа проверит следующее:
import Test.QuickCheck
tf = cycle [True,False]
gen l = foldl (++) [] $ map (\i -> [tf!!i | x<-[1..i]]) l
putIn (a,b) l = zipWith (||) l [(a <= p) && (p <= b) | p <- [0..length l]]
putAllIn rs len = foldr putIn [False|i<-[1..len]] rs
main = print $ quickCheck (check functionNameGoesHere)
code-golf
array-manipulation
Майкл Кляйн
источник
источник
Ответы:
Pyth,
1716 байтИспользует некоторую причудливую маску счетчика после назначения вместе с кодированием длины пробега.
Принимает ввод в виде массива
0
s и1
s, например[1, 1, 0, 1, 0]
. Выходы как в вызове, например[[0, 1], [3, 3]]
.Тестирование
источник
Pyth, 18 байт
Тестирование
True представляется как
1
, False как0
.Диапазоны представлены включительно.
источник
Retina ,
823427 байтПустая строка должна содержать один пробел.
Ввод представляет собой плоскую строку
_
для истинного и:
ложного. Выходные данные разделены пробелами, каждая на отдельной строке.Попробуйте онлайн.
объяснение
Тяжелая игра в гольф от 82 до 27 байтов была возможна благодаря умному выбору представления истинного и ложного. Я выбрал символ слова
_
, (это не цифра) для истины, а не символ слова:
, (не нужно экранировать) для ложного. Это позволяет мне определять концы диапазонов как границы слов.Мы сопоставляем границу слова. Мы хотим заменить эту границу соответствующим индексом истинного значения. В принципе, это довольно просто с недавней
$#
функцией Retina , которая подсчитывает количество снимков группы. Мы просто фиксируем каждого персонажа перед этой позицией в группу. Подсчитав эти символы, мы получим позицию. Единственная загвоздка в том, что концы диапазона теперь закрыты на единицу. Мы на самом деле хотим индекс персонажа перед матчем. Это также легко исправить,_
если нужно сопоставить не захваченное, пропуская один символ, когда мы находимся в конце диапазона.Теперь мы заменяем все серии подчеркиваний пробелами. То есть мы вставляем пробел между началом и концом каждого диапазона, одновременно избавляясь от подчеркивания.
Это оставляет двоеточия (и нам все еще нужно разделить пары). Мы делаем это, разбивая всю строку на строки вокруг каждой двоеточия. Режим
S
разделения активных_
элементов и подавление пустых сегментов, которые не дают тонны пустых строк, когда у нас есть ряды двоеточий.источник
Python 2, 69 байт
Пример вывода:
Прямой подход, без встроенных модулей. Отслеживает текущее значение
x
и предыдущее значениеp
. Когда они различны, мы переключили пробеги. При переключении0
на1
печатает текущий индексi
. При переключении1
на0
печатает текущий индекс минус один, за которым следует точка с запятой.Это
if
довольно вонючий. Может быть, рекурсия будет лучше,источник
MATL , 17
1820байтИспользует текущую версию (9.1.0) языка / компилятора.
Ввод - это строка, содержащая символы
T
иF
. Выходные данные представляют собой таблицу из двух строк, где каждый столбец указывает диапазон с использованием 1-индексации, которая является языком по умолчанию.Спасибо Stewie Griffin за удаление 2 байтов.
пример
объяснение
Он основан на простом регулярном выражении:
источник
Октава, 43 байта
find(diff([0,x,0]))
находит все позиции, где входной массив изменяется между истиной и ложью. Преобразуя это в матрицу 2 на n, мы достигаем двух вещей: изменения с истинного на ложное и с ложного на истинное делятся на две строки. Это позволяет вычесть 1 и 2 из каждого из этих рядов. Вычитание 1 из первой строки необходимо, потому что Octave индексирован по 1, а не по нулям. Вычитание 2 из второй строки необходимо, потому чтоfind(diff())
находит позицию первого ложного значения, в то время как мы хотим последнее истинное значение. Часть вычитания возможна только в Octave, а не в MATLAB.источник
CJam,
2725 байтовОжидает ввода, как
TTFTFT
. Попробуйте онлайн .объяснение
источник
Japt,
343125 байтПопытка нового подхода действительно сработала на этот раз.
Попробуйте онлайн!
Ввод - это строка с
F
forfalse
иT
fortrue
. Выход - это массив массивов; строковое представление делает его похожим на один массив.Как это работает
Примечание: теперь я вижу, что несколько человек уже придумали этот алгоритм, но я обнаружил его независимо.
Неконкурентная версия, 22 байта
В последнем коммите GitHub я добавил новую функцию: ведущий
;
устанавливает переменныеA-J,L
в разные значения.A
устанавливается в пустой массив, что исключает необходимость его создания вручную.источник
Haskell, 74 байта
Пример использования:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Как это работает:
источник
J, 26 байт
Это безымянный монадический глагол (унарная функция), который возвращает двумерный массив или целые числа. Используется следующим образом.
объяснение
источник
Руби, 39
Пример вызова:
Вот
..
как Ruby представляет инклюзивные диапазоны.Одна интересная вещь здесь - как я получаю индекс конца диапазона. Это странно. Я динамически создаю регулярное выражение, которое соответствует последнему символу диапазона, а затем всем последующим символам и концу строки, чтобы вызвать правильное совпадение. Затем я использую,
=~
чтобы получить индекс этого регулярного выражения в исходной строке.Подозреваю, что в Ruby может быть более короткий способ сделать это с помощью флагов -naF.
источник
JavaScript (ES6), 59
Анонимная функция, ввод в виде строки
T
иF
, возвращающая вывод в виде массива массивовТЕСТ
источник
𝔼𝕊𝕄𝕚𝕟 18 символов / 28 байт
Try it here (Firefox only).
объяснение
источник
Haskell, 62 байта
Принимает в качестве входных данных список 0 и 1.
Учитывая список
l
, дополняет его 0 с обеих сторон и вычисляет индексированный список последовательных пар. НапримерЗатем извлеките индексы, соответствующие последовательным элементам
(0,1)
и(1,0)
, которые являются началами блоков 0 и 1, вычтя 1 из начала 0, чтобы получить концы 1, и заархивируйте результаты.источник
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pyth,
1918 байтОбъяснение:
Попробуй это здесь .
источник
Perl, 47 байт
Со следующими параметрами perlrun
-lpe
:Альтернатива, где выходные данные разделены строкой (34 байта):
источник
Python 2, 108 байт
Тестовые случаи:
Конечно, есть более короткое решение, чем это, но оно работает.
источник
Haskell: 123 байта (пример, победа невозможна)
Менее гольф:
источник
allTrue s e = and (subList s e)
или, может бытьallTrue = (and.) . sublist
.all (==True) (subList s e)
это очень ясно.CJam, 30 байтов
Ввод в виде массива в стиле CJam из
0
s и1
s. Вывод в виде массива пар в стиле CJam.Запустите все тестовые случаи. (Заботится о преобразовании форматов ввода.)
источник
Japt, 27 байт
Там должен быть способ играть в гольф это вниз ...
Во всяком случае, это так же, как мой 𝔼𝕊𝕄𝕚𝕟 ответ.
источник
APL, 17 символов
В
⎕IO←0
а⎕ML←3
. По-английски:⍵×⍳⍴⍵
: обнулить элементы вектора индекса до тех пор, пока аргумент, где аргумент равен false⍵⊂
: вырезать в начале каждого прогона правды и выбрасывать ложные(↑,↑∘⊖)¨
: взять первый и последний элемент каждого подмассиваисточник
PowerShell, 82 байта
Решение Regex, используя свойства объекта MatchInfo .
пример
источник
Mathematica, 45 байт
Не особенно интересно; использует встроенный
источник
Clojure, 109 символов
Первое, что пришло мне в голову, на основе
reduce
иpartition-by
.Простой тестовый пример (отображается
T
наtrue
иF
наfalse
):источник