ループとループとループ


16

チャレンジ

ASCIIアートの入力(最終的にループする可能性のあるパスを指示する)が与えられると、ループの長さ(ある場合)およびループのいずれかにある「テール」の長さを出力する関数を作成します。以下のフォーム。


入力

入力を関数に渡す必要があります。以下は、単純な入力の例です。

# --> # --> #
      ^     |
      |     |
      |     v
      # <-- #

上記のブロックは次のように視覚化できます

「尾」は1つのアイテムで、ループは4つの長さです。

より難しいもの:

            # --> # --> #
            ^           |
            |           |
            |           v
      # --> # <-- #     # --> #
      ^           ^           |
      |           |           |
      |           |           v
# --> #           # <-- # <-- #

出力

STDOUTまたは言語の最も近い代替手段を介して出力する必要があります。

2つの出力整数は、テールの長さとループの長さでなければなりません。この出力には2つの形式があります。

  1. スペース区切りの文字列: "2 10"
  2. 整数の配列: [2, 10]

ルール

  • すべてのブロック、またはは、それ自体から離れる単一のパス#のみを持ちます。

  • すべての矢印は2つの線分と1つの頭です。

  • 開始ブロックは常に左端の列にあります。

  • 入力がループになることはありません。


# --> # --> # --> #
^     ^           |
|     |           |
|     |           v
#     # <-- # <-- #

これのテール長は2で、ループ長は6です。以下では、テールとループが分離されています。

# -->
^
|
|
#

ループ

# --> # --> #
^           |
|           |
|           v
# <-- # <-- #

正しい出力がある[2, 6]"2 6"

入力がtailのみの場合、ループ長はゼロです。

# --> # --> # --> #
                  |
                  |
                  v
        <-- # <-- #

上記入力のための正しい出力である[6, 0]"6 0"


@orlp入力と出力が混乱していると思います。
-Sanchises

1
入力に余分な切断されたパスを含めることができますか
xnor

イントロはわかりにくいと思います。それは問題がプログラム分析に関するものであると思うようになりますが、それはASCIIアートの経路探索に関するものです。
-xnor

イントロを削除しました。それは少し混乱した/誤解を招くものでした。@xnor
ザック・ゲイツ

回答:


11

JavaScript(ES6)、221 229

入力をパラメーターとして使用し、ポップアップウィンドウ(アラート)を介して文字列として出力する関数。

入力を繰り返しスキャンする:
各ステップで

  • 尾の端を取り除く
  • 残りの「#」を数える

削除するテールがこれ以上ない場合、これまでのステップ数はテールのサイズであり、残りの「#」の数はループのサイズです。

バックティック内のすべての改行は重要であり、カウントされます

Firefoxで以下のスニペットを実行してテストします(Chromeではなく、サポートしていません...

F=s=>{s=`


${s}


`.split`
`.map(r=>[...r]);for(t=0,f=1;f;)s.map((r,y)=>r.map((c,x)=>c=='#'&&((r[x+2]+r[x-2]+s[y-1][x]+s[y+1][x]).match`[v<>^]`?++l:t+=(f=r[x-4]=r[x+4]=s[y-3][x]=s[y+3][x]=r[x]=1))),f=l=0);alert(t+' '+l)}

// Less golfed
U=s=>{
  s=`\n\n\n${s}\n\n\n`.split`\n`.map(r=>[...r])
  t=0
  do {
    f=l=0
    s.forEach((r,y) => {
      r.forEach((c,x) => {
        if (c == '#')
        {
          if (!(r[x+2] == '<' || r[x-2] == '>' || s[y-1][x] == 'v' || s[y+1][x] == '^'))
            t+=(f=r[x-4]=r[x+4]=s[y-3][x]=s[y+3][x]=r[x]=1)
          else
            ++l
        }
      })
    })
  } while(f)
  alert(t+' '+l)
}  

//Test

// Redefine console.log
alert=(...x)=>O.innerHTML+=x+'\n'

test=[`
# --> # --> #
      ^     |
      |     |
      |     v
      # <-- #`
,`
            # --> # --> #
            ^           |
            |           |
            |           v
      # --> # <-- #     # --> #
      ^           ^           |
      |           |           |
      |           |           v
# --> #           # <-- # <-- #`
,`
# --> # --> # --> #
^     ^           |
|     |           |
|     |           v
#     # <-- # <-- #`      
]

test.forEach(t=>(alert(t),F(t)))
<pre id=O></pre>


...スプレッド演算子は正しいですか?他の構文(groovyのような)によって他の言語(groovyなど)に存在するため、このように名前を付けることができます。とにかく素敵な解決策!
アーロン

1
+1「これを行うには賢い方法が必要だ」と考えていたのですが、この解決策を思い付きました。
-Sanchises

8

ルビー、287 278バイト

->i{n={}
g=->x{n[x]||=[0,p]}
t=y=0
i.lines{|l|x=0
l.chars{|c|x+=1
'><'[c]&&(r=c.ord-61;s,d=[y,x-4*r],[y,x+2*r])
'^v'[c]&&(r=c<?_?1:-1;s,d=[y+r*3,x],[y-r,x])
s&&(g[s][1]=g[d])[0]+=1}
y+=1}
c,*_,s=n.values.sort_by{|v|v[0]}
l=n.size
s[0]>1?((t+=1;c=c[1])while c!=s):t=l-=1
[t,l-t]}

それを試してみてください ここでください

これにより、ノードのハッシュ(辞書)が作成されます。各ノードについて、着信接続の数と(おそらくnull)次のノードが格納されます。

最後に:

  • 2つの着信接続を持つノードがない場合(ループがないことを意味する)、テールに0を返し、ループの既存ノードの数を返します。
  • それ以外の場合、2つの着信接続(ループスタート)を持つノードに到達するまで、next-> ...-> nextを使用して、着信接続が0のノード(開始)から反復を開始します。適切なカウントを返します。

コードの読み取り可能なバージョンは、ここから入手できます


2

ルビー、276

->s{a=k=w=s.index(r='
')*2+2
s=r*w+s+r*w
(s.size).times{|i|s[i,2]=='
#'&&(s[3+j=i+1]+s[j+w]+s[j-w]).strip.size<2&&(a=[j]
d=0
loop{("|-|-"[d])+?#=~/#{s[k=j+[-w,3,w,-3][d]]}/?(a.include?(k)&&break;a<<(j=k);d-=1):d=(d+1)%4}
)}
u=a.size
v=a.index(k)
t=(u-v)/4*2
print u/2-t," ",t}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.