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.


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)


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>


@ 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.


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


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


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


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:

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


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

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.


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:

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

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.


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


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 é ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.