I ponti sono metafore di tutto nell'arte ASCII


15

(con scuse a Jim West per il titolo e ispirato casualmente dalla rappresentazione testuale del logo di Cisco: .:|:.:|:. per il concetto)

Dato un intero di input 1 <= n <= 255, emette una rappresentazione artistica ASCII di un ponte sospeso di distanza nseguendo le regole di costruzione seguenti:

  • L'inizio e la fine del ponte (non contati in nlontananza) sono sempre -|e |-, quindi il ponte può collegarsi in modo appropriato alle autostrade accanto ad esso.
  • Il ponte non si estende verso il basso (il livello della carreggiata, composto dalla -riga, è la riga inferiore).
  • Possono esserci al massimo due pezzi di carreggiata --consecutivi, per cui una campata più lunga richiede cavi di sospensione per il supporto.
  • I cavi di sospensione si \estendono dalla carreggiata fino alle torri |in linea retta.
  • Le torri |devono essere abbastanza alte da supportare i cavi di sospensione adiacenti, ma non più alte.
  • Il ponte deve essere bilanciato da sinistra a destra attorno al punto centrale, favorendo le sezioni centrali ogni volta che è possibile.
  • Tutto quanto sopra dovrebbe tradursi in una riduzione al minimo dei cavi, ma per essere chiari, il numero di cavi di sospensione deve essere ridotto al minimo pur seguendo le regole di cui sopra.

Per fornire una rappresentazione visiva, ecco gli output previsti per n = 1, 2, 3, ... 15-

1
-|-|-

2
-|--|-

3
-|\-/|-

4
-|\--/|-

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

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

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

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

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

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

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

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

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

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

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

Ingresso

Un unico intero positivo in qualsiasi formato conveniente , n > 9.

Produzione

Il ponte di arte ASCII seguendo la tecnica di costruzione di cui sopra.

Regole

  • Le nuove linee iniziali o finali o gli spazi bianchi sono tutti opzionali, purché i personaggi del ponte si allineino correttamente.
  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Se possibile, includi un collegamento a un ambiente di test online in modo che le persone possano provare il tuo codice!
  • Scappatoie standardSono vietate le .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).


@carusocomputing Hah, non mollare! : D
AdmBorkBork,

Non mi sono arreso, ho dovuto andare altrove e non volevo perdere i miei progressi;).
Magic Octopus Urn,

5
@carusocomputing Aha. Quindi, più come #RageTemporarilyWalkAway.
AdmBorkBork,

Risposte:


3

05AB1E , 79 59 58 byte

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

Provalo online! .

Spiegazione:

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

Trovato la soluzione migliore, la chiave era restituire i seguenti array per ciascun numero come segue:

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

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)

Specchia il valore di b e aggiungi il
f=lambda b:'-|'+b[::-1].replace('/','\\')+-~(~i%2)*'-'+b+'|-'
motivo di base "-" centrale (metà destra della linea di fondo)
b=(i*'/--')[:~-i/2]
Ciclo per livelli non inferiori
for x in range(1,~-i/2):
Ottieni i primi x caratteri del motivo di base e completa con "-"
(len(b)-x)*'-'+b[:x]
Sostituisci tutto - con spazi da stampare tutti i livelli (tranne il fondo)
print f().replace('-',' ')
Stampa il livello inferiore
print f(b)


5
Dovresti includere la versione non
elaborata

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

Provalo online!

Ho anche fornito una versione non modificata del codice che dimostra meglio l'architettura utilizzata nella costruzione del ponte.

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

Provalo online!

Le torri gestiscono l'input e l'inizializzazione dei parametri. Il mazzo è composto da due anelli che calcolano le parti del ponte che devono essere emesse per ciascuna coordinata x, y. E la fondazione contiene la tabella dei caratteri per quelle parti del ponte, così come qualche altro codice completamente non correlato.

Spiegazione dettagliata

Iniziamo calcolando la larghezza e l'altezza dell'area di output che dovrà essere ripetuta per rendere il bridge.

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

Si noti che l' intervallo y non è basato su zero. Il valore iniziale è 5 - (h<5)ed è ripetuto fino a h (il valore corrente è memorizzato a 2,0). Il valore x è ripetuto da w fino a 0 ed è memorizzato nello stack.

Il ciclo interno è solo una serie di condizioni booleane che determinano se una particolare coordinata x , y corrisponde a una qualsiasi delle posizioni che richiedono un carattere non spaziale. Questi calcoli si basano su due offset scorrevoli che seguono il percorso dei cavi di sospensione.

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

Le varie condizioni sono quindi determinate come segue:

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)

Per tradurre queste condizioni nell'offset del carattere corretto, dobbiamo solo moltiplicare ciascuna di esse per un offset appropriato e sommare il risultato. Questo calcolo viene eseguito man mano che vengono valutate le condizioni. Quindi sembra qualcosa del genere:

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

Si noti che bridge_deck valore viene unito in base al fatto che una qualsiasi delle altre condizioni sia stata soddisfatta, poiché una sospensione o un personaggio torre avrà la precedenza sul mazzo.

Il risultato finale è un offset nella tabella dei caratteri sull'ultima riga del campo di gioco. Abbiamo semplicemente emesso quel personaggio e ripetiamo il loop.


Vuoi fornire una spiegazione? con tutti quelli che
vanno

Sei l'unico a postare dopo che ho aggiunto la taglia, se nessun altro ti batte, ti assegnerò il 100.
Magic Octopus Urn

@carusocomputing So che speravi di meglio di così, ma c'è ancora molto tempo e dovrebbe ricevere più attenzione una volta più vicino alla cima dell'elenco delle funzionalità.
James Holderness,

Questa è una bella risposta in sé e per sé, ha già più voti dei miei; meglio non è sicuramente la parola giusta.
Magic Octopus Urn

3

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

Nota: trascinamento dello spazio sulla linea 5. Inizia costruendo una fila di spazi, quindi aggiungendo i cavi necessari, ripetendo per costruire torri all'altezza desiderata, terminando sostituendo gli spazi rimanenti con la strada.


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

L'immissione viene effettuata impostando lo pseudo-registro $t0.

Sento che dovrebbe esserci un modo per combinare i due for anelli in uno ... forse anche altre opportunità di golf ...

Questo funziona riempiendo l'intera area con la strada, quindi sostituendo tutto tranne l'ultima riga con lo spazio e infine costruendo colonne e cavi.

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

Uscita campione di 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 byte

11 byte salvati grazie a Kritixi Lithos

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

Puoi golf questa risposta in molti modi, in primo luogo, puoi avere tutte le tue dichiarazioni int in una dichiarazione, qualcosa del genere int i,j,k,t=n/2+n%2,u=t-2,q=0e invece di avere char v="-";puoi usare char v=45;e puoi cambiare la abc%xyz==0s in abc%xyz<1(non l'ho testata)
Kritixi Lithos

@KritixiLithos thx! modificato i primi 2 l'ultimo non ha funzionato
Bobas_Pett
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.