Hasilkan labirin satu jalur

12

Dengan bilangan bulat ganjil N (5 <= N <= 51), buat sebuah labirin dengan panjang sisi N yang mengikuti persyaratan berikut:

Labirin harus terdiri dari karakter | -dan +. Itu harus menggunakan |karakter sebagai dinding vertikal, -karakter sebagai dinding horizontal, dan jika dinding itu berubah, karakter +harus digunakan.

Lebar jalan harus satu karakter.

Labirin harus berputar setidaknya empat kali.

Labirin harus memiliki dinding luar, yang pecah pada dua titik: awal dan akhir.

Labirin harus terdiri dari satu jalur tanpa putus, dari awal hingga akhir.

Misalnya, berikut ini adalah labirin yang valid: ( N = 5)

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

Dan untuk N = 7:

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

Ingat, ini adalah , jadi kode dengan jumlah byte paling sedikit menang.

Oliver Ni
sumber
9
Ini bukan labirin, itu labirin english.stackexchange.com/a/144103/199361
edc65
@ edc65 Sebenarnya, ini nighter.
Oliver Ni
Saya tidak jelas tentang "Labirin harus terdiri dari satu jalur tanpa putus, dari awal hingga akhir." Apakah ini berarti bahwa hanya ada satu jalur dan itu dari awal hingga akhir, atau bahwa jumlah jalur dari awal hingga akhir adalah 1? Mungkinkah ada jalan lain dengan jalan buntu? Loop terpisah?
xnor
Bilangan bulat ganjil harus <50, <= 49
pinkfloydx33
2
@ edc65 Saya menganggap OP tidak berarti keduanya.
orlp

Jawaban:

10

Jelly , 36 35 34 33 32 byte

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

TryItOnline!

Buat nighter ™ sebaliknya dengan contoh-contoh seperti:

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

Bagaimana?

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

(masing-masing byte diselamatkan terlibat perubahan cukup non-sepele, melihat sejarah mengedit jika Anda tertarik, meskipun saya hanya melihat bahwa Link 1 adalah jumlah byte sama dengan berulang lebih konvensional dan bergabung: _2⁶ẋ“ ||“|”j)

Jonathan Allan
sumber
5

JavaScript (ES6), 86 92 116

Hampir tantangan kolmogorv-kompleksitas ... Dengan sedikit pemikiran lateral (terinspirasi oleh jawaban @ Neil), ini bisa menjadi sangat singkat. Putar saja 90 °

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

Uji

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
sumber
@Neil wow setiap hari saya belajar sesuatu yang baru. Terima kasih
edc65
Luar biasa! Saya menghitung 86 byte , btw
ETHproduksi
@ ETHproduk benar. Terima kasih
edc65
4

Batch, 216 byte

@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 canggung di Batch jadi saya tercermin memutar contoh sebagai gantinya.

Neil
sumber
Apakah maksud Anda memutar 90 °? Saya mencobanya dan menyimpan banyak di JS. Terima kasih lagi
edc65
@ edc65 Saya awalnya pergi untuk refleksi, tetapi Anda benar bahwa saya berakhir dengan rotasi sebagai gantinya.
Neil
3

PHP, 99 Bytes

gerbang naik ke bawah

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

PHP, 157 Bytes

gerbang kanan kiri

<?=($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 Terima kasih telah mengecilkan byte

Jörg Hülsermann
sumber
1
hemat 3 byte dengan menetapkan `$ n =" \ n "
Titus
1
$p("",$c*($c-4),...)bukannya str_repeat(...,$c-4)(-2)
Titus
1
... dan 3 byte lagi dengan $p($n,$c-1," | ")bukannya$p("\n ",$c-1," | ")
Titus
1
parens yang tidak perlu di ($c)%4(-2), hapus $gdari kode (-1)
Titus
1
versi up-to-down; parameter ke-3 yang tidak perlu untuk str_pad (-4), $c=$argv[1]-1bukannya ($c=$argv[1])-1, <=$cbukannya <$cdan $cbukannya $c-1(-3)
Titus
3

JavaScript (ES6), 87 byte

Fungsi rekursif. Menghasilkan beberapa spasi tambahan.

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

Uji

Arnauld
sumber
Oh wow, saya baru saja mencoba rekursi dan berakhir 9 byte lebih lama. Bagus sekali :-)
ETHproduksi
2

Ruby 72 atau 69 byte

Fungsi lambda. Seperti yang ditunjukkan, mengembalikan string yang dipisahkan baris baru. Hapus * $ / untuk mengembalikan array string.

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

Menggambar labirin yang diputar 90 derajat dari contoh. Untuk setiap baris, string format dipilih (misalnya +%s |untuk baris 1 (tidak ada garis nol) dan %sdiganti dengan jumlah yang sesuai -atau spasi menggunakan %operator (setara dengan sprintf, tetapi lebih pendek.)

Level River St
sumber
2

Java 7, 228 byte

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

Menggunakan keluaran vertikal yang serupa dengan jawaban Jelly @ JonathanAllan .

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

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


+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
|                       |
| ----------------------+
|                       |
+---------------------- |
Kevin Cruijssen
sumber
alasan, tapi Given an odd integer N (5 <= N <= 51), generate a maze with side length N. Anda tampaknya memiliki panjang sisi atas dan bawah yang berbeda untuk Anda ...
Destructible Lemon
@DestructibleWatermelon Saya membaca masa lalu itu. Kode saya masih memenuhi semua aturan / persyaratan. Ah well, saya sudah memutar-balik ke jawaban asli saya yang menggunakan lebar yang sama dengan tinggi.
Kevin Cruijssen
1

Python 2, 89 byte

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

repl.it

Membangun dinding internal x,, seperti '+---- |'dan koridor internal y,, seperti '| |'
Lalu membangun daftar [x,y,x[::-1],y]( x[::-1]adalah kebalikan dari x)
Kemudian mengulangi daftar itu nkali (sebagai daftar tunggal), dengan *n, dan memotongnya ke nentri pertama , dengan (...)[:n], bergabung daftar dengan umpan baris, dengan '\n'.join(...), dan mencetak hasilnya.

Jonathan Allan
sumber
1

Racket 187 byte

Menggunakan pola tampilan oleh @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))

Tidak Disatukan:

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

Pengujian:

(f 10)

Keluaran:

+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+
|     |
+---- |
|     |
| ----+
juga
sumber
1

GNU sed 140 byte

Termasuk +1 untuk -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

Cobalah secara Online!

Mengambil input di unary ( lihat konsensus ini ).

Pada dasarnya ia menyisipkan labirin ukuran 5, lalu menambahkan karakter ke-2 dan ke-3 setiap baris ke awal sebanyak yang diperlukan. Kemudian duplikat baris ke-3 (bergantian |dan ) sebanyak yang diperlukan.

Satu-satunya hal yang menarik yang saya gunakan adalah mopsi pada baris 6 yang memungkinkan ^dan $untuk mencocokkan masing-masing (selain perilaku normal) string kosong setelah baris baru, dan string kosong sebelum baris baru.

Riley
sumber
1

T-SQL, 123/79 byte

Golf:

DECLARE @i INT=7

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

Tidak Disatukan:

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

Jika Anda curang dan hanya membuat labirin sempit, skrip dapat di-golf hingga 79 byte:

Golf:

DECLARE @i INT = 9

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

Tidak Disatukan:

DECLARE @i INT = 9

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

Biola untuk jawaban panjang

t-clausen.dk
sumber
0

JavaScript (ES6), 96 byte

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

Saya berharap rekursi akan menjadi rute terpendek, dan ternyata itu adalah ...

Produksi ETH
sumber