これらの厄介なドアから私の壁を守る


20

ドアノブはすばらしいものですが、ドアを開けると、常に周囲の壁がへこんでいます。次のように、部屋のASCIIアートを入力する必要があります。

+---------+--X  --X    --+-----+
|       \     \   |\     |   \ |
|        \     \  | \    |    \|
|         X       |  \   |     X
|      /  |       |   \  X      
|     /   |     \       /       
|    /    |      \     /       |
+---X   --+-------X------+-----+

そして、次のようにドアストップのある部屋を出力します。

+---------+--X  --X    --+-----+
|       \  .  \   |\     |   \.|
|        \     \  | \   .|    \|
|         X       |  \   |     X
|      /  |       |.  \  X      
|     /  .|     \       /       
|.   /    |     .\     /       |
+---X   --+-------X------+-----+

仕様:

  • ASCIIルーム(入力)で構成されます+-|。これらのキャラクターは純粋に表面的なものです。それらはすべて+s である可能性がありますが、それは恐ろしく見えるでしょう。また、ヒンジ(X)とドア(/または\)も含まれます。
  • ドアは/またはで構成されてい\ます。である「ヒンジ」の文字から出発しX、彼らが斜めに直接移動します(中1の変動xと1でy2台以上(文字)の場合)。
  • ドアのドアストップを配置する場所を見つけるには(ドアごとにドアストップは常に1つだけです)、ドアの出入口を見つけます。出入口は常に1つのヒンジから始まり、そこからドアの上下左右の長さと同じ量のスペースを取ります。その後の次のスペースは常に壁になります。たとえば、このドアでは、出入口はDs でマークされています。

       \
        \
    ---DDX-----
    

    戸口が見つかったら、ドアに到達するために時計回りまたは反時計回りに移動する必要があるかどうかを調べます。たとえば、上の例のドアでは、時計回りに移動する必要があり、このドアでは反時計回りに移動する必要があります。

       \ <-
        \  )
    -----X  ---
    

    どの方向に進むかがわかったら、壁に着くまでその方向に進み続けます(ドアは無視します)。

    上記の例のドアの視覚化を次に示します。

    視覚化

    青は出入口、オレンジは時計回りに移動する必要があることを示し、赤は壁に到達するまで時計回りに移動し続けています。

    壁に到達したらX、その壁のヒンジ()から(ドアの長さ)のスペースに移動し、壁からドアに向かって1スペースを移動します(したがって、ドアストップを壁に直接配置しないでください)。.そこ。ドアストップの配置方法を示す同じドアの例を次に示します。

       \
        \  .
    ---DDX12---
    

    ドアごとに繰り返し、結果を出力します!この投稿の上部にあるサンプル入力をテストケースとして使用して、プログラムが有効かどうかを確認してください。

    次のような、壁に収まらないドアを取り扱う必要がないことに注意してください。

    |     /
    |    /
    |   /
    |  /
    +-X    --
    

    または:

         /
        /
       /
    +-X   --
    |
    |
    
  • これはなので、バイト単位の最短コードが優先されます。

出入り口のルールは何ですか?それらは、ドアと同じ長さで、一方の側が壁で囲まれ、もう一方の側がヒンジ(右のドア用)で囲まれている必要がありますか?
ジョンドヴォルザーク14年

@JanDvorak OK、明確化のために編集
ドアノブ

3
ヒンジから始まる壁は少なくともドアと同じ長さであり、他の壁(ヒンジからは開始しない)がその特定のドアに干渉しないと仮定できますか?
ハワード14年

@Howardあなたが何について話しているのか分かりません。出入口の反対側の壁が出入口と同じ長さであると仮定できるかどうかを尋ねていますか?そうだとすれば、いいえ、ドアはテストケースの2番目のドアのように90度しかスイングできないためです(左上から開始するヒンジ配置によってカウント)。
ドアノブ

1
え?ドアは斜めです。これらの文字列はすべて6文字幅であるため、中央の列はありません。
ピーターテイラー14年

回答:


4

Scala、860バイト

Golfed

    object D extends App{val s=args(0)split("\n")
    val r=Seq(P(1,0),P(1,-1),P(0,-1),P(-1,-1),P(-1,0),P(-1,1),P(0,1),P(1,1))
    var m=r(0)
    val e=s.map(_.toCharArray)
    case class P(x:Int,y:Int){def u=x==0||h
    def h=y==0
    def p(o:P)=P(x+o.x,y+o.y)
    def o="\\/".contains(c)
    def w="-|+".contains(c)
    def c=try s(y)(x) catch {case _=>'E'}
    def n=r.filter(!_.u).map(d => d.j(p(d))).sum
    def j(t:P):Int=if(t.o)1+j(p(t))else 0
    def q=if(c=='X'){m=this
    r.filter(_.u).map{d=>if(p(d).c==' '&&p(P(d.x*(n+1),d.y*(n+1))).w)d.i}}
    def i:Unit=Seq(r++r,(r++r).reverse).map(l=>l.drop(l.indexOf(this)+1)).map(_.take(4)).filter(_.exists(a=>a.p(m)o))(0).grouped(2).foreach{p=>if(p(1)p(m)w){p(0)add;return}}
    def add=if(r.filter(_.h).map(p(_)p(m)).exists(_.w))e(y*m.n+m.y)(x+m.x)='.'else e(y+m.y)(x*m.n+m.x)='.'}
    val f=args(0).size
    Array.tabulate(f,f){(i,j)=>P(i,j)q} 
    e.map(_.mkString).map(println)}

ゴルフをしていない

    object DoorknobCleanVersion extends App {
            val s = args(0) split ("\n")

            val r = Seq(P(1, 0), P(1, -1), P(0, -1), P(-1, -1), P(-1, 0), P(-1, 1), P(0, 1), P(1, 1))
            val HorizontalDirections = r.filter(_.isHorizontal)

            var hinge = r(0)
            val result = s.map(_.toCharArray)

            type I = Int
            case class P(x: Int, y: Int) {
                    def isCardinal = x == 0 || isHorizontal
                    def isHorizontal = y == 0

                    override def toString = x + "," + y

                    def p(o: P) = P(x + o.x, y + o.y)

                    def isDoor = Seq('\\', '/').contains(charAt)
                    def isWall = Seq('-', '|', '+').contains(charAt)

                    def charAt = try s(y)(x) catch { case _ => 'E' }

                    def doorLength = r.filter(!_.isCardinal).map(d => d.recursion2(p(d))).sum

                    def recursion2(currentPosition: P): Int =
                            if (currentPosition.isDoor)
                                    1 + recursion2(p(currentPosition))
                            else
                                    0

                    def findDoorway =
                            if (charAt == 'X') {
                                    hinge = this
                                    r.filter(_.isCardinal).map { d =>
                                            if (p(d).charAt == ' ' && p(P(d.x * (doorLength + 1), d.y * (doorLength + 1))).isWall)
                                                    d.getCorrectRotation2
                                    }
                            }

                    def getCorrectRotation2: Unit = Seq(r ++ r, (r ++ r).reverse).map(l => l.drop(l.indexOf(this) + 1))
                            .map(_.take(4))
                            .filter(_.exists(a => a.p(hinge)isDoor))(0)
                            .grouped(2)
                            .foreach {
                                    p =>
                                            if (p(1) p (hinge)isWall) {
                                                    p(0)add;
                                                    return
                                            }
                            }

                    def add =
                            if (HorizontalDirections.map(p(_) p (hinge)).exists(_.isWall))
                                    result(y * hinge.doorLength + hinge.y)(x + hinge.x) = '.'
                            else
                                    result(y + hinge.y)(x * hinge.doorLength + hinge.x) = '.'

            }

            val size = args(0).size
            Array.tabulate(size, size) { (i, j) => P(i, j).findDoorway }

            result.map(_.mkString).map(println)
    }

ここでは、OOPを使用することは間違いなく間違ったアプローチでした。もう一度それができたら、ハードコードされた真理値表の束を間違いなく使います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.