Konstruieren Sie ASCII-Bögen


17

Ich mag ASCII-Kunst und langweile mich sehr, deshalb habe ich einige ASCII-Charaktere gefunden und angefangen, zufällige Dinge, 8-Bit-Mario-Schlösser, Irrgärten und Bögen zu machen. Ich stellte fest, dass die Bögen leicht ordentlich gestapelt werden konnten.

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

Herausforderung

Erstellen Sie ein Programm, eine Funktion oder ein anderes Standardformat, das eine Ganzzahl größer oder gleich 0 akzeptiert (es sei denn, Sie machen den Bonus) und ASCII-Kunst mit der angegebenen Anzahl von Bögen ausgibt.

Testfälle

Eingang:

7

Ausgabe:

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

Alt:

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

Eingang:

1

Ausgabe:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Wenn die Ganzzahl 0 ist, wird nichts ausgegeben
  • Diese Frage steht in utf-8, jedes Zeichen zählt als "Byte"
  • Das ist also gewinnt die kürzeste Antwort.
  • Sie haben die Möglichkeit, +-+anstelle von ╔═╗, ---anstelle von ╨─╨und |anstelle von zu verwenden

Bonus (nicht entschieden, ob dies in der alternativen Version zulässig ist, da es nicht so schwer wäre)

-10%, wenn das Programm negative Zahlen unterstützt und die Bögen so spiegelt

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

3
AFAIK das sind keine ASCII-Zeichen. Unicode-Kunst
Fehler

welp, @flawr du hast recht. Was jetzt ...
JuanPotato

Die Welt wird zusammenbrechen! Keine Sorge, erwähne vielleicht nur, dass sie nicht Teil des Standard-ASCII sind, aber das ASCII-Tag gilt weiterhin (das Unicode-Tag war ein Witz.)
Fehler

Das sieht allerdings nach erweitertem ASCII aus, also bist du wahrscheinlich in Ordnung.
Mama Fun Roll

2
@ ՊՓԼՃՐՊՃՈԲՍԼ Es gibt keine Standardversion von erweitertem ASCII en.wikipedia.org/wiki/Extended_ASCII. Am nächsten ist die Codepage 437 en.wikipedia.org/wiki/Code_page_437, die in den USA und vielen anderen Ländern Standard war, aber ich finde, wenn ich Kopieren Sie diese in einen Codepage 437-Editor und fügen Sie sie wieder in Windows ein. Sie "interpretiert" sie als Bögen mit +---+oben, an den Seiten |und unten, -----die für mich gut aussehen. Juanpotato, wenn Sie Nicht-ASCII-Zeichen verwenden möchten, geben Sie die Codierung in der Frage an. So wie es aussieht, stimme ich als unklar zu schließen.
Level River St

Antworten:



2

Python 2, 106 Bytes (94 Zeichen)

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

Ziemlich einfach. Druckt Zeile für Zeile mit einer sich ändernden Anzahl horizontaler und vertikaler Balken. Die letzte Zeile wird separat gedruckt.

Ich habe das Gefühl, dass mir einige Optimierungen fehlen. Die Tatsache, dass die Zeichen aus mehreren Bytes bestehen, bedeutet, dass Sie so etwas nicht tun können. Daher '║╨'[n>0]habe ich keinen guten Weg gefunden, um die letzte Zeile in der Schleife zu drucken. Es ist hässlich, dass so viel an der Theke manipuliert wird. Ich würde gerne Strings direkt aktualisieren s+='║', aber der Index wird auch für horizontale Balken verwendet.


Sie können jetzt +-|die Bögen bauen, siehe op für Beispiele.
Juan Potato

2
@ JuanPotato OP steht für Originalposter. Meinst du die Frage?
Addison Crump

1
@flagasspam Ja, ich habe gerade gesehen, wo es bedeutet, Original-Post
JuanPotato

2

Perl, 78 82 Zeichen

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

Leider konnte ich keinen Weg finden, den Bonus zu nutzen, ohne die Größe um mehr als 10% zu erhöhen. Ich kann mich noch durchsetzen.

Ungolfed

Wirklich ziemlich unkompliziert. Baut die untere Zeile ( ╨$n╨) schrittweise auf, während die obere Zeile ( ══) um zwei Zeichen gekürzt wird. Sie endet, wenn sie nicht mehr gekürzt werden kann, sodass ich mich nicht mit Zählern herumschlagen muss.

 $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

Ich denke, dies gibt eine Single für n = 0 aus, aber es sollte nichts ausgeben.
Lynn

@ Mauris Ich habe es gerade ausgeführt und Sie sind richtig
JuanPotato

1
@ Mauris Dang! Du hast absolut recht. Meine ursprüngliche Version war in Ordnung, aber irgendwo auf der Strecke habe ich den Scheck verloren. Behoben, zum Preis von 4 Zeichen. Danke, dass du das gesehen hast.
type_outcast

Ich weiß, dass dies alt ist, aber um @ Abigails Kommentar hinzuzufügen, können Sie auch Bytes speichern, indem Sie Folgendes verwenden -n: Probieren Sie es online aus!
Dom Hastings

1

Bash, 124 Bytes (112 Zeichen)

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

Probelauf:

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

Verwendet +& -. 4 Bytes für die blutige Eingabeüberprüfung geopfert!

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

Versuch es


Erläuterung

                                  :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

schlägt am Eingang fehl0
dzaima

@dzaima, was meinst du? Wie können Sie einen Bogen der Größe 0 haben?
Shaggy

If the integer is 0 then don't output anythingvon der Herausforderung: /
Dzaima

@dzaima, Oh, das habe ich verpasst. Vielen Dank. Zuallererst: Boo-Urnen zur Eingabevalidierung! Zweitens kann Japt nichts ausgeben - ich könnte eine leere Zeichenkette zum Preis von einigen Bytes ausgeben 0, falseaber ich weiß nicht, ob eine davon akzeptabel wäre, außer vielleicht die leere Zeichenkette, die mich 5 Bytes kosten würde ( 0würde mich nur 1 kosten).
Shaggy

0

JavaScript (ES6), 101 Zeichen

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

Erläuterung

Rekursive Funktion, die jede Zeile druckt

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

Prüfung

Test verwendet keine Standardparameter für die Browserkompatibilität.


0

PHP (109 Zeichen)

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

Ich muss diesen str_repeat noch loswerden, aber die meisten Alternativen unterstützen keine mulyibyte-Zeichen.

$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 Zeichen

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

Probieren Sie es online aus.

Hierbei wird eine neue Funktion in Retina verwendet, die eine Dezimalzahl \d+durch eine Liste mit so vielen Zeichen ersetzt $0$*═.


0

Schnell (209 Bytes)

Wahrscheinlich ist Swift nicht die beste Sprache dafür. Ich versuche zum ersten Mal, eine Code-Golf-Challenge durchzuführen:

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 Zeichen)

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

Probelauf:

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: Ich habe vergessen, mich 0als Input zu beschäftigen


0

54 Zeichen / 95 Bytes

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

Try it here (Firefox only).

Erläuterung

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

ANMERKUNG: Hierfür werden gute alte Kopierblöcke verwendet, um an die Stellen zu gelangen, an denen die Deklaration von normalen Variablen nicht möglich war.


0

Sed, 97 Bytes (81 Zeichen)

(96 Byte (80 Zeichen) Code + 1 Zeichen Befehlszeilenoption)

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

Eingabe als unäre Ganzzahl erwartet .

Probelauf:

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 Zeichen)

(104 Byte (74 Zeichen) Code + 1 Zeichen Befehlszeilenoption)

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

Eingabe als unäre Ganzzahl erwartet .

Probelauf:

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

Canvas , 15 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

{    ]            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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.