ラベルの行き止まり


16

ASCIIアート「道路」の入力が与えられると、すべての行き止まりにラベルが付けられた道路を出力します。

これは道です:

########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########

これは、文字でラベル付けされた行き止まりの道路Xです:

########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX

デッドエンドは、任意の道路タイルとして定義される境界nは少なくとも他の道路タイル、N-1であると考えられるその行き止まりをこのルールによって既に。「境界線」は4つの基本方向であるため、斜めに隣接するタイルはカウントされません。

このルールは繰り返し適用されます。新しく作成された行き止まり自体が、さらに行き止まりを作成できるためです。また、他の1つの道路タイルのみに接する道路タイルは、ルールが初めて適用されたときに行き止まりと見なされることに注意してください。

入力と出力は、単一の文字列(#または以外の文字で区切られた行を持つ.)または配列/リスト/などのいずれかです。言語がサポートしている場合は、関数の引数として各行を入力することもできます。

入力について次のことを想定できます。

  • 常に少なくとも1つの「ループ」、つまり#無限に追跡できる文字のグループがあります。(そうしないと、すべてのタイルが行き止まりになります。)

  • これは、最小ループが次のようになるため、入力が常に2×2以上になることを意味します。

    ##
    ##
    

    (ちなみに、変更せずに出力する必要があります。)

  • すべての#キャラクターが接続されます。つまり、any #で塗りつぶしを実行すると、それらすべてが影響を受けます。

これはであるため、バイト単位の最短コードが優先されます。

上記の例と小さな2×2グリッドは、テストケースとして使用できます(この課題でカバーするエッジケースは多くありません)。

回答:


8

CJam、61バイト

q_N/{{0f+zW%}4*3ew:z3few::z{e__4=_@1>2%'#e=*"#"='X@?}f%}@,*N*

ここで試してみてください

説明

Outline:

    q_N/               Read input lines
        {   }@,*       Perform some operation as many times as there are bytes
                N*     Join lines

Operation:

    {0f+zW%}4*         Box the maze with zeroes
    3ew:z3few::z       Mystical 4D array neighborhood magic.
                       (Think: a 2D array of little 3x3 neighborhood arrays.)

    {                        }f%    For each neighborhood, make a new char:
     e_                                 Flatten the neighborhood
       _4=_                             Get the center tile, C
           @1>2%                        Get the surrounding tiles
                '#e=                    Count surrounding roads, n
                    *                   Repeat char C n times
                     "#"=               Is it "#"? (i.e., C = '# and n = 1)
                         'X@?           Then this becomes an 'X, else keep C.

(Martinは2バイト節約しました、ありがとう!)


それは私が今まで見た中で最も長いチャムの答えの一つです。=)
DJMcMayhem


ある'#"#"CJamで違うのですか?
ETHproductions 16

はい、そうです。"#"に等しい['#]
リン

5

JavaScript(ES6)、110 109バイト

r=>[...r].map(_=>r=r.replace(g=/#/g,(_,i)=>(r[i+1]+r[i-1]+r[i+l]+r[i-l]).match(g)[1]||"X"),l=~r.search`
`)&&r

@ edc65のおかげで1バイト節約!

説明

問題への非常にシンプルなアプローチ。各を検索し、その周囲に#2 #秒未満がある場合、に置き換えXます。すべての行き止まりがXsに置き換えられることが保証されるまで、このプロセスを何度も繰り返します。

var solution =

r=>
  [...r].map(_=>                    // repeat r.length times to guarantee completeness
    r=r.replace(g=/#/g,(_,i)=>      // search for each # at index i, update r once done
      (r[i+1]+r[i-1]+r[i+l]+r[i-l]) // create a string of each character adjacent to i
      .match(g)                     // get an array of all # matches in the string
        [1]                         // if element 1 is set, return # (the match is a #)
        ||"X"                       // else if element 1 is undefined, return X
    ),
    l=~r.search`
`                                   // l = line length
  )
  &&r                               // return the updated r
<textarea id="input" rows="10" cols="40">########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########</textarea><br>
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


1
このタイプのタスクに常に使用する一般的なトリック。同じ方法でlと-lの両方を使用すると、のl=~r.search代わりに計算できますl=1+r.search。(1バイトのみ保存)
edc65

@ edc65賢い。ありがとう!
user81655 16

0

パイソン(3.5)362 331 329 314バイト

@アリッサに感謝します。彼女は私が〜33バイトを獲得するのを助けます

d='.'
r=range
def f(s):
 t=[list(d+i+d)for i in s.split()]
 c=len(t[0])
 u=[[d]*c]
 t=u+t+u
 l=len(t)
 g=lambda h,x:t[h][x]=='#'
 for k in r(l*c):
  for h in r(1,l):
   for x in r(1,c):
    if g(h,x) and g(h+1,x)+g(h-1,x)+g(h,x+1)+g(h,x-1)<2:
     t[h][x]='X'
 print('\n'.join([''.join(i[1:-1])for i in t][1:-1]))

説明

d='.'
r=range

関数定義

def f(s):

「。」の境界線を追加します ボードの左右に

 t=[list(d+i+d)for i in s.split()]
 c=len(t[0])
 u=[[d]*c]

「。」の境界線を追加します 上下に

 t=u+t+u
 l=len(t)

'#'をテストするLambda関数

 g=lambda h,x:t[h][x]=='#'

入力長をループして、行き止まりを忘れないようにします

 for k in r(l*c):

列と行でループ

  for h in r(1,l):
   for x in r(1,c):

周りに「#」があるかどうかをテストします

    if g(h,x) and g(h+1,x)+g(h-1,x)+g(h,x+1)+g(h,x-1)<2:

「#」を「X」に置き換えます

     t[h][x]='X'

「。」で満たされた境界線を切り抜きます 文字列で結合します

 print('\n'.join([''.join(i[1:-1])for i in t][1:-1]))

使用法

f("########.....######..#..###\n#......#######....#..#..#.#\n#.##......#...#####..#..###\n#..#####..#....#..#######.#\n#......#...#####.....##...#\n#..###.#...#...###...#..###\n##########.#..#..##..#.##.#\n..#......#.######.#..#.#.#.\n..#......#.#..#.#.#..#.#.#.\n..######.###..##..#########")

########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX

1)のsplit()代わりに使用しますsplitlines()。2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]短い。さらに短縮することもできますd='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]。3)すべてのリスト(zip(....))が必要なわけではありませんprint('\n'.join([''.join(i[1:-1])for i in t])
アリッサ

@アリッサはあなたの助けに感謝します1)と3)のヒントを使用しますが、2)すべてのブラケットを削除することはできません'str' object does not support item assignment。文字列のリストではなくcharのリストのリストが必要です。リストのリストでは、t [h] [x] = 'X'を使用できます
Erwan

申し訳ありませんが、文字列の不変性に関することを見逃しました。またr、すべての定数(、gおよびd)を関数の外に移動することもできます(集計を節約できます)。多分split()をいじるのが役立つかもしれません:t=[d+list(i)+d for i in s.split()]、長さを計算し、最後にドットラインを追加してから始めて、それからこれらの拡張された長さで動作するようにサイクルを変更します。コードが短縮されるかどうかは
わかり

それはトンを使用しているため、私は機能のグラムを移動することはできません@Alissa私はあなたの他のコメントテストします
エルワン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.