Konstruuj łuki ASCII

17

Lubię sztukę ascii i bardzo się nudzę, więc znalazłem kilka postaci ascii i zacząłem tworzyć losowe rzeczy, 8-bitowy zamek mario, labirynty i łuki. Przekonałem się, że łuki można łatwo układać w porządny sposób.

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

Wyzwanie

Utwórz program, funkcję lub inny standardowy format, który akceptuje liczbę całkowitą większą lub równą 0 (chyba że robisz bonus) i wyświetla ascii art z określoną liczbą łuków.

Przypadki testowe

Wejście:

7

Wynik:

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

Alt:

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

Wejście:

1

Wynik:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Jeśli liczba całkowita wynosi 0, to nie wypisuj niczego
  • To pytanie będzie w UTF-8, każdy znak będzie liczony jako „bajt”
  • To jest więc wygrywa najkrótsza odpowiedź.
  • Możesz użyć +-+zamiast zamiast ╔═╗, ---zamiast ╨─╨i |zamiast

Bonus (nie zdecydowałem, czy zezwolić na to w alternatywnej wersji, ponieważ nie byłoby to tak trudne)

-10%, jeśli program obsługuje liczby ujemne i odwraca łuki w ten sposób

╥╥╥╥─╥╥╥╥
║║║╚═╝║║║
║║╚═══╝║║
║╚═════╝║
╚═══════╝
JuanPotato
źródło
3
AFAIK to nie są znaki ASCII. unicode-art
wada
welp, @flawr masz rację. Co teraz ...
JuanPotato,
Świat się zawali! Nie martw się, może po prostu wspomnij, że nie są one częścią standardowego kodu ASCII, ale tag ascii-art nadal obowiązuje (tag unicode był żartem).
flawr
Wygląda to na rozszerzony ASCII, więc prawdopodobnie nic ci nie jest.
Mama Fun Roll
2
@ ՊՓԼՃՐՊՃՈԲՍԼ Nie ma standardowej wersji rozszerzonego ASCII en.wikipedia.org/wiki/Extended_ASCII Najbliższą rzeczą jest strona kodowa 437 en.wikipedia.org/wiki/Code_page_437, która była standardem w USA i wielu innych krajach, ale znajduję, kiedy ja skopiuj i wklej to do edytora strony kodowej 437 i z powrotem do systemu Windows „interpretuje” jako łuki z +---+górą, bokami |i dolną częścią, -----które dla mnie wyglądają dobrze. Juanpotato, jeśli chcesz używać znaków innych niż ascii, podaj kodowanie w pytaniu. W tej chwili głosuję za zamknięciem jako niejasne.
Level River St

Odpowiedzi:

1

CJam, 59 bajtów

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

Wypróbuj tutaj!

Lynn
źródło
Możesz teraz użyć + - | aby zbudować łuki, patrz przykłady.
JuanPotato,
2

Python 2, 106 bajtów (94 znaków)

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

Całkiem proste. Drukuje linia po linii ze zmieniającą się liczbą poziomych i pionowych pasków. Ostatni wiersz jest drukowany osobno.

Czuję, że brakuje mi optymalizacji. Fakt, że znaki są wielobajtowe, oznacza, że ​​nie możesz zrobić czegoś takiego '║╨'[n>0], więc nie znalazłem dobrego sposobu na wydrukowanie ostatniej linii w pętli. To brzydkie, że z licznikiem dzieje się tak wiele manipulacji. Chciałbym aktualizować ciągi bezpośrednio, jak s+='║', ale indeks jest również używany do poziomych pasków.

xnor
źródło
Możesz teraz użyć +-|do budowy łuków, patrz przykłady.
JuanPotato,
2
@JuanPotato OP oznacza oryginalny plakat. Masz na myśli pytanie?
Addison Crump
1
@flagasspam tak, właśnie widziałem zastosowania, w których oznacza oryginalny post
JuanPotato,
2

Perl, 78 82 znaków

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

Niestety nie mogłem znaleźć sposobu na skorzystanie z bonusu bez zwiększenia rozmiaru o więcej niż 10%. Mogę jeszcze zwyciężyć.

Bez golfa

Naprawdę całkiem proste. Zwiększa ╨$n╨stopniowo dolną linię ( ), jednocześnie skracając górną linię ( ══) o dwa znaki, kończąc się, gdy nie można jej już skrócić, więc nie muszę zadzierać z licznikami.

 $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
źródło
Myślę, że to wypisuje jeden dla n = 0, ale nie powinno nic drukować.
Lynn
@ Mauris Właśnie go uruchomiłem i masz rację
JuanPotato,
1
@Mauris Dang! Masz całkowitą rację. Moja oryginalna wersja była w porządku, ale gdzieś wzdłuż linii zgubiłem czek. Naprawiono, kosztem 4 znaków. Dzięki za wykrycie tego.
type_outcast 11.01.16
Wiem, że to jest stare, ale aby dodać do komentarza @ Abigail, możesz także zaoszczędzić bajty -n: Wypróbuj online!
Dom Hastings,
1

Bash, 124 bajty (112 znaków)

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

Przykładowy przebieg:

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

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

bash-4.3$ bash ascii-arch.sh 0
człowiek w pracy
źródło
1

Japt -R , 29 bajtów

Używa +i -. Poświęcono 4 bajty, aby poradzić sobie z cholerną weryfikacją danych wejściowych!

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

Spróbuj


Wyjaśnienie

                                  :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
Kudłaty
źródło
nie działa na wejściu0
dzaima
@dzaima, co masz na myśli? Jak możesz mieć łuk wielkości 0?
Kudłaty
If the integer is 0 then don't output anythingz wyzwania: /
dzaima
@dzaima, Oh, tęskniłem za tym. Dzięki. Po pierwsze: Boo-urny do sprawdzania poprawności danych wejściowych! Po drugie, nie można wyjściowy Japt nic - mogłem wyjście 0, falselub pusty ciąg kosztem niektórych bajtów, ale nie wiem, czy któryś z tych byłoby dopuszczalne z wyjątkiem, być może, pusty ciąg znaków, który kosztował mnie 5 bajtów ( 0kosztowałoby mnie to tylko 1).
Kudłaty
0

JavaScript (ES6), 101 znaków

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

Wyjaśnienie

Funkcja rekurencyjna, która drukuje każdą linię

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

Test nie używa domyślnego parametru do kompatybilności przeglądarki.

użytkownik 81655
źródło
0

PHP (109 znaków)

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

Nadal muszę pozbyć się tego str_repeat, ale większość alternatyw nie obsługuje znaków 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
źródło
0

Siatkówka , 79 znaków

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

Wypróbuj online.

Wykorzystuje nową funkcję Retina, która zastępuje liczbę dziesiętną \d+listą tylu znaków $0$*═.

Cyfrowa trauma
źródło
0

Swift (209 bajtów)

Prawdopodobnie Swift nie jest najlepszym językiem do tego, po raz pierwszy próbuję zrobić wyzwanie w golfa kodowego:

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
źródło
0

Rubinowy, 90 bajtów (74 znaków)

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

Przykładowy przebieg:

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 
człowiek w pracy
źródło
0

Haskell, 151 162 bajtów

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

Edycja: zapomniałem traktować 0jako dane wejściowe

basile-henry
źródło
0

𝔼𝕊𝕄𝕚𝕟, 54 znaki / 95 bajtów

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

Try it here (Firefox only).

Wyjaśnienie

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

UWAGA: wykorzystuje to dobre bloki kopiowania, aby dotrzeć do miejsc, w których zwykła zmienna deklarująca nie mogła dotrzeć.

Mama Fun Roll
źródło
0

Sed, 97 bajtów (81 znaków)

(Kod 96 bajtów (80 znaków) + opcja wiersza poleceń 1 znak)

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

Wejście oczekiwać jako jednoskładnikowa liczba całkowita .

Przykładowy przebieg:

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 bajtów (75 znaków)

(Kod 104 bajty (74 znaki) + opcja wiersza poleceń 1 znak)

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

Wejście oczekiwać jako jednoskładnikowa liczba całkowita .

Przykładowy przebieg:

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//' <<< ''
człowiek w pracy
źródło
0

Płótno , 15 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

{    ]            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
źródło