2D доска будет содержать следующие объекты:
^
,>
,v
, Или<
: лазерный излучатель лицевой стороной вверх, вправо, вниз, влево или соответственно. Там может быть больше, чем один. Лазеры будут путешествовать по прямой линии в пустом пространстве (пустое пространство обозначено точкой.
). Лазеры не проходят через излучатели.*
: Цель. Лазеры проходят сквозь мишени. Там может быть больше, чем один.
Доска также может содержать следующие объекты:
@
: Сплошная стена. Лазер здесь не пройдет.\
: Левый отражатель. Изменяет направление лазеров в соответствии со следующей таблицей:Direction laser is travelling Direction of laser after hitting reflector Up Left Right Down Down Right Left Up
Должно быть довольно интуитивно понятно, как работают отражатели. Просто представьте их как настоящее двустороннее зеркало, и направления должны быть ясными.
/
: Правый отражатель. Изменяет направление лазеров в соответствии со следующей таблицей:Direction laser is travelling Direction of laser after hitting reflector Up Right Right Up Down Left Left Down
1
,2
,3
...9
: портал . Номер указывает канал портала - будет ровно два портала одного канала (например, не будет трех1
). Портал меняет положение лазеров на положение другого портала того же канала. Например:> 1 @ 1 *
Лазер поразит цель, потому что, когда он попадает в первую
1
, он телепортируется ко второй1
на другой стороне. Лазеры сохраняют то же направление, что и прежде.Портал не будет телепортировать лазер на портал другого канала (т.е.
1
не будет телепортироваться лазер на9
.
Ваша программа получит двухмерное представление доски в качестве входных данных. Доска всегда будет прямоугольной формы. Вывод должен быть, True
если у всех целей есть лазеры, проходящие через них, или False
иначе.
Вот несколько тестов:
вход
>....\ ..*... >./../ ..*...
Выход
True
вход
>..........\ 1........../ 2..........1 3..........2 4..........3 5..........4 6..........5 7..........6 8..........7 9..........8 *..........9
Выход
True
вход
>.@............* >..@...........* >...@..........* >....@.........* >.....@........* >...*..@........ >.......@......*
Выход
False
вход
../\. >./**
Выход
False
вход
/.......*.......\/3..... @..............//\.\.... *.............2\.1\/\... \..............///.....< .........*...//\\/.....\ >.............\.1.///.4. 4.......*/...\2\/3/\/..^
Выход
True
вход
vvvvvvvvvvvvvvvvv \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// *****************
Вывод (обратите внимание на цель в крайнем правом углу)
False
Ответы:
Python,
310302287278277260Не радикально отличается от существующего поста Python, но имеет один или два примечательных трюка, я думаю.
Он также обрабатывает «не заканчивающийся» ввод, такой какРЕДАКТИРОВАТЬ : Ой! излучатели блочных лазеров.1>1
.t
берет список строк (входные строки) и возвращает логический результат.Вот хороший гиф кода, играющего в гольф:
РЕДАКТИРОВАТЬ : Awsome GIF любезно Уилл. Спасибо, Уилл!
источник
1>1
кончится. Я не смог найти что-то, что не заканчивается, хотя я не приложил много усилий и предположил, что этого не произойдет для моей реализации. Я, конечно, пересмотрю, если кто-то может представить один..find(d)
возвращает -1, если не найден. Если вы удалитеif-1<d:
оператор и вместо этого сделаетеj+=[-1,1,w,-w,-i][d]
в верхней части цикла while, не найденный -1 превратится в добавление последнего элемента в этом массивеj
, что дастj
0, который, как мы знаем,@
...?Perl, 647
Это моя первая попытка в код-гольфе, и я немного смущен, я даже не побил C #, но я подумал, что было бы интересно (или весело, или просто мазохистски) сделать все это как серия подстановок регулярных выражений. (Я также подумал, что было бы интересно освежить мой Perl, но в конце я глубоко сожалел, что не реализовал его в Ruby или Python.)
Я не провел много испытаний, но я думаю, что это должно справиться с каждым случаем.
Сетка вводится через STDIN. Во входе должна быть хотя бы одна новая строка (т.е. не будет работать ни одна строка без новой строки).
Объяснение: код итеративно обновляет строку сетки, когда лазеры проходят через нее.
-
представляет собой горизонтальный лазер,|
вертикальный лазер,+
скрещенные лазеры,K
а\
зеркало с лазерным отражаясь от вершины,k
а/
зеркало с лазерным отражаясь от дна,Z
а\
зеркало с помощью лазера отражаясь от дна, аW
на/
зеркало с лазерным отскакивая вершина.%
это/
зеркало с помощью лазеров с обеих сторон, в то время какX
это\
зеркало с помощью лазеров с обеих сторон. (Они чувствительны к регистру. Я пытался выбрать буквы, которые выглядят несколько уместно - например,k
иK
Есть несколько очевидных вариантов, но, к сожалению, эффект не очень полезен. Я действительно должен положить эту информацию в таблицу, но я исчерпан прямо сейчас.)Аналогичным образом для обработки порталов (т. Е. Присвоение каждой цифре набора дополнительных символов на основе возможных положений лазера ввода / вывода) потребуется 144 символа (включая исходные 9), поэтому вместо этого, когда лазер попадает на портал «ввода», Я добавляю «выходной» символ портала к набору символов, излучающих лазер в нужном направлении. (Для этого необходимо различать входные и выходные порталы;
qwertyuio
для этого я использовал буквы .)Несколько не в гольф, с инструкциями печати, чтобы вы могли видеть, что замены происходят (каждая замена представляет один «раунд» лазерной прогрессии), и с
g
добавленным флагом к основному,s///
чтобы он не занимал так много итераций:источник
Python 338
351Моя незавершенная версия на самом деле показывает лазерные пути на плате, что довольно красиво:
источник
C # -
515414400 байтПолная программа на C #, нет хороших результатов, как у Уилла. Работает, следуя пути лазерного луча для каждого испускаемого индивидуально, и сохраняя массив ячеек, которые мы посетили, чтобы мы могли проверить, что мы посетили все звезды в конце. Редактировать: чередовать большое количество байтов, делая все 1D и используя char вместо int для хранения текущего char
w0lf напомнил мне, что в середине моего кода у меня был недоиспользуемый цикл for, поэтому я решил, что лучше приложить еще одну попытку и заставить его работать, и теперь я дошел до абсолютного минимального числа фигурных брекеты. Я не буду притворяться, что мне нравится сворачивание второго цикла for, код теперь ужасно беспорядочный, но он сэкономил несколько байтов. В процессе я переписал портальную обработку. Я также нашел более короткий метод для выполнения «перемещения» с помощью вложенной, а не агрегированной условной операции.
Гольф-код:
Меньше гольф-кода:
В новом коде обработки портала используется тот факт, что функция String.IndexOf успешно возвращает -1 (т. Е. Символ не найден), если вы просите его начать поиск на 1 символ за строкой (выдает исключение, если вы просите его начать дальше). Это было для меня новостью, но в данном случае это было очень удобно.
источник
m+=(d>0?d-2:0)+(d<3?d-1:0)*W;
и засунуть его вfor
, как это:for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)
. Таким образом, вы сохраните один символ, потому что потеряете точку с запятой.