Köprüler ASCII Art'taki her şey için metaforlardır


15

( başlık için Jim West'ten özür dileriz ve Cisco'nun logosunun metinsel temsilinden rastgele ilham alır: .:|:.:|:. konsept için)

Bir giriş tamsayısı verildiğinde , aşağıdaki inşaat kurallarına 1 <= n <= 255göre bir asma köprü mesafesinin ASCII sanat temsilini nçıktılayın:

  • Köprünün başlangıcı ve sonu ( nuzaktan sayılmayan ) her zaman -|ve |-böylece köprü yanındaki otoyollara uygun şekilde bağlanabilir.
  • Köprü aşağı doğru uzanmaz ( -satırdan oluşan yol seviyesi alt sıradır).
  • --Arka arkaya en fazla iki yol parçası olabilir , artık açıklık destek için süspansiyon kabloları gerektirir.
  • Süspansiyon kabloları \yoldan kulelere |düz çizgiler halinde uzanır .
  • Kuleler |, bitişik süspansiyon kablolarını destekleyecek kadar uzun olmalıdır, ancak daha uzun olmamalıdır.
  • Köprü, orta nokta hakkında soldan sağa doğru dengelenmeli ve mümkün olduğunda orta bölümleri desteklemelidir.
  • Yukarıdakilerin tümü kabloların en aza indirilmesine neden olmalıdır, ancak açık olmak gerekirse, yukarıdaki kurallara uymaya devam ederken süspansiyon kablolarının sayısı en aza indirilmelidir.

Görsel bir sunum sağlamak için n = 1, 2, 3, ... 15-

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

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

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

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

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

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

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

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

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

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

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

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

Giriş

Tek bir pozitif tam sayı , herhangi bir uygun biçimde , n > 9.

Çıktı

Yukarıdaki inşaat tekniğini takip eden ASCII-art köprüsü.

kurallar

  • Köprü karakterleri doğru bir şekilde sıralandığı sürece, önde gelen veya sondaki satırsonu veya boşlukların tümü isteğe bağlıdır.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Mümkünse, kullanıcıların kodunuzu deneyebilmesi için lütfen çevrimiçi bir test ortamına bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.


@carusocomputing Hah, vazgeçme! : D
AdmBorkBork

Vazgeçmedim, sadece başka bir yere gitmek zorunda kaldım ve ilerlememi kaybetmek istemedim;).
Sihirli Ahtapot Urn

5
@carusocomputing Aha. Yani, #RageTemporarilyWalkAway gibi.
AdmBorkBork

Yanıtlar:


3

05AB1E , 79 59 58 bayt

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

Çevrimiçi deneyin! .

Açıklama:

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

Daha iyi bir çözüm bulundu, anahtar her sayı için aşağıdaki dizileri aşağıdaki gibi döndürmekti:

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

4

Python 2,173 bayt

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 değerini yansıtın ve merkezi "-" ekleyin
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
Temel desen (alt satırın sağ yarısı)
b=(i*'/--')[:~-i/2]
Alt olmayan katmanlar için döngü
for x in range(1,~-i/2):
Temel desenin ilk x karakterlerini alın ve "-" ile tamamlayın
(len(b)-x)*'-'+b[:x]
Tümünü değiştir - yazdırılacak boşluklarla tüm katmanlar (alt hariç)
print f().replace('-',' ')
Alt katmanı yazdır
print f(b)



4

Befunge, 150 bayt

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

Çevrimiçi deneyin!

Ayrıca köprünün yapımında kullanılan mimariyi daha iyi gösteren kodun ungolfed sürümünü sağladım.

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

Çevrimiçi deneyin!

Kuleler giriş ve parametre başlatma işlemlerini gerçekleştirir. Güverte, köprünün her bir x, y koordinatı için çıkarılması gereken kısımlarını hesaplayan iki döngüden oluşur. Ve vakıf, bu köprü parçalarının karakter tablosunun yanı sıra tamamen ilgisiz bazı kodları da barındırıyor.

Detaylı açıklama

Köprüyü oluşturmak için tekrarlanması gereken çıkış alanının genişliğini ve yüksekliğini hesaplayarak başlıyoruz.

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

Y aralığının sıfır temelli olmadığını unutmayın . Başlangıç ​​değeri h değerine 5 - (h<5)kadar yinelenir (geçerli değer 2,0'da saklanır). X değeri den tekrarlanır ağırlık 0 aşağı ve yığın üzerinde depolanır.

İç döngü, belirli bir x , y koordinatının boşluk olmayan bir karakter gerektiren konumlardan herhangi biriyle eşleşip eşleşmediğini belirleyen bir dizi boolean koşuludur . Bu hesaplamalar, süspansiyon kablolarının yolunu takip eden iki kayma ofsetine dayanmaktadır.

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

Daha sonra çeşitli koşullar aşağıdaki gibi belirlenir:

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)

Bu koşulları doğru karakter ofsetine çevirmek için, her birini uygun bir ofsetle çarpmamız ve sonucu toplamamız gerekir. Bu hesaplama koşullar değerlendirildikçe yapılır. Yani şuna benziyor:

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 değerinin, diğer koşullardan herhangi birinin karşılanıp karşılanmadığına bağlı olarak birleştirildiğine dikkat edin , çünkü askıya alma veya kule karakteri güverte üzerinde önceliğe sahip olacaktır.

Sonuç, oyun alanının son satırındaki karakter tablosuna bir ofsettir. Sadece bu karakteri çıkarır ve döngüyü tekrarlarız.


Bir açıklama yapmak ister misiniz? tüm bu alır ve koyar, takip etmek zor
MildlyMilquetoast

Ödül ekledikten sonra gönderilecek tek kişi sensin, eğer kimse seni dövmezse sana 100 ödül vereceğim.
Sihirli Ahtapot Urn

@carusocomputing Bundan daha iyisini umduğunuzu biliyorum, ama yine de bolca zaman var ve özellikli listenin en üstüne yaklaştığında daha fazla bildirim alması gerekiyor.
James Holderness

Bu kendi içinde harika bir cevap, zaten benimkinden daha fazla oyu var; daha iyisi kesinlikle doğru kelime değildir.
Sihirli Ahtapot Urn

3

Toplu, 241 bayt

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

Not: Hat 5'teki boşluğu takip edin. Bir satır boşluk oluşturarak, ardından gerekli kabloları ekleyerek, kuleleri istenen yüksekliğe inşa etmek için tekrarlayarak, kalan boşlukları yolla değiştirerek başlar.


3

WinDbg, 312 bayt

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

Giriş, yalancı kayıt ayarlanarak yapılır $t0.

İki fordöngüyü bir araya getirmenin bir yolu olmalı gibi hissediyorum ... belki başka golf fırsatları da ...

Bu, tüm alanı yolla doldurarak, daha sonra son sıra dışındaki tümünü boşlukla değiştirerek ve son olarak sütunları ve kabloları inşa ederek çalışır.

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 örnek çıktı:

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 bayt

Kritixi Lithos sayesinde 11 bayt tasarruf edildi

golfed:

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

Sen golf birçok yönden bu cevap, ilk, bir açıklamada tüm int beyanlarını olabilir, bir şey gibi int i,j,k,t=n/2+n%2,u=t-2,q=0ve bunun yerine sahip char v="-";kullanabileceğiniz char v=45;ve değiştirebileceğiniz abc%xyz==0için s abc%xyz<1(aCoolFunction)
Kritixi Lithos

@KritixiLithos thx! ilk 2 sonuncusu işe yaramadı düzenledi
Bobas_Pett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.