обзор
Некоторым из вас может быть известна последовательность Колакоски ( A000002 ), хорошо известная самоссылочная последовательность, которая имеет следующее свойство:
Это последовательность, содержащая только 1 и 2, и для каждой группы из 1 и 2, если вы сложите длину прогонов, она будет равна половине длины. Другими словами, последовательность Колакоски описывает длину серий в самой последовательности. Это единственная последовательность, которая делает это, за исключением той же самой последовательности с удаленной начальной 1. (Это верно только в том случае, если вы ограничиваете себя последовательностями, состоящими из 1 и 2 - Мартин Эндер)
Соревнование
Задача, учитывая список целых чисел:
- Выведите,
-1
если список НЕ является рабочим префиксом последовательности Колакоски. - Выведите количество итераций до того, как последовательность станет
[2]
.
Разработанный пример
Используя предоставленное изображение в качестве примера:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] # Iteration 0 (the input).
[1,2,2,1,1,2,1,2,2,1,2] # Iteration 1.
[1,2,2,1,1,2,1,1] # Iteration 2.
[1,2,2,1,2] # Iteration 3.
[1,2,1,1] # Iteration 4.
[1,1,2] # Iteration 5.
[2,1] # Iteration 6.
[1,1] # Iteration 7.
[2] # Iteration 8.
Следовательно, результирующее число 8
для ввода [1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1]
.
9
Также хорошо, если вы 1-индексации.
Набор тестов (вы также можете тестировать с под-итерациями)
------------------------------------------+---------
Truthy Scenarios | Output
------------------------------------------+---------
[1,1] | 1 or 2
[1,2,2,1,1,2,1,2,2,1] | 6 or 7
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1] | 8 or 9
[1,2] | 2 or 3
------------------------------------------+---------
Falsy Scenarios | Output
------------------------------------------+---------
[4,2,-2,1,0,3928,102904] | -1 or a unique falsy output.
[1,1,1] | -1
[2,2,1,1,2,1,2] (Results in [2,3] @ i3) | -1 (Trickiest example)
[] | -1
[1] | -1
Если вы запутались:
Правда: в конечном итоге он достигнет двух без какого-либо промежуточного шага, имеющего какие-либо элементы, кроме 1
и 2
. -Einkorn Enchanter 20 hours ago
Ложь: конечное значение нет [2]
. Промежуточные термины содержат нечто иное, чем набор [1,2]
. Пара других вещей, см. Примеры.
Это код-гольф , победителем будет самый низкий счетчик байтов.
-1
?[2]
до тех пор, пока я не увидел[2,2,1,1,2,1,2]
тестовый пример1
и2
.[1]
в качестве контрольного примера.Ответы:
Haskell ,
12687797675 байт39 байтов сэкономлено благодаря Эрджану Йохансену
Попробуйте онлайн!
Это ошибки при плохом вводе.
источник
f
(и, следовательно,!
) можно значительно сократить, используя ленивое производство +span
/length
вместо аккумуляторов. Попробуйте онлайн![1]
import Data.List;f l=length<$>group l
. (<$>
здесь это синонимmap
.) Кроме того, вместо использования двух разных вариантов-1
, короче использовать@(_:_:_)
шаблон, чтобы заставить основной случай соответствовать только длинам> = 2 списков. Попробуйте онлайн!05AB1E , 22 байта
Попробуйте онлайн!
объяснение
источник
[1,1,2,2,1,2,1,1,2,2,1,2,2,1,1,2,1,1]
SCALA, 290 (282?) Символов, 290 (282?) Байтов
Это заняло у меня тааак лун ... Но я наконец-то сделал!
с этим кодом:
Я не знаю, должен ли я считать
var u=t
в байтах, учитывая, что я не используюt
во время алгоритма (копия просто для того, чтобы получить модифицируемыйvar
вместо параметра, которыйt
рассматривается какval
- спасибо ScaLa ). Пожалуйста, скажите мне, если я должен посчитать это.Достаточно жестко. Попробуйте онлайн!
PS: я думал сделать это рекурсивно, но мне придется передать счетчик в качестве параметра истинной рекурсивной «подфункции»; этот факт заставляет меня объявить две функции, и эти символы / байты просто потеряны.
РЕДАКТИРОВАТЬ: Я должен был изменить (?), Потому что мы не уверены, что мы должны принять в
[1]
случае подсчета . Итак, вот модифицированный код:Это не оптимизировано (у меня есть дубликат "out" для тех же условий: когда я получаю
[2]
и когда параметр[2]
обрабатывается отдельно).NEW COST = 342 (я не изменил название специально)
источник
[1]
[2]
»[1]
никогда не достигает[2]
и, следовательно, должен вернуть -1 .JavaScript,
146142 байтаСначала попробуйте в коде гольф, кажется, что «возврат» в более крупной функции довольно утомителен ...
Кроме того, проверка b = 1 и b = 2 занимает несколько байтов ...
Вот код:
объяснение
Тестовые данные (используя данные тестовых данных)
Редактировать 1: 146 -> 142. Отмена редактирования при уменьшении байтов, потому что это влияет на вывод; а некоторые редактируют последнее утверждение
источник
f=a=>{for(i=t=!a[0];a[1];)r=[],c=j=0,a.map(a=>{t|=a-1&&a-2;a-c&&(0<j&&r.push(j),c=a,j=0);j++}),(a=r).push(j),i++;return t||a[0]-2?-1:0^i}
сохраняет 5 байт (для цикла вместо while; запятые против фигурных скобок; && vs if). Вы можете использовать закрывающий компилятор Google ( closure-compiler.appspot.com ), чтобы сделать эти оптимизации для васЖеле ,
2625222120 байтПопробуйте онлайн!
Этот код фактически не работал правильно до 20 байт, и я даже не заметил; это не удалось в
[2,2]
тестовом случае. Должно работать отлично сейчас.источник
JavaScript (ES6),
1271269580 байт0 индексированные. Кидает
"ReferenceError: X is not defined"
и"InternalError: too much recursion"
на плохой ввод.Контрольные примеры
Показать фрагмент кода
источник
Clojure, 110 байт
Базовый
loop
с предварительной проверкой на крайних случаях. Возвращаетnil
для неверных входных данных. Я не знал(= [2] '(2))
этоtrue
: oисточник
Python 2, 146 байт (только функция)
Возвращает 0 при ложном вводе (хорошо, поскольку он 1-индексирован). Просто используйте это так:
источник
Mathematica, 82 байта
Function
который многократно заменяет{2}
неопределенный символT
, список (один или несколько)1
s и2
s на следующую итерацию и все остальное,0
пока не будет достигнута фиксированная точка, затем возвращаетFirstPosition
символT
в результирующемFixedPointList
минусе1
. Выход ,{n}
гдеn
есть (1
-indexed) число итераций , необходимых для достижения{2}
для случая truthy и-1+Missing["NotFound"]
для falsy случая.Если выходные данные должны быть,
n
а не{n}
, это стоит еще три байта:источник
Python 2 ,
184 163156 байтPython 2 , 156 байт
Попробуйте онлайн!
Объяснение:
источник
Желе , 17 байт
Попробуйте онлайн!
источник
Python 2 , 122 байта
Попробуйте онлайн!
Python 3 , 120 байт
Попробуйте онлайн!
объяснение
Новая последовательность (w) инициализируется для сохранения следующей итерации редукции. Счетчик (c) инициализируется для отслеживания количества итераций.
Каждый элемент в исходной последовательности (ях) сравнивается с предыдущим значением. Если они одинаковы, значение последнего элемента (w) увеличивается на 1. Если они различаются, последовательность (w) расширяется на [1].
Если w == [2], счетчик (c) возвращается. Иначе, если исходная последовательность (и) содержит другие элементы, кроме 1 и 2, возвращается значение -1. Если это не так, функция вызывается рекурсивно с новой последовательностью (w) как (s) и счетчик (c) увеличивается на 1.
источник
def f(s,c=2,j=0,w=[1]):
, но это дает другой результат. Кто-нибудь может объяснить, почему это так?R 122 байта
Проходит все тестовые случаи. Выдает одну или несколько ошибок в противном случае. Я ненавижу проверки достоверности; этот код мог бы быть настолько удачным, если бы входные данные были хорошими; это было бы короче, даже если бы входные данные были последовательностью 1 и 2, а не обязательно префиксом последовательности Колакоски. Здесь мы должны проверить как начальный вектор (в противном случае тестовый случай
[-2,1]
) прошел бы), так и результирующий вектор (в противном случае[1,1,1]
прошел бы).источник
Рубин ,
8177 байтПопробуйте онлайн!
Редактировать: Сохранены 4 байта путем преобразования в рекурсивную лямбду.
Возвращает 1-индексированное число итераций или 0 как фальси.
Использует метод чанков Ruby enumerable, который делает именно то, что нам нужно - группировать последовательные серии одинаковых чисел. Длины прогонов составляют массив для следующей итерации. Продолжает итерацию, пока массив длиннее 1 элемента и не встречаются никакие числа, кроме 1 и 2.
источник
Pyth , 45 байт
Попробуйте онлайн!
Это вероятно все еще пригодно для игры в гольф. Он определенно пригоден для игры в гольф, если бы
.?
работал так, как я надеялся (else
для самой внутренней структуры, а не внешней)источник
Perl 5
-p
, 71 байтПопробуйте онлайн!
1
-indexed. Выходы0
на ложь.источник