Чи закінчується рибна дорога?


13

Я люблю> <>,> <> це життя! 2D мови дивовижні! У цьому виклику вам доведеться сказати, чи закінчилася «риб’яча» дорога, а кодовий гольф.

Визначення

Рибна дорога споруджена плиткою, включаючи такі:

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

Будь-який інший персонаж (крім -|+) може розглядатися як відволікання, як деякі квіти (або рибні голови) на кордоні дороги.

Дорога завжди починається у верхньому лівому куті прямокутної сітки, -|+позначеної символами. Дорога закінчується, якщо, дотримуючись її, ви опинитесь на кордоні, інакше ви потрапите в нескінченну стежку.

Пошук шляху в дорозі здійснюється, дотримуючись вказівок v>^<та дзеркал. Дзеркало відображатиметься на 90 ° залежно від того, звідки ви приїхали. Ось як це працює (за допомогою v>^<показу маршрутів):

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

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

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

Нескінченна петля:

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

Особливості

Дорога не обов'язково складається лише з інструкцій. Пробіли або букви можна використовувати для його заповнення. Це означає, що вам потрібно продовжувати рухатися в тому ж напрямку, за винятком випадків, коли ви перекреслите символ у <v^>-|.

У v>^<верхньому лівому куті завжди буде одна , <або ^це означає, що ця дорога закінчується.

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

Ваші подання повинні повернути або надрукувати на STDOUT значення truthy / false, коли це зроблено. Ціннісні значення, що означають, що дорога має кінець, тоді як хибні означає, що це нескінченна петля.

Тестові справи

+--------------------+
|>\/  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

Стандартні лазівки заборонені (як завжди).

Виграє той, хто має найменший код у байтах. (було б дивно побачити відповідь> <> :))



1
Це краще отримати> <> відповідь ...
хлоп

@ConfusedMr_C Був би на себе, якби знав цей багаж: /. Можливо, якщо я знайду час ^^ '
Katenkyo

Я думаю, що перетворення вхідної інформації на> <>, а потім виклик інтерпретатора> <> (без включення коду цього в рахунок) було б лазівкою?
Paŭlo Ebermann

1
@ PaŭloEbermann Щоб це не лазівка, вам потрібно буде порахувати персонаж в інтерпретаторі, або скориставшись ланкою із вбудованим перекладачем, що перебуває в інтернеті, і я не думаю, що він існує ^^.
Катенкьо

Відповіді:


4

JavaScript, ES6, 177 161 145 байт

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)

Ми можемо виявити цикл, пройшовши шлях і виявивши повтор кортежу

  • Місцезнаходження
  • що йде з напрямку

Тобто, якщо ми вступаємо в якусь позицію, що (x,y)йде з якогось напрямку Dвдруге, ми знаємо, що цей цикл повториться назавжди. Таким чином, код відстежує всі відвідувані місця та з якого напрямку, і перевіряє, чи не записується цей запис, кожного разу, коли відвідується новий простір.

Напрямки вгору, вниз, вліво і вправо присвоюються номери 1, 2, 3і 4. Код враховує поточний символ, який відвідується ( s[i+L]), і змінює поточний напрямок ( D), тоді новий напрямок використовується для рекурсивного виклику функції та оцінки наступного пробілу. 5як напрямок вказує на стіну, а на trueзакінчення програми.

Ось пояснення щодо менш гольф-коду:

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)

Рядок шаблону `431255${5-D+'X3412'[D]}`має вкладений вираз, який обробляє дзеркала: оскільки напрямки є числами, вони також можуть використовуватися як покажчики. Вираз 'X3412'[D], що оцінює 8-й символ у рядку з можливим напрямком і так відповідає \8-му символу в рядку символів '><^v-|/\\'). Вираз говорить:

  • Якщо напрямок струму Dє 1(вгору), то новий напрямок на удар \дзеркала буде 3(зліва)
  • Якщо напрямок струму Dє 2(вниз), то новим напрямком на удар \дзеркала буде 4(праворуч)
  • тощо.

Інше дзеркало /використовуватиме вираз 'X4321'[D], але оскільки це просто впорядкований відлік 4, ми можемо виразити його просто як 5-D.


5

Невідповідальна відповідь

Ти хотів> <>, я тобі даю> <>!

Я вважаю, що єдиний розумний спосіб зробити це в <<> - це скопіювати вхід у кодову область і дати інтерпретатору самостійно вирішити, чи вводить він кудись. Оскільки> <> вже не реалізує нитки, це залишає перед нами велику проблему: якщо на вході є цикл, ми застряжемо в ньому.

Враховуючи ці міркування, я вирішив зробити рішення, сумісне з інтерпретатором <>>, щоб можна було стверджувати, якщо перекладач застряг у вході або просто потребує віку, щоб зробити все. Я також повинен був додати кінцеві рядки до коду, щоб онлайн-інтерпретатор показав доданий код і не вийшов з ладу при спробі його запису.

О, і оскільки я на сьогодні явно дискваліфікований, я не турбувався з кодом для гольфу.

Без зайвих помилок, код у всій красі:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
              ^

Щоб скористатися ним, скопіюйте його в онлайн-перекладач, додайте достатньо проміжних ліній для обробки вашого вводу, подайте код, надайте йому введення як ;розділені лінії та насолоджуйтесь їздою.

Кілька тестів:

З

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

Кінцевий простір коду:

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     .
. /\/         ^<     .
 ....................

Виводить "вірно" і зупиняється.


З

+--------+
|>>\ 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" <<
            ^
 ........ 
.>>\     .
.\\      .
.  \\    .
. \ /    .
 ........

Петлі назавжди.


Навіть якщо це не відповідає, я люблю ваше джерело! Дякуємо за цей запис! Сумно, що він зациклюється назавжди, коли він повинен бути вродливим, але в будь-якому випадку добре працювати ^^.
Катенкьо

Я оновив онлайн-перекладача риб. Тепер він підтримує багаторядковий вхід
Suppen

@Suppen Гей, приємно! Дякуємо також за збільшену максимальну швидкість!
Аарон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.