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.