단일 경로 미로 생성


12

홀수 정수 N (5 <= N <= 51)이 주어지면 다음 요구 사항을 따르는 측면 길이 N 을 가진 미로를 생성하십시오 .

미로는 문자 | -와 로 구성되어야합니다 +. 그것은 사용해야 |수직 벽의로 문자를 -수평 벽으로 문자, 그 벽 회전하는 경우, 문자가 +사용되어야한다.

경로의 너비는 하나의 문자 여야합니다.

미로는 최소한 네 번 회전해야합니다.

미로는 시작과 끝의 두 지점에서 부서지는 외벽을 가져야합니다.

미로는 처음부터 끝까지 하나의 비파괴 경로로 구성되어야합니다.

예를 들어, 다음은 유효한 미로입니다. ( N = 5)

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

그리고 N = 7 인 경우

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

이것은 이므로 바이트 수가 가장 적은 코드가 이깁니다.


9
그것은 미로 아니라, 그것은 미로의 english.stackexchange.com/a/144103/199361
edc65

@ edc65 실은 밤새입니다.
Oliver Ni

"미로는 처음부터 끝까지 하나의 비파괴 경로로 구성되어야합니다." 이것은 하나의 경로 만 있고 시작부터 끝까지 또는 시작에서 끝까지의 경로 수가 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

자바 스크립트 (ES6) 86 92 116

거의 kolmogorv-complexity challenge ... @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 바이트 , btw를 계산
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:!=^|%

|Batch에서 어색하기 때문에 대신 예제를 회전하여 반영 했습니다.


당신은 90도 회전을 의미합니까? 나는 그것을 시도하고 JS에 많은 것을 저장했다. 다시 한번 감사드립니다
edc65

@ edc65 원래 반사를하려고했지만 대신 회전으로 끝났습니다.
Neil

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)
Titus

1
... $p($n,$c-1," | ")대신에 3 바이트 이상$p("\n ",$c-1," | ")
Titus

1
($c)%4(-2)에 불필요한 파 렌스 $g, 코드에서 제거 (-1)
Titus

1
업다운 버전; 불필요한 3 str_pad에 대한 매개 변수 (-4), $c=$argv[1]-1대신 ($c=$argv[1])-1, <=$c대신 <$c$c대신 $c-1(-3)
디도

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

루비 72 또는 69 바이트

람다 기능. 표시된대로 줄 바꿈으로 구분 된 문자열을 반환합니다. 문자열 배열을 반환하려면 * $ /를 삭제하십시오.

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

예제에서 90도 회전 한 미로를 그립니다. 각 줄에 대해 형식 문자열이 선택되고 (예 +%s |: 첫 번째 줄 (0 번째 줄 없음)) 연산자를 사용하여 %s적절한 수 -또는 공백으로 대체됩니다 %(sprintf와 같지만 더 짧음).


2

자바 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 답변 과 유사한 수직 출력을 사용했습니다 .

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

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 나는 그 과거를 읽었다. 내 코드는 여전히 모든 규칙 / 요구 사항을 준수했습니다. 아 잘, 나는 높이와 같은 너비를 사용하는 원래의 대답으로 롤백했습니다.
Kevin Cruijssen

1

파이썬 2, 89 바이트

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

반복

내부 벽, 빌드 x처럼 '+---- |', 및 내부 통로 y처럼 '| |'
이어서 목록 빌드 [x,y,x[::-1],y]( x[::-1]의 역이다 x)
그렇다면 그 목록이 반복 n으로, (하나의리스트와 같은) 회 *n, 제 1 행 자릅니다를 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 미로를 삽입 한 다음 각 줄의 두 번째 및 세 번째 문자를 필요한만큼 시작 부분에 추가합니다. 그런 다음 세 번째 줄 (대체 |)을 필요한만큼 복제합니다 .

내가 사용한 유일한 흥미로운 것은 줄 바꿈 후의 빈 문자열과 줄 바꿈 앞의 빈 문자열을 각각 (정상적인 동작과 함께) m허용 ^하고 $일치 시키는 6 행 의 옵션입니다 .


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

자바 스크립트 (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.