Наступил 2019 год, и, вероятно, все заметили особенность этого числа: на самом деле оно состоит из двух под номерами (20 и 19), представляющих последовательность последовательных убывающих чисел.
Вызов
Для заданного числа x
верните длину максимальной последовательности последовательных убывающих чисел, которые можно сформировать, взяв под номера x
.
Примечания :
- под номера не могут содержать начальные нули (например,
1009
не могут быть разбиты на10
,09
) - последовательный и нисходящий означает, что число в последовательности должно быть равно предыдущему числу -1, или (например, не может быть разбит на, потому что и не являются последовательными, )
52
5,2
5
2
2 ≠ 5 - 1
- последовательность должна быть получена с использованием полного числа, например,
7321
вы не можете отказаться7
и получить последовательность3
,2
,1
- только одна последовательность может быть получена из числа, например ,
3211098
не может быть разделен на две последовательности3
,2
,1
и10
,9
,8
вход
- Целое число (
>= 0
): может быть числом или строкой, или списком цифр
Выход
- Одно целое число с учетом максимального числа убывающих подузлов (обратите внимание, что нижняя граница этого числа равна
1
, т.е. число составляется само по себе в порядке убывания длины один)
Примеры :
2019 --> 20,19 --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
210 -> 2,1,0
не так (то же самое с0 -> 0
)? Задача говорит, что « под номера не могут содержать начальные нули », является ли ноль особым случаем?212019
. Кажется, я не прочитал все правила.Ответы:
Желе ,
159 байтИсправлено благодаря Денису
Попробуйте онлайн! (дажеO ( N2)
321
занимает полминуты, так как код по крайней мере)Как?
источник
JavaScript (ES6), 56 байт
Порт ответа Python от ArBo значительно короче. Однако в некоторых тестовых случаях это не удается из-за слишком большой рекурсии.
Попробуйте онлайн!
JavaScript (ES6), 66 байт
Принимает ввод в виде строки.
Попробуйте онлайн!
комментарии
источник
Perl 6 ,
43 4140 байт-1 байт благодаря nwellnhof
Попробуйте онлайн!
Решение на основе регулярных выражений. Я пытаюсь найти лучший способ сопоставления из нисходящего списка, но Perl 6 плохо справляется с разбиением
Объяснение:
источник
Python 3 ,
232228187181180150149 байт-1 благодаря @ Джонатану Фреху
Попробуйте онлайн!
Исходный негольфированный код:
источник
s+1 for
может бытьs+1for
,(t(n[:j])-t(n[j:j+i])==1)*t(n[0])
может бытьt(n[:j])-t(n[j:j+i])==1>=t(n[0])
.if
.Python 2 ,
787473 байтаПопробуйте онлайн!
-1 байт благодаря Арно
Принимает ввод в виде строки. Программа довольно быстро достигает предела глубины рекурсии Python, но может завершить большинство тестовых случаев.
Как это устроено
источник
a+c+1
можно сократить доa-~c
.05AB1E , 10 байтов
Чрезвычайно медленно, поэтому TIO ниже работает только для тестовых случаев ниже 750 ..
Попробуйте онлайн .
Объяснение:
источник
n!
кn lg n
просто не стоит.Pyth, 16 байт
Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
источник
Желе , 11 байт
Попробуйте онлайн!
Как это устроено
источник
Древесный уголь , 26 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Цикл
i
от 0 до длины входа.Цикл
k
от 0 до длины входа.Вычислить первые
k
числа в нисходящей последовательности, начиная с числа, заданного первымиi
цифрами ввода, объединить их и накапливать каждую результирующую строку в предварительно определенном пустом списке.Найдите положение первой совпадающей копии ввода и уменьшите ее по модулю 1 больше, чем длина ввода.
Пример: для ввода
2019
генерируются следующие строки:2019
затем находится по индексу 12, который уменьшается по модулю 5, чтобы дать 2, желаемый ответ.источник
Haskell, 87 байт
Ввод представляет собой список цифр.
Попробуйте онлайн!
Функция
#
создает список всех возможных разбиений, глядя на обаa
ко всем расщеплениям, возвращаемым рекурсивным вызовом с остальной частью input (x<-b#c
), но только если следующий номер не равен нулю (b>0
) (или это последний номер в input (c==[]
)) иa
он на единицу больше первого номер соответствующего предыдущего разбиенияx
(a==x!!0+1
).и
b
из списка ввода к текущему номеруa
и продолжение с остальной частью ввода ((10*a+b)#c
)Базовый случай, когда входной список пуст (т.е. не соответствует шаблону
(b:c)
). Рекурсия начинается с текущего числа,a
являющегося0
((0#)
), которое никогда не попадает в первую ветвь (a
предшествует всем предыдущим расщеплениям), потому что оно никогда не будет больше, чем любое число расщеплений.Возьмите длину каждого разделения и найдите максимум (
maximum.map length
).Вариант также с 87 байтами:
который в основном работает аналогичным образом, но вместо сохранения всего разбиения в списке он сохраняет только пару
(r,x)
длин разбиенияr
и первое число в разбиенииx
.источник
Python 3 ,
302282271 байт-10 байт благодаря подсказке @ElPedro.
Принимает ввод в виде строки. В основном, это требует увеличения больших срезов числа слева и определяет, может ли быть сформирована последовательность для этого среза числа, используя все числа.
Попробуйте онлайн!
источник
range
3 раза, вы можете определитьR=range
вне обеих функций, а затем использоватьR(whatever)
вместо того,range(whatever)
чтобы сохранить 4 байта.Japt , 27 байт
Попробуйте онлайн! или проверьте большинство тестовых случаев
Это не очень хорошо, но он использует уникальный метод, и, возможно, есть место для игры в гольф намного больше. Он также работает достаточно хорошо, чтобы все тестовые случаи, кроме как
201200199198
избежать тайм-аута.Объяснение:
источник
21201
потому что они не обеспечивают правильное выравнивание конца последовательности (из моей исходной версии строка «заканчивается запятой»). Эта или эта альтернатива работает.210
потому что после 0. Разделителя нет. Вот фиксированный 28-байт, который работает.Haskell, 65 байт
Ввод - это строка.
Попробуйте онлайн!
Полностью отличается от моего другого ответа . Простая грубая сила, которая пробует все списки последовательных убывающих чисел, пока не найдет тот, который равен входному списку.
Если ограничить ввод число до 64-битных целых чисел, мы можем сохранить 6 байт, обернув
y
через[1..19]
, потому что самое большое 64-разрядное целое число имеет 19 цифр , и нет никакой необходимости тестирования списков с большим количеством элементов.Haskell, 59 байт
Попробуйте онлайн!
источник
Python 2 , 95 байт
Другое медленное, грубое решение.
Попробуйте онлайн!
источник
Dyalog APL, 138 байтов
Немного глоток, но он работает быстро и для больших чисел. Если вы попробуете это онлайн , добавьте префикс dfn by
⎕←
и введите справа текст в виде списка цифр.объяснение
Во-первых, внутренний dfn справа, который рекурсивно создает список возможных способов разбить (с
⊂
) список цифр. Например,1 0 1 0 ⊂ 2 0 1 9
возвращает вложенный вектор(2 0)(1 9)
.Мы используем
1,
для добавления столбца 1 с в начале и заканчиваем с матрицей допустимых разделов для ⍵.Теперь функция тренируется слева в паранах. Из-
⍨
за левого аргумента в последовательность входит строка матрицы разделов, а правый аргумент - ввод пользователя. Поезд представляет собой кучу вилок с верхним левым зубцом.Если раздел создает последовательность убывающих чисел, поезд возвращает длину последовательности. В противном случае ноль.
⍤1⊢
применяет последовательность функций между пользовательским вводом и каждой строкой матрицы разделов, возвращая значение для каждой строки матрицы.⊢
необходимо различать между операндом⍤
и аргументом производной функции от⍤
.⌈/
находит максимум.Мог найти более короткий алгоритм, но я хотел попробовать этот путь, который является самым прямым и декларативным из всех, что я мог придумать.
источник
TSQL, 169 байт
Примечание: это может быть выполнено только тогда, когда входные данные могут быть преобразованы в целое число.
Рекурсивный sql используется для зацикливания.
Golfed:
Ungolfed:
Попробуйте это
источник
R 101 байт
Попробуйте онлайн!
Больше 2 недель прошло без ответа R, поэтому я решил опубликовать свой собственный :)
Код довольно быстрый, так как он использует «ограниченный» метод грубой силы
Развернутый код и объяснение:
источник