Jembatan adalah metafora untuk semua yang ada dalam Seni ASCII

15

(dengan permintaan maaf kepada Jim West untuk judul, dan secara acak terinspirasi oleh representasi tekstual dari logo mereka: .:|:.:|:. untuk konsep)

Diberikan integer input 1 <= n <= 255, output representasi seni ASCII dari jembatan gantung jarak nmengikuti aturan konstruksi di bawah ini:

  • Awal dan akhir jembatan (tidak dihitung dalam njarak) selalu -|dan |-, sehingga jembatan dapat terhubung dengan tepat ke jalan raya di sebelahnya.
  • Jembatan tidak memanjang ke bawah (tingkat jalan, terdiri dari -baris, adalah baris bawah).
  • Paling tidak ada dua potongan jalan --dalam satu baris, setiap rentang yang lebih panjang membutuhkan kabel suspensi untuk penyangga.
  • Kabel suspensi \memanjang dari jalan raya ke menara |dalam garis lurus.
  • Menara |harus cukup tinggi untuk menopang kabel suspensi yang berdekatan, tetapi tidak lebih tinggi.
  • Jembatan harus seimbang dari kiri ke kanan tentang titik tengah, mendukung bagian tengah bila memungkinkan.
  • Semua hal di atas harus menghasilkan minimalisasi kabel, tetapi hanya untuk menjadi jelas, jumlah kabel suspensi harus diminimalkan sambil tetap mengikuti aturan di atas.

Untuk memberikan representasi visual, berikut adalah output yang diharapkan untuk n = 1, 2, 3, ... 15-

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

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

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

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

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

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

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

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

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

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

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

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

Memasukkan

Sebuah bilangan bulat positif dalam format yang nyaman , n > 9.

Keluaran

Jembatan ASCII-art mengikuti teknik konstruksi di atas.

Aturan

  • Leading atau trailing newlines atau whitespace semuanya opsional, selama karakter bridge itu sendiri berbaris dengan benar.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
#RageQuit ( 05ab1e.tryitonline.net/… )
Magic Octopus Urn
@computercomputing Hah, jangan menyerah! : D
AdmBorkBork
Saya tidak menyerah, hanya harus pergi ke tempat lain dan tidak ingin kehilangan kemajuan saya;).
Magic Gurita Guci
5
@carusocomputing Aha. Jadi, lebih seperti #RageTemporentlyWalkAway.
AdmBorkBork

Jawaban:

3

05AB1E , 79 59 58 byte

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

Cobalah online! .

Penjelasan:

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

Menemukan solusi yang lebih baik, kuncinya adalah mengembalikan array berikut untuk setiap nomor sebagai berikut:

1=[" "]
2=["  "]
3=["\"]
4=["\ "]
5=["\"," \"]
6=["\"," \ "]
7=["\"," \","  \"]
8=["\"," \","  \ "]
Etc...
Guci Gurita Ajaib
sumber
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)

Cermin nilai b dan tambahkan pusat "-"
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
Pola dasar (setengah kanan dari garis bawah)
b=(i*'/--')[:~-i/2]
Lingkaran untuk lapisan non-bawah
for x in range(1,~-i/2):
Dapatkan karakter x pertama dari pola dasar dan lengkapi dengan "-"
(len(b)-x)*'-'+b[:x]
Ganti semua - dengan spasi untuk mencetak semua lapisan (kecuali bagian bawah)
print f().replace('-',' ')
Cetak lapisan bawah
print f(b)

tongkat
sumber
5
Anda harus memasukkan versi mentah (tanpa komentar) di pos Anda
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*
 |\/-

Cobalah online!

Saya juga menyediakan versi kode yang tidak disunat yang lebih baik menunjukkan arsitektur yang digunakan dalam pembangunan jembatan.

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

Cobalah online!

Menara menangani inisialisasi input dan parameter. Dek terdiri dari dua loop yang menghitung bagian-bagian jembatan yang perlu menjadi output untuk setiap koordinat x, y. Dan yayasan memegang tabel karakter untuk bagian-bagian jembatan, serta beberapa kode yang sama sekali tidak terkait.

Penjelasan detail

Kita mulai dengan menghitung lebar dan tinggi area keluaran yang perlu diulang untuk membuat jembatan.

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

Perhatikan bahwa rentang y bukan berbasis nol. Nilai awal adalah 5 - (h<5)dan iterasi hingga h (nilai saat ini disimpan pada 2,0). Nilai x diulang dari w ke 0 dan disimpan di stack.

Lingkaran dalam hanyalah serangkaian kondisi boolean yang menentukan apakah koordinat x , y cocok dengan salah satu lokasi yang memerlukan karakter non-spasi. Perhitungan ini didasarkan pada dua offset geser yang mengikuti jalur kabel suspensi.

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

Berbagai kondisi kemudian ditentukan sebagai berikut:

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)

Untuk menerjemahkan kondisi ini ke offset karakter yang benar, kita hanya perlu mengalikan masing-masing dengan offset yang sesuai dan menjumlahkan hasilnya. Perhitungan ini dilakukan saat kondisi dievaluasi. Jadi terlihat seperti ini:

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

Perhatikan bahwa nilai bridge_deck digabungkan berdasarkan apakah ada kondisi lain yang telah dipenuhi, karena karakter suspensi atau menara akan diutamakan di atas geladak.

Hasil akhirnya adalah offset ke dalam tabel karakter pada baris terakhir dari playfield. Kami cukup menampilkan karakter itu dan mengulangi loop.

James Holderness
sumber
Mau memberikan penjelasan? dengan semua yang didapat dan dimasukkan, sulit untuk diikuti
MildlyMilquetoast
Anda satu-satunya yang memposting setelah saya menambahkan hadiah, jika tidak ada orang lain yang mengalahkan Anda, saya akan menghadiahkan 100.
Magic Octopus Urn
@carusocomputing Saya tahu Anda berharap lebih baik dari ini, tetapi masih ada banyak waktu, dan itu harus mendapatkan lebih banyak pemberitahuan setelah lebih dekat ke bagian atas daftar fitur.
James Holderness
Ini adalah jawaban yang asyik dan dalam dirinya sendiri, ia sudah memiliki lebih banyak suara daripada milik saya; lebih baik jelas bukan kata yang tepat.
Magic Octopus Mm
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:!=^|%

Catatan: Trailing space on line 5. Mulai dengan membangun deretan ruang, kemudian tambahkan kabel seperlunya, ulangi untuk membangun menara dengan ketinggian yang diinginkan, diakhiri dengan mengganti ruang yang tersisa dengan jalan.

Neil
sumber
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

Input dilakukan dengan mengatur pseudo-register $t0.

Saya merasa harus ada cara untuk menggabungkan keduanya for loop menjadi satu ... mungkin beberapa peluang golf lainnya juga ...

Yang ini bekerja dengan mengisi seluruh area dengan jalan, lalu mengganti semua kecuali baris terakhir dengan ruang, dan akhirnya membangun kolom dan kabel.

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

Contoh hasil 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  "-|\--\--\-/--/--/|-"
susu
sumber
2

Java 8, 423 , 412 byte

11 byte disimpan berkat Kritixi Lithos

golf:

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));
}
Bobas_Pett
sumber
Anda dapat memasukkan jawaban ini dalam banyak cara, pertama, Anda dapat memiliki semua deklarasi int Anda dalam satu pernyataan, sesuatu seperti int i,j,k,t=n/2+n%2,u=t-2,q=0dan alih-alih memiliki char v="-";Anda dapat menggunakan char v=45;dan Anda dapat mengubah abc%xyz==0s ke abc%xyz<1(belum mengujinya)
Kritixi Lithos
@KritixiLithos thx! mengedit 2 pertama yang terakhir tidak berhasil
Bobas_Pett