Xây dựng vòm ASCII


17

Tôi thích nghệ thuật ascii và tôi cảm thấy buồn chán rất nhiều, vì vậy tôi đã tìm thấy một số nhân vật ascii và bắt đầu tạo ra những thứ ngẫu nhiên, lâu đài mario 8 bit, mê cung và vòm. Tôi thấy rằng các vòm có thể dễ dàng được xếp chồng lên nhau một cách gọn gàng.

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

Thử thách

Tạo một chương trình, hàm hoặc bất kỳ định dạng tiêu chuẩn nào khác chấp nhận số nguyên lớn hơn hoặc bằng 0 (trừ khi bạn đang thực hiện phần thưởng) và xuất ra nghệ thuật ascii với số lượng vòm được chỉ định.

Các trường hợp thử nghiệm

Đầu vào:

7

Đầu ra:

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

Alt:

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

Đầu vào:

1

Đầu ra:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • Nếu số nguyên bằng 0 thì không xuất bất cứ thứ gì
  • Câu hỏi này sẽ có trong utf-8, mỗi ký tự sẽ được tính là "byte"
  • Đây là nên câu trả lời ngắn nhất sẽ thắng.
  • Bạn có tùy chọn sử dụng +-+thay vì ╔═╗, ---thay vì ╨─╨|thay vì

Phần thưởng (không quyết định có cho phép điều này trên phiên bản thay thế hay không vì nó sẽ khó như vậy)

-10% nếu chương trình hỗ trợ số âm và lật các vòm như vậy

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

3
AFAIK không phải là ký tự ASCII. unicode-art
flawr

Welp, @flawr bạn đúng. Bây giờ thì sao ...
JuanPotato

Thế giới sẽ sụp đổ! Đừng lo lắng, có lẽ chỉ cần đề cập rằng chúng không phải là một phần của tiêu chuẩn ASCII, nhưng thẻ ascii-art vẫn được áp dụng (thẻ unicode là một trò đùa.)
flawr

Tuy nhiên, điều đó trông giống như ASCII mở rộng, vì vậy bạn có thể ổn.
Mama Fun Roll

2
@ Không có phiên bản tiêu chuẩn của ASCII mở rộng en.wikipedia.org/wiki/Extends_ASCII Điều gần nhất là codepage 437 en.wikipedia.org/wiki/Code_page_437 là tiêu chuẩn ở Hoa Kỳ và nhiều quốc gia khác nhưng tôi tìm thấy khi tôi sao chép và dán nó vào một trình soạn thảo codepage 437 và quay lại vào các cửa sổ, nó "diễn giải" như các vòm với +---+ở trên cùng, các cạnh |và một đáy của -----nó trông ổn đối với tôi. Juanpotato, nếu bạn muốn sử dụng các ký tự không phải mã ascii, vui lòng cho biết mã hóa trong câu hỏi. Vì hiện tại tôi đang bỏ phiếu để đóng là không rõ ràng.
Cấp sông St

Câu trả lời:



2

Python 2, 106 byte (94 ký tự)

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

Khá đơn giản. In từng dòng với số lượng thanh ngang và dọc thay đổi. Dòng cuối cùng được in riêng.

Tôi cảm thấy như tôi đang thiếu một số tối ưu hóa. Thực tế là các ký tự có nhiều byte có nghĩa là bạn không thể làm điều gì đó giống như '║╨'[n>0]vậy, vì vậy tôi đã không tìm thấy một cách hay để in dòng cuối cùng trong vòng lặp. Thật xấu xí khi có quá nhiều thao túng xảy ra với quầy. Tôi muốn cập nhật chuỗi trực tiếp, thích s+='║', nhưng chỉ mục cũng được sử dụng cho các thanh ngang.


Bây giờ bạn có thể sử dụng +-|để xây dựng các vòm, xem op cho ví dụ.
JuanPotato

2
@JuanPotato OP là viết tắt của poster gốc. Ý bạn là câu hỏi?
Addison Crump

1
@flagasspam vâng, tôi vừa thấy sử dụng có nghĩa là bài gốc
JuanPotato

2

Perl, 78 82 ký tự

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

Đáng buồn thay, tôi không thể tìm ra cách tận dụng lợi thế của tiền thưởng mà không tăng kích thước hơn 10%. Tôi có thể thắng thế.

Bị đánh cắp

Khá đơn giản, thực sự. Xây dựng dòng dưới cùng ( ╨$n╨) tăng dần, trong khi rút ngắn dòng trên cùng ( ══) bằng hai ký tự, kết thúc khi không thể rút ngắn được nữa, vì vậy tôi không phải lộn xộn với bộ đếm.

 $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

Tôi nghĩ rằng điều này in một đơn cho n = 0, nhưng nó sẽ không in gì cả.
Lynn

@Mauris Tôi vừa chạy nó và bạn đã đúng
JuanPotato

1
@Mauris Đăng! Bạn hoàn toàn đúng. Phiên bản gốc của tôi vẫn ổn, nhưng đâu đó dọc theo dòng tôi đã mất kiểm tra. Đã sửa, với giá 4 ký tự. Cảm ơn vì đã phát hiện ra điều đó.
gõ vào

Tôi biết điều này đã cũ, nhưng để thêm vào nhận xét của @ Abigail, bạn cũng có thể lưu byte bằng cách sử dụng -n: Hãy thử trực tuyến!
Dom Hastings

1

Bash, 124 byte (112 ký tự)

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

Chạy mẫu:

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 byte

Sử dụng +& -. Hy sinh 4 byte để xử lý xác nhận đầu vào đẫm máu !

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

Thử nó


Giải trình

                                  :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

thất bại ở đầu vào0
dzaima 11/07/18

@dzaima, ý bạn là gì? Làm thế nào bạn có thể có một vòm kích thước 0?
Shaggy

If the integer is 0 then don't output anythingtừ thử thách: /
dzaima

@dzaima, ồ, tôi nhớ rồi. Cảm ơn. Trước hết: Boo-urns để xác nhận đầu vào! Thứ hai, Japt không thể xuất ra bất cứ thứ gì - tôi có thể xuất ra 0, falsehoặc một chuỗi trống với chi phí một số byte nhưng tôi không biết liệu có bất kỳ chuỗi nào có thể chấp nhận được không, ngoại trừ, chuỗi trống, sẽ khiến tôi mất 5 byte ( 0sẽ chỉ tốn 1).
Shaggy

0

JavaScript (ES6), 101 ký tự

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

Giải trình

Hàm đệ quy in từng dòng

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

Kiểm tra

Kiểm tra không sử dụng tham số mặc định cho khả năng tương thích trình duyệt.


0

PHP (109 ký tự)

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

Vẫn cần phải loại bỏ chuỗi đó, nhưng hầu hết các lựa chọn thay thế sẽ không xử lý các ký tự 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

Swift (209 byte)

Có lẽ Swift không phải là ngôn ngữ tốt nhất cho việc này, đây là lần đầu tiên tôi thử thực hiện một thử thách golf mã:

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 byte (74 ký tự)

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

Chạy mẫu:

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

Chỉnh sửa: Tôi quên đối phó với 0đầu vào


0

, 54 ký tự / 95 byte

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

Try it here (Firefox only).

Giải trình

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

LƯU Ý: điều này sử dụng các khối sao chép ol 'tốt để có được tại các điểm mà khai báo biến thông thường không thể đạt tới.


0

Sed, 97 byte (81 ký tự)

(96 byte (80 ký tự) mã + tùy chọn dòng lệnh 1 ký tự)

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

Đầu vào dự kiến ​​là số nguyên đơn nguyên.

Chạy mẫu:

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 ký tự)

(104 byte (74 ký tự) mã + tùy chọn dòng lệnh 1 ký tự)

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

Đầu vào dự kiến ​​là số nguyên đơn nguyên.

Chạy mẫu:

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 byte

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

Hãy thử nó ở đây!

Giải trình:

{    ]            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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.