Bangun lengkungan ASCII

17

Saya suka seni ascii dan saya sangat bosan, jadi saya menemukan beberapa karakter ascii dan mulai membuat hal-hal acak, kastil mario 8-bit, labirin, dan lengkungan. Saya menemukan bahwa lengkungan dapat dengan mudah ditumpuk dengan rapi.

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

Tantangan

Buat program, fungsi, atau format standar lainnya yang menerima bilangan bulat yang lebih besar dari atau sama dengan 0 (kecuali jika Anda melakukan bonus) dan menghasilkan ascii art dengan jumlah lengkungan yang ditentukan.

Uji Kasus

Memasukkan:

7

Keluaran:

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

Alt:

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

Memasukkan:

1

Keluaran:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Jika bilangan bulat 0 maka jangan output apa pun
  • Pertanyaan ini akan berada di utf-8, setiap karakter akan dihitung sebagai "byte"
  • Ini sehingga jawaban terpendek menang.
  • Anda memiliki opsi untuk menggunakan +-+alih- alih ╔═╗, ---alih-alih ╨─╨, dan |bukannya

Bonus (tidak memutuskan apakah akan mengizinkan ini pada versi alternatif karena itu tidak akan sulit)

-10% jika program mendukung angka negatif dan membalik lengkungan seperti itu

╥╥╥╥─╥╥╥╥
║║║╚═╝║║║
║║╚═══╝║║
║╚═════╝║
╚═══════╝
JuanPotato
sumber
3
AFAIK itu bukan karakter ASCII. unicode-art
flawr
welp, @ flawr kamu benar. Apa sekarang ...
JuanPotato
Dunia akan runtuh! Jangan khawatir, mungkin hanya menyebutkan bahwa mereka bukan bagian dari ASCII standar, tetapi tag ascii-art masih berlaku (tag-unicode adalah sebuah lelucon.)
flawr
Tapi sepertinya ASCII diperpanjang, jadi Anda mungkin baik-baik saja.
Mama Fun Roll
2
@ ՊՓԼՃՐՊՃՈԲՍԼ ada versi standar ASCII diperpanjang en.wikipedia.org/wiki/Extended_ASCII Hal yang paling dekat ada adalah codepage 437 en.wikipedia.org/wiki/Code_page_437 yang standar di Amerika Serikat dan banyak negara lain tapi saya merasa ketika saya salin dan tempel ini ke dalam editor codepage 437 dan kembali ke windows "ditafsirkan" sebagai lengkungan dengan +---+di bagian atas, sisi |dan bagian bawah -----yang terlihat baik bagi saya. Juanpotato, jika Anda ingin menggunakan karakter non-ascii, harap tunjukkan penyandian dalam pertanyaan. Saat berdiri aku memilih untuk menutup sebagai tidak jelas.
Level River St

Jawaban:

1

CJam, 59 byte

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

Coba di sini!

Lynn
sumber
Anda sekarang dapat menggunakan + - | untuk membangun lengkungan, lihat op untuk contoh.
JuanPotato
2

Python 2, 106 byte (94 karakter)

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

Cukup mudah. Mencetak baris demi baris dengan jumlah batang horizontal dan vertikal yang terus berubah. Baris terakhir dicetak secara terpisah.

Saya merasa seperti kehilangan beberapa optimasi. Fakta bahwa chars adalah beberapa byte berarti Anda tidak dapat melakukan sesuatu seperti '║╨'[n>0], jadi saya tidak menemukan cara yang baik untuk mencetak baris terakhir dalam loop. Sangat jelek bahwa ada begitu banyak manipulasi yang terjadi dengan konter. Saya ingin memperbarui string secara langsung s+='║', tetapi indeks juga digunakan untuk bilah horizontal.

Tidak
sumber
Anda sekarang dapat menggunakan +-|untuk membangun lengkungan, lihat op untuk contoh.
JuanPotato
2
@JuanPotato OP adalah singkatan dari poster asli. Apakah maksud Anda pertanyaan itu?
Addison Crump
1
@ flagasspam ya, saya baru saja melihat kegunaan mana artinya posting asli
JuanPotato
2

Perl, 78 82 karakter

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

Sayangnya, saya tidak bisa menemukan cara untuk mengambil keuntungan dari bonus tanpa meningkatkan ukuran lebih dari 10%. Saya mungkin belum menang.

Tidak disatukan

Sangat mudah, sungguh. Membangun garis bawah (╨$n╨ ) secara bertahap, sementara memperpendek garis atas ( ══) dengan dua karakter, berakhir ketika tidak dapat lagi dipersingkat, jadi saya tidak perlu mengacaukan penghitung.

 $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
sumber
Saya pikir ini mencetak satu untuk n = 0, tetapi seharusnya tidak mencetak apa pun.
Lynn
@Mauris Saya baru saja menjalankannya dan Anda benar
JuanPotato
1
@Mauris Dang! Anda benar sekali. Versi asli saya baik-baik saja, tetapi di suatu tempat saya kehilangan cek. Tetap, dengan biaya 4 karakter. Terima kasih telah melihatnya.
type_outcast
Saya tahu ini sudah tua, tetapi untuk menambahkan komentar @ Abigail, Anda juga dapat menyimpan byte menggunakan -n: Coba online!
Dom Hastings
1

Bash, 124 byte (112 karakter)

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

Contoh dijalankan:

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

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

bash-4.3$ bash ascii-arch.sh 0
manatwork
sumber
1

Japt -R , 29 byte

Penggunaan +& -. Mengorbankan 4 byte untuk menangani validasi input berdarah !

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

Cobalah


Penjelasan

                                  :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
Shaggy
sumber
gagal pada input0
dzaima
@zaza, apa maksudmu? Bagaimana Anda bisa memiliki lengkungan ukuran 0?
Shaggy
If the integer is 0 then don't output anythingdari tantangan: /
dzaima
@zaima, Oh, aku merindukan itu. Terima kasih. Pertama-tama: Boo-guci untuk memasukkan validasi! Kedua, Japt tidak dapat menghasilkan apa-apa - saya bisa menampilkan 0, falseatau string kosong dengan biaya beberapa byte tetapi saya tidak tahu apakah ada di antara mereka yang dapat diterima kecuali, mungkin, string kosong, yang akan menelan biaya 5 byte ( 0hanya akan dikenakan biaya 1).
Shaggy
0

JavaScript (ES6), 101 karakter

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

Penjelasan

Fungsi rekursif yang mencetak setiap baris

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

Uji

Tes tidak menggunakan parameter default untuk kompatibilitas browser.

pengguna81655
sumber
0

PHP (109 karakter)

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

Masih perlu menyingkirkan str_repeat itu, tetapi sebagian besar alternatif tidak akan menangani karakter 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
sumber
0

Retina , 79 karakter

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

Cobalah online.

Ini menggunakan fitur baru di Retina yang menggantikan angka desimal \d+dengan daftar karakter sebanyak itu $0$*═.

Trauma Digital
sumber
0

Swift (209 byte)

Mungkin Swift bukan bahasa terbaik untuk ini, ini adalah pertama kalinya saya mencoba melakukan tantangan kode golf:

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
sumber
0

Ruby, 90 byte (74 karakter)

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

Contoh dijalankan:

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 
manatwork
sumber
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

Sunting: Saya lupa berurusan 0sebagai masukan

basile-henry
sumber
0

𝔼𝕊𝕄𝕚𝕟, 54 karakter / 95 byte

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

Try it here (Firefox only).

Penjelasan

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

CATATAN: ini menggunakan blok salinan yang baik untuk mendapatkan di tempat di mana variabel biasa menyatakan tidak dapat mencapai.

Mama Fun Roll
sumber
0

Sed, 97 byte (81 karakter)

(96 byte (80 karakter) kode + 1 opsi baris perintah karakter)

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

Input diharapkan sebagai unary bilangan bulat .

Contoh dijalankan:

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

(104 byte (74 karakter) kode + 1 opsi baris perintah karakter)

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

Input diharapkan sebagai bilangan bulat unary .

Contoh dijalankan:

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//' <<< ''
manatwork
sumber
0

Kanvas , 15 byte

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

Coba di sini!

Penjelasan:

{    ]            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
sumber