Введение
По определению, уникальные идентификаторы должны быть уникальными. Наличие нескольких одинаковых идентификаторов приводит к получению неожиданных данных. Но поскольку данные поступают одновременно из нескольких источников, может быть сложно обеспечить уникальность. Напишите функцию, которая унифицирует список идентификаторов.
Возможно, это худший пазл из всех, что я написал, но вы поняли.
Требования
Учитывая список от нуля или более натуральных чисел, примените следующие правила к каждому числу от первого до последнего:
- Если номер первый в своем роде, сохраните его.
- Если число встречалось ранее, замените его наименьшим положительным целым числом, которого нет нигде во всем списке ввода или в любом существующем выводе.
Для решения:
- Решением может быть программа или функция.
- Ввод может быть строкой, массивом, переданным в качестве аргументов, или вводом с клавиатуры.
- Вывод может быть строкой, массивом или выводиться на экран.
- Все числа в списке вывода различны.
Предположения
- Список ввода чистый. Он содержит только положительные целые числа.
- Целое положительное число имеет диапазон от 1 до 2 31 -1.
- Менее 256 МБ памяти доступно для переменных вашей программы. (Как правило, массивы из 2 147 483 648 элементов не допускаются.)
Тестовые случаи
Input: empty
Output: empty
Input: 5
Output: 5
Input: 1, 4, 2, 5, 3, 6
Output: 1, 4, 2, 5, 3, 6
Input: 3, 3, 3, 3, 3, 3
Output: 3, 1, 2, 4, 5, 6
Input: 6, 6, 4, 4, 2, 2
Output: 6, 1, 4, 3, 2, 5
Input: 2147483647, 2, 2147483647, 2
Output: 2147483647, 2, 1, 3
счет
Просто простой код гольф. Наименьшее количество байтов к этому времени на следующей неделе побеждает.
code-golf
set-theory
Hand-E-Food
источник
источник
6, 6, 1, 2, 3, 4, 5
→6, 7, 1, 2, 3, 4, 5
6, 6, ...
давать6, 1, ...
?6, 6, 4, 4, 2, 2
Тестовый пример подтверждает интерпретацию Адама: ожидаемый результат есть6, 1, 4, 3, 2, 5
, а нет6, 1, 4, 2, 3, 5
.Ответы:
Брахилог , 8 байт
Попробуйте онлайн!
объяснение
источник
Java 8,
158144 байта.contains(m+c);m++)
чтобы.contains(++m+c);)
сохранить 1 байт, и одновременно преобразовать в Java 8, чтобы сохранить еще 13 байт.Пояснения:
Попробуй это здесь.
источник
JavaScript (ES6), 49 байт
источник
Рубин , 63 байта
Попробуйте онлайн!
объяснение
источник
05AB1E ,
171618 байтПопробуйте онлайн!
объяснение
источник
6, 6, 1, 2, 3, 4, 5
.[6, '1', '2', '3', '4', '5', '7']
. Должен дать[6, '7', '1', '2', '3', '4', '5']
.PHP, 121 байт
Онлайн версия
расширенный
источник
Python 2,
7779 байтБерет ввод с клавиатуры, вроде
[3, 3, 3, 3, 3, 3]
.Просто следите за наименьшим положительным целым числом, которое
j
до сих пор не использовалось. Для каждого элементаx
ввода выведите,x
если онx
еще не использовался, в противном случае выведитеj
. Наконец, обновляйтеj
каждый раз, когда вы что-то выводите.РЕДАКТИРОВАНИЕ: исправить ошибку при обработке ввода
[6, 6, 4, 4, 2, 2]
. Спасибо @Rod за указание на ошибку, а также на исправление. Ошибка заключалась в том, что в случае дублирования записи он вывел бы наименьшее число, не использованное для этой точки в списке, даже если этот вывод появился позже во входных данных. (Это было неправильно, как поясняется в посте и комментариях, но я все равно как-то испортил это.) В любом случае, исправление состояло в том, чтобы просто добавить список вводаa
к набору значений, которые в этом случае не могли быть выведены.источник
[6,6,4,4,2,2]
, вы можете (вероятно) исправить это, добавив+a
вwhile j in u:
->while j in u+a:
Haskell ,
7976 байтРЕДАКТИРОВАТЬ:
head
может быть заменено сопоставлением с образцом.([]#)
анонимная функция, принимающая и возвращающая список Используйте как([]#)[2147483647, 2, 2147483647, 2]
.Попробуйте онлайн!
Как это работает
?
является сокращенным оператором для проверки отсутствия элемента в списке.s#l
обрабатывает список целых чиселl
, учитывая списокs
уже используемых целых чисел.x
это следующее целое число, чтобы посмотреть,y
остальные.z
целое число, выбранное для следующего места. Этоx
еслиx
не является элементомs
, и первое положительное целое число ни в,s
ни вy
другом.(z:s)#y
затем возвращается сz
добавленным в список целых чисел.n
является пустым списком, поскольку непустые списки были обработаны в предыдущей строке.([]#)
принимает список и вызывает#
его как второй аргумент, а также пустой список для первого аргумента.источник
|z:_<-[x|...]...
APL (Dyalog 16.0), 34 байта
источник
Pyth ,
2120 байтТестирование
Я добавлю объяснение, когда у меня будет время.
источник
C # , 135 байт
Golfed
Ungolfed
Ungolfed читаемый
Полный код
релизы
135 bytes
- Исходное решение.Заметки
источник
Python 2 , 101 байт
Попробуйте онлайн! или попробуйте все тестовые случаи
источник
R , 39
46байтСоздает вектор из входных данных, затем заменяет дублированные значения диапазоном от 1 до миллиона, в которых удалены входные значения. Возвращает числовой вектор. Нет ввода вернет пустой вектор числовой (0).
Попробуйте онлайн!
Это выдаст предупреждение о длине вектора замены
источник
C
169 байтов133 байтавход = массив а, выход = модифицированный массив а
отформатированные
Слишком много байтов потрачено на эти циклы. Кто-нибудь думает о сокращении кода, изобретая новый алгоритм (который использует меньше цикла)? Я думал, но не нашел один.
источник
C # 7, 116 байт
изрезанный
Разъяснения
[1, 2, 3, ...]
, пропуская значения, присутствующие во входных данных.Онлайн версия
источник
Clojure, 72 байта
Основное сокращение. Если
i
до сих пор содержится в выходном списке, мы возьмем 2-й элемент (1 при 0-индексированном) из бесконечного списка целых чисел,(range)
из которого мы удалили те числа, которые уже были использованы. Диапазон начинается с нуля, поэтому мы не можем взять первый элемент, но второй.источник
R, 74 байта
читает список со стандартного ввода; возвращает NULL для пустого ввода.
объяснение:
1:length(n)
могут быть использованы, поскольку мы гарантированно никогда не нуждаемся в замене за пределами этого диапазона.Попробуйте онлайн!
источник
Аксиома, 169 байт
разгул и результат
источник