Cầu là phép ẩn dụ cho mọi thứ trong Nghệ thuật ASCII


15

(với lời xin lỗi tới Jim West cho tiêu đề và được lấy cảm hứng ngẫu nhiên từ cách thể hiện bằng văn bản logo của Cisco: .:|:.:|:. cho khái niệm này)

Cho một số nguyên đầu vào 1 <= n <= 255, xuất ra biểu diễn nghệ thuật ASCII của cầu treo khoảng cách ntheo các quy tắc xây dựng dưới đây:

  • Điểm bắt đầu và kết thúc của cây cầu (không được tính ntừ xa) luôn luôn -||-do đó, cây cầu có thể kết nối một cách thích hợp với các đường cao tốc bên cạnh nó.
  • Cây cầu không kéo dài xuống dưới (cấp đường, bao gồm -hàng, là hàng dưới cùng).
  • Có thể có nhiều nhất hai đoạn đường --liên tiếp, bất kỳ nhịp dài nào cũng cần cáp treo để hỗ trợ.
  • Các dây cáp treo \kéo dài từ đường lên đến các tháp |theo đường thẳng.
  • Các tháp |phải đủ cao để hỗ trợ các cáp treo liền kề, nhưng không cao hơn.
  • Cây cầu phải được cân bằng từ trái sang phải về điểm giữa, ưu tiên các phần trung tâm bất cứ khi nào có thể.
  • Tất cả những điều trên sẽ dẫn đến việc giảm thiểu các loại cáp, nhưng để rõ ràng, số lượng cáp treo phải được giảm thiểu trong khi vẫn tuân theo các quy tắc trên.

Để cung cấp một đại diện trực quan, đây là các đầu ra dự kiến ​​cho n = 1, 2, 3, ... 15-

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

5
 |\   /|
-|-\-/-|-

6
 |\    /|
-|-\--/-|-

7
 |\     /|
 | \   / |
-|--\-/--|-

8
 |\      /|
 | \    / |
-|--\--/--|-

9
 |\       /|
 | \     / |
 |  \   /  |
-|\--\-/--/|-

10
 |\        /|
 | \      / |
 |  \    /  |
-|\--\--/--/|-

11
 |\         /|
 | \       / |
 |  \     /  |
 |\  \   /  /|
-|-\--\-/--/-|-

12
 |\          /|
 | \        / |
 |  \      /  |
 |\  \    /  /|
-|-\--\--/--/-|-

13
 |\           /|
 | \         / |
 |  \       /  |
 |\  \     /  /|
 | \  \   /  / |
-|--\--\-/--/--|-

14
 |\            /|
 | \          / |
 |  \        /  |
 |\  \      /  /|
 | \  \    /  / |
-|--\--\--/--/--|-

15
 |\             /|
 | \           / |
 |  \         /  |
 |\  \       /  /|
 | \  \     /  / |
 |  \  \   /  /  |
-|\--\--\-/--/--/|-

Đầu vào

Một số nguyên dương duy nhất trong bất kỳ định dạng thuận tiện , n > 9.

Đầu ra

Cây cầu nghệ thuật ASCII theo kỹ thuật xây dựng ở trên.

Quy tắc

  • Các dòng mới hoặc dấu cách hàng đầu hoặc dấu trắng đều là tùy chọn, miễn là các ký tự cầu nối chính xác.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để mọi người có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.


@carusocomputing Hah, đừng bỏ cuộc! : D
admBorkBork

Tôi đã không bỏ cuộc, chỉ phải đi nơi khác và không muốn đánh mất sự tiến bộ của mình;).
Bạch tuộc ma thuật Urn

5
@carusocomputing Aha. Vì vậy, giống như #RageTemporantlyWalkAway.
admBorkBork

Câu trả lời:


3

05AB1E , 79 59 58 byte

"\  "×¹<;£R.sð«¹3‹ið}.BvyD¹Éi¨}R„\/„/\‡«'|.øð.ø}ð'-‡¹2›i»}

Hãy thử trực tuyến! .

Giải trình:

"\  "×                                                     # Push n copies of "\  ".
      ¹<;£                                                 # Push a[0:(n-1)/2] 
          R.s                                              # Reverse, get substrings.
             ð«                                            # Append a space.
               ¹3‹ið}                                      # If n < 3, push a space.
                     .B                                    # Boxify.
                       vy                      }           # For each...
                         D¹Éi¨}R                           # Dupe, if n is odd, a[0:-1].
                                „\/„/\‡                    # Reverse the slashes.
                                       «'|.øð.ø            # Surround with | and a space.
                                                ð'-‡       # Replace spaces with "-".
                                                    ¹2›i } # If it's more than 2...
                                                        »  # Join stack by newlines.

Tìm thấy giải pháp tốt hơn, chìa khóa là trả về các mảng sau cho mỗi số như sau:

1=[" "]
2=["  "]
3=["\"]
4=["\ "]
5=["\"," \"]
6=["\"," \ "]
7=["\"," \","  \"]
8=["\"," \","  \ "]
Etc...

4

Python 2, 173 byte

i=input()
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
b=(i*'/--')[:~-i/2]
for x in range(1,~-i/2):print f((len(b)-x)*'-'+b[:x]).replace('-',' ')
print f(b)

Phản chiếu giá trị của b và thêm
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
mẫu cơ sở "-" (nửa bên phải của dòng dưới cùng)
b=(i*'/--')[:~-i/2]
Vòng lặp cho các lớp không có đáy
for x in range(1,~-i/2):
Lấy các ký tự x đầu tiên của mẫu cơ sở và hoàn thành bằng "-"
(len(b)-x)*'-'+b[:x]
Thay thế tất cả - bằng khoảng trắng để in Tất cả các lớp (trừ đáy)
print f().replace('-',' ')
In lớp dưới cùng
print f(b)


5
Bạn nên bao gồm phiên bản thô (không có bất kỳ bình luận nào) trong bài đăng của mình
FlipTack

4

Befunge, 150 byte

45&3+:00p4+2/:10p`-v
*\00g1-\`*2*+\1-!+v>1+:20p55+00g>::::00g1--!\:20g+00g-:0`\3%!
`1\*!%3\`0:-\g02:\<^_@#-g01<:,$_^#`\0:-1,g3+**4!-g01g02!:+*3*
 |\/-

Hãy thử trực tuyến!

Tôi cũng đã cung cấp một phiên bản mã chưa được mã hóa để thể hiện rõ hơn kiến ​​trúc được sử dụng trong việc xây dựng cây cầu.

        >4                                         5v
        v+3                                       <&<
        >:00                                     p4+v
        v-`p0                                   1:/2<
*+\1-!+v>1+:20p55+00g>::::00g1--!\:20g+00g-:0`\3%!*\00g1-\`*2
-\g02:\<^_@#-g01<:,$_^#`\0:-1,g6+7+**4!-g01g02!:>#+<v*!%3\`0:
        |\/->3#*                             *#`^#1\<

Hãy thử trực tuyến!

Các tháp xử lý khởi tạo và tham số khởi tạo. Bộ bài được tạo thành hai vòng tính toán các phần của cây cầu cần được xuất ra cho mỗi tọa độ x, y. Và nền tảng giữ bảng ký tự cho các phần cầu đó, cũng như một số mã hoàn toàn không liên quan khác.

Giải thích chi tiết

Chúng tôi bắt đầu bằng cách tính chiều rộng và chiều cao của khu vực đầu ra sẽ cần phải lặp đi lặp lại để kết xuất cây cầu.

w  = n + 3                (stored at 0,0)
h  = (w + 4)/2            (stored at 1,0)

Lưu ý rằng phạm vi y không dựa trên zero. Giá trị ban đầu là 5 - (h<5)và được lặp lại đến h (giá trị hiện tại được lưu trữ ở mức 2,0). Các x giá trị được lặp từ w xuống 0 và được lưu trữ trên stack.

Vòng lặp bên trong chỉ là một chuỗi các điều kiện boolean xác định xem tọa độ x , y cụ thể có khớp với bất kỳ vị trí nào yêu cầu ký tự không phải không gian không. Các tính toán này dựa trên hai độ lệch trượt theo đường dẫn của cáp treo.

loff = y + x - w
roff = y - x 

Các điều kiện khác nhau sau đó được xác định như sau:

left_tower       = (x == w-1)
left_suspension  = (loff > 0) and (loff%3 == 0) and (x < w-1)
right_tower      = (x == 1)
right_suspension = (roff > 0) and (roff%3 == 0) and (x > 1)
bridge_deck      = (y == h)

Để dịch các điều kiện này thành phần bù ký tự chính xác, chúng ta chỉ cần nhân mỗi số đó với một phần bù thích hợp và tính tổng kết quả. Tính toán này được thực hiện khi các điều kiện được đánh giá. Vì vậy, nó trông giống như thế này:

char_offset =  left_tower
char_offset += left_suspension * 2
char_offset += right_tower
char_offset += right_suspension * 3
char_offset += !char_offset * bridge_deck * 4

Lưu ý rằng giá trị Bridge_deck được hợp nhất dựa trên việc có bất kỳ điều kiện nào khác được đáp ứng hay không, vì ký tự treo hoặc ký tự tháp sẽ được ưu tiên trên boong.

Kết quả cuối cùng là một phần bù vào bảng ký tự trên dòng cuối cùng của sân chơi. Chúng ta chỉ cần xuất ký tự đó và lặp lại vòng lặp.


Quan tâm để cung cấp một lời giải thích? với tất cả những gì được và đặt, thật khó để theo dõi
MildlyMilquetoast

Bạn là người duy nhất đăng bài sau khi tôi thêm tiền thưởng, nếu không có ai đánh bại bạn, tôi sẽ thưởng cho bạn 100.
Bạch tuộc ma thuật Urn

@carusocomputing Tôi biết bạn đã hy vọng tốt hơn thế này, nhưng vẫn còn nhiều thời gian và nó sẽ được chú ý nhiều hơn một khi nó ở gần đầu danh sách nổi bật.
James Holdiness

Đây là một câu trả lời tuyệt vời, bản thân nó đã có nhiều phiếu hơn so với của tôi; tốt hơn chắc chắn không phải là từ đúng.
Bạch tuộc ma thuật Urn

3

Batch, 241 byte

@echo off
set t=set s=
%t%
for /l %%i in (1,1,%1)do call %t% %%s%%
%t% !%s%! 
for /l %%i in (5,2,%1)do call:l 0
:l
%t%%s:\ = \%
%t%%s: /=/ %
%t%%s:!   =!\  %
%t%%s:   !=  /!%
%t%%s:\  !=\ /!%
if %1 gtr 0 %t%%s: =-%
echo %s:!=^|%

Lưu ý: Trailing space trên dòng 5. Bắt đầu bằng cách xây dựng một hàng khoảng trắng, sau đó thêm cáp khi cần thiết, lặp lại để xây dựng các tháp theo chiều cao mong muốn, kết thúc bằng cách thay thế bất kỳ khoảng trống nào còn lại bằng đường.


3

WinDbg, 312 byte

r$t4=@$t0+4;.block{j3>@$t0'r$t5=1';r$t5=(@$t0-1)/2};f8<<16 L@$t4*@$t5 2d;f8<<16 L@$t4*(@$t5-1) 20;.for(r$t1=0;@$t1<@$t5;r$t1=@$t1+1){eb2000001+@$t4*@$t1 7c;e1fffffe+@$t4*(1+@$t1) 7c;j2<@$t0'.for(r$t2=@$t1;@$t2>=0;r$t2=@$t2-3){e2000002+@$t4*@$t1+@$t2 5c;e1fffffd+@$t4*(1+@$t1)-@$t2 2f}'};da/c@$t4 8<<16 L@$t4*@$t5

Đầu vào được thực hiện bằng cách thiết lập thanh ghi giả $t0.

Tôi cảm thấy nên có một cách để kết hợp hai forvòng thành một ... có thể một số cơ hội chơi gôn khác nữa ...

Cái này hoạt động bằng cách lấp đầy toàn bộ khu vực bằng đường, sau đó thay thế tất cả trừ hàng cuối cùng bằng không gian, và cuối cùng là xây dựng các cột và dây cáp.

r$t4 = @$t0+4;                                * Set width to input+4
.block                                        * Code block, needed for some reason...
{                                             * and .block+j is shorter than .if/.else
    j 3>@$t0                                  * If input is less than 3...
    '
        r$t5 = 1                              * ...set height to 1
    ';                                        * Implicit else...
        r$t5 = (@$t0-1)/2                     * ...set height to (input-1)/2
};
f 8<<16 L@$t4*@$t5 2d;                        * Fill area with -
f 8<<16 L@$t4*(@$t5-1) 20;                    * Fill all but last row with space
.for(r$t1=0; @$t1<@$t5; r$t1=@$t1+1)          * For each row
{
    eb 2000001+@$t4*@$t1 7c;                  * Build the left column with |
    e 1fffffe+@$t4*(1+@$t1) 7c;               * Build the right column (e is the same as last e* call, ie- eb)
    j 2<@$t0                                  * If input is more than 2...
    '
        .for(r$t2=@$t1; @$t2>=0; r$t2=@$t2-3) * ...Enumerate from counter back to 0
        {
            e 2000002+@$t4*@$t1+@$t2 5c;      * Build left cables with \
            e 1fffffd+@$t4*(1+@$t1)-@$t2 2f   * Build right cables with /
        }
    '
};
da /c@$t4 8<<16 L@$t4*@$t5                    * Print the string in lines of length width

Sản lượng mẫu 1-15:

0:000> .for(r$t0=1;@$t0<10;r$t0=@$t0+1){.printf"%d\n",@$t0;r$t4=@$t0+4;.block{j3>@$t0'r$t5=1';r$t5=(@$t0-1)/2};f8<<16 L@$t4*@$t5 2d;f8<<16 L@$t4*(@$t5-1) 20;.for(r$t1=0;@$t1<@$t5;r$t1=@$t1+1){eb2000001+@$t4*@$t1 7c;e1fffffe+@$t4*(1+@$t1) 7c;j2<@$t0'.for(r$t2=@$t1;@$t2>=0;r$t2=@$t2-3){e2000002+@$t4*@$t1+@$t2 5c;e1fffffd+@$t4*(1+@$t1)-@$t2 2f}'};da/c@$t4 8<<16 L@$t4*@$t5}
1
Filled 0x5 bytes
Filled 0x0 bytes
02000000  "-|-|-"
2
Filled 0x6 bytes
Filled 0x0 bytes
02000000  "-|--|-"
3
Filled 0x7 bytes
Filled 0x0 bytes
02000000  "-|\-/|-"
4
Filled 0x8 bytes
Filled 0x0 bytes
02000000  "-|\--/|-"
5
Filled 0x12 bytes
Filled 0x9 bytes
02000000  " |\   /| "
02000009  "-|-\-/-|-"
6
Filled 0x14 bytes
Filled 0xa bytes
02000000  " |\    /| "
0200000a  "-|-\--/-|-"
7
Filled 0x21 bytes
Filled 0x16 bytes
02000000  " |\     /| "
0200000b  " | \   / | "
02000016  "-|--\-/--|-"
8
Filled 0x24 bytes
Filled 0x18 bytes
02000000  " |\      /| "
0200000c  " | \    / | "
02000018  "-|--\--/--|-"
9
Filled 0x34 bytes
Filled 0x27 bytes
02000000  " |\       /| "
0200000d  " | \     / | "
0200001a  " |  \   /  | "
02000027  "-|\--\-/--/|-"
10
Filled 0x38 bytes
Filled 0x2a bytes
02000000  " |\        /| "
0200000e  " | \      / | "
0200001c  " |  \    /  | "
0200002a  "-|\--\--/--/|-"
11
Filled 0x4b bytes
Filled 0x3c bytes
02000000  " |\         /| "
0200000f  " | \       / | "
0200001e  " |  \     /  | "
0200002d  " |\  \   /  /| "
0200003c  "-|-\--\-/--/-|-"
12
Filled 0x50 bytes
Filled 0x40 bytes
02000000  " |\          /| "
02000010  " | \        / | "
02000020  " |  \      /  | "
02000030  " |\  \    /  /| "
02000040  "-|-\--\--/--/-|-"
13
Filled 0x66 bytes
Filled 0x55 bytes
02000000  " |\           /| "
02000011  " | \         / | "
02000022  " |  \       /  | "
02000033  " |\  \     /  /| "
02000044  " | \  \   /  / | "
02000055  "-|--\--\-/--/--|-"
14
Filled 0x6c bytes
Filled 0x5a bytes
02000000  " |\            /| "
02000012  " | \          / | "
02000024  " |  \        /  | "
02000036  " |\  \      /  /| "
02000048  " | \  \    /  / | "
0200005a  "-|--\--\--/--/--|-"
15
Filled 0x85 bytes
Filled 0x72 bytes
02000000  " |\             /| "
02000013  " | \           / | "
02000026  " |  \         /  | "
02000039  " |\  \       /  /| "
0200004c  " | \  \     /  / | "
0200005f  " |  \  \   /  /  | "
02000072  "-|\--\--\-/--/--/|-"

2

Java 8, 423 , 412 byte

11 byte được lưu nhờ Kritixi Lithos

đánh gôn

void f(int n){int i,j,k,t=n/2+n%2,u=t-2,q;char v=45;char[][]a=new char[t-1][n+4];for(char[]c:a)Arrays.fill(c,' ');a[u][0]=v;a[u][n+3]=v;for(q=0;q<t-1;q++){a[q][1]='|';a[q][n+2]='|';}for(i=t+1;i>1;i--){if((t-i)%3==0){k=u;for(j=i;j>1;j--)a[k--][j]='\\';}else a[u][i]=v;}for(i=n/2+2;i<n+2;i++){if((i-n/2-3)%3==0){k=u;for(j=i;j<n+2;j++)a[k--][j]='/';}else a[u][i]=v;}for(char[]w:a)System.out.println(new String(w));}

vô dụng:

void f(int n){
    int i,j,k,t=n/2+n%2,u=t-2;
    char v=45;
    char[][] a=new char[t-1][n+4];
    for (char[]c : a) Arrays.fill(c,' ');
    a[u][0]=v;
    a[u][n+3]=v;

    // left and right columns
    for (int q=0;q<t-1;q++){
        a[q][1]='|';
        a[q][n+2]='|';
    }
    // left part of base
    for (i=t+1;i>1;i--){
        if ((t-i)%3==0){
            k=u;
            for (j=i;j>1;j--)
                a[k--][j]='\\';
        }
        else a[u][i]=v;
    }
    // right part of base
    for (i=n/2+2;i<n+2;i++){
        if ((i-n/2-3)%3==0){
            k=u;
            for (j=i;j<n+2;j++)
                a[k--][j]='/';
        }
        else a[u][i]=v;
    }
    for (char[]w : a) System.out.println(new String(w));
}

Bạn có thể đánh golf câu trả lời này theo nhiều cách, trước tiên, bạn có thể có tất cả các tuyên bố int của mình trong một tuyên bố, một cái gì đó giống int i,j,k,t=n/2+n%2,u=t-2,q=0và thay vì char v="-";bạn có thể sử dụng char v=45;và bạn có thể thay đổi abc%xyz==0s thành abc%xyz<1(chưa kiểm tra nó)
Kritixi Lithos

@KritixiLithos thx! đã chỉnh sửa 2 cái đầu tiên, cái cuối cùng không hoạt động
Bobas_Pett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.