Brücken sind Metaphern für alles in ASCII Art


15

(Mit einer Entschuldigung an Jim West für den Titel und nach dem Zufallsprinzip inspiriert von Ciscos textueller Darstellung ihres Logos: .:|:.:|:. für das Konzept)

Ausgeben einer 1 <= n <= 255ASCII-Grafikdarstellung einer Hängebrücke mit einer bestimmten Ganzzahl gemäß den nfolgenden Konstruktionsregeln:

  • Der Anfang und das Ende der Brücke (in der nEntfernung nicht mitgezählt ) sind immer -|und |-, sodass die Brücke in geeigneter Weise mit den Autobahnen daneben verbunden werden kann.
  • Die Brücke erstreckt sich nicht nach unten (die Fahrbahnebene, bestehend aus der -Reihe, ist die unterste Reihe).
  • Es können höchstens zwei Fahrbahnstücke --hintereinander liegen, für eine längere Spannweite sind Tragseile zur Abstützung erforderlich.
  • Die Tragseile \verlaufen |geradlinig von der Fahrbahn bis zu den Türmen .
  • Die Türme |müssen hoch genug sein, um die angrenzenden Aufhängungskabel zu tragen, dürfen jedoch nicht höher sein.
  • Die Brücke muss um den Mittelpunkt von links nach rechts ausbalanciert sein, wobei die Mittelteile nach Möglichkeit bevorzugt werden.
  • All dies sollte zu einer Minimierung der Kabel führen. Um jedoch klar zu sein, muss die Anzahl der Aufhängungskabel minimiert werden, während die obigen Regeln eingehalten werden.

Zur visuellen Darstellung sind hier die erwarteten Ausgaben für n = 1, 2, 3, ... 15:

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

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

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

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

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

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

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

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

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

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

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

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

Eingang

Eine einzelne positive ganze Zahl in jedem geeigneten Format , n > 9.

Ausgabe

Die ASCII-art Brücke folgt der obigen Konstruktionstechnik.

Regeln

  • Führende oder nachfolgende Zeilenumbrüche oder Leerzeichen sind optional, sofern die Brückenzeichen selbst korrekt ausgerichtet sind.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit die Benutzer Ihren Code ausprobieren können!
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.


@carusocomputing Hah, gib nicht auf! : D
AdmBorkBork

Ich habe nicht aufgegeben, musste einfach woanders hingehen und wollte meinen Fortschritt nicht verlieren;).
Magic Octopus Urn

5
@carusocomputing Aha. Also eher wie #RageTemporarilyWalkAway.
AdmBorkBork

Antworten:


3

05AB1E , 79 59 58 Bytes

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

Probieren Sie es online! .

Erläuterung:

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

Als die bessere Lösung gefunden wurde, lautete der Schlüssel, die folgenden Arrays für jede Nummer wie folgt zurückzugeben:

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

4

Python 2, 173 Bytes

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)

Spiegel des Wert von b und fügen Sie die zentralen „-“
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
Grundmuster (rechte Hälfte der unteren Zeile)
b=(i*'/--')[:~-i/2]
Schleife für nicht-untere Schichten
for x in range(1,~-i/2):
Holen Sie sich die ersten x Zeichen des Grundmusters und komplett mit „-“
(len(b)-x)*'-'+b[:x]
Alle ersetzen - mit Leerzeichen zu drucken Alle Ebenen (außer unten)
print f().replace('-',' ')
Untere Ebene drucken
print f(b)


5
Sie sollten die
unformatierte

4

Befunge, 150 Bytes

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

Probieren Sie es online!

Ich habe auch eine unbenutzte Version des Codes zur Verfügung gestellt, die die beim Bau der Brücke verwendete Architektur besser demonstriert.

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

Probieren Sie es online!

Die Türme übernehmen die Eingabe und Parameterinitialisierung. Das Deck besteht aus zwei Schleifen, die die Teile der Brücke berechnen, die für jede x, y-Koordinate ausgegeben werden müssen. Und die Grundlage enthält die Zeichentabelle für diese Brückenteile sowie einen anderen völlig unabhängigen Code.

Ausführliche Erklärung

Wir beginnen mit der Berechnung der Breite und Höhe des Ausgabebereichs, der zum Rendern der Brücke iteriert werden muss.

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

Beachten Sie, dass der y- Bereich nicht auf Null basiert. Der Anfangswert ist 5 - (h<5)und wird bis h iteriert (der aktuelle Wert wird bei 2,0 gespeichert). Der x- Wert wird von w bis 0 iteriert und auf dem Stapel gespeichert.

Die innere Schleife ist nur eine Reihe von Booleschen Bedingungen, die bestimmen, ob eine bestimmte x , y- Koordinate mit einer der Positionen übereinstimmt, die ein Nicht-Leerzeichen erfordern. Diese Berechnungen basieren auf zwei Gleitversätzen, die dem Pfad der Aufhängungskabel folgen.

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

Die verschiedenen Bedingungen werden dann wie folgt bestimmt:

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)

Um diese Bedingungen in den richtigen Zeichenversatz zu übersetzen, müssen wir sie nur mit einem geeigneten Versatz multiplizieren und das Ergebnis summieren. Diese Berechnung wird durchgeführt, wenn die Bedingungen ausgewertet werden. So sieht es ungefähr so ​​aus:

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

Beachten Sie, dass der Wert für bridge_deck abhängig davon zusammengeführt wird, ob eine der anderen Bedingungen erfüllt ist, da ein Suspendierungs- oder Turmcharakter Vorrang vor dem Deck hat.

Das Endergebnis ist ein Versatz in der Zeichentabelle in der letzten Zeile des Spielfelds. Wir geben einfach dieses Zeichen aus und wiederholen die Schleife.


Möchtest du eine Erklärung abgeben? mit all diesen bekommt und setzt, ist es schwer zu folgen
MildlyMilquetoast

Du bist der Einzige, der etwas veröffentlicht, nachdem ich das Kopfgeld hinzugefügt habe. Wenn dich sonst niemand schlägt,
Magic Octopus Urn

@carusocomputing Ich weiß, dass Sie auf etwas Besseres gehofft haben, aber es bleibt noch viel Zeit und es sollte mehr Beachtung finden, sobald es näher an der Spitze der vorgestellten Liste ist.
James Holderness

Dies ist eine coole Antwort an und für sich, es hat bereits mehr Stimmen als meine; Besser ist definitiv nicht das richtige Wort.
Magic Octopus Urn

3

Batch, 241 Bytes

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

Hinweis: Leerzeichen in Zeile 5 nachziehen. Beginnt mit dem Aufbau einer Reihe von Leerzeichen und dem Hinzufügen von Kabeln nach Bedarf. Wiederholen Sie diesen Vorgang, um Türme in der gewünschten Höhe zu errichten, und ersetzen Sie dann alle verbleibenden Leerzeichen durch Straßen.


3

WinDbg, 312 Bytes

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

Die Eingabe erfolgt durch Setzen des Pseudoregisters $t0.

Ich denke, es sollte eine Möglichkeit geben, die beiden forLoops zu einer zu kombinieren ... vielleicht auch einige andere Möglichkeiten zum Golfen ...

Dieser Vorgang füllt den gesamten Bereich mit Straßen, ersetzt dann alle bis auf die letzte Reihe mit Leerzeichen und erstellt schließlich die Säulen und 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

Beispielausgabe von 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 Bytes

Dank Kritixi Lithos konnten 11 Bytes eingespart werden

Golf gespielt:

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

Sie können diese Antwort auf vielfältige Weise nutzen. Erstens können Sie alle Ihre int-Deklarationen in einer Anweisung haben, so etwas wie int i,j,k,t=n/2+n%2,u=t-2,q=0und anstatt dass char v="-";Sie es verwenden können , können char v=45;Sie das abc%xyz==0s ändern in abc%xyz<1(haben es nicht getestet)
Kritixi Lithos

@KritixiLithos Danke! bearbeitet die ersten 2 der letzte hat nicht funktioniert
Bobas_Pett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.