Gere um labirinto de um caminho

12

Dado um número inteiro ímpar N (5 <= N <= 51), gere um labirinto com o comprimento lateral N que segue os seguintes requisitos:

O labirinto deve ser composto pelos caracteres | -e +. Ele deve usar o |personagem como uma parede vertical, o -personagem como uma parede horizontal e, se essa parede virar, o personagem +deve ser usado.

A largura do caminho deve ser um caractere.

O labirinto deve girar pelo menos quatro vezes.

O labirinto deve ter paredes externas, que se partem em dois pontos: o início e o fim.

O labirinto deve consistir em um caminho ininterrupto, do início ao fim.

Por exemplo, o seguinte é um labirinto válido: ( N = 5)

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

E para N = 7:

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

Lembre-se, isso é , portanto o código com o menor número de bytes vence.

Oliver Ni
fonte
9
Não é um labirinto, é um labirinto english.stackexchange.com/a/144103/199361
edc65
@ edc65 Na verdade, está mais agradável.
Oliver Ni
Não sei ao certo "O labirinto deve consistir em um caminho ininterrupto, do começo ao fim". Isso significa que existe apenas um caminho e é do início ao fim ou que o número de caminhos do início ao fim é 1? Pode haver outros caminhos com becos sem saída? Loops separados?
Xnor
Número inteiro ímpar deve ser <50, <= 49
pinkfloydx33
2
@ edc65 Presumo que OP não significa nenhum.
Orlp 31/10/16

Respostas:

10

Geléia , 36 35 34 33 32 bytes

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

TryItOnline!

Constrói um nighter ™ ao contrário, com exemplos como:

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

Quão?

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

(cada byte salvo envolveu mudanças bastante não-triviais, ver o histórico de edição se você estiver interessado, embora eu só notei que Link 1 é a mesma contagem de bytes como a repetição mais convencional e junte-se: _2⁶ẋ“ ||“|”j)

Jonathan Allan
fonte
5

JavaScript (ES6), 86 92 116

Quase um desafio de complexidade kolmogorv ... Com um pouco de pensamento lateral (inspirado na resposta de @ Neil), pode ser muito mais curto. Basta girar 90 °

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

Teste

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>

edc65
fonte
@ Neil wow todos os dias eu aprendo algo novo. Graças
edc65
Surpreendente! Conto 86 bytes , btw
ETHproductions
@ETHproductions certo. Graças
edc65
4

Lote, 216 bytes

@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:!=^|%

|s são estranhos no lote, então eu refleti os exemplos rotacionados.

Neil
fonte
Você quer dizer girar 90 °? Eu tentei e economizei muito em JS. Obrigado novamente
edc65 30/10
@ edc65 Eu estava indo originalmente para uma reflexão, mas você está certo no que acabei fazendo uma rotação.
31416 Neil
3

PHP, 99 bytes

até portões baixos

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

PHP, 157 bytes

portões direito esquerdo

<?=($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 Obrigado por minializar os bytes

Jörg Hülsermann
fonte
1
economize 3 bytes atribuindo `$ n =" \ n "
Titus
1
$p("",$c*($c-4),...)em vez de str_repeat(...,$c-4)(-2)
Tito
1
... e mais 3 bytes com em $p($n,$c-1," | ")vez de$p("\n ",$c-1," | ")
Titus
1
parênteses desnecessários em ($c)%4(-2), remover $gdo código (-1)
Titus
1
versão up-to-down; 3º parâmetro desnecessário para str_pad (-4), $c=$argv[1]-1em vez de ($c=$argv[1])-1, <=$cem vez de <$ce $cem vez de $c-1(-3)
Titus
3

JavaScript (ES6), 87 bytes

Uma função recursiva. Gera alguns espaços à direita.

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

Teste

Arnauld
fonte
Oh uau, eu apenas tentei recursão e acabei 9 bytes mais. Bem feito :-)
ETHproductions
2

Ruby 72 ou 69 bytes

Função Lambda. Como mostrado, retorna uma sequência separada por nova linha. Exclua o * $ / para retornar uma matriz de seqüências de caracteres.

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

Desenha um labirinto girado 90 graus dos exemplos. Para cada linha, uma sequência de formatação é selecionada (por exemplo, +%s |a 1ª linha (não há linha zero) e %sé substituída por um número -ou espaços apropriados usando o %operador (equivalente ao sprintf, mas mais curto).

Level River St
fonte
2

Java 7, 228 bytes

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;}

Usou uma saída vertical semelhante ao @JonathanAllan resposta Jelly 's .

Ungolfed & código de teste:

Experimente aqui.

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));
  }
}

Resultado:

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


+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
Kevin Cruijssen
fonte
desculpa, mas Given an odd integer N (5 <= N <= 51), generate a maze with side length N. Você parece ter um top diferente e comprimento do lado inferior para seu ...
Destrutível Lemon
@DestructibleWatermelon Eu li além disso. Meu código ainda cumpria todas as regras / requisitos. Ah, bem, voltei à minha resposta original, que usava a mesma largura que altura.
21716 Kevin Murrijssen
1

Python 2, 89 bytes

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

repl.it

Constrói uma parede interna x, como '+---- |'e um corredor interno y, como '| |'
Em seguida, cria uma lista de [x,y,x[::-1],y]( x[::-1]é o inverso de x)
Em seguida, repete esse ntempo de lista (como uma única lista), com *ne trunca-a para as primeiras nentradas, com (...)[:n], joins a lista com alimentações de linha, com '\n'.join(...)e imprime o resultado.

Jonathan Allan
fonte
1

Raquete 187 bytes

Usando o padrão de exibição de @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))

Ungolfed:

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

Teste:

(f 10)

Resultado:

+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+
rnso
fonte
1

GNU sed 140 bytes

Inclui +1 para -r

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

Experimente Online!

Recebe informações unárias ( consulte este consenso ).

Basicamente, ele insere o labirinto do tamanho 5 e, em seguida, acrescenta o segundo e o terceiro caracteres de cada linha ao início quantas vezes for necessário. Em seguida, duplica a 3ª linha (alternando |e ) quantas vezes for necessário.

A única coisa interessante que usei é a mopção na linha 6, que permite ^e $corresponde, respectivamente (além do comportamento normal), a sequência vazia após uma nova linha e a sequência vazia antes de uma nova linha.

Riley
fonte
1

T-SQL, 123/79 bytes

Golfe:

DECLARE @i INT=7

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

Ungolfed:

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

Se você trapaceia e faz apenas um labirinto estreito, o script pode ser jogado até 79 bytes:

Golfe:

DECLARE @i INT = 9

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

Ungolfed:

DECLARE @i INT = 9

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

Violino para a resposta longa

t-clausen.dk
fonte
0

JavaScript (ES6), 96 bytes

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

Eu esperava que a recursão acabasse sendo o caminho mais curto, e aparentemente é ...

ETHproductions
fonte