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.