ASCIIアーチの構築


17

私はアスキーアートが好きで、退屈することが多いので、アスキーキャラクターを見つけて、ランダムなもの、8ビットマリオ城、迷路、アーチを作り始めました。アーチを簡単にきちんと積み重ねることができることがわかりました。

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

チャレンジ

プログラム(関数)、または0以上の整数を受け入れ(ボーナスを行っていない場合)、指定されたアーチの量でasciiアートを出力する他の標準形式を作成します。

テストケース

入力:

7

出力:

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

Alt:

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

入力:

1

出力:

╔═╗
╨─╨

Alt:

+-+
| |
---
  • 整数が0の場合、何も出力しません
  • この質問はutf-8で、各文字は「バイト」としてカウントされます
  • これはなので、最短の答えが勝ちます。
  • +-+代わりに╔═╗、の---代わりに╨─╨、およびの|代わりに使用するオプションがあります

おまけ

プログラムが負の数をサポートし、そのようにアーチを反転させる場合、-10%

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

3
私の知る限り、これらはASCII文字ではありません。unicode-art
flawr

welp、@ flawr、あなたは正しい。今何
...-JuanPotato

世界は崩壊するでしょう!心配する必要はありません。標準ASCIIの一部ではないことに言及してください。ただし、ascii-artタグは引き続き適用されます(unicodeタグはジョークでした。)
16年

ただし、これは拡張ASCIIのように見えるため、おそらく大丈夫です。
ママファンロール

2
@ՊՓԼՃՐՊՃՈԲՍԼ拡張ASCII en.wikipedia.org/wiki/Extended_ASCIIの標準バージョンはありません最も近いものは、コードページ437 en.wikipedia.org/wiki/Code_page_437です。これは、米国および他の多くの国で標準でしたが、これをコードページ437エディターにコピーして貼り付け、ウィンドウに戻すと+---+、上部、側面|、下部に-----あるアーチのように「解釈」されます。Juanpotato、非ASCII文字を使用する場合は、質問にエンコードを指定してください。現状では、私は不明確として終了することを投票しています。
レベルリバーセント

回答:



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は元のポスターの略です。質問ですか?
アディソンクランプ

1
@flagasspamはい、私はちょうどそれが元の投稿を意味する場所を見ました
-JuanPotato

2

Perl、78 82文字

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

悲しいことに、サイズを10%以上増やすことなくボーナスを利用する方法を見つけることができませんでした。私はまだ勝つかもしれません。

非ゴルフ

本当に簡単です。ボトムライン(╨$n╨)をインクリメンタルに作成し、トップライン(══)を2文字短くし、短くできなくなるまで終了するので、カウンターを台無しにする必要はありません。

 $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の場合に1つだけを出力すると思いますが、何も出力しないはずです。
リン

@モーリス私はちょうどそれを実行し、あなたは正しいです
-JuanPotato

1
@モーリスダン!あなたは絶対に正しい。私の元のバージョンは大丈夫でしたが、線に沿ってどこかでチェックを失いました。固定、4文字のコストで。それを見つけてくれてありがとう。
type_outcast

私はこれが古いことを知っていますが、@ Abigailのコメントに追加するには、以下を使用してバイトを節約できます-nオンラインで試してみてください!
ドムヘイスティングス

1

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

Japt -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は何も出力できません- いくつかのバイトのコストで空の文字列を出力できましたが0false5バイトのコストがかかる空の文字列を除いて、それらのいずれかが受け入れられるかどうかはわかりません(0費用は1だけです)。
シャギー

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を取り除く必要がありますが、ほとんどの代替は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バイト)

おそらく、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

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

Canvas、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.