Мэтью любит решать головоломки. Всякий раз, когда ему удается решить один, он счастливо пропускает. В последнее время ему действительно нужно это сделать, поскольку метеорный поток открыл в земле кратеры и дыры, в которые он не хотел бы упасть.
Вам дана часть ландшафта, который Мэтью хочет пересечь, надеясь, что он прибудет здоровым в конце. Земля дана в метрах, причем каждый метр представляет собой либо нормальную землю, либо дыру. Когда он бежит, ему удается пересечь один метр за шаг; альтернатива - прыжки, которые пересекают четыре метра за шаг. Мэтью начинает в крайнем левом углу первого наземного метра и хочет добраться до последнего (но не дальше его - просто представьте бесконечную дыру за последним метром, указанным в ландшафте).
вход
Входные данные задаются в виде одной строки на стандартном входе и заканчиваются переводом строки. Линия состоит из либо dashes ( -
) или underscores ( _
), представляющих метр земли или скважины, соответственно. Пример ввода может быть:
----__--___---
Данный ландшафт имеет длину не менее одного и не более 30 метров и всегда начинается с земли.
Выход
Выходные данные выдаются на стандартный вывод и представляют собой последовательность команд перемещения для Мэтью, либо run ( R
), либо jump ( J
). Как отмечалось выше,
команда запуска заставляет Мэтью бежать на один метр, в то время как прыжки переносят его вперед ровно на четыре метра. Для приведенного выше примера возможно следующее движение:
RRJRJRR
который выглядит примерно так:
Если нет безопасного пути через ландшафт, то !
должен быть напечатан один восклицательный знак ( ).
Образцы входов
--------
----__--___---
-_______
-_-_-_-_-_-
-
Пример выходов
JRRR
RRJRJRR
!
!
(последний вывод пустой, так как никакого движения не требуется, но я думаю, Markdown не может разобрать это)
Заметка
Необходим только один возможный путь, поэтому выходные данные программы не обязательно должны точно соответствовать выходным данным примера. Пока дается решение, если оно существует, и каждая команда перемещения перемещается на землю, и в конце концов достигается последний метр, выходные данные действительны.
Дополнительный вывод по стандартной ошибке игнорируется.
Выигрышное условие
Самый короткий код выигрывает, как это принято в гольфе. В случае ничьей победит более раннее решение.
Контрольные примеры
Есть два сценария тестирования, содержащие идентичные тестовые случаи:
- Баш (Спасибо Вентеро )
- PowerShell
Вызов в обоих случаях: <test script> <my program> [arguments]
например, ./test ruby jumprun.rb
или ./test.ps1 ./jumprun.exe
.
Еще одна заметка
Эта задача была частью соревнования по гольфу, проводимого в моем университете в течение 2011-W24. Баллы и языки наших конкурсантов были следующими:
- 104 - Хаскелл
- 131 - Хаскелл
- 154 - С
- 170 - С
- 275 - VB.NET
- 286 - Общий Лисп
Наши собственные решения были
- 92 - Рубин
- 124 - PowerShell
источник
./test.sh perl jump.pl
-./test.sh: line 42: syntax error near unexpected token 'done'
, под bash 3.2.48Ответы:
Perl, 53 символа
Запустите это с
perl -p jumpnrun.pl
. Я посчитал 3 символа для-p
опции, которая является разницей в длинеperl jumpnrun.pl
иperl -p jumpnrun.pl
.Я не очень хорошо говорю на Perl, поэтому я уверен, что это можно сократить дальше. Это использует регулярное выражение, похожее на решение Говарда .
источник
Рубин,
93907970 символовЯ думал, что решение для регулярных выражений будет достаточно тонким и компактным (пусть этот механизм сделает всю работу). К сожалению, все крайние случаи и специальные процедуры сделали это таким длинным - по крайней мере, я не коснулся 100 ;-).
Он проходит все тестовые сценарии предоставленного скрипта.
Сохранено несколько символов по сравнению с предыдущим скриптом (теперь достаточно одного вызова
gsub
).Редактировать 1: изменено
puts z!=?-??!:''
наz!=?-&&$><<?!
после того, как тестовый скрипт не разрешал вывод для тестового примера 1.Изменить 2: предыдущая версия была
Моя первоначальная идея состояла в том, чтобы заменить персонажей с помощью стратегии «смотреть сзади» и «смотреть вперед», например, так: шаблон был,
^(?<=[RJ]*)(-|-...)(?=(-|-...)*-$)
и тогда я бы заменил «-» на «R», а в противном случае на «J». К сожалению, Ruby не позволяет просматривать данные переменной длины, и другая группа захвата для первой части сделала код еще длиннее.Затем я применил итеративный подход: если я могу начать с шага или прыжка с
^(-|-...)
последующими сериями других шагов или прыжков до последней платформы,(-|-...)*-$
то я печатаю соответствующую букву, удаляю первые один / четыре символа и начинаю заново. Он может даже настроить приоритет RJ против JR, переключая варианты внутри выражения (в настоящее время он предпочитает RJ).Редактировать 3: Разделение одного подстановки
на две
дал еще несколько символов. В конце концов мне удалось избавиться от этой проблемы конца строки, но за определенную плату: обнаружение сбоев стоит еще несколько символов.
источник
z!=?-&&$><<?!
. Кроме этого, отличное решение, +1!Perl -
7160Сейчас проходит все тестовые случаи. :) Оказывается, я убрал последнего персонажа слишком рано ... и половина моего исходного выражения была полностью излишней.
$ _ = $ ARGV [0]; y / - / R /; s / (R ... (? = R)) (R * (? = R)) / J $ 2 / г; chop; печать / /? "!": $ , $ /Еще одно решение регулярных выражений, проходит 5 тестов в посте.
Можно сократить, запустив как одну строку с-E
иsay
вместоprint
, но затем Perl пытается интерпретировать ввод как переключатель ... (Unrecognized switch: -_-_-_-_-_-
)источник
$ARGV
его, оно все равно не может выполнить 108 тестовых случаев из тестовых сценариев.Python -
89939793 персонажаДа просто так.
В настоящее время проходит только десять тестовых случаев (с учетом случаев, когда существует несколько допустимых решений). Я исправлю это позже.
Занимая один из рабочих регулярных выражений, он в конечном итоге как
С 96 персонажами.
источник
Haskell, 90 символов:
Мое первое решение - длинное, но работает за линейное время с использованием динамического программирования. :) 150 символов :
Второе решение - намного медленнее (экспоненциальное время), но намного короче: 90 символов
источник