Construir arcos ASCII


17

Eu gosto de arte ascii e fico muito entediado, então encontrei alguns personagens ascii e comecei a fazer coisas aleatórias, castelo mario de 8 bits, labirintos e arcos. Descobri que os arcos podiam ser facilmente empilhados de maneira organizada.

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

Desafio

Crie um programa, função ou qualquer outro formato padrão que aceite um número inteiro maior ou igual a 0 (a menos que você esteja fazendo o bônus) e produza arte ascii com a quantidade de arcos especificada.

Casos de teste

Entrada:

7

Resultado:

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

Alt:

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

Entrada:

1

Resultado:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Se o número inteiro for 0, não produza nada
  • Esta pergunta estará no utf-8, cada caractere contará como um "byte"
  • Este é um então a resposta mais curta vence.
  • Você tem a opção de usar em +-+vez de ╔═╗, em ---vez de ╨─╨e em |vez de

Bônus (não decidido se é permitido permitir isso na versão alternativa porque não seria tão difícil)

-10% se o programa suportar números negativos e virar os arcos da seguinte maneira

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

3
AFAIK esses não são caracteres ASCII. unicode-art
flawr

welp, @flawr você está certo. E agora ...
JuanPotato

O mundo está entrando em colapso! Não se preocupe, talvez apenas mencionar que eles não fazem parte do padrão ASCII, mas a tag ascii-art ainda se aplica (o unicode-tag era uma piada.)
flawr

Parece um ASCII estendido, então você provavelmente está bem.
Mama Fun Roll

2
@ ՊՓԼՃՐՊՃՈԲՍԼ Não há versão padrão do ASCII estendido en.wikipedia.org/wiki/Extended_ASCII O mais próximo é a página de código 437 en.wikipedia.org/wiki/Code_page_437, que era padrão nos EUA e em muitos outros países, mas acho que quando copie e cole isso em um editor da página de códigos 437 e de volta para as janelas que ele "interpreta" como arcos +---+na parte superior, nas laterais |e na parte inferior da -----qual me parece bem. Juanpotato, se você quiser usar caracteres não-ascii, indique a codificação na pergunta. No momento, estou votando para fechar como pouco claro.
Level River St

Respostas:


1

CJam, 59 bytes

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

Experimente aqui!


Agora você pode usar + - | para construir os arcos, veja op para exemplos.
JuanPotato

2

Python 2, 106 bytes (94 caracteres)

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

Bem direto. Imprime linha por linha com um número variável de barras horizontais e verticais. A última linha é impressa separadamente.

Sinto que estou perdendo algumas otimizações. O fato de os caracteres serem múltiplos bytes significa que você não pode fazer algo assim '║╨'[n>0], então não achei uma boa maneira de imprimir a última linha do loop. É feio que haja tanta manipulação acontecendo com o contador. Eu gostaria de atualizar as strings diretamente, tipo s+='║', mas o índice também é usado para barras horizontais.


Agora você pode usar +-|para construir os arcos, veja op para exemplos.
JuanPotato

2
@JuanPotato OP significa pôster original. Você quer dizer a pergunta?
Addison Crump

11
@flagasspam sim, eu só vi usos onde isso significa postagem original
JuanPotato

2

Perl, 78 82 caracteres

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

Infelizmente, não consegui descobrir uma maneira de aproveitar o bônus sem aumentar o tamanho em mais de 10%. Eu ainda posso prevalecer.

Ungolfed

Bem simples, realmente. Constrói a linha inferior ( ╨$n╨) incrementalmente, enquanto reduz a linha superior ( ══) em dois caracteres, terminando quando não pode mais ser reduzida, para que eu não precise mexer nos contadores.

 $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

Eu acho que isso imprime um único para n = 0, mas não deve imprimir nada.
Lynn

@Mauris Eu corri isso e você está correto
JuanPotato

11
@Mauris Dang! Você está absolutamente correto. Minha versão original estava boa, mas em algum momento perdi o cheque. Fixo, ao custo de 4 caracteres. Obrigado por descobrir isso.
type_outcast 11/01/16

Sei que isso é antigo, mas para adicionar ao comentário de @ Abigail, você também pode salvar bytes usando -n: Experimente online!
Dom Hastings

1

Bash, 124 bytes (112 caracteres)

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

Exemplo de execução:

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 bytes

Usa +& -. Sacrificou 4 bytes para lidar com a validação de entrada sangrenta !

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

Tente


Explicação

                                  :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

falha na entrada0
dzaima 11/07

@dzaima, o que você quer dizer? Como você pode ter um arco de tamanho 0?
Shaggy

If the integer is 0 then don't output anythingdo desafio: /
dzaima 11/07/2018

@ Dzaima, Oh, eu senti falta disso. Obrigado. Primeiro de tudo: Boo-urns para inserir validação! Em segundo lugar, o Japt não pode produzir nada - eu poderia produzir 0, falseou uma string vazia a um custo de alguns bytes, mas não sei se alguma seria aceitável, exceto, talvez, a string vazia, que me custaria 5 bytes ( 0me custaria apenas 1).
Shaggy

0

JavaScript (ES6), 101 caracteres

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:""

Explicação

Função recursiva que imprime cada linha

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

Teste

O teste não usa o parâmetro padrão para compatibilidade do navegador.


0

PHP (109 caracteres)

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

Ainda precisamos nos livrar desse str_repeat, mas a maioria das alternativas não trata de caracteres 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 caracteres

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

Experimente online.

Isso usa um novo recurso no Retina que substitui um número decimal \d+por uma lista com tantos caracteres $0$*═.


0

Swift (209 bytes)

Provavelmente o Swift não é o melhor idioma para isso, esta é a minha primeira vez tentando fazer um desafio de código de golfe:

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

Ruby, 90 bytes (74 caracteres)

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

Exemplo de execução:

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 bytes

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

Edit: Eu esqueci de lidar 0como entrada


0

, 54 caracteres / 95 bytes

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

Try it here (Firefox only).

Explicação

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*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: isso faz uso de bons e velhos blocos de cópias para chegar aos pontos onde a declaração da variável comum não pôde alcançar.


0

Sed, 97 bytes (81 caracteres)

(Código de 96 bytes (80 caracteres) + opção de linha de comando de 1 caractere)

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

Entrada esperada como número inteiro unário .

Exemplo de execução:

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 bytes (75 caracteres)

(Código de 104 bytes (74 caracteres) + opção de linha de comando de 1 caractere)

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

Entrada esperada como número inteiro unário .

Exemplo de execução:

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 bytes

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

Experimente aqui!

Explicação:

{    ]            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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.