Construire des arcs ASCII

17

J'aime l'art ascii et je m'ennuie beaucoup, alors j'ai trouvé des personnages ascii et j'ai commencé à faire des choses au hasard, un château mario 8 bits, des labyrinthes et des arches. J'ai trouvé que les arches pouvaient facilement être empilées de manière ordonnée.

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

Défi

Créez un programme, une fonction ou tout autre format standard qui accepte un entier supérieur ou égal à 0 (sauf si vous faites le bonus) et génère de l'art ascii avec le nombre d'arches spécifié.

Cas de test

Contribution:

7

Production:

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

Alt:

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

Contribution:

1

Production:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Si l'entier est 0 alors ne rien afficher
  • Cette question sera en utf-8, chaque caractère comptera comme un "octet"
  • Il s'agit de donc la réponse la plus courte l'emporte.
  • Vous avez la possibilité d'utiliser +-+au lieu de ╔═╗, ---au lieu de ╨─╨et |au lieu de

Bonus (pas décidé d'autoriser cela sur la version alternative car ce ne serait pas aussi difficile)

-10% si le programme prend en charge les nombres négatifs et retourne les arcs comme ça

╥╥╥╥─╥╥╥╥
║║║╚═╝║║║
║║╚═══╝║║
║╚═════╝║
╚═══════╝
JuanPotato
la source
3
AFAIK ce ne sont pas des caractères ASCII. unicode-art
flawr
welp, @flawr vous avez raison. Et maintenant ...
JuanPotato
Le monde va s'effondrer! Ne vous inquiétez pas, mentionnez peut-être simplement qu'ils ne font pas partie de l'ASCII standard, mais la balise ascii-art s'applique toujours (la balise unicode était une blague.)
flawr
Cela ressemble à de l'ASCII étendu, donc vous êtes probablement d'accord.
Mama Fun Roll
2
@ ՊՓԼՃՐՊՃՈԲՍԼ Il n'y a pas de version standard de l'ASCII étendu en.wikipedia.org/wiki/Extended_ASCII La chose la plus proche est la page de codes 437 en.wikipedia.org/wiki/Code_page_437 qui était standard aux États-Unis et dans de nombreux autres pays mais je trouve quand je copiez et collez cela dans un éditeur de page de code 437 et de nouveau dans Windows, il "interprète" comme des arcs avec +---+en haut, sur les côtés |et en bas -----qui me semble bien. Juanpotato, si vous souhaitez utiliser des caractères non-ascii, veuillez indiquer l'encodage dans la question. Dans l'état actuel des choses, je vote pour clore car pas clair.
Level River St

Réponses:

1

CJam, 59 octets

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

Essayez-le ici!

Lynn
la source
Vous pouvez maintenant utiliser + - | pour construire les arches, voir op pour des exemples.
JuanPotato
2

Python 2, 106 octets (94 caractères)

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

Assez simple. Imprime ligne par ligne avec un nombre variable de barres horizontales et verticales. La dernière ligne est imprimée séparément.

J'ai l'impression de manquer quelques optimisations. Le fait que les caractères soient sur plusieurs octets signifie que vous ne pouvez pas faire quelque chose comme ça '║╨'[n>0], donc je n'ai pas trouvé un bon moyen d'imprimer la dernière ligne de la boucle. C'est moche qu'il y ait tellement de manipulation en cours avec le compteur. J'aimerais mettre à jour les chaînes directement, comme s+='║', mais l'index est également utilisé pour les barres horizontales.

xnor
la source
Vous pouvez maintenant utiliser +-|pour construire les arches, voir op pour des exemples.
JuanPotato
2
@JuanPotato OP signifie affiche originale. Voulez-vous dire la question?
Addison Crump
1
@flagasspam oui, je viens de voir des utilisations où cela signifie un post original
JuanPotato
2

Perl, 78 82 caractères

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

Malheureusement, je ne pouvais pas trouver un moyen de profiter du bonus sans augmenter la taille de plus de 10%. Je peux peut-être encore l'emporter.

Non golfé

Assez simple, vraiment. Construit la ligne du bas ( ╨$n╨) progressivement, tout en raccourcissant la ligne du haut ( ══) de deux caractères, se terminant lorsqu'elle ne peut plus être raccourcie, donc je n'ai pas à jouer avec les compteurs.

 $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
type_outcast
la source
Je pense que cela imprime un seul pour n = 0, mais il ne devrait rien imprimer.
Lynn
@Mauris Je viens de l'exécuter et vous avez raison
JuanPotato
1
@Mauris Dang! Vous avez absolument raison. Ma version originale allait bien, mais quelque part le long de la ligne, j'ai perdu le chèque. Fixe, au prix de 4 caractères. Merci d'avoir repéré ça.
type_outcast
Je sais que c'est vieux, mais pour ajouter au commentaire de @ Abigail, vous pouvez également économiser des octets en utilisant -n: Essayez-le en ligne!
Dom Hastings
1

Bash, 124 octets (112 caractères)

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

Exemple d'exécution:

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

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

bash-4.3$ bash ascii-arch.sh 0
homme au travail
la source
1

Japt -R , 29 octets

Utilise +& -. Sacrifié 4 octets pour gérer la validation d'entrée sanglante !

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

Essayez-le


Explication

                                  :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
Hirsute
la source
échoue sur l'entrée0
dzaima
@dzaima, que voulez-vous dire? Comment pouvez-vous avoir un arc de taille 0?
Shaggy
If the integer is 0 then don't output anythingdu défi: /
dzaima
@dzaima, Oh, ça m'a manqué. Merci. Tout d'abord: Boo-urns pour entrer la validation! Deuxièmement, Japt ne peut rien produire - je pourrais produire 0,false ou une chaîne vide au prix de quelques octets, mais je ne sais pas si l'une d'entre elles serait acceptable sauf, peut-être, la chaîne vide, qui me coûterait 5 octets ( 0me coûterait seulement 1).
Shaggy
0

JavaScript (ES6), 101 caractères

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

Explication

Fonction récursive qui imprime chaque ligne

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

Tester

Le test n'utilise pas de paramètre par défaut pour la compatibilité du navigateur.

user81655
la source
0

PHP (109 caractères)

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

Il faut encore se débarrasser de ce str_repeat mais la plupart des alternatives ne gèreront pas les caractères 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;
mk8374876
la source
0

Retina , 79 caractères

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

Essayez-le en ligne.

Cela utilise une nouvelle fonctionnalité dans Retina qui remplace un nombre décimal \d+par une liste de ce nombre de caractères $0$*═.

Traumatisme numérique
la source
0

Swift (209 octets)

Swift n'est probablement pas le meilleur langage pour cela, c'est ma première fois que je tente de relever un défi de golf de code:

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)
genesisxyz
la source
0

Ruby, 90 octets (74 caractères)

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

Exemple d'exécution:

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 
homme au travail
la source
0

Haskell, 151 162 octets

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: j'ai oublié de traiter 0comme entrée

basile-henry
la source
0

𝔼𝕊𝕄𝕚𝕟, 54 caractères / 95 octets

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

Try it here (Firefox only).

Explication

⩥ïⓜᵖ⟮ ⍘|ď⟯$+`+⦃⟮⍘-ď (ï⟯-$)*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

REMARQUE: cela utilise de bons vieux blocs de copie pour atteindre les endroits où la déclaration de variable ordinaire ne peut pas atteindre.

Mama Fun Roll
la source
0

Sed, 97 octets (81 caractères)

(Code de 96 octets (80 caractères) + option de ligne de commande de 1 caractère)

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

Entrée attendue comme unaire entier .

Exemple d'exécution:

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 octets (75 caractères)

(Code de 104 octets (74 caractères) + option de ligne de commande de 1 caractère)

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

Entrée attendue comme unaire entier .

Exemple d'exécution:

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//' <<< ''
homme au travail
la source
0

Toile , 15 octets

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

Essayez-le ici!

Explication:

{    ]            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
dzaima
la source