Вступление
В последнее время у Сизифа были проблемы на работе. Кажется, он просто ничего не делает, и ему очень хотелось бы найти решение этой проблемы.
Его текущая работа требует, чтобы катить камень в гору. Обычно он хорошо выполняет свою работу, но каждый раз, когда он оказывается на вершине холма, он снова падает.
Он очень расстроен своей работой и хочет научиться решать эту проблему с помощью компьютера, имитирующего скалу, катящуюся по склону.
Случилось так, что Сизиф не особенно хорош в программировании, так что, может быть, вы можете помочь ему?
Соревнование
После этого глупого вступления давайте перейдем к делу. Ваша программа получит иллюстрацию холма и скалы, которая выглядит примерно так:
#o
##
###
######
########
Где #
представляет собой часть холма и o
представляет скалу.
Теперь вам нужно реализовать программу, которая перемещает слой на 1 слой вниз. Например, результат вышеупомянутого должен быть:
#
##o
###
######
########
Если есть горизонтальная ровная область, холм просто катится горизонтально, так что ...
o
########
... это просто заставит камень катиться в сторону.
o
########
Если есть вертикальная зона, камень падает на один шаг, так что ...
#o
#
#
#####
... уступил бы ...
#
#o
#
#####
Вы также получите ширину и высоту изображения соответственно в одну строку над изображением. Итак, в целом, наш пример ввода будет выглядеть так:
10 5
#o
##
###
######
#########
(Обратите внимание, что пробелами здесь являются пробелы. Выделите текст и посмотрите, что я имею в виду.)
Некоторые детали
- Когда рок уже находится в последней строке при запуске программы, вы можете либо завершить программу, либо вывести неизмененный ввод
- Холм спускается только вниз
Ваша программа должна форматировать выходные данные точно так же, как и входные данные (включая размеры), поэтому, если вы передаете выходные данные программы себе, она вычисляет следующий шаг.
Вы можете предположить, что всегда есть путь ко дну, поэтому ввод, где путь «заблокирован», может вызвать неопределенное поведение
Вы можете предположить, что в последней строке всегда есть пробел. Камень должен «отдыхать» там, так что после вызова программы несколько раз, всегда направляя ее вывод в себя, вы должны в конечном итоге получить камень в последней строке, лежащий там, где ранее было пространство.
Вы можете принимать ввод в любой форме, которая вам нравится (стандартный, файл, ...). Вы должны опубликовать ВЕСЬ программу (поэтому все предварительно инициализированные переменные считаются кодом).
Строки оканчиваются на
\n
.Вы можете получить некоторые примеры ввода здесь (убедитесь, что вы правильно скопировали пробелы!)
Это код-гольф , поэтому выигрывает рабочая подача с наименьшим количеством байтов .
Победитель будет выбран 26 июля 2014 года. После этого вы можете публиковать решения, но не можете выиграть
Если у вас есть какие-либо вопросы, дайте мне знать в комментариях.
Удачного игры в гольф!
#
с, так что в конце есть один пробел, потому что ширина равна 10. В этом случае (после нескольких итераций) камень будет лежать там, где есть пробел (так внизу) -правый угол).Ответы:
Regex (.NET, Perl, PCRE, JavaScript, ... разновидности), 25 байт
Да, это снова вызовет споры о том, является ли регулярное выражение допустимой программой, но я сделаю это заранее и скажу, что это представление просто для развлечения и не должно рассматриваться как победитель. (В отличие от 31-байтового варианта Perl внизу;).)
Итак, вот чистое решение по замене регулярных выражений.
Шаблон (обратите внимание на завершающий пробел):
Замена (обратите внимание на начальный пробел):
Количество байтов соответствует сумме двух.
Вы можете проверить это на http://regexhero.net/tester/ . Обязательно выбирайте окончания строк в стиле Unix и «сохраняйте вставленное форматирование» при вставке. Если это все еще не работает, вы все равно вставили конец строки в стиле Windows. Самое простое решение в этом случае заключается в замене
\n
с\r\n
в схеме , чтобы увидеть , что он работает.Вот 48-байтовая функция ECMAScript 6, использующая эту
Наконец, у меня также есть актуальная программа. Это 31 байт Perl (включая два байта для
p
и0
флаги; спасибо Ventero за предложение!).Если вы хотите проверить это, даже не сохраняйте его в файл, просто сделайте
источник
\n
на\r\n
)Питон - 190
Ужас нарезки и объединения, а также слишком много переменных. Я уверен, что это может быть больше в гольфе, но я не могу сейчас думать о каких-либо умных функциях Python. Ввод сохраняется в строке
s
.Поскольку строки Python являются неизменяемыми, я заменяю символ, объединяя все символы до, мой новый символ и все символы после. Я использую ширину холма и индексирование, чтобы определить, куда должен катиться камень.
источник
Рубин, 65/55 символов
Думаю, я увижу, как долго это решение, которое не просто бросает регулярное выражение в проблему.
Как и ожидалось, оно не такое короткое, как у регулярного выражения m.buettner, но и не намного дольше.
При использовании флагов интерпретатора это можно сократить до 55 символов (53 для кода, 2 для флагов):
Запустите код так:
источник
HTML JavaScript - 251 символ
( 251, если вы посчитали код внутри одинарных кавычек, который считывает ввод и возвращает вывод. 359, если вы считаете поле ввода, строку ввода, кнопку и т. Д. 192, если вы считаете только то, что работает.)
Гольф-код:
http://goo.gl/R8nOIK
Нажмите «Перейти» снова и снова.
метод
Я использую String.match (), чтобы разбить холм на 5 частей, затем меняю одну или две части. Я изучаю JavaScript, поэтому любые предложения будут оценены.
Читаемый код
источник
Python 2 -
289252 байтаЯ сделал несколько значительных улучшений, но это все еще ужасно. Еще пару байтов можно сохранить, преобразовав это в Python 3, но я не могу быть исключен.
Сначала я нахожу камень. Если символ непосредственно под ней
'#'
, заменить каждый экземпляр'o '
с' o'
. Так как в конце гарантированно будет дополнительное пространство, это всегда сместит камень вправо.Независимо от того, сделал я это или нет, я переношу всю сетку с помощью
zip(*m)
. Затем я делаю еще одну замену'o '
с' o'
. Если есть пространство справа от скалы, это означает, что в реальной сетке есть пространство под ним, поэтому он перемещается. Затем я перевожу обратно и печатаю.источник
#
, и я делаю эту проверку, прежде чем я делаю проверку, чтобы двигаться вертикально.Питон (201)
источник
awk, 152
Более читаемый
источник
php
485484 символаЯ знаю, что это огромно по сравнению с записью m.buettner, но сейчас я могу сделать лучше всего. Я думаю, что должен быть более быстрый способ превратить входную строку в многомерный массив, но сейчас очень поздно.
И хотя она неконкурентоспособна, мне понравилась эта головоломка. Хотелось бы, чтобы расширение показывало, где заканчивается шар или после заданного количества шагов, возможно, добавляется после ширины и высоты в строке ввода. Можно очень легко добавить это к этой версии.
Вот мой код: вход находится в первой переменной.
Вы можете увидеть это здесь в действии на кодовой панели
Редактировать: изменил кодовую панель и код выше, так как выводил 0 вместо o, что вызывало проблемы, когда я пытался передать вывод обратно в программу. Исправлено и сохранено один символ!
источник
Groovy -
263261256 символовGolfed. Считайте файл в строку и используйте функцию
p
для эмуляции функцииString.putAtIndex(index,value)
:Неуравновешенный (немного):
источник
try{
вместоtry {
иcatch(Exception
вместоcatch (Exception
.R 234
Манипулирование строками - не самая сильная сторона R.
Более читабельно:
источник
С (182)
Или, если вы действительно хотите прочитать код:
источник
Clojure - 366 символов
Без регулярных выражений Обязательный входной файл с именем "d". Golfed:
Ungolfed:
Пробный прогон (только один случай, для краткости):
Я новичок. Предложения приветствуются.
источник
MATLAB, 160
Болезненная часть - это файл-ввод. Фактическое вычисление будет только 114 байтов:
источник