Costruisci archi ASCII


17

Mi piace l'arte ascii e mi annoio molto, quindi ho trovato alcuni personaggi ascii e ho iniziato a fare cose casuali, castello di mario a 8 bit, labirinti e archi. Ho scoperto che gli archi potevano essere facilmente impilati in modo ordinato.

╔═══════╗
║╔═════╗║
║║╔═══╗║║
║║║╔═╗║║║
╨╨╨╨─╨╨╨╨

Sfida

Crea un programma, una funzione o qualsiasi altro formato standard che accetti un numero intero maggiore o uguale a 0 (a meno che tu non stia facendo il bonus) e produca arte ascii con la quantità di archi specificata.

Casi test

Ingresso:

7

Produzione:

╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

alt:

+-------------+
|+-----------+|
||+---------+||
|||+-------+|||
||||+-----+||||
|||||+---+|||||
||||||+-+||||||
||||||| |||||||
---------------

Ingresso:

1

Produzione:

╔═╗
╨─╨

alt:

+-+
| |
---
  • Se il numero intero è 0, non generare nulla
  • Questa domanda sarà in utf-8, ogni personaggio verrà conteggiato come un "byte"
  • Questo è quindi vince la risposta più breve.
  • Hai la possibilità di usare +-+invece di ╔═╗, ---invece di ╨─╨e |invece di║

Bonus (non deciso se permetterlo sulla versione alternativa perché non sarebbe così difficile)

-10% se il programma supporta numeri negativi e capovolge gli archi in questo modo

╥╥╥╥─╥╥╥╥
║║║╚═╝║║║
║║╚═══╝║║
║╚═════╝║
╚═══════╝

3
AFAIK quelli non sono caratteri ASCII. unicode-art
— flawr

welp, @flawr hai ragione. Che ora ...
— JuanPotato,

Il mondo sta per crollare! Non ti preoccupare, forse menziona solo che non fanno parte dell'ASCII standard, ma il tag ascii-art si applica ancora (il tag unicode era uno scherzo.)
— flawr

Sembra esteso ASCII, però, quindi probabilmente stai bene.
— Mama Fun Roll

2
@ ՊՓԼՃՐՊՃՈԲՍԼ Non esiste una versione standard di ASCII estesa en.wikipedia.org/wiki/Extended_ASCII La cosa più vicina è la tabella codici 437 en.wikipedia.org/wiki/Code_page_437 che era standard negli Stati Uniti e in molti altri paesi, ma trovo quando copiarlo e incollarlo in un editor 437 di tabella codici e di nuovo in Windows "interpreta" come archi con +---+in alto, ai lati |e in fondo di -----cui mi sembra perfetto. Juanpotato, se si desidera utilizzare caratteri non ascii, si prega di indicare la codifica nella domanda. Per ora sto votando per chiudere come poco chiaro.
— Level River St

Risposte:


1

CJam, 59 byte

qi:Lg"^Za"a{_0=1'Z3*tsa\{'[2*\*}%+}L(*'rL*a2*N*a+9462ff+N**

Provalo qui!


Ora puoi usare + - | per costruire gli archi, vedi op per esempi.
— JuanPotato,

2

Python 2, 106 byte (94 caratteri)

n=input();j=1
exec"s=j/2*'║';print s+'╔'+'═'*(2*n-j)+'╗'+s;j+=2;"*n
if n:t='╨'*n;print t+'─'+t

Abbastanza diretto. Stampa riga per riga con un numero variabile di barre orizzontali e verticali. L'ultima riga è stampata separatamente.

Mi sento come se mi mancassero alcune ottimizzazioni. Il fatto che i caratteri siano multipli byte significa che non puoi fare qualcosa del genere'║╨'[n>0] , quindi non ho trovato un buon modo per stampare l'ultima riga nel ciclo. È brutto che ci sia così tanta manipolazione nel bancone. Vorrei aggiornare direttamente le stringhe, ad esempio s+='║', ma l'indice viene utilizzato anche per le barre orizzontali.


Ora puoi usare +-|per costruire gli archi, vedi op per esempi.
— JuanPotato,

2
@JuanPotato OP sta per poster originale. Intendi la domanda?
— Addison Crump,

1
@flagasspam sì, ho appena visto gli usi in cui significa post originale
— JuanPotato

2

Perl, 78 82 caratteri

$n='─';$_='══'x pop;while(s/══//){print"$s╔═$_╗$s\n";$s.="║";$n="╨$n╨"}$s&&print$n

Purtroppo, non sono riuscito a trovare un modo per sfruttare il bonus senza aumentare le dimensioni di oltre il 10%. Potrei ancora prevalere.

Ungolfed

Abbastanza semplice, davvero. Costruisce la linea di fondo ( ╨$n╨) in modo incrementale, accorciando la linea di cima ( ══) di due caratteri, terminando quando non può più essere abbreviata, quindi non devo fare confusione con i contatori.

 $n = '─'; # Bottom line
 $_ = '══'x pop; # "Top" line, length from commandline argument
 while (s/══//) { # Shorten top line by two characters
     print "$s╔═$_╗$s\n"; # Print current line with $s (sides)
     $s .= "║";           # Append vertical bar to sides
     $n  = "╨$n╨";        # Widen bottom line
 }
 $s && print $n; # Print bottom line if input is not 0

Penso che questo stampi un singolo ─per n = 0, ma non dovrebbe stampare nulla.
— Lynn,

@Mauris L'ho appena eseguito e hai ragione
— JuanPotato,

1
@Mauris Dang! Hai assolutamente ragione. La mia versione originale andava bene, ma da qualche parte lungo la linea ho perso il controllo. Risolto, al costo di 4 caratteri. Grazie per averlo individuato.
— type_outcast

So che questo è vecchio, ma per aggiungere al commento di @ Abigail, puoi anche salvare byte usando -n: Provalo online!
— Dom Hastings,

1

Bash, 124 byte (112 caratteri)

printf -vh %$1s
b=${h// /╨}
h=${h// /═}
for((n=$1;n--;)){
echo $v╔$h${h:1}╗$v
h=${h#?}
v+=║
}
(($1))&&echo $b─$b

Esecuzione di esempio:

bash-4.3$ bash ascii-arch.sh 7
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ bash ascii-arch.sh 1
╔═╗
╨─╨

bash-4.3$ bash ascii-arch.sh 0

1

Japt -R , 29 byte

Utilizza +& -. Sacrificato 4 byte per gestire la sanguinosa convalida dell'input!

©Æ'+²¬q-p´UÑÄÃpS û| p-pNÑÄ)ªP

Provalo


Spiegazione

                                  :Implicit input of integer U
©                                 :Logical AND with U
 Æ                                :Map the range [0,U)
  '+                              :  Literal "+"
    ²                             :  Repeat twice
     ¬                            :  Split
      q                           :  Join with
       -                          :   Literal "-"
        p                         :   Repeat
         ´U                       :    Decrement U
           Ñ                      :    Multiply by 2
            Ä                     :    Add 1
             Ã                    :End mapping
              pS                  :Push a space
                 û|               :Centre pad each element with "|" to the length of the longest element
                    p     )       :Push
                     -            : Literal "-"
                      p           : Repeat
                       N          :  The array of inputs (which will be cast to an integer if we perform a mathematical operation on it)
                        ÑÄ        :  Multiply by 2 and add 1
                           ª      :Logical OR
                            P     :The empty string
                                  :Implicitly join with newlines and output

fallisce l'input0
— dzaima l'

@dzaima, che vuoi dire? Come puoi avere un arco di dimensioni 0?
— Shaggy,

If the integer is 0 then don't output anythingdalla sfida: /
— dzaima,

@dzaima, Oh, l'ho perso. Grazie. Prima di tutto: urla per inserire la validazione! In secondo luogo, Japt non può produrre nulla: potrei produrre 0, falseo una stringa vuota al costo di alcuni byte, ma non so se qualcuno di questi sarebbe accettabile tranne, forse, la stringa vuota, che mi costerebbe 5 byte ( 0mi costerebbe solo 1).
— Shaggy,

0

JavaScript (ES6), 101 caratteri

f=(n,i=0)=>n?i-n?(b="║"[r="repeat"](i))+`╔${"═"[r]((n-i)*2-1)}╗${b}
`+f(n,i+1):(g="╨"[r](n))+"─"+g:""

Spiegazione

Funzione ricorsiva che stampa ogni riga

f=(n,i=0)=>              // f = recursive function, i = current line (default = 0)
  n?                     // if n != 0
    i-n?                 // if we are not in the last line, print the line
      (b="║"[r="repeat"](i))+`╔${"═"[r]((n-i)*2-1)}╗${b}
`+f(n,i+1)               // add the output of the next line
    :(g="╨"[r](n))+"─"+g // if we ARE in the last line, print the last line
  :""                    // print nothing if n = 0

Test

Il test non utilizza i parametri predefiniti per la compatibilità del browser.


0

PHP (109 caratteri)

$s='';for($b=($n=$argv[1])?'─':'';$n--;){echo$s.'╔═'.str_repeat('══',$n)."╗$s\n";$s.='║';$b="╨{$b}╨";}echo$b;

Devo ancora sbarazzarmi di quella str_repeat ma la maggior parte delle alternative non gestirà i caratteri mulyibyte.

$s = '';
// Initialise $b (bottom) to '─' or '' for n==0
for ($b = ($n = $argv[1]) ? '─' : ''; $n--;) {
    // Echo sides + arch + sides
    echo $s . '╔═' . str_repeat('══', $n) . "╗$s\n";
    // Growing sides
    $s .= '║';
    // Growing bottom
    $b = "╨{$b}╨";
}
// Show bottom
echo $b;

0

Retina , 79 caratteri

.+
$0$*═$0$*═╗
^═
╔
+`(║*)╔═(═+)═╗║*$
$0¶$1║╔$2╗║$1
(\S+)$
$0¶$1
T`═╔╗║`─╨`\S+$

Provalo online.

Questo utilizza una nuova funzionalità in Retina che sostituisce un numero decimale \d+con un elenco di tanti caratteri $0$*═.


0

Swift (209 byte)

Probabilmente Swift non è la lingua migliore per questo, questa è la mia prima volta che provo a fare una sfida con il codice:

func *(l:String,r: Int)->String{return r>0 ?l+(l*(r-1)):""}
let n=Int(readLine()!)!
for i in 0...(n-1){let a=("║"*i)+"╔═";let b=a+("══"*(n-1-i))+"╗"+("║"*i);print(b)};print("╨"*n+"─"+"╨"*n)

0

Rubino, 90 byte (74 caratteri)

->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}

Esecuzione di esempio:

2.1.5 :001 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[7]
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨
 => nil 

2.1.5 :002 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[1]
╔═╗
╨─╨
 => nil 

2.1.5 :003 > ->n{n.times{|i|puts ?║*i+?╔+?═*((n-i)*2-1)+?╗+?║*i}>0&&puts(?╨*n+?─+?╨*n)}[0]
 => false 

0

Haskell, 151 162 byte

r=replicate
c=concat
f n=putStr$unlines[c[r i '║',"╔",r(2*(n-i)-1)'═',"╗",r i '║']|i<-[0..n-1]]++c[r n '╨',r(signum n)'─',r n '╨']
main=readLn>>=f

Modifica: ho dimenticato di trattare 0come input


0

𝔼𝕊𝕄𝕚𝕟, 54 caratteri / 95 byte

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`+Ⅰ$;ï⅋ᵖⅠï+⬭+Ⅰï,Ⅱ*2+1

Try it here (Firefox only).

Spiegazione

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`+Ⅰ$;ï⅋ᵖⅠï+⬭+Ⅰï,Ⅱ*2+1 // implicit: ï=input, $=mapped item
                                                       // PHASE 1
⩥ïⓜ                                                   // create a range to map over
    ᵖ                                                  // push to stack:
     ⟮ ⍘|ď⟯$                                            // | repeated $ times
           +`+⦃⟮⍘-ď (ï⟯-$)*2-1)}+`                      // & +[- repeated 2$-1 times]+
                                 +Ⅰ$;                  // & | repeated $ times
                                                       // PHASE 2
                                     ï⅋                // if ï>0
                                       ᵖ               // push to stack 2 items:
                                        Ⅰï+⬭+Ⅰï,      // | repeated $ times & [space] & | repeated $ times
                                                 Ⅱ*2+1 // and - repeated 2ï+1
                                                       // implicit stack output, newline-separated

NOTA: questo fa uso di buoni vecchi blocchi di copia per raggiungere i punti in cui la normale dichiarazione delle variabili non poteva raggiungere.


0

Sed, 97 byte (81 caratteri)

(96 byte (80 caratteri) codice + 1 carattere opzione riga di comando)

s/.(.*)/2&\13/
t
:
H
s/(.+)11(.+)/4\1\24/
t
y/1234/─╨╨╨/
H
g
s/\n//
y/1234/═╔╗║/

Ingresso previsto come unario numero intero .

Esecuzione di esempio:

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< '1111111'
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< '1'
╔═╗
╨─╨

bash-4.3$ sed -r 's/.(.*)/2&\13/;t;:;H;s/(.+)11(.+)/4\1\24/;t;y/1234/─╨╨╨/;H;g;s/\n//;y/1234/═╔╗║/' <<< ''

Sed, 105 byte (75 caratteri)

(104 byte (74 caratteri) codice + 1 carattere opzione riga di comando)

y/1/═/
s/.(.*)/╔&\1╗/
t
:
H
s/(.+)══(.+)/║\1\2║/
t
y/╔║╗═/╨╨╨─/
H
g
s/\n//

Ingresso previsto come unario numero intero .

Esecuzione di esempio:

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< '1111111'
╔═════════════╗
║╔═══════════╗║
║║╔═════════╗║║
║║║╔═══════╗║║║
║║║║╔═════╗║║║║
║║║║║╔═══╗║║║║║
║║║║║║╔═╗║║║║║║
╨╨╨╨╨╨╨─╨╨╨╨╨╨╨

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< '1'
╔═╗
╨─╨

bash-4.3$ sed -r 'y/1/═/;s/.(.*)/╔&\1╗/;t;:;H;s/(.+)══(.+)/║\1\2║/;t;y/╔║╗═/╨╨╨─/;H;g;s/\n//' <<< ''

0

Tela , 15 byte

-*+∔]⤢:↷±n│L-×∔

Provalo qui!

Spiegazione:

{    ]            map over 1..input
 -*                 repeat "-" counter times
   +∔               append "+" to that
      ⤢           transpose
       :          create a duplicate of that
        ↷±        rotated 90°, then reversed horizontally
          n       overlap the 2
           |      and palindromize horizontally with 1 overlap
            L     get the with of that
             -×   repear "-" that many times
               ∔  and add vertically to the rest of the output
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.