บริดจ์เป็นคำอุปมาอุปมัยสำหรับทุกสิ่งใน ASCII Art


15

(ด้วยการขอโทษต่อJim Westสำหรับชื่อเรื่องและได้รับแรงบันดาลใจจากการแสดงโลโก้ของซิสโก้: .:|:.:|:. สำหรับแนวคิด)

รับค่าอินพุทจำนวนเต็ม1 <= n <= 255เอาท์พุทการแทนค่า ASCII art ของสะพานแขวนระยะทางnตามกฎการก่อสร้างด้านล่าง:

  • จุดเริ่มต้นและจุดสิ้นสุดของสะพาน (ไม่นับnระยะทาง) มักจะเป็น-|และ|-ดังนั้นสะพานจึงสามารถเชื่อมต่อกับทางหลวงที่อยู่ติดกับมันได้อย่างเหมาะสม
  • สะพานไม่ขยายลง (ระดับถนนประกอบด้วย-แถวคือแถวด้านล่าง)
  • สามารถมีชิ้นส่วนถนนได้มากที่สุดสองชิ้น--ติดต่อกันช่วงใดที่นานกว่านั้นต้องใช้สายเคเบิลช่วงล่างเพื่อรองรับ
  • สายเคเบิลช่วงล่าง\ขยายจากถนนขึ้นไปยังหอคอยเป็น|เส้นตรง
  • เสา|ต้องสูงพอที่จะรองรับสายกันสะเทือนที่อยู่ติดกัน แต่ไม่มีความสูง
  • สะพานจะต้องมีความสมดุลจากซ้ายไปขวาเกี่ยวกับจุดกึ่งกลางซึ่งเป็นที่นิยมในส่วนตรงกลางเมื่อเป็นไปได้
  • ทั้งหมดข้างต้นควรทำให้สายเคเบิลมีขนาดเล็กที่สุด แต่เพื่อให้ชัดเจนจำนวนของสายเคเบิลช่วงล่างต้องลดลงในขณะที่ยังคงปฏิบัติตามกฎข้างต้น

เพื่อให้การแสดงภาพนี่คือผลลัพธ์ที่คาดหวังสำหรับn = 1, 2, 3, ... 15-

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

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

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

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

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

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

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

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

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

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

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

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

อินพุต

เป็นจำนวนเต็มบวกเดียวในรูปแบบที่สะดวกใด ๆn > 9 ,

เอาท์พุต

สะพาน ASCII-art ดังต่อไปนี้เทคนิคการก่อสร้างข้างต้น

กฎระเบียบ

  • ขึ้นบรรทัดใหม่หรือลากตามช่องว่างหรือช่องว่างทั้งหมดเป็นทางเลือกตราบใดที่อักขระบริดจ์เรียงกันอย่างถูกต้อง
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดใส่ลิงก์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้คนสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ


@carusocomputing ฮะอย่ายอมแพ้! : 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

Python 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ไม่ได้อิงตามศูนย์ ค่าเริ่มต้นคือ5 - (h<5)และถูกทำซ้ำจนถึงh (ค่าปัจจุบันถูกเก็บไว้ที่ 2,010) 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

Java 8, 423 , 412 ไบต์

บันทึก 11 ไบต์ด้วย Kritixi Lithos

แข็งแรงเล่นกอล์ฟ:

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

ungolfed:

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

@KritixiLithos ขอบคุณ! แก้ไข 2 รายการแรกรายการสุดท้ายใช้งานไม่ได้
Bobas_Pett
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.