Вы исследователь, картирующий неизвестный мир. Ваш корабль несется на ветру. Куда это идет, кто знает?
Каждый день в подзорной трубе вы видите черты на севере, юге, востоке и западе. Вы всегда видите четыре такие особенности, соответствующие кардинальным направлениям. Ваш spyglass сообщает символы ASCII, как это:
~~.*
, ~~~~
, ~.^^
,~#~#
Символы в порядке (север, юг, восток, запад).
Это символы: ~
= море, .
= побережье, ^
= гора, *
= дерево, #
= недопустимо (нет наблюдения, это происходит всякий раз, когда вы видите край света, или пейзаж затенен туманом). Ваш подзорная труба видит ровно одну единицу в каждом направлении.
Каждую ночь вы смотрите на звезды, чтобы увидеть, как далеко вы продвинулись. Глядя на звезды, вы видите символ ascii:
n
, s
, e
,w
соответственно Север, Юг, Восток и Запад. Вы всегда перемещаете ровно одну единицу на север, юг, восток или запад каждую ночь. Таким образом, вы, как исследователь, будете получать бесконечный поток символов:
~~.*n~~~~s~~.*s~.**
Ваша задача - вывести двумерную карту мира (где ?
неизвестные части карты, север направлен вверх, восток направо):
?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~
Для простоты предположим, что вы начинаете в левом нижнем углу карты. Предположим, все карты 8х8.
Вот простой пример 3х3. Предположим, что карта выглядит так:
~.~
~^~
~.~
Со следующим вводом: ~#.#n~~^#s
Вы получите этот вывод:
~??
~^?
~.?
Больше примеров входов и выходов:
вход
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~
выход
~~~~~~~~
~....~~~
~.????~~
~~????~~
~~????.~
~~????~~
~~?.^.~~
~~~~~~~~
Входные данные:
~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s
Выход:
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
?~~..~??
~~~.^.??
~~~~~~??
источник
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w
) неправильный, и вывод должен иметь то,??
что говорит?.
Ответы:
MATL ,
685958 байтПопробуйте онлайн!
объяснение
Карта хранится в нижней части стопки и постепенно заполняется. Текущая позиция проводника сохраняется в буфере обмена J.
Карта использует матричные координаты, поэтому (1,1) находится слева вверху. Кроме того, используется линейное индексирование по основным столбцам. Это означает, что элементы матрицы 8 × 8, представляющие карту, доступны с одним индексом следующим образом:
Так, например, элемент (3,2) матрицы является элементом с линейным индексом 11. Движение в направлении севера, юга, востока и запада соответственно соответствует добавлению -1, 1, 8 или -8 к линейному индексу. Массив [-1 1 8 -8] служит для кодирования двух разных вещей:
Входная строка разбита на куски
5
символов. Поскольку в первом фрагменте отсутствует первый символ (то, что указывает на движение),s
произвольно включается инициал , чтобы сделать все фрагменты одинакового размера. Чтобы компенсировать это, проводник начинает с позиции 7, а не с 8, поэтому первоначальное смещение на юг (добавьте 1 к линейному индексу) оставляет их в позиции 8.Куски из 5 символов обрабатываются в цикле. Первый символ обновляет позицию, а оставшиеся 4, если они отличаются от
#
, записываются в соответствующие записи матрицы, которая представляет карту.источник
C
210208207 байтовЭтот использует printf и scanf для чтения ввода и линеаризованный массив вместо x, y; поэтому я чувствую, что он достаточно отличается от миллибайта .
Golfed:
Несколько-ungolfed:
Представление:
Кроме того, вы начинаете с позиции 8, потому что это сбивает символ с петли печати.
источник
Фортран,
263251247235234216 байт1D версия (похожая на версию Дона Мюсли):
2D версия:
Чтобы включить произвольную форму и предварительную обработку, файл нуждается в расширении
.F90
, напримерexplorer.F90
. Ввод читается из STDIN:источник
C
265226224 байтаКарта 8х8, я раньше этого не замечал. И вот 265-байтовое решение, которое работает для карт с переменными измерениями:
источник
a[8][8]
быть достаточно?int a[8][8]
дает вам бесплатную инициализацию карты, а использование charm[64]
дает мне большие скидки на вывод карты. Действительно близкие счета, хотяe
иw
в своем представлении карты, то вы можете использоватьfor(x=8;x--;)putchar((i=a[x][y])?i:63)
для бритья два байта на выходеc=getchar(),c+1
не эквивалентнаgetchar(),c++
или есть какой - то обман участие?Рубин,
169147 байтПолная программа. Принимает входную строку из STDIN (вам, вероятно, понадобится передать ее из файла, чтобы не допустить путаницы в конце новой строки), и выводит результирующую карту в STDOUT.
Обрезал тонну, сложив все струны в одну, а затем разделив их позже.
Ungolfed:
источник
Lua, 354 байта ( попробуйте онлайн )
Golfed:
Слегка разгульный
источник
x=x+(("w e"):find(e)or 2)-2 end
может бытьx=x-2+(("w e"):find(e)or 2)end
?Котлин, 242 байта
Новые строки могут быть заменены точкой с запятой при желании.
Попробуй здесь
источник