Balık yolunun bir sonu var mı?


13

Seviyorum> <>,> <> hayattır! 2D diller inanılmaz! Bu meydan okuma, kod golf yaparken bir "balık" yolun sonu olup olmadığını söylemek gerekir.

Tanım

Aşağıdakiler de dahil olmak üzere karolarla balıklı bir yol yapılır:

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

-|+Yolun kenarındaki bazı çiçekler (veya balık kafaları) gibi başka herhangi bir karakter (hariç ) dikkat dağıtıcı olarak kabul edilebilir.

Her zaman dikdörtgen bir ızgaranın sol üst köşesinde -|+sembollerle sınırlandırılmış bir yol başlar . Yolun bir sonu vardır, eğer onu takip ederek, bir sınırda kalırsanız, aksi takdirde sonsuz bir yolda sıkışıp kalırsınız.

Yolda yolunuzu bulmak, yol tarifleri v>^<ve aynalar takip edilerek gerçekleştirilir . Bir ayna nereden geldiğinize bağlı olarak 90 ° yansıtacaktır. Nasıl çalıştığı aşağıda ( v>^<yol tariflerini göstermek için kullanarak ):

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

Bir yol biterse şu şekilde görünebilir:

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

Sonsuz bir döngü:

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

Ayrıntılı Bilgiler

Bir yol mutlaka talimatlardan ibaret değildir. Boşlukları veya harfleri tamamlamak için kullanılabilir. Bu, bir karakteri geçmeniz durumu dışında aynı yönde ilerlemeye devam etmeniz gerektiği anlamına gelir <v^>-|.

v>^<Sol üst köşede her zaman biri olacaktır <ya ^da bu yolun bittiği anlamına gelir.

Bir dize parametre olarak alan bir işlevi veya STDIN / dilinizdeki en yakın alternatif olanı kullanarak bağımsız bir program gönderebilirsiniz.

Gönderiminiz tamamlandığında STDOUT gerçek / falsy değerlerine geri dönmeli veya yazdırmalıdır. Gerçek değerler yolun bir sonu olduğu anlamına gelirken, falsy ise sonsuz bir döngü olduğu anlamına gelir.

Test senaryoları

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

Standart boşluklar yasaktır (her zamanki gibi).

Kazanan, bayt cinsinden en kısa koda sahip olan olacaktır. (bir> <> cevabı görmek harika olurdu :))



1
Bu daha iyi ... a> <> cevap almak
alkış

@ConfusedMr_C Bu dili biliyor olsaydım kendime koyardım: /. Belki zaman
bulursam

Ben giriş> <> dönüştürmek ve sonra> <> yorumlayıcı (sayım bunun kodu dahil olmadan) çağıran bir boşluk olacak tahmin?
Paŭlo Ebermann

1
@ PaŭloEbermann Bir boşluk olmaması için, yorumlayıcıdaki karakteri saymanız veya yerleşik> <> yorumlayıcı içeren bir langayı kullanmanız gerekir ve bunun var olduğunu düşünmüyorum ^^.
Katenkyo

Yanıtlar:


4

JavaScript, ES6, 177 161 145 bayt

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)

Yolu çevirip demetin tekrarını tespit ederek bir döngüyü tespit edebiliriz

  • yer
  • geliş yönü

Yani, ikinci kez bir (x,y)yönden gelen bir pozisyona girersek D, bu döngünün sonsuza kadar tekrar edeceğini biliyoruz. Bu nedenle, kod ziyaret edilen tüm konumları ve hangi yönden izler ve yeni bir alan her ziyaret edildiğinde bu kaydı kontrol eder.

Yol tarifi yukarı, aşağı, sola ve sağa numaralarının verildiği 1, 2, 3, ve 4. Kod, ziyaret edilen geçerli sembolü dikkate alır ( s[i+L]) ve geçerli yönü değiştirir ( D), daha sonra işlevi tekrar tekrar çağırmak ve bir sonraki boşluğu değerlendirmek için yeni yön kullanılır. 5bir yön olarak bir duvarı ve trueprogramın sonlandığını gösterir.

İşte daha az golf kodunun açıklaması:

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)

Şablon dizesi `431255${5-D+'X3412'[D]}`, aynaları işleyen iç içe bir ifadeye sahiptir: yönler sayılar olduğundan, bunlar dizinler olarak da kullanılabilir. İfade 'X3412'[D], olası yön dizesindeki 8. karaktere göre değerlendirilir ve böylece \sembol dizesindeki 8. karaktere karşılık gelir '><^v-|/\\'). İfade diyor ki,

  • Akıntı yönü ise Dise 1(yukarı), sonra bir isabet yeni yön \ayna olacak 3(sol)
  • Akıntı yönü ise Dise 2(aşağı), bir isabet daha sonra yeni yön \olacak ayna 4(sağda)
  • vb.

Diğer ayna /ifadeyi kullanacaktı 'X4321'[D], ama bu sadece düzenli bir geri sayım olduğu için 4, bunu daha basit bir şekilde ifade edebiliriz 5-D.


5

Uyumsuz> <> cevap

Sen istedin> <>, sana veriyorum> <>!

Bunu yapmanın tek aklı başında yolun <>> kod alanındaki girdiyi kopyalamak ve girdinin bir yere gidip gitmediğine karar vermesine izin vermek olduğuna inanıyorum. > <> Artık iş parçacığı uygulamadığı için, bu bizi büyük bir sorunla karşı karşıya bırakıyor: eğer giriş bir döngüye sahipse, ona takılırız.

Bu hususlar göz önünde bulundurularak , çevirmenin girişte sıkışıp kalmadığını veya sadece her şeyi yapmak için yaşları alıp almadığını iddia etmenin mümkün olabilmesi için çevrimiçi tercümanla uyumlu bir çözüm yapmaya karar verdim . Ben de online tercüman eklenen kodu gösterir ve buna yazmaya çalışırken çökmez koduna sondaki satırları eklemek zorunda kaldı.

Oh ve şimdiye kadar açıkça diskalifiye olduğum için, kodu golf oynamakla uğraşmadım.

Daha fazla uzatmadan, tüm ihtişamıyla kod:

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

Bunu kullanmak için çevrimiçi yorumlayıcıya kopyalayın, girişinizi işlemek için yeterli sondaki satırları ekleyin, kodu gönderin, girdiye ayrıştırılmış satırlar olarak; verin ve sürüşün tadını çıkarın.

Birkaç test:

İle

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

Son kod alanı:

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

"True" değerini verir ve durur.


İle

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

Son kod alanı:

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

Sonsuza kadar döngüler.


Uyumlu olmasa bile, kaynağınızı seviyorum! Bu giriş için teşekkürler! Ne zaman sahte, ama yine de iyi bir iş olmalıdır sonsuza kadar döngü üzücü ^ ^.
Katenkyo

Çevrimiçi balık yorumlayıcısını güncelledim. Artık satırlı girişi destekler
Suppen

@Tedarik, güzel! Artmış maksimum hız için de teşekkürler!
Aaron
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.