Вызов
Учитывая последовательность чисел, создайте функцию, которая возвращает последовательность шагов.
- Предположим, что последовательность будет
N >= 3
- Последовательность будет повторять ее шаги хотя бы один раз
- Последовательность будет содержать только натуральные числа
- Ваша функция или программа должна возвращать максимально короткую последовательность шагов
Пример:
Входные данные: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
Выход: [1, 1, 2]
Пояснение: Исходная последовательность начинается с 1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)
. Затем это повторяется. Выходом тогда является[1 step, 1 step, 2 steps] => [1, 1, 2]
Другой пример:
Входные данные: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
Выход: [3, 1, 1, 1]
[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
\ /\ /\ /\ /
3 1 1 1 Then it repeats...
Тестовые случаи
Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]
Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]
Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]
Input: [5, 6, 7] => Output: [1]
Разъяснения
- Длина ввода - 1 делится на длину вывода
- Предположим, что последовательность всегда будет увеличиваться
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
источник
Ответы:
Желе ,
97 байтПопробуйте онлайн!
Как это устроено
источник
JavaScript (ES6), 58 байт
Вывод строки через запятую (с запятой).
Попробуйте онлайн!
Или 56 байт, если мы используем
,-
в качестве разделителя и предполагаем, что последовательность всегда строго увеличивается.Как?
Сначала мы преобразуем входной массив a [] в список последовательных различий с помощью:
Поскольку p изначально установлено в нечисловое значение (функция обратного вызова map () ), первая итерация дает NaN .
Пример:
Затем мы приводим результат к строке:
Наконец, мы ищем самый короткий 1 шаблон целых чисел, разделенных запятыми (
,\d+
), начинающихся сразу после «NaN» и повторяющихся до конца строки:1: использование не жадных
*?
источник
/(,.+?)\1*$/
.Брахилог , 11 байт
Попробуйте онлайн!
Было бы 5 байтов, если бы был встроенный для последовательных различий.
объяснение
источник
Pyth, 11 байт
Попробуй здесь
объяснение
источник
Japt ,
1412 байтПопытайся
объяснение
оригинал
Попытайся
источник
R ,
4946 байтПолная программа:
Попробуйте онлайн!
R ,
725854 байтаОтправка оригинальной функции со всеми тестами в одном месте:
Попробуйте онлайн!
Спасибо JayCe за предложение полного программного маршрута и -4 байта для функции, и Джузеппе за дальнейшие -3.
источник
a<-
здесь тоже не нуженJ ,
2219 байт3 байта сохранены благодаря FrownyFrog!
Попробуйте онлайн!
[Попробуйте онлайн!] [TIO-ji2uiwla]
Как?
источник
/:
вместо вас#\
, вы можете0{"1[:~.
сэкономить 1 байт."0 1
это"{
05AB1E , 8 байтов
Сохранено 3 байта благодаря Кевину Круйссену .
Попробуйте онлайн!
05AB1E , 11 байт
Попробуйте онлайн!
13 байт
Симпатичная альтернатива, ИМО:
Попробуйте онлайн!
источник
.œ
.Javascript, 49
56байтРедактировать 7 байтов спасено спасибо (угадайте, кто?) Арно
Та же идея регулярного выражения, что и у Арно, но, как ни странно, такая разная реализация ...
Возврат строки с разделенными запятыми шагами (и начальная запятая)
Тестовое задание
источник
match
было моим плохим решением. Вы можете переиграть меня еще немного . :-)MATL ,
141312 байтПопробуйте онлайн!
Просто обнаружил, что MATL имеет функцию циркулянта!
объяснение
d
- Получить различия между последовательными терминами, как массивt5YL
- продублируйте это, затем вызовитеYL
функцию ('gallery') с5
опцией ('circulant'). Создает матрицу с заданным вектором в качестве первой строки, затем в последовательных строках один и тот же вектор смещается по кругу, пока не будет развернут.FTF#Xu
- Проверьте наличие уникальных строк и получите их номера строк (не уверен, есть ли более короткий способ сделать это). Когда шаги последовательности повторяются, смещенная по кругу строка будет такой же, как и первая строка, а последующие строки будут повторяться. Таким образом, это получает индексы первого запуска шагов последовательности, прежде чем они начнут повторяться.)
- индекс, используя это в исходный массив различий, чтобы получить ответ.Старшая:
Попробуйте онлайн!
(-1 байт благодаря Джузеппе)
Объяснение:
источник
Python 2 , 101 байт
Попробуйте онлайн!
Сначала генерирует дельты d , затем находит первый префикс p of d, который при повторении ⌊len (L) / len (p) ⌋ раз дает L , где L - список ввода.
источник
Рубин , 62 байта
Опирается на логику Regex, адаптированную из ответа Арно .
Попробуйте онлайн!
Альтернативное определение разности шагов, также 62 байта:
Попробуйте онлайн!
источник
Java 10,
104100 байтRegex
( ?.+?)\1*$
для кратчайшего повторения подстроки из @Neil 's комментарий на @Arnauld ' JavaScript (ES6) ответ s .Попробуйте онлайн.
Объяснение:
источник
APL + WIN, 39 байт
Подскажите для ввода.
Попробуйте онлайн! Предоставлено Dyalog Classic
Объяснение:
источник
Python 2 ,
8685 байтПопробуйте онлайн!
Построить различия как
d
; еслиd
повторяется с размером блока,n
тоd[n:]==d[:-n]
; остальное рекурсивно.источник
Сетчатка 0.8.2 , 42 байта
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Вывод включает начальную запятую. Объяснение:
Преобразовать в одинарный.
Вычислить разницу вперед, за исключением первого числа, которое остается позади.
Подходим повторяющиеся различия.
Преобразовать в десятичную.
источник
05AB1E ,
1413 байтПопробуйте онлайн или проверьте все контрольные примеры .
Я знаю, что @ Mr.Xcoder уже опубликовал два более коротких ответа 05AB1E , но я хотел попробовать этот альтернативный подход, использующий проверку на вращение и равенство.
Может быть, удастся сыграть в нее несколько байт, не упав
Á
.-1 байт после подсказки @Emigna для удаления регистров global_variable (
©
и 2x®
) и использования взамен Duplicate (D
) и Triplicate (Ð
).Объяснение:
источник
Haskell, 107 байт
х - входной массив.
источник
f x=
. Также использованиеinits
требуетimport Data.List
, поскольку это не является частью Prelude: попробуйте онлайн!(init x)
может бытьx
связано с тем, чтоzip
автоматически усекается, если один из списков длиннее другого. Иmap(uncurry(-))$zip
существует Строить-в:zipWith(-)
. Вместо того ,f x=let i=...in
вы можете использовать шаблон охранник:f x|i<-...=
.filter
,!!0
вместоhead
иcycle
вместоconcat$repeat
: Попробуйте онлайн!Stax ,
86 байтЗапустите и отладьте его
Вот распакованная аннотированная версия, чтобы показать, как она работает.
Запустите этот
источник
Perl 6 , 57 байт
Проверь это
Выход разделен пробелом (
"1 1 2"
)Expanded:
источник
~(.skip Z-$_)
05AB1E , 9 байтов
Объяснение:
Альтернатива 9 байт:
Тот же алгоритм, но вместо сравнения со списком дельт (который необходимо сохранить / восстановить), он использует
.¥
(undelta), а затем сравнивает с (неявным) вводом.Попробуйте онлайн!
источник
K4 , 30 байт
Решение:
Примеры:
Объяснение:
Кажется здоровенным для того, что мы пытаемся решить. Получите дельты входных данных, затем постройте последовательности и определите самую короткую, которая соответствует этому.
источник
Wolfram Language (Mathematica) , 26 байтов
Попробуйте онлайн!
Возвращает
Sequence
содержащий шаги.+2 байта для
List
вывода:Попробуйте онлайн!
источник
Perl 5
-p
, 55 байтПопробуйте онлайн!
Числа вводятся как разделенный пробелами список. Вывод в том же формате.
источник