ASCII 아치 구성


17

나는 아스키 아트를 좋아하고 지루해 졌기 때문에 아스키 캐릭터를 발견하고 8 비트 마리오 성, 미로 및 아치를 무작위로 만들기 시작했습니다. 아치를 깔끔하게 쌓을 수 있다는 것을 알았습니다.

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

도전

0보다 크거나 같은 정수를 허용하고 (보너스를 수행하지 않는 한) 프로그램, 함수 또는 기타 표준 형식을 작성하고 지정된 양의 아치를 사용하여 ASCII 아트를 출력하십시오.

테스트 사례

입력:

7

산출:

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

Alt :

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

입력:

1

산출:

╔═╗
╨─╨

Alt :

+-+
| |
---
  • 정수가 0이면 아무것도 출력하지 않습니다
  • 이 질문은 utf-8이며 각 문자는 "바이트"로 계산됩니다.
  • 이것은 이므로 가장 짧은 답변이 이깁니다.
  • +-+대신 ╔═╗, ---대신 ╨─╨|대신 사용하는 옵션 이 있습니다.

보너스 (대체 버전이 어렵지 않기 때문에 대체 버전에서 허용할지 여부를 결정하지 않음)

프로그램이 음수를 지원하고 아치를 뒤집는 경우 -10 %

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

3
AFAIK는 ASCII 문자가 아닙니다. unicode-art
flawr

웰프, @flawr 당신이 맞아요. 무엇 지금
JuanPotato

세상은 무너질 것입니다! 걱정하지 마십시오. 표준 ASCII의 일부는 아니지만 ASCII 태그가 여전히 적용됩니다 (유니 코드 태그는 농담이었습니다)
flawr

확장 ASCII처럼 보이지만 아마도 괜찮을 것입니다.
Mama Fun Roll

2
@ ՊՓԼՃՐՊՃՈԲՍԼ 확장 ASCII의 표준 버전은 없습니다. en.wikipedia.org/wiki/Extended_ASCII 가장 가까운 것은 코드 페이지 437 en.wikipedia.org/wiki/Code_page_437 입니다. 이것을 코드 페이지 437 편집기에 복사하여 붙여 넣은 다음 창으로 돌아가서 +---+상단, 측면 |및 하단이 아치 모양으로 "해석"됩니다 -----. Juanpotato, ASCII 이외의 문자를 사용하려면 질문에 인코딩을 표시하십시오. 그것이 서있는 것처럼 나는 불확실한 것으로 닫을 투표입니다.
Level River St

답변:



2

Python 2, 106 바이트 (94 자)

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

꽤 직설적 인. 가로 및 세로 막대 수가 변경되면서 한 줄씩 인쇄합니다. 마지막 줄은 별도로 인쇄됩니다.

최적화가 누락 된 것 같습니다. 문자가 여러 바이트라는 사실은와 같은 것을 할 수 없다는 것을 의미 '║╨'[n>0]하므로 루프의 마지막 줄을 인쇄하는 좋은 방법을 찾지 못했습니다. 카운터에서 너무 많은 조작이 진행되는 것은 추악합니다. 과 같이 문자열을 직접 업데이트하고 싶지만 s+='║'색인은 가로 막대에도 사용됩니다.


이제 +-|아치를 만드는 데 사용할 수 있습니다 . 예를 보려면 op를 참조하십시오.
JuanPotato

2
@JuanPotato OP는 원본 포스터를 나타냅니다. 당신은 질문을 의미합니까?
Addison Crump

1
@flagasspam 예, 방금 원래 게시물을 의미하는 용도를 보았습니다
JuanPotato

2

펄, 78 82 자

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

안타깝게도 크기를 10 % 이상 늘리지 않으면 서 보너스를 활용할 수있는 방법을 찾지 못했습니다. 나는 아직 이길 수 있습니다.

언 골프

정말 간단합니다. 하단 줄 ( ╨$n╨)을 점진적으로 늘리면서 상단 줄 ( ══)을 두 문자로 줄이면서 더 이상 줄을 수 없을 때 끝나므로 카운터를 엉망으로 만들 필요가 없습니다.

 $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

나는 이것이 n = 0에 대해 단일 을 인쇄한다고 생각 하지만 아무것도 인쇄하지 않아야합니다.
Lynn

@Mauris 방금 그것을 실행하고 당신이 맞습니다
JuanPotato

1
@Mauris Dang! 당신 말이 맞아요 내 원래 버전은 괜찮 았지만 라인 어딘가에서 확인을 잃었습니다. 4 문자의 비용으로 수정되었습니다. 그것을 발견해 주셔서 감사합니다.
type_outcast

나는 이것이 오래되었다는 것을 알고 있지만 @Abigail의 의견에 추가하려면 다음을 사용하여 바이트를 절약 할 수 -n있습니다. 온라인으로 시도하십시오!
Dom Hastings

1

배쉬, 124 바이트 (112 자)

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

샘플 실행 :

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

apt -R , 29 바이트

+&를 사용합니다 -. 피 묻은 것을 처리하기 위해 4 바이트를 희생 입력 유효성 검사 !

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

시도 해봐


설명

                                  :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

입력 실패0
dzaima

@ dzaima, 무슨 뜻인가요? 크기가 0 인 아치를 어떻게 가질 수 있습니까?
얽히고 설킨

If the integer is 0 then don't output anything도전에서 : /
dzaima

@ dzaima, 오, 나는 그것을 그리워했다. 감사. 우선 : 입력 확인을위한 부런! 둘째, JAPT는 출력하지 아무것도 할 수 - I 출력을 할 수 0, false또는 어떤 바이트의 비용으로 빈 문자열하지만 그 중 하나가 허용 될 경우 나도 몰라 제외하고는, 어쩌면, 빈 문자열은, 어느 날 5 바이트를 요할 것 ( 01 만 비용이들 것입니다).
얽히고 설킨

0

JavaScript (ES6), 101 자

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

설명

각 줄을 인쇄하는 재귀 함수

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

테스트

테스트는 브라우저 호환성을 위해 기본 매개 변수를 사용하지 않습니다.


0

PHP (109 자)

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

여전히 str_repeat를 제거해야하지만 대부분의 대안은 멀티 바이트 문자를 처리하지 않습니다.

$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

스위프트 (209 바이트)

아마도 스위프트 (Swift)는이 언어에 가장 적합한 언어는 아닙니다. 코드 골프 도전을 시도한 것은 이번이 처음입니다.

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

루비, 90 바이트 (74 자)

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

샘플 실행 :

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

하스켈 151 162 바이트

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

편집 : 0입력 으로 처리하는 것을 잊었습니다


0

𝔼𝕊𝕄𝕚𝕟, 54 문자 / 95 바이트

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

Try it here (Firefox only).

설명

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

참고 : 이것은 일반적인 변수 선언에 도달 할 수없는 지점에 도달하기 위해 좋은 ol '카피 블록을 사용합니다.


0

sed, 97 바이트 (81 자)

(96 바이트 (80 자) 코드 + 1 문자 명령 행 옵션)

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

단항 정수 로 입력해야 합니다.

샘플 실행 :

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 바이트 (75 자)

(104 바이트 (74 자) 코드 + 1 문자 명령 행 옵션)

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

단항 정수 로 입력해야 합니다.

샘플 실행 :

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

캔버스 , 15 바이트

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

여기 사용해보십시오!

설명:

{    ]            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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.