Рассмотрим массив битов, скажем
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
Мы называем непрерывный подмассив длиной ≥ 5 фазой, если, по крайней мере, 85% битов одинаковы, а первый / последний биты равны основному биту. Кроме того, мы называем фазу максимальной, если она не является строгой подрешеткой какой-либо другой фазы.
Вот максимальные фазы приведенного выше примера:
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
-------------
-------------
-------------
Как видите, есть 3
максимальные фазы. С другой стороны, это
1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 0
---------
не максимальная фаза, так как это строгий подмассив по крайней мере еще одной фазы.
Соревнование
Ввод представляет собой последовательность из 5 битов через STDIN, командную строку или аргумент функции. Биты могут входить в виде строки или массива.
Вы должны вывести единственное целое число, число максимальных фаз для массива, либо напечатанное через STDOUT, либо возвращенное из функции.
счет
Это код-гольф, поэтому выигрывает программа с наименьшим количеством байтов.
Контрольные примеры
0 1 0 1 0 -> 0
0 0 0 0 0 -> 1
0 0 0 0 1 0 1 1 1 1 -> 0
0 0 0 0 0 1 0 1 1 1 1 1 -> 2
1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -> 1
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 -> 2
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -> 1
0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 -> 0
1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 -> 4
0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 -> 5
Вот объяснение последнего случая:
0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0
---------------------------
-------------------------
-----------------
-----------------
-------------
Интересный факт: эта проблема возникла из-за проблемы интеллектуального анализа данных с целью обнаружения изменений во временных данных.
источник
1 1 0 1 1
85% от 5 составляет 4,25, то есть длина 5 будет невозможна, или мы должны округлить ее до 4?0
и заканчивая последним.Ответы:
Дьялог АПЛ, 62 персонажа
{≢∪0~⍨+/∨⍀∨\⌽∘.{((⊃=⊃∘⌽)∧(.85≤(+/⊢=⊃)÷≢)∧5≤≢)(⍺-1)↓⍵↑a}⍨⍳⍴a←⍵}
Похож на решение Згарба, но играл в гольф немного дальше.
источник
Python 2, 149 байт
Первый цикл сканирует массив слева направо. Каждый бит, проиндексированный
i
, проверяется, чтобы увидеть, может ли он быть первым битом в максимальной фазе.Это делается внутренним циклом, который сканирует справа налево. Если подрешетка между
i
иj
является фазой, мы увеличиваем счетчик и идем дальше. В противном случае мы продолжаем идти, пока подмассив не станет слишком маленьким или неj
достигнет конца предыдущей максимальной фазы.Пример:
источник
Python 2, 144
Введите ввод в форму
[0,1,0,1,0]
.Подпоследовательности проверяются с упорядочением путем увеличения начального элемента, а затем уменьшения длины. Таким образом, известно, что новая подпоследовательность не является подпоследовательностью предыдущей подпоследовательности, если индекс ее последнего элемента больше, чем любой индекс последнего элемента ранее найденной последовательности.
источник
Dyalog APL, 86 байт *
Попробуй это здесь. Использование:
Вероятно, это может быть довольно много, особенно в средней части, где проверяется фазовое состояние.
объяснение
Сначала я собираю подстроки входного вектора в матрицу, где верхний левый угол содержит весь ввод, используя
⌽∘.{(⍺-1)↓⍵↑t}⍨⍳⍴t←⍵
. Для ввода0 0 0 0 0 1 0
эта матрицаЗатем я отображаю условие нахождения фазы над ним, в результате чего получается 0-1-матрица.
Для того, чтобы получить число максимальных фаз, я заливать
1
«S вправо и вниз , используя∨⍀∨\
,собрать уникальные строки с
∪↓
,и посчитайте те, которые содержат хотя бы одно
1
использование+/∨/¨
.* Существует стандартная 1-байтовая кодировка для APL.
источник
Clojure, 302
и немного негольфированная версия
отзывной как это:
(s [0 1 0 1 0] 10 0)
. Это требует нескольких дополнительных аргументов, но я мог бы избавиться от тех, у которых есть дополнительные 20 символов.источник
JavaScript (ES6) 141
Алгоритм @ grc, портированный на JavaScript
Ввод может быть строкой или массивом
Тест в консоли FireFox / FireBug
Выход
источник
CJam,
110103 байтаПреттттт долго. Можно много играть в гольф.
Ввод как
Выход - это количество фаз.
Попробуйте онлайн здесь
источник
JavaScript (ECMAScript 6),
148139 байтОбрабатывает массив и начинает итерацию с последнего индекса рекурсии. Аргумент может быть либо массивом, либо строкой.
источник
f=(s,l=0,e=0,p=0)=>{for(n=s.length,o=[j=0,y=0],i=l;i<n;++j>4&x==s[l]&i>e&c>=.85*j&&(e=i,y=1))c=++o[x=s[i++]];return l-n?f(s,l+1,e,p+y):p}
Вольфрам - 131
пример
источник
Java: 771 байт
запустить с помощью вызова метода s (int [] input)
источник