Codegolf - Есть Ли Конец У Рыбной Дороги?

  • Автор темы Горпина
  • Обновлено
  • 23, Oct 2024
  • #1

Я люблю ><>, ><> — это жизнь! 2D-языки потрясающие!

В этом задании вам придется сказать, есть ли у «рыбной» дороги конец,

во время игры в гольф.

 
 
 
 
 +--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/ ><>     ^<     |
+--------------------+

True

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

False

+--+
|<v|
|^<|
+--+

True

+--+
|>v|
|^<|
+--+

False

+----------+
|v Hello \ |
|\\/\/   / |
| \/\\   \ |
|/  // >\  |
|  ^/\>\\/ |
|\  /\/\/  |
+----------+

False

+-----+
|>\/\\|
|//\\/|
|\/\\\|
|//\//|
|\/\/ |
+-----+

True

2 test cases added as suggested by @MartinBüttner
+----+
|v   |
|\\  |
|//\ |
|\\v |
| \/ |
+----+

False

+----+
|v   |
|\\  |
|//\ |
|\\^ |
| \/ |
+----+

False

Test case inspired by @ETHproductions
+-------------------------+
|><>                      |
|something smells fishy...|
+-------------------------+

False
 

Определение ^ ) may be considered as a distraction, like some flowers (or fish heads) on the border of the road.

Рыбная дорога строится из плиток, включая следующие: < symbols. The road has an end if, by following it, you end up on a border, else, you'll be trapped in an infinite path.

Любой другой персонаж (кроме v>^< and mirrors. A mirror will reflect by 90° depending on where you came from. Here's how it works (using <v^>-| Дорога всегда начинается в верхнем левом углу прямоугольной сетки, ограниченной

+--------+ |>>\ This| |\\ is | | \\ a | | \ /trap| +--------+

Ориентироваться на дороге можно, следуя указаниям, данным

+--------------------+ |>\/ this way >\/> | this one ends here | v^ \/ | | v^ ^.^ | | \/\ >v | | /\/ ^< | +--------------------+

чтобы показать направление):

^ ^ >/< >\< v v </> <\> ^ ^

Дорога может выглядеть так, если она заканчивается:

Бесконечный цикл: v>^< .

Особенности v>^< in the upper-left corner, -|+ Дорога не обязательно состоит только из инструкций. Для завершения можно использовать пробелы или буквы. Это означает, что вам придется продолжать двигаться в том же направлении, за исключением случаев, когда вы пересекаете персонажа в -|+ implies this road ends.

Всегда будет один из

или

Вы можете отправить функцию, принимающую строку в качестве параметра, или отдельную программу, используя STDIN или любую другую ближайшую альтернативу на вашем языке.

v (go down) > (go right) ^ (go up) < (go left) / (mirror) \ (mirror)

По завершении ваша отправка должна вернуть или вывести на STDOUT истинные/ложные значения. Значения истины означают, что дорога имеет конец, а значения ложности означают, что это бесконечный цикл. Тестовые случаи

Стандартные лазейки

запрещены (как всегда).

Горпина


Рег
08 Apr, 2011

Тем
67

Постов
197

Баллов
552
  • 26, Oct 2024
  • #2

Несоответствие ><> ответ

Ты хотел ><>, я тебе ><> !

Я считаю, что единственный разумный способ сделать это в ><> — скопировать ввод в кодовое пространство и позволить интерпретатору самому решить, ведет ли ввод куда-то. Поскольку ><> больше не реализует многопоточность, у нас возникает большая проблема: если на входе есть цикл, мы застрянем в нем.

Приняв во внимание эти соображения, я решил сделать решение, совместимое с ><> онлайн-переводчик чтобы можно было определить, застрял ли интерпретатор на вводе или ему просто требуется много времени, чтобы все сделать. Мне также пришлось добавить в код завершающие строки, чтобы онлайн-интерпретатор отображал добавленный код и не выходил из строя при попытке записи в него.

Да, и поскольку я уже явно дисквалифицирован, я не стал утруждать себя игрой в код.

Без лишних слов, код во всей красе:

 
 
 
 
 
 
 5-D 

Чтобы использовать его, скопируйте его в онлайн-интерпретатор, добавьте достаточно завершающих строк для обработки ввода, отправьте код, дайте ему ввод как 4 -separated lines and enjoy the ride.

Несколько тестов:

С

'X4321'[D]

Окончательное кодовое пространство:

/

Выводит «истина» и останавливается.


С

4

Окончательное кодовое пространство:

\

Петли навсегда.

 

AlottHatt29


Рег
21 Nov, 2010

Тем
63

Постов
196

Баллов
511
  • 26, Oct 2024
  • #3

JavaScript, ES6, 177 161 145 байт

2

Мы можем обнаружить цикл, пройдя путь и обнаружив повторение кортежа.

  • расположение
  • исходящее направление

То есть, если мы входим в какую-то позицию D coming from some direction 3 во второй раз мы знаем, что этот цикл будет повторяться вечно. Таким образом, код отслеживает все места, которые были посещены, и в каком направлении, и сверяется с этой записью каждый раз, когда посещается новое пространство.

Направлениям вверх, вниз, влево и вправо присвоены номера. \ , 1 , D , and '><^v-|/\\' . Код учитывает текущий посещаемый символ ( \ ) and changes the current direction ( 'X3412'[D] ), то новое направление используется для рекурсивного вызова функции и оценки следующего пробела. `431255${5-D+'X3412'[D]}` as a direction indicates a wall, and a f= (s, // input string i=1, // current location as offset string index M=[], // record of previously visited spaces D // current direction )=>( L=s[O="indexOf"]('|'), // find arena width `L` by index of first `|` // if D is 5, return true, or... D==5 || // if direction + position is not new, return false !~M[O](D+i) && // otherwise, save this direction + position M.push(D+i) && // recursively call `f` with new direction and position f(s, i-[,L,-L,1,-1][D= // modify position based on active direction `431255${5-D+'X3412'[D]}` // from these possible directions... [ // chose the one at the index... '><^v-|/\\'[O]( // based on the index of the symbol s[i+L] // of the current character ) ] ||D // or preserve old D if symbol is not directional ], M,D) прекращение программы.

Вот объяснение кода с меньшим количеством гольфа:

true

Строка шаблона 5 has a nested expression that handles the mirrors: because the directions are numbers, they can also be used as indexes. The expression D , оценивается как восьмой символ в строке возможного направления и, таким образом, соответствует s[i+L] , the 8th character in the symbol string 4 ). Выражение говорит:

  • Если текущее направление 3 is 2 (вверх), затем новое направление при попадании в 1 mirror will be D (левый)
  • Если текущее направление (x,y) is f=(s,i=1,M=[],D)=>D==5||!~M[O="indexOf"](D+i)&&f(s,i-[M.push(D+i),L=s[O]('|'),-L,1,-1][D=`431255${5-D+'X3412'[D]}`['><^v-|/\\'[O](s[i+L])]||D],M,D) (вниз), затем новое направление при попадании в 50i:0(?v :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10. >.!603f< v"."~ < < >~1+010. >.!01+1p}:$}:}v! < < < < < < ;oooo"true" << ^ ........ .>>\ . .\\ . . \\ . . \ / . ........ mirror will be +--------+ |>>\ This| |\\ is | | \\ a | | \ /trap| +--------+ (верно)
  • и т. д.

Другое зеркало 50i:0(?v :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10. >.!603f< v"."~ < < >~1+010. >.!01+1p}:$}:}v! < < < < < < ;oooo"true" << ^ .................... .>\/ >\/> . . v^ \/ . . v^ ^ ^ . . \/\ >v . . /\/ ^< . .................... would use the expression +--------------------+ |>\/ this way >\/> | this one ends here | v^ \/ | | v^ ^.^ | | \/\ >v | | /\/ ^< | +--------------------+` , но поскольку это просто упорядоченный обратный отсчет от ; , we can express it more simply as 50i:0(?v :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10. >.!603f< v"."~ < < >~1+010. >.!01+1p}:$}:}v! < < < < < < ;oooo"true" << ^ .

 

Muboyauya


Рег
16 Nov, 2019

Тем
98

Постов
216

Баллов
726
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно