Напишите программу , которая проходит через строку без пробельных символов (можно предположить , что они являются цифры 0
до 9
, но ничего в том , как они должны быть обработаны не зависит от этого) , и добавляет пространства в соответствии со следующими правилами.
- Пусть текущий токен будет пустой строкой, а ранее выпущенные токены будут пустым набором.
- Перебирайте символы строки. Для каждого символа сначала добавьте символ к текущему токену. Затем, если текущий токен еще не находится в наборе ранее выпущенных токенов, добавьте текущий токен в этот набор и пусть новый текущий токен будет пустой строкой.
- Если по достижении конца строки текущий токен пуст, выведите ранее выпущенные токены в порядке эмиссии, разделенных пробелом. В противном случае выведите исходную строку дословно.
вход
Ввод к STDIN должен быть последовательностью цифр.
Выход
Программа должна распечатать результат, как указано в шаге 3.
образцы
Образцы входов
2015
10101010
4815162342
101010101010
3455121372425
123456789101112131415
314159265358979323846264338327950288419716939937
Пример выходов
2 0 1 5
10101010
4 8 1 5 16 2 3 42
1 0 10 101 01 010
3 4 5 51 2 1 37 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 95 0 28 841 971 69 39 937
Это код гольф, поэтому применяются стандартные правила компьютерной игры. Самая короткая программа в байтах побеждает.
(Пожалуйста, запросите любые пояснения в комментариях. Я все еще новичок в этом. Спасибо!)
4815162342
Я вижу, что ты там сделал, брат .1 0 10
, следующая итерация найдет1
(уже использованная), затем продвинет одну, чтобы найти10
(уже использованную), затем продвиньте одну, чтобы найти101
, которая является новой и будет «добавлена». Затем будет добавлен пробел, и вы получите новый0
, который уже использовался, но находится в конце строки. Следовательно, вывод будет1 0 10 101 0
недопустимым (0
повторяется), и сценарий должен просто вывести входную строку. Это можно было сделать, только1010
если101
уже было использовано.If a unique number cannot be formed at the end of the string, then the input should be printed verbatim
может быть разделен, поэтому он печатается как есть.1
, который будет повторяться. Таким образом, вместо этого вы перемещаетесь вправо на 5 в пространстве 5, а затем снова перемещаетесь вправо на шаге 4, снова вводите шаг 5 и создаете101
.Ответы:
Pyth, 22 байта
Ведущее пространство важно.
источник
Retina ,
6861 байт<empty>
пустая строка Обратите внимание на завершающий пробел в строке 3. Вы можете запустить приведенный выше код из одного файла с-s
флагом.объяснение
Этот первый шаг реализует правила с 1 по 6. Это подстановка регулярных выражений, которая применяется несколько раз, пока строка не перестанет меняться (для этого и нужно
+
). На каждом шаге мы добавляем один пробел в строку слева направо (следуя правилам конкурса). Регулярное выражение соответствует самой короткой строке цифр, которая не появилась в уже обработанной части строки. Мы гарантируем, что мы смотрим на префикс оставшейся строки с границей слова\b
и проверяем, что мы можем достичь конца строки, не пропуская пробелы с(\w+)$
. Последнее также гарантирует, что мы выполняем только одну замену за шаг.Это соответствует любому пробелу (который находится в конце регулярного выражения), при условии, что последний сегмент строки совпадает с любым другим сегментом в строке, и заменяет их пустой строкой. То есть мы отменяем первый шаг, если он привел к неверному последнему сегменту, реализуя правило 7.
источник
Pyth,
2423 байтаПопробуйте это здесь .
Спасибо @FryAmTheEggman за сохранение байта: о)
источник
Python 3, 92 байта
В основном версия решения @ Willem для игры в гольф.
источник
[" ".join(o),i][n>""]
bool(n)
но я не думал об этомn>""
.Python 3,
10099 байтисточник
else "
.Брахилог , 91 байт
Это заставило меня осознать, что в синтаксисе нужно многое изменить ...
объяснение
источник
CJam, 26 байтов
Проверьте это здесь.
объяснение
источник
JavaScript (ES6), 109
Мой формат вывода не совсем совпадает с форматом вывода в вопросе (есть пробел). Я не вижу в этом недостатка, поскольку формат вывода не указан (просто программа должна печатать число после числа ... )
Попробуйте запустить приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6. Разработано с Firefox, протестировано и работает на последней версии Chrome.
источник
GNU sed,
83777371 байт(Наберите один дополнительный, потому что нам требуется
-r
флаг)Внутренний цикл проверяет повторяющуюся последовательность и добавляет символы по мере необходимости, пока после разделителя не появится уникальный номер
_
. Внешний цикл движется_
вдоль.Расширенная, аннотированная версия:
источник
t
в одном./((\b[^ ]+).*\b\2)_/{
можно переписать как/(\b[^ ]+).*\b\1_/{
, без причин для 2 групп захвата.\1
хотя!Рубин, 57 + 1 = 58 байт
Использует флаг командной строки
-p
(илиpl
если ваш ввод имеет завершающий перевод строки). Использует несколько свойств словарей Ruby Hash: вы можете безопасно изменять строку, использованную для определения ключа, без изменения ключа (что не работает для других изменяемых типов),.keys
возвращает ключи в том порядке, в котором они были вставлены, и[]||=
оператор обеспечивает краткий способ ветвления того, существует ли данный ключ.источник
Haskell, 105 байт
f
Является ли.источник
PHP - 148 байт
Крутой вызов, очень весело!
источник