교량은 ASCII Art의 모든 것에 대한 은유입니다.


15

( 제목에 대한 Jim West의 사과 와 시스코의 로고에 대한 텍스트 표현에서 무작위로 영감을 얻었습니다 .:|:.:|:. . 개념에 대해)

입력 integer가 주어지면 아래의 건설 규칙에 따라 1 <= n <= 255거리의 현수교에 대한 ASCII 아트 표현을 출력하십시오 n.

  • 교량의 시작과 끝 ( n거리에 포함되지 않음 )은 항상 -||-이므로 교량은 옆의 고속도로에 적절히 연결할 수 있습니다.
  • 다리는 아래쪽으로 확장되지 않습니다 ( -열로 구성된 도로 레벨 이 맨 아래 열).
  • 최대 2 개의 도로 부분 --이 연속 될 수 있으며 , 더 이상 경간에는지지 용 서스펜션 케이블이 필요합니다.
  • 서스펜션 케이블 \은 도로에서 타워 |까지 직선으로 뻗어 있습니다.
  • 타워 |는 인접한 서스펜션 케이블을 지탱할 수있을만큼 키가 크지 않아야합니다.
  • 교량은 중간 지점에 대해 왼쪽에서 오른쪽으로 균형을 이루어야하며 가능할 때마다 중앙 섹션을 선호해야합니다.
  • 위의 모든 사항은 케이블을 최소화해야하지만, 분명히하기 위해, 위의 규칙을 준수하면서 서스펜션 케이블 수를 최소화해야합니다.

시각적 표현을 제공하기 위해, 여기에서의 예상 출력은 n = 1, 2, 3, ... 15-

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

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

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

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

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

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

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

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

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

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

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

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

입력

하나의 양의 정수 편리한 형식으로 ,n > 9 .

산출

위의 건축 기술을 따르는 ASCII 예술 다리.

규칙

  • 브리지 문자 자체가 올바르게 정렬되는 한 줄 바꿈 또는 공백은 모두 선택 사항입니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 사람들이 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.


@carusocomputing Hah, 포기하지 마십시오! : D
AdmBorkBork

나는 포기하지 않고 단지 다른 곳으로 가야했고 내 진보를 잃고 싶지 않았습니다.).
Magic Octopus Urn

5
@carusocomputing Aha. 따라서 #RageTemporarilyWalkAway와 비슷합니다.
AdmBorkBork

답변:


3

05AB1E , 79 59 58 바이트

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

온라인으로 사용해보십시오!.

설명:

"\  "×                                                     # 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.

더 나은 해결책을 찾았 으면 열쇠는 다음과 같이 각 숫자에 대해 다음 배열을 반환하는 것이 었습니다.

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

4

파이썬 2, 173 바이트

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)

b의 값을 반영하고 중앙 "-"
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
기본 패턴 추가 (하단의 오른쪽 절반) 하단
b=(i*'/--')[:~-i/2]
이 아닌 레이어의 루프
for x in range(1,~-i/2):
기본 패턴의 첫 x 문자를 가져오고 "-"로 완성
(len(b)-x)*'-'+b[:x]
합니다. 모두 인쇄 할 공백으로 바꿉니다. 모든 레이어 (하단 제외)
print f().replace('-',' ')
하단 레이어 인쇄
print f(b)


5
게시물에 원시 버전 (댓글없이)을 포함시켜야합니다.
FlipTack

4

Befunge, 150 바이트

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*
 |\/-

온라인으로 사용해보십시오!

또한 다리 건설에 ​​사용되는 아키텍처를 더 잘 보여주는 코드의 압축되지 않은 버전을 제공했습니다.

        >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\<

온라인으로 사용해보십시오!

타워는 입력 및 파라미터 초기화를 처리합니다. 데크는 각 x, y 좌표에 대해 출력해야하는 브리지 부분을 계산하는 두 개의 루프로 구성됩니다. 그리고 재단은 다리 부분에 대한 문자표와 완전히 관련이없는 다른 코드를 보유하고 있습니다.

상해

브리지를 렌더링하기 위해 반복해야하는 출력 영역의 너비와 높이를 계산하는 것으로 시작합니다.

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

점을 유의 Y 범위를, 제로 아니다. 초기 값은 h5 - (h<5) 까지 반복 되며 현재 값은 2.0에 저장됩니다. X의 값으로부터 반복된다 w 0까지 스택에 저장된다.

내부 루프는 특정 x , y 좌표가 공백이 아닌 문자가 필요한 위치와 일치 하는지 여부를 결정하는 일련의 부울 조건 입니다. 이 계산은 서스펜션 케이블의 경로를 따르는 두 개의 슬라이딩 오프셋을 기반으로합니다.

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

다양한 조건은 다음과 같이 결정됩니다.

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)

이러한 조건을 올바른 문자 오프셋으로 변환하려면 각 조건에 적절한 오프셋을 곱하고 결과를 합하면됩니다. 이 계산은 조건이 평가 될 때 수행됩니다. 따라서 다음과 같이 보입니다.

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

합니다 bridge_deck서스펜션 또는 타워 문자가 데크보다 우선 값은 다른 조건이 충족되었는지 여부에 따라 병합됩니다.

최종 결과는 플레이 필드의 마지막 줄에있는 캐릭터 테이블에 대한 오프셋입니다. 우리는 단순히 그 문자를 출력하고 루프를 반복합니다.


설명을 제공 하시겠습니까? 가져오고 넣는 모든 것을 따르기 힘들다
MildlyMilquetoast

현상금을 추가 한 후에 당신이 게시 할 유일한 사람입니다. 다른 사람이 당신을 이길 수 없다면 당신에게 100을 수여 할 것입니다.
Magic Octopus Urn

@ carusocomputing 나는 당신이 이것보다 더 나아지기를 원한다는 것을 알고 있지만 여전히 많은 시간이 있으며, 추천 목록의 상단에 가까워지면 더 많은 주목을 받아야합니다.
James Holderness

이것은 그 자체로 멋진 답변이며 이미 내 투표보다 더 많은 투표권을 가지고 있습니다. 더 나은 것은 확실히 올바른 단어가 아닙니다.
Magic Octopus Urn

3

배치, 241 바이트

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

참고 : 5 행의 후행 공간 시작합니다. 한 줄의 공간을 구축 한 다음 필요에 따라 케이블을 추가하고 타워를 원하는 높이로 반복하여 반복하여 나머지 공간을 도로로 교체합니다.


3

WinDbg, 312 바이트

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

의사 레지스터를 설정하여 입력이 완료됩니다. $t0 .

두 가지를 결합하는 방법이 있어야한다고 생각합니다. for 루프를 하나로 . 아마도 다른 골프 기회도 있습니다 ...

이것은 전체 영역을 도로로 채운 다음 마지막 행을 제외한 모든 행을 공간으로 대체하고 마지막으로 열과 케이블을 구축하여 작동합니다.

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

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

자바 8,423 , 412 바이트

Kritixi Lithos 덕분에 11 바이트 절약

골프 :

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

언 골프 :

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

당신은 골프 여러 가지 방법이 대답은, 첫째, 당신은 하나 개의 문장에 모든 INT 선언을 가질 수 있습니다, 뭔가 같은 int i,j,k,t=n/2+n%2,u=t-2,q=0대신 데 char v="-";사용할 수있는 char v=45;당신은 변경할 수 abc%xyz==0에들 abc%xyz<1(그것을 테스트하지 않은 경우)
Kritixi LITHOS

트윗 담아 가기 마지막 2 개가 작동하지 않는 처음 2 개를 수정 함
Bobas_Pett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.