ワンパス迷路を生成する


12

奇数の整数N(5 <= N <= 51)が与えられた場合、次の要件に従う辺の長さNの迷路を生成します。

迷路はキャラクター | -とで構成する必要があり+ます。|キャラクターを垂直の壁、-キャラクターを水平の壁として使用する必要があり、その壁が回転する場合、キャラクター+を使用する必要があります。

パスの幅は1文字でなければなりません。

迷路は少なくとも4回回転する必要があります。

迷路の外壁は、開始点と終了点の2点で壊れている必要があります。

迷路は、開始から終了までの1つの非破壊パスで構成されている必要があります。

たとえば、次は有効な迷路です:(N = 5)

+---+
|   |
| | |
  |  
--+--

そして用N = 7:

--+---+
  |   |
| | | |
| | | |
| | | |
|   |  
+---+--

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。


9
それは迷路だ、迷路ではありませんenglish.stackexchange.com/a/144103/199361
edc65

@ edc65実際、その夜。
オリバーNi

「迷路は最初から最後まで、1つの非破壊パスで構成されている必要があります」については明確ではありません。これは、パスが1つだけであり、開始から終了までである、または開始から終了までのパスの数が1であることを意味しますか?行き止まりの他のパスがありますか?別々のループ?
xnor

奇数の整数は<50、<= 49でなければなりません
pinkfloydx33

2
@ edc65 OPはどちらも意味しないと思います。
orlp

回答:


10

ゼリー36 35 34 33 32 バイト

2*×5H_2Bị⁾ |
_3”-ẋ”+;;Çsẋ2U3¦ṁµY

TryItOnline!

次のような例とは逆にnighter™を構築します。

+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+

どうやって?

2*×5H_2Bị⁾ | - Link 1, pipes & spaces: n      e.g. 7
2*           - 2 raised to the nth power      e.g. 128
  ×5         - multiply by 5                  e.g. 640
    H        - halve                          e.g. 320
     _2      - subtract 2                     e.g. 318
       B     - convert to binary              e.g. [1,0,0,1,1,1,1,1,0]
        ị    - index into (1-based)
         ⁾ | - char list " |"                 e.g. " ||     |"

_3”-ẋ”+;;Çsẋ2U3¦ṁµY - Main link: n            e.g. 7
_3                  - n - 3                   e.g. 4
  ”-                - char list "-"
    ẋ               - repeat                  e.g. "----"
     ”+             - char list "+"
       ;            - concatenate             e.g. "+----"
         Ç          - call last link (1) as a monad
        ;           - concatenate             e.g. "+---- ||     |"" 
          s         - split into chunks of n  e.g. ["+---- |","|     |"]
           ẋ2       - repeat 2 times          e.g. ["+---- |",
                                                    "|     |",
                                              +-->  "+---- |",
                                              |     "|     |"]
              3¦    - apply to index 3:       |
             U      -    upend                +---  "| ----+"
                ṁ   - mould like n (i.e. repeat to fill)
                 µ  - monadic chain separation
                  Y - join with line feeds

(保存された各バイトにはかなり重要な変更が含まれていました。興味がある場合は編集履歴を参照してください。ただし、リンク1は従来のリピートおよび結合と同じバイト数です。_2⁶ẋ“ ||“|”j


5

JavaScript(ES6)、86 92 116

ほぼコルモゴルフの複雑さの課題... 少し横に考えて(@Neilの答えに触発され)、非常に短くすることができます。ちょうど90°回す

n=>`|${s=' '[r='repeat'](n-2)}|
| ${h='-'[r](n-3)}+
|${s}|
+${h} |
`[r](n).slice(n*~n)

テスト

f=
n=>`|${s=' '[r='repeat'](n-2)}|
| ${h='-'[r](n-3)}+
|${s}|
+${h} |
`[r](n).slice(n*~n)

function update() {
  var i=+I.value
  O.textContent=i&1? f(i): 'even'
}

update()
<input id=I value=7 min=5 max=49 step=2 type=number oninput="update()"><pre id=O><pre>


@Neilは毎日何か新しいことを学びます。ありがとう
-edc65

すごい!私は86バイトをカウントします
-ETHproductions

@ETHproductionsの権利。ありがとう
-edc65

4

バッチ、216バイト

@echo off
set s=
for /l %%i in (4,1,%1)do call set s=-%%s%%
set b= %s:-= %
set r=! %s%+
set s=+%s% !
call:e
for /l %%i in (5,2,%1)do call:l
:l
echo ^|%b%^|
set t=%s%
set s=%r%
set r=%t%
:e
echo %s:!=^|%

|バッチでは扱いにくいので、反映しました、代わりに例を回転させてました。


90°回転するということですか?私はそれを試して、JSでたくさん節約しました。再びありがとう
edc65

@ edc65私はもともとリフレクションのために行っていましたが、あなたは私が代わりに回転することになったという点で正しいです。
ニール

3

PHP、99バイト

ダウンゲートまで

for($s=str_pad("\n| ",$c=$argv[1],"-")."+\n";$i++<$c;)echo$i%2?$s=strrev($s):str_pad("|",$c-1)."|";

PHP、157バイト

左右ゲート

<?=($p=str_pad)($n="\n",$c=1+$argv[1],"+---").$p($n,$c-1,"|   ")." #|"[$c%4].str_repeat($p($n,$c,"| "),$c-5).$p($n,$c-1,"  | ")."|# "[$c%4].$p($n,$c,"--+-");

@Titusバイトを小さくしてくれてありがとう


1
`$ n =" \ n "を割り当てることで3バイトを節約
Titus

1
$p("",$c*($c-4),...)代わりにstr_repeat(...,$c-4)(-2)
タイタス

1
...そしてさらに3バイト$p($n,$c-1," | ")の代わりに$p("\n ",$c-1," | ")
タイタス

1
($c)%4(-2)の不要な括弧$g、コードから削除(-1)
Titus

1
アップダウンバージョン。str_padの不要な3番目のパラメーター(-4)、の$c=$argv[1]-1代わりに($c=$argv[1])-1、(-3)の<=$c代わりに<$c$c代わりに$c-1(-3)
Titus

3

JavaScript(ES6)、87バイト

再帰関数。いくつかの末尾スペースを出力します。

f=(n,w=n,s=' -'[n&1].repeat(w-3),c='|+'[n&1])=>n?`
`+(n&2?c+s+' |':'| '+s+c)+f(n-1,w):s

テスト


ああ、私は再帰を試みたところ、9バイト長くなりました。よくやった:
ETHproductions

2

Ruby 72または69バイト

ラムダ関数。示されているように、改行で区切られた文字列を返します。* $ /を削除して、文字列の配列を返します。

->n{(1..n).map{|i|"|%s |+%s || %s|| %s+"[i%4*5,5]%(" -"[i%2]*(n-3))}*$/}

例から90度回転した迷路を描画します。各行に対して、フォーマット文字列が選択され(たとえば+%s |、1行目(0行目はありません)、演算子を使用%sして適切な数-またはスペースで置き換えられます%(sprintfと同等ですが、より短い)。)


2

Java 7、228バイト

String c(int n){String a="+x |",b="|y|\n",x,y,r=x=y="";int i=0;for(;i++<n-2;){x+=i>1?"-":"";y+=" ";}a=a.replace("x",x);b=b.replace("y",y);for(i=0;i<n;i++)r+=i%4<1?a+"\n":(i-2)%4==0?new StringBuffer(a).reverse()+"\n":b;return r;}

@JonathanAllanのJelly answerと同様の垂直出力を使用しました。

未ゴルフ&テストコード:

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

class M{
  static String c(int n){
    String a = "+x |",
           b = "|y|\n",
           x = "",
           y = "",
           r = "";
    int i = 0;
    for (; i++ < n-2;){
      x += i > 1
            ? "-"
            : "";
      y += " ";
    }
    a = a.replace("x", x);
    b = b.replace("y", y);
    for(i = 0; i < n; i++){
      r += i % 4 < 1
            ? a+"\n"
            : (i-2) % 4 == 0
               ? new StringBuffer(a).reverse()+"\n"
               : b;
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(7));
    System.out.println();
    System.out.println(c(25));
  }
}

出力:

+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+


+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |

言い訳、しかしGiven an odd integer N (5 <= N <= 51), generate a maze with side length N。あなたは...あなたのために異なる上部と下部の辺の長さを持っているように見える
破壊可能レモン

@DestructibleWatermelonそれを過去に読んだ。私のコードはまだすべてのルール/要件に準拠していました。ああ、私は高さと同じ幅を使用した元の答えにロールバックしました。
ケビンCruijssen 16年

1

Python 2、89バイト

def f(n):x='+'+'-'*(n-3)+' |';y='|'+' '*(n-2)+'|';print'\n'.join(([x,y,x[::-1],y]*n)[:n])

repl.it

内壁は、構築しx、同様に'+---- |'、内部廊下yのような'| |'
その後のリストを構築し[x,y,x[::-1],y]x[::-1]の逆であるx
そしてそのリスト反復nと、(単一のリストとして)時間を*n、最初にトランケートそれをn用いて、エントリは(...)[:n]、ジョイン改行付きのリストは、で'\n'.join(...)、結果を出力します。


1

ラケット187バイト

@JonathanAllanによる表示パターンの使用

(let*((u "+---- |")(v "|     |")(sr(λ(s)(list->string(reverse(string->list s)))))(g #t)(d displayln)
(p(λ()(d(if g u(sr u)))(set! g(if g #f #t)))))(for((i(ceiling(/ n 2))))(p)(d v))(p))

ゴルフをしていない:

(define (f n)
  (let* ((sr (lambda(s)
               (list->string
                (reverse
                 (string->list s)))))
         (u "+---- |")
         (v "|     |")
         (g #t)
         (d displayln)
         (p (lambda()
              (d (if g u (sr u)))
              (set! g (if g #f #t)))))
    (for ((i (ceiling (/ n 2))))
      (p)
      (d v))
    (p)))

テスト:

(f 10)

出力:

+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+

1

GNU sed 140バイト

-rの+1を含む

s/1{5}//
h
s/^/+---+\n|   |\n| | |\n  |  \n--+--/
/1/!b
:w
s/^..(..)[^$]*/\1&/gm
s/11//
/1/bw
G
:h
s/\n[^\n]*\n([^\n]*\n)/&\1/
s/1//
/1/bh

オンラインでお試しください!

単項で入力を取ります(このコンセンサスを参照)。

基本的にサイズ5の迷路を挿入し、必要に応じて各行の2番目と3番目の文字を先頭に追加します。次に、3行目(|)を必要な回数だけ複製します。

私が使用した唯一の興味深い点は、改行後の空の文字列と改行前の空の文字列をそれぞれ(通常の動作に加えて)一致および一致させるm6行目のオプションです。^$


1

T-SQL、123/79バイト

ゴルフ済み:

DECLARE @i INT=7

,@ INT=0z:PRINT
STUFF(CHOOSE(@%4+1,'+- |','|  |','| -+','|  |'),3,0,REPLICATE(IIF(@%2=0,'-',' '),@i))SET
@+=1IF @<@i GOTO z

ゴルフをしていない:

DECLARE @i INT = 9

DECLARE @i INT=7

,@ INT=0
z:
  PRINT 
    STUFF(CHOOSE(@%4+1,'+- |','|  |','| -+','|  |'),3,0,
      REPLICATE(IIF(@%2=0,'-',' '),@i))
  SET @+=1
IF @<@i GOTO z

チートして狭い迷路を作成するだけであれば、スクリプトは79バイトまでゴルフできます。

ゴルフ済み:

DECLARE @i INT = 9

,@ INT=0z:PRINT CHOOSE(@%4+1,'+- |','|  |','| -+','|  |')SET @+=1IF @<@i GOTO z

ゴルフをしていない:

DECLARE @i INT = 9

,@ INT=0
z:
  PRINT CHOOSE(@%4+1,'+- |','|  |','| -+','|  |')
  SET @+=1
IF @<@i GOTO z

長い答えのフィドル


0

JavaScript(ES6)、96バイト

f=(n,w=n-3)=>(h="-".repeat(w),n&2?`+${h} |`:`| ${h}+`)+(n>1?`
| ${" ".repeat(w)}|
`+f(n-2,w):"")

再帰が最短ルートになることが期待されていましたが、どうやら ...

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