Gambarlah kurva meandering ASCII

19

Untuk keperluan pertanyaan ini, kurva berkelok-kelok adalah kurva yang mengikuti arah umum dari kiri ke kanan, tetapi berulang kali membuat n + 1 berbelok pada 90 derajat ke kiri dan kemudian n + 1 berbelok ke kanan (untuk n> 0).

Bahkan berliku-liku itu sendiri akan memiliki nsegmen.

Gilirannya dilambangkan dengan +.

Lebar berkelok-kelok (jarak antara dua +) adalah 3 di cakrawala ( ---) dan 1 di vertikal ( |)

Berikut adalah segmen tunggal kurva berkelok-kelok dengan ukuran n dari 1 hingga 5:

                                                           +-------------------+
                                                           |                   |
                                       +---------------+   |   +-----------+   |
                                       |               |   |   |           |   |
                       +-----------+   |   +-------+   |   |   |   +---+   |   |
                       |           |   |   |       |   |   |   |   |   |   |   |
           +-------+   |   +---+   |   |   +---+   |   |   |   +---+   |   |   |
           |       |   |   |   |   |   |       |   |   |   |           |   |   |
   +---+   +---+   |   +---+   |   |   +-------+   |   |   +-----------+   |   |
   |   | 1     |   | 2         |   | 3             |   | 4                 |   | 5
---+   +-------+   +-----------+   +---------------+   +-------------------+   +   

Tantangan:

Diberi dua angka positif ndan m, gambarkan msegmen kurva berkelok-kelok dengan ukuran n. Anda dapat menulis program atau fungsi lengkap.

Memasukkan:

n > 0 Ukuran kurva

m > 0 Jumlah segmen untuk menggambar

Keluaran:

Representasi ASCII dari kurva berkelok-kelok.

Contoh:

n = 3
m = 2
   +-----------+   +-----------+   
   |           |   |           |
   |   +---+   |   |   +---+   |
   |   |   |   |   |   |   |   |
   +---+   |   |   +---+   |   |
           |   |           |   |  
-----------+   +-----------+   +

n = 2
m = 5
   +-------+   +-------+   +-------+   +-------+   +-------+   
   |       |   |       |   |       |   |       |   |       |   
   +---+   |   +---+   |   +---+   |   +---+   |   +---+   |   
       |   |       |   |       |   |       |   |       |   |   
-------+   +-------+   +-------+   +-------+   +-------+   +

n = 4
m = 4
   +---------------+   +---------------+   +---------------+   +---------------+
   |               |   |               |   |               |   |               |
   |   +-------+   |   |   +-------+   |   |   +-------+   |   |   +-------+   |
   |   |       |   |   |   |       |   |   |   |       |   |   |   |       |   |
   |   +---+   |   |   |   +---+   |   |   |   +---+   |   |   |   +---+   |   |
   |       |   |   |   |       |   |   |   |       |   |   |   |       |   |   |
   +-------+   |   |   +-------+   |   |   +-------+   |   |   +-------+   |   |
               |   |               |   |               |   |               |   | 
---------------+   +---------------+   +---------------+   +---------------+   +

Kriteria menang:

Ini adalah , jadi kode terpendek dalam byte di setiap bahasa menang. Tolong jelaskan kode Anda, jika Anda punya waktu untuk melakukannya.

Galen Ivanov
sumber
1
Saran untuk tantangan di masa depan: plot angka pertama (angka dengan peningkatan berkelok-kelok), memungkinkan keluaran grafis
Luis Mendo
3
Bukankah ndibiarkan belok?
LiefdeWen
1
@LuisMendo Ya, ketika saya menyusun gambar 1-5, saya menyadari bahwa ada tantangan yang bagus di dalamnya - diberikan daftar L bilangan bulat positif, buat kurva berkelok-kelok dengan segmen ukuran L (i)
Galen Ivanov
@ LiefdeWen Tergantung pada di mana Anda mulai menghitung. Saya pikir itu n+1ketika melihat contoh-contoh, terutama antara segmen tunggal ..
Galen Ivanov

Jawaban:

6

Arang , 52 34 33 byte

Nθ↶FNF⊗⊕θ«+⊖⊗×⊕﹪κ²∨↔⁻θ∧κ⊖κ¹¿›κθ↷↶

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukkan ukuran berliku-liku.

Putar ke atas saat gambar dimulai di kanan dan bekerja ke kiri.

FN

Simpulkan jumlah meander yang diinginkan.

F⊗⊕θ«

Lingkari bagian yang berliku-liku.

+

Cetak a +.

∨↔⁻θ∧κ⊖κ¹

kn,n,n-1,n-2...3,2,1,1,1,2,3,...n

⊖⊗×⊕﹪κ²...

Bergantian antara menggandakan dan melipatgandakan panjang karena garis horizontal dua kali lebih panjang, tetapi kurangi hasilnya sebelum dicetak untuk memperhitungkan +yang baru saja dicetak.

¿›κθ↷↶

Putar tepat untuk segmen berikutnya.

Neil
sumber
4

APL (Dyalog Classic) , 108 101 95 byte

' -+|'[⊃,/⎕⍴⊂b/3 1⍴⍨≢⍉b←⌽⊖2@a1@(a←⊂0 0)⊖0,⊃{((4|-⊖⍉⍵),⍉¯2↑⍉⍵)⍪(2/⍪⍳2),¯2↑⍵}/⎕⍴⊂46 16 47⊤⍨34]

Cobalah online!

ngn
sumber
3

Python 3 , 371 354 346 328 298 290 byte

import sys
v=sys.argv
s=int(v[1])
n=range
r="   |"
t="   +---"
h="-"*4
e=" "*4
def C(l):print(l*int(v[2]))
for i in n(-(-s//2)):q=s-i+~i;R=r*i;C(R+t+h*q+"+"+R);C(R+r+e*q+R+r)
for i in n(s//2):q=s//2-i;R=r*~-q;w=2*i+s%2;C(R+t+h*~-w+"+"+r*(q+((i>0)|s%2)));C(R+e*-~w+R+2*r)
C(h*~-s+"---+   +")

-20B Terima kasih untuk ceilingcat

Cobalah online!

Pra-golf:


import sys

import math

def draw_curve(curve_size, curve_count, out=sys.stdout):
    for i in range(math.ceil(curve_size / 2)):
        for j in range(curve_count):
            out.write("   |" * i)
            out.write("   +---")
            out.write("----" * (curve_size - 2 * i - 1))
            out.write("+")
            out.write("   |" * i)

        out.write("\n")

        for j in range(curve_count):
            out.write("   |" * (i + 1))
            out.write("    " * (curve_size - 2 * i - 1))
            out.write("   |" * (i + 1))

        out.write("\n")

    for i in range(curve_size // 2):
        for j in range(curve_count):
            out.write("   |" * (curve_size // 2 - i - 1))
            out.write("   +---")
            out.write("----" * (2 * i - (0 if curve_size % 2 else 1)))
            out.write("+")
            out.write("   |" * (curve_size // 2 - i + (1 if i or curve_size % 2 else 0)))

        out.write("\n")

        for j in range(curve_count):
            out.write("   |" * (curve_size // 2 - i - 1))
            out.write("    " * (2 * i + (2 if curve_size % 2 else 1)))
            out.write("   |" * (curve_size // 2 - i + 1))

        out.write("\n")

    for j in range(curve_count):
        out.write("----" * (curve_size - 1))
        out.write("---+   +")

if __name__ == "__main__":
    draw_curve(int(sys.argv[1]), int(sys.argv[2]))
Sasha
sumber
2

C (gcc) , 559 540 523 511 494 484 476 468 456 447 443 byte

#define S memset
l,o,p,q,r;g(c,d,n)char*d;{q=~c;for(p=n*2;q%2*p;bcopy(n*2-p--?"|   |":"+---+",d-q*l*p,5));p=n-1;c--%2?S(S(d-~l-r*!q,45,r++)-2*l,45,r=n*4-1),d[r*=q-1]='|',d[r-l]=d[r+l]=43,p&&g(c%4,memcpy(q?d+p*4+l:d-l-n*4,q?"+   |":"|   +",5),p):p&&g(c%4,d,p,d[-q]=45,d[q*=l]=43,*(d-=q*(n*2*l-l-2)-2)=32);}f(n,m){char b[(o=n-~n)*(l=n*4+5)];g(0,strcpy(S(S(b,32,l*o),45,l)+l-6,"+   +"),n);for(o*=m;b[o/m*l-1]=0,o--;o%m||puts(""))printf(b+o/m*l);}

Cobalah online!

Sedikit kurang golf

#define S memset
l,o,p,q,r;
g(c,d,n)char*d;{
 q=~c;
 for(p=n*2;q%2*p;bcopy(n*2-p--?"|   |":"+---+",d-q*l*p,5));
 p=n-1;
 c--%2?
  S(S(d-~l-r*!q,45,r++)-2*l,45,r=n*4-1),
  d[r*=q-1]='|',
  d[r-l]=d[r+l]=43,
  p&&
   g(c%4,memcpy(q?d+p*4+l:d-l-n*4,q?"+   |":"|   +",5),p)
 :
  p&&
   g(c%4,d,p,d[-q]=45,d[q*=l]=43,*(d-=q*(n*2*l-l-2)-2)=32);
}
f(n,m){
 char b[(o=n-~n)*(l=n*4+5)];
 g(0,strcpy(S(S(b,32,l*o),45,l)+l-6,"+   +"),n);
 for(o*=m;b[o/m*l-1]=0,o--;o%m||puts(""))
  printf(b+o/m*l);
}
plafon
sumber
1

Dash - skrip POSIX Shell, 528 byte

Cobalah online!

golf:

Y=0;p(){ eval A${1}_${2}='$3';};for Z in `seq $2`;do case $1 in 1)L='r3 u1 r3 d1';;2)L='r7 u1 l3 u1 r7 d3';;3)L='r11 u3 l3 d1 l3 u3 r11 d5';;4)L='r15 u5 l7 d1 r3 d1 l7 u5 r15 d7';;5)L='r19 u7 l11 d3 r3 u1 r3 d3 l11 u7 r19 d9'
esac;for A in $L;do d(){ C=-;case "$1" in r*)X=$((X+1));;l*)X=$((X-1));;u*)Y=$((Y+1));C=\|;;d*)Y=$((Y-1));C=\|;;esac;p $X $Y $2 $C;};for I in `seq ${A#*[a-z]}`;do d $A;done;d $A +;done;done;for Y in `seq 20 -1 0`;do for X in `seq 0 99`;do eval F="\"\$A${X}_${Y}\"";L=${L}${F:- };done;echo "$L";L=;done

ungolfed:

#!/bin/sh

# helper function for emulating an array, the language does not know it
p(){ eval A${1}_${2}='$3';}
Y=0

for Z in `seq $2`;do

 # define the possible patterns:
 # list="direction+count direction+count ..."
 case $1 in
  1)L='r3 u1 r3 d1';;
  2)L='r7 u1 l3 u1 r7 d3';;
  3)L='r11 u3 l3 d1 l3 u3 r11 d5';;
  4)L='r15 u5 l7 d1 r3 d1 l7 u5 r15 d7';;
  5)L='r19 u7 l11 d3 r3 u1 r3 d3 l11 u7 r19 d9'
 esac

 for A in $L;do
  # helper function for going into needed direction
  # and plot char into array
  d(){
   C=-
   case "$1" in
    r*)X=$((X+1));;
    l*)X=$((X-1));;
    u*)Y=$((Y+1));C=\|;;
    d*)Y=$((Y-1));C=\|;;
   esac
   p $X $Y $2 $C
  }

  # write char as long as needed into array,
  # append in the same direction as last element the '+'
  for I in `seq ${A#*[a-z]}`;do
   d $A
  done
   d $A +
  done
 done

# echo the array linewise
for Y in `seq 20 -1 0`;do
 for X in `seq 0 99`;do
  eval F="\"\$A${X}_${Y}\"";L=${L}${F:- }
 done
 echo "$L";L=
done
Bastian Bittorf
sumber
1

Python 2 , 261 byte

n,m=input()
i=0;h,v,p,s=map(tuple,'hv+ ');k=p;R=[h+s]
exec"h,v=v,h;R=zip(*R)[::-1];R=[s+R[0][:-1]+k+h+p]+[s+r+s+v for r in R[1:]]+[h*2*i+h+p+s+p];i+=1;k=v;"*n
for r in[[(3-i%2*2)*{h[0]:'-',v[0]:'|'}.get(c,c)for i,c in enumerate(l)]*m for l in R]:print''.join(r)

Cobalah online!

5 byte dari tip ini oleh Esolanging Fruit .

Chas Brown
sumber