Фон
Большинство (наполовину приличных) текстовых редакторов позволяют перемещаться по тексту с помощью клавиш со стрелками. Вверх и вниз позволяют перемещаться по линиям, а левый и правый перемещаются по линии, но также могут перемещаться вокруг. Кроме того, если линия короче позиции X вашего курсора, курсор появляется в конце строки, но возвращается к той же позиции X, если вы продолжаете двигаться вверх или вниз. Возможно, поможет следующее визуальное объяснение:
Примеры движения
Простой образец текста может выглядеть следующим образом. Курсор будет вставлен между двумя символами в этом тексте или в конце.
-----
---
------
let's put the cursor here:
X-----
---
------
move down (v):
-----
X---
------
move left (<):
-----X
---
------
v
-----
---X
------
v (notice how the X position of the cursor has been maintained)
-----
---
-----X-
^
-----
---X
------
> (more line wrapping)
-----
---
X------
<
-----
---X
------
^ (the X-position from earlier is no longer maintained due to the left-right motion)
---X--
---
------
Соревнование
Учитывая несколько строк теста ASCII, найдите кратчайший путь от начального местоположения до конечного местоположения. Начальное местоположение представлено как, ^
и конечное местоположение представлено $
, и будет только один из каждого. Они не считаются частью текста и не влияют на «длину» этой строки.
Ввод будет состоять из нескольких непустых строк текста. Вывод будет серией ^v<>
символов, которые показывают один из самых коротких путей. При желании вы можете добавить дополнительный символ новой строки в конце каждого, но он не включен в текст навигации.
Вы можете написать программу или именованную функцию. Победителем будет самое короткое представление, измеренное в байтах.
Пример ввода / вывода
^Squares
are
fun$ny
vv<v (which is better than the naive vv>>>)
Squares
^are
funny$
<vv
Alp$habet^
Song
v<^
Mary had a little lamb,
His fleece was white as snow,
And$ everywhere that ^Mary went,
The lamb was sure to go.
^^>>>>v>>>
$^degenerate case
(no output)
v<vv
, верно? Или это закончится после последнего символа в этой строке?Ответы:
CJam, 139 байтов
Ну, это заняло много часов, чтобы прийти к тому, что кажется готовым. Похоже, что время, которое требуется для агрессивной оптимизации кода CJam, больше, чем O (n) по отношению к размеру кода ...
Вы можете попробовать его онлайн , но для любого ввода, для которого наилучший путь составляет не менее 6 операций или около того, вам, вероятно, следует попробовать его в автономном режиме с более быстрым интерпретатором.
сплющенные:
Расширено и прокомментировано:
В целом, это довольно простое решение. Он «выполняет» цифры представления base-5 номера пути, который увеличивается на каждой итерации, начиная с 0, до тех пор, пока путь не будет работать. Цифры
1
-4
отображают операции вверх, вниз, влево и вправо и0
ничего не делают. Первая итерация, использующая путь just,0
ловит вырожденный случай. Все остальные пути, содержащие a0
, никогда не выбираются, потому что это просто версии уже протестированных путей с добавленными no-ops.Состояние моделируется настолько минималистично, насколько это возможно: текст с удаленными маркерами начала и конца, положение курсора в тексте и «память столбца». Символы новой строки в основном обрабатываются как любой другой символ, поэтому концепция строки отсутствует, а позиция курсора - просто индекс. Это упрощает перемещение влево и вправо, что просто реализуется как уменьшение и приращение (с ограничением по размеру текста). Движение вверх и вниз немного сложнее, но все же управляемо.
Повторное использование кода было довольно важной тактикой оптимизации. Примеры этого включают в себя:
5
операции в начало строки пути, которая также использует0
логику запрета операций из-за индексации циклического массива и имеет только 5 определенных операций.В целом, я очень доволен тем, как это получилось. Это определенно самая большая работа, которую я поместил в ответе по гольфу в коде на сегодняшний день (для чего-то, что вписывается в твит !?). Время выполнения довольно ужасно, хотя. CJam не является самым быстрым языком для начала, и этот алгоритм имеет такую сложность, как O (m * 5 n ) , где m - размер ввода, а n - размер вывода. Хорошая скорость не считается!
источник
Python 2: 446
Простое решение. Я выполняю поиск в ширину.
t
перебирает все разные пути. Я конвертируюt
в базу5
, но использую только записи, отличные от нуля.1
вверх,2
вниз,3
слева и4
справа.Я сохраняю текущую позицию курсора в 3 переменных
x
,y
иz
.x
это линия,y
позиция столбца иz
«скрытая» позиция столбца, если вы идете вверх или вниз, а линия слишком короткая. Много ifs решают, как переменная изменяется во время движения.Предварительная обработка действительно длительная, первые 4 строки выполняют только эту задачу.
Длинный тестовый сценарий занимает очень много времени. Алгоритм имеет сложность O (N * 5 ^ N), где N - длина кратчайшего решения.
Использование: Введите строки как одну строку (разделенные строки
\n
), как"Alp$habet^\nSong"
источник
CJam - 274
Ответа пока нет? Хорошо, вот один :)
Попробуйте это на http://cjam.aditsu.net/ ... за исключением примера с Мэри или чего-то такого размера, вам, вероятно, понадобится Java-интерпретатор .
источник