Задача состоит в том, чтобы определить недостающее число в строке из неограниченных целых чисел.
Вам дана строка цифр (допустимый ввод будет соответствовать регулярному выражению ^[1-9][0-9]+$
). Строка представляет собой последовательность целых чисел. Например, 1234567891011
. Все числа в последовательности находятся в диапазоне от 1
и 2147483647
включительно.
Последовательность представляет собой последовательность чисел, где каждое число на единицу больше, чем его предшественник. Однако эта последовательность может содержать один и только один пропущенный номер из последовательности. Возможно, что данная строка также не содержит пропущенных чисел в последовательности. Строка всегда будет содержать как минимум два числа из последовательности.
Код должен выводить или возвращать пропущенное значение или 0
(это 0
- не ложное значение) в случае, если пропущенные значения не были найдены.
Ниже приведены допустимые входные данные и их вывод / возврат:
input output actual sequence (for refrence)
123467 5 1 2 3 4 _ 6 7
911 10 9 __ 11
123125126 124 123 ___ 125 126
8632456863245786324598632460 8632458 8632456 8632457 _______ 8632459 8632460
123 0 1 2 3
8632456863245786324588632459 0 8632456 8632457 8632458 8632459
Хотя все это описывается как «строка» в качестве входных данных, если язык способен обрабатывать произвольно большие числа ( dc
и mathematica
, я смотрю на вас двоих), входные данные могут быть произвольно большим числом вместо строки, если это делает код проще.
Для справки, это было вдохновлено вопросом Programmers.SE: найти пропущенное число в последовательности в строке
Ответы:
Haskell,
115112 байтовПервая строка - это определение вспомогательной функции, вторая - основная анонимная функция. Проверяйте контрольные примеры (мне пришлось запускать более короткие тесты из-за временных ограничений).
объяснение
Это решение грубой силы: разбить строку на слова всеми возможными способами, разобрать слова в целые числа, посмотреть, отсутствует ли диапазон с одним пропущенным элементом (вернуть этот элемент и т. Д.
0
), И взять максимум для всех разбиений. Проверка диапазона с отсутствующим элементом выполняется в вспомогательной функцииg
, которая берет списокb
и возвращает единственный элемент в диапазоне[head of b..last of b]
, которого нетb
или0
если он не существует.источник
JavaScript (ES6), 117 байт
объяснение
Довольно эффективный подход. Завершает мгновенно для всех тестовых случаев.
Получает каждую подстроку от начала входной строки как число
n
и инициализирует отсутствующее числоm
как0
. Затем он многократно удаляетn
из начала строки, увеличиваетn
и ищет строку для него. Еслиindex of n != 0
это проверяетm
. Еслиm == 0
установитьm = n
и продолжить, если нет, пропущено несколько номеров, поэтому прекратите проверку из этой подстроки. Этот процесс продолжается, пока вся строка не будет удалена.источник
JavaScript (ES6) 114
Менее гольф и объяснил
Тестовое задание
источник
C
183168166163 байтаUngolfed
источник
891112
где числа имеют разную длину?sprintf
Вызов возвращает длину недостающего числа, независимо от того , это больше , чем предыдущий или нет.