Группировка берет список и разбивает его на новые списки равных смежных элементов. Например
[1,1,2,1,1] -> [[1,1],[2],[1,1]]
Если затем взять длину этих групп, вы получите новый список целых чисел.
[1,1,2,1,1] -> [2,1,2]
Ваша задача - написать программу, которая берет список положительных целых чисел и находит, сколько раз вы можете сгруппировать и увеличить его длину, прежде чем результирующий список будет содержать один элемент. Например, список [1,2,3,3,2,1]
можно перегруппировать 4 раза
[1,2,3,3,2,1]
[1,1,2,1,1]
[2,1,2]
[1,1,1]
[3]
Это код-гольф, поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.
Контрольные примеры
[1,2,3,3,2,1] -> 4
[1,2,3,4,5,6,7] -> 2
[1,1,1,1,1,1] -> 1
[2] -> 0
[1,2,4] -> 2
[1,2,2,1,1,2] -> 4
[1,2,2,1,1,2,1,2,2] -> 5
[1] -> 0
code-golf
array-manipulation
Пост Рок Гарф Хантер
источник
источник
[1]
является верным входом и должен давать0
, правильно?Ответы:
Haskell, 49 байтов
Попробуйте онлайн!
источник
CJam , 18 байт
Попробуйте онлайн!
источник
Japt , 12 байт
Проверьте это онлайн!
объяснение
Рекурсия - это действительно нетрадиционный подход для Japt, но она кажется на 4 байта короче, чем следующая альтернатива ...
источник
F.a()
по-прежнему доступна через историю изменений. Я хотел бы видеть ваш 14-байт, хотя!Брахилог , 12 байт
Попробуйте онлайн!
объяснение
источник
C (gcc) , 108 байтов
Попробуйте онлайн!
объяснение
Попробуйте онлайн!
источник
JavaScript (ES6),
676563 байтаКак ни странно, JavaScript и Japt, кажется, имеют один и тот же самый короткий алгоритм за один раз ...
источник
K (ок) ,
2019 байтРешение:
Попробуйте онлайн!
Примеры:
Объяснение:
Это довольно просто, мне интересно, есть ли еще лучший подход ... Найдите индексы, где входные данные различаются, разбейте на эти индексы и затем посчитайте длину каждого подсписка. Итерируйте, пока результаты не сойдутся в 1.
Примечания:
Следующее 14-байтовое решение работает для всех, кроме списка из одного элемента:
Попробуйте онлайн!
источник
J ,
2523 байта1 байт сохранен благодаря streetter
1 байт сохранен благодаря FrownyFrog
Попробуйте онлайн!
Начальное решение:
Попробуйте онлайн!
объяснение
источник
_2+
сохранить байт?#;.1@(0,2=/\])
экономит 1 байт.Stax , 9 байт
Запустите и отладьте его онлайн
Представление ascii той же программы таково.
При этом используется функция Stax, называемая генератором, который создает значение в соответствии с блоками преобразования и фильтрации.
источник
Python 2 , 84 байта
Попробуйте онлайн!
Как?
f
является рекурсивной функцией, которая, если ее входa
имеет длину 2 или более (len(a)>1
), возвращает1+f(x)
*, гдеx
длина группы равнаa
; в то время как если его вход имеет длину 1 или 0 возвращаетFalse
(равно 0 в Python) - это происходит потому, что правая частьand
не оценивается, когда левая ложь.*
-~f(x)
есть-(-1 - f(x))
но может упираться вand
отличие1+f(x)
илиf(x)+1
)Длина группы рассчитывается путем создания кода, который затем оценивается с помощью
eval(...)
. Созданный код является чем-то вроде,1,1,1+1+1,1,1+1,1,
который оценивается как кортеж(1,1,3,1,2,1)
.Код создается путем перемещения по головке
a
иa
без нее (...for x, y in zip(a,a[1:])
созданиеx
иy
каждая из соседних пар вa
. Если пара равна,x==y
оценивается какTrue
(1), в противном случаеFalse
(0) - этот результат используется для индексации в строку,,+
дающую+
и,
соответственно, и каждый результирующему символу предшествует1
('1'+...
) - все это затем имеет финальный, завершающий1,
добавленный конец. Например, если быa
были,[5,5,2,9,9,9]
тоx,y
пары были бы(5,5)(5,2)(2,9)(9,9)(9,9)
делать равенства10011
то символы были бы+,,++
, что с предыдущей1
ей становится1+1,1,1+1+
и окончательные Продольными1,
решения1+1,1,1+1+1,
который оценивает(2,1,3)
как необходимый.Обратите внимание, что трейлинг
,
гарантирует, что вход с одной группой оценивается как кортеж, а не как целое число (т.е.[3,3]
->1+1,
->,(2)
а не[3,3]
->1+1
->2
).источник
CJam , 19 байтов
Попробуйте онлайн!
источник
CJam , 20 байтов
Попробуйте онлайн!
источник
Perl 5 ,
53504945 байтВключает
+3
в себя для-p
Дайте список номеров одной строкой на STDIN
Попробуйте онлайн!
источник
Шелуха , 8 байт
-1 байт благодаря @Zgarb!
Попробуйте онлайн!
объяснение
источник
←Vε
это более короткая проверка для поиска индекса одноэлементного списка.Желе , 10 байт
Попробуйте онлайн!
источник
[1]
. Вы должны быть в состоянии исправить это с помощью двух dequeues / pops вместо_2
ÐĿ
Во-первых, это был плохой выбор ... Заменил его на цикл while.05AB1E , 9 байтов
Попробуйте онлайн!
объяснение
источник
Wolfram Language (Mathematica) , 32 байта
Сохранено 2 байта благодаря Мартину Эндеру. Использование кодировки CP-1252, где
±
один байт.Попробуйте онлайн!
источник
±{_}=0;±x_:=1+±(Length/@Split@x)
(при условииWindowsANSI
кодирования)Рубин ,
54 56 5554 байтаПопробуйте онлайн!
источник
SmileBASIC,
110108 байтФункция вызова как
R list,0
; вывод выводится на консоль.источник
Python 2 , 85 байт
Попробуйте онлайн!
источник
R ,
5145 байтПопробуйте онлайн!
Рекурсивно взять длину кодирования длины серии и увеличить счетчик.
источник
Сетчатка 0.8.2 , 31 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Если есть запятая, мы собираемся сделать еще одну итерацию, поэтому добавьте символ счета.
Замените каждый прогон его уменьшенной длиной. Вышеуказанные этапы повторяются до тех пор, пока не останется запятых.
Подсчитайте количество итераций.
источник
Perl 6 , 52 байта
Проверь это
Expanded:
источник
Brain-Flak , 78 байт
Попробуйте онлайн!
источник
Pyth , 9 байт
Тестирование!
источник
Котлин , 123 байта
Принимает
List<Int>
.Более читабельно:
Попробуйте онлайн!
131 байт, TIO
181 байт, TIO
Включает 39 для
import kotlin.coroutines.experimental.*
.источник
Красный , 140 байт
Попробуйте онлайн!
Я просто хотел дать Redse Parse диалект еще одну попытку.
Ungolfed
источник