Дана строка, содержащая десятичные числа:
teststring134this 123test string54 100
увеличивайте каждое число в этой строке на единицу, чтобы дать новую строку
teststring135this 124test string55 101
,
Строка может быть представлена как:
- аргумент командной строки
- STDIN
- жестко закодированная переменная или аргумент функции
Закройте все возможные позиции для номера:
- в качестве префикса для слова;
123test
►124test
- в качестве суффикса для слова;
test123
►test124
- внутри слова;
te123st
►te124st
- один
test 123 test
►test 124 test
Вот не-решение для гольфа в Python:
NUMBERS = '0123456789'
def increment(s):
out = ''
number = ''
for c in s:
if c in NUMBERS:
number += c
else:
if number != '':
out += str(int(number) + 1)
number = ''
out += c
if number != '':
out += str(int(number) + 1)
number = ''
return out
print "\"%s\"" % (increment('teststring134this 123test string54 100'))
Это code-golf
вопрос, самый короткий код выигрывает.
Ответы:
Perl, 14 байт
Требуется
-p
переключатель, который я посчитал одним байтом.Пример запуска
источник
Рубин,
3024 байтаОжидает, что вход будет сохранен в
s
.источник
$1.next
быть использован в блоке?next
что это было сложно.Vim - 13 нажатий клавиш
Ожидается, что вход будет текущей строкой.
Или для конечного числа чисел (например, 999) при нажатии клавиш 8 + ceil (log (n)):
источник
JavaScript (ES6) - 28
Запустите с помощью
H("test 123 234t")
.источник
H=
удалить и просто сделать это анонимной функцией.Perl, 23
Предполагается, что входная строка назначена
$_
источник
Python 2 - 59
Введите строку в качестве переменной
n
источник
C99 - 86 (GCC 4.9.0 и Visual C ++ 2013)
Редактировать: и GCC 4.9.0 (с -std = c99), и Visual C ++ 2013 успешно создают (с предупреждениями) один и тот же код без включений. Я не знал, что ты мог сделать это! Спасибо за подсказку.
Редактировать: мне даже не пришло в голову, что я должен записать это на экран на лету вместо того, чтобы создать строку и затем распечатать ее. Это имеет огромное значение. Спасибо Деннис!
При этом используется жестко закодированная строка, но ее содержимое не учитывается в общей сумме (= "" считается).
В основном он проходит по строке по одному символу за раз, проверяя каждый, является ли он целым числом. Если это так, то он увеличивает целое число и записывает его в вывод, в противном случае он копирует текущий символ в вывод.
Это приводит к утечке жестко закодированной строки, поскольку она увеличивает s.
источник
include
s, и он все равно будет прекрасно компилироваться с gcc.99
?J (20)
Ожидает, что вход будет сохранен в переменной
a
.Тест:
источник
(f?) lex (39)
Файл
inc.l
:Обобщение:
Бег:
Я не проверял это с оригиналом
lex
. Комментарии приветствуются.источник
%%
поскольку это не код пользователя: flex.sourceforge.net/manual/…Emacs - 20 персонажей
Требует обработки текста для присутствия в текущем буфере. Здесь я посчитал CM-% одним символом, поскольку его можно вводить одним нажатием клавиши при удержании трех модификаторов.
источник
GNU sed, 304 (включая 1 для флага -r)
Я близко проголосовал за этот вопрос как за возможный дубликат, но это, возможно, противоречит этому, потому что этот ответ не может быть тривиально изменен, чтобы работать там. Безусловно, самый длинный ответ.
Вдохновленный этим примером из документации sed , хотя для обработки нескольких чисел в строке потребовалась некоторая работа:
Выход:
Обратите внимание, что это временно вставляет
_
символы, поэтому может привести к неправильным результатам, если они есть_
во входном потоке._
Чтобы избежать этого, мы можем заменить скрипт в sed некоторым непечатным символом (например, ASCII 0x07 BEL) и предположить, что входной поток содержит только печатный ASCII. Кажется, это работает нормально, когда я проверяю это.источник
Ракетка 74
источник
Луа - 68 персонажей
Ожидает, что вход будет сохранен в s.
источник
CJam,
67 58 534831 символовЭтот вопрос как худший вопрос для CJam. Без регулярных выражений, без сопоставления с образцом, без ловли исключений. Но здесь мы идем (#YOLO)
Этот разбивает строку на группы только из букв и цифр. Увеличивает каждую цифру и сшивает два массива по одному элементу за раз.
Предыдущее решение:
Попробуйте онлайн здесь
Как это работает:
Основная идея состоит в том, чтобы хранить символ отдельно в строке, если это цифра, и выгружать увеличенное значение в окончательную строку, как только мы получим нецифровый символ.
источник
Кобра - 88
источник
C # -
178169157 символовЭто предполагает, что числа типа 999 могут переполняться до 000 и что - +, E не являются частью числа.
Лучше читаемая форма:
Я новичок здесь, никогда не пробовал код гольф раньше, просто попробовал :)
Интересно, есть ли у кого-нибудь идеи, чтобы сделать его еще короче ...
Для участия в C # было бы неплохо, если бы мы могли опустить всю необходимую структуру вокруг реального кода - тогда это будет иметь только 82 символа, и это без вызова каких-либо мощных системных функций.
То же самое с указателями (182 символа):
Теперь без переполнения это правильно обрабатывает случай 999 (223 символа):
Другой, более старый, читает со стандартного ввода и использует рекурсию:
Замечания:
Console.ReadKey();
и сама строка не должна учитываться.Я улучшил это уже несколько раз, смотрите комментарии. Я бы сказал, что еще есть возможности для улучшений :) И извините за длину, но я думаю, что разные версии достаточно интересны, чтобы держать их ...
источник
if(c==57)
того, как вы могли бы написатьc--;
вместо тогоc=48;
, как насчет троичного оператора тоже. Существует множество игровых трюков. может быть, вам стоит посетить codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c... ? ... : c++*b--
Groovy, 38 байт
Я просто ненавижу эти слова,
replace
иall
они разрушают для меня все регулярные игры в гольф.источник
(it as int)+1
→it.next()
PHP - 91 байт
Я не хотел использовать регулярные выражения. PHP не способен напрямую увеличивать смещение строки, поэтому мне нужно было добавить несколько байтов на шаге увеличения. Этот однострочный скрипт помнит меня очень мрачный век сценариев PHP ...
источник
К, 56
источник
sed and bash - 40 (включая вызов и трубы)
Выходы:
источник
42;rm -rf /
она сработала с первого раза.\0
до&
(-1 полукокса),$((…))
до$[…]
(-2 символов),s/^/echo /
доiecho \\
(-2 символов) , чтобы сократить ваш текущий код. Однако лучше сначала исправить ошибку, упомянутую @Dennis. (Он писал : «Он работал в первый раз» для удовольствия и , как намек на вопрос На самом деле ваш код не на входе , содержащий.;
,#
,`…`
,$(…)
И , возможно , другие специальные символы тоже.)eval echo `sed 's/[0-9]\+/$[&+1]/g'`
- все еще есть проблема с внедрением кода, хотя, согласно моему ответу на другой похожий вопрос, codegolf.stackexchange.com/a/37145/11259Java 7, 119 байт
Если требование - это программа, а не просто функция, то это 149 байт:
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
Гема, 14 знаков
Образец прогона:
источник
DASH , 16 байт (неконкурентный)
Это возвращает функцию / частичное применение.
Использование:
объяснение
источник
CJam, 18 байт
Попробуй это здесь.
объяснение
источник
R, 83 байта
Поздно на вечеринку. Предполагается, что ввод хранится в переменной
x
. Вероятно, это не нужно использоватьregmatches
для решения этой проблемы, но я не мог найти векторизованные замены без каких-либо внешних пакетов.Разгромил и объяснил
Пример вывода
источник
C # (интерактивный компилятор Visual C #) с параметром командной строки
/u:System.Text.RegularExpressions.Regex;System.Int32
, 40 байтОжидается, что вход будет в переменной с именем n.
Попробуйте онлайн!
источник