ASCIIライトニングボルトを描く


35

前書き

このStackOverflowの質問に一部触発され、ASCIIライトニングボルトを描きましょう。

nSTDINまたはコマンドラインを介して正の整数を受け取り、以下のASCIIライトニングボルトを出力するプログラムを作成します。

入力

n描画する稲妻のジグザグ層の数を表す正の整数。

出力例

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

__
\ \
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

n = 3

__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

n = 4

__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

。。。等


その他の注意事項

  • n唯一の引数として文字列を出力または返す関数を作成できます。
  • 末尾のスペースと改行は問題ありません。
  • 指定されたパターンに適切な場合を除いて、先行スペースはありません。
  • バイト単位の最短コードが優先されます。

2
これまでに、これらの課題のうちいくつを見てきましたか?
フレイ

@flawr多すぎるmany
ベータ崩壊

回答:


19

Java、201 196 189 186 182バイト

明らかに最適ではありません、Javaにあります。

class I{public static void main(String[]a){System.out.print(("__\na a"+new String(new byte[new Byte(a[0])-1]).replace("\0","__a\\  __\\\n a")+"  a   \\/").replace("a","\\ \\\n"));}}

23
ああ、Java、mainメソッドの本体の入力を始める前にすでに失っていた言語です。
デビッドリチャービー

2
mainバイトカウントにカウントされるべきではないと思うこともありますが、冗長なキーワードを持ついくつかの言語ではマクロを許可する必要があります。それから興味深いだろう
アレックティール

@AlecTeal完全に同意して、機能的なスニペットのみを必要とする質問もありますが、ほとんどの質問はそうではありません。
デビッドモルダー

6
nを唯一の引数として、文字列を出力または返す関数を作成できます。だから、うーん、あなたはおそらくそれを行うべきです;)
Geobits

6か月遅れることもありますが、codegolf.stackexchange.com / a / 64713/42736または関数を使用すると短縮されます。
Jアトキン

10

CJam、41バイト

":¡ö cQïO[nu÷&,"255b6b"
 _\/X"f='X/~ri(*\

おそらく、さらにいくつかのバイトを圧縮できますが、ここで圧縮を行います。私は、印刷不能にならないベースを選びました。

オンラインでお試しください

稲妻は、に分割されtop + middle * (input-1) + bottom、ここでtopmiddlebottom(ベースの変換を用いて圧縮されます)

__
\. 

  \
.\.\
__\.\
\..__ 

    \
.\.\
..\.\
...\/

(スペースには.sのマークが付いています)

40バイト

オプティマイザーのおかげで

「¹Ñ³Û-+ÎDx^áÐ」254b6b」
_ \ 0 / "f =)/〜ri(* \


説明のおかげで、top + middle * (input-1) + bottompowershellが文字列を増やすことができることを思い出しました:P
Nacht-Monica

8

JavaScript(ES6)76

テンプレート文字列を使用すると、3つの改行が重要でカウントされます。

スニペットの実行テスト(Firefoxのみ)

f=n=>`__
1 1${`__1\\  __\\
 1`.repeat(n-1)}  1   \\/`.replace(/1/g,`\\ \\
`)

// TEST

go=_=>O.innerHTML=f(I.value)

go()
N: <input id=I value=3><button onclick='go()'>Test</button>
<pre id=O></pre>


7

PowerShell、72 63バイト

愚かなWindowsと\ r \ n ...これは67 59バイトだったかもしれません!

%{$a="\ \
";"__
$a"+" $a`__$a\  __\
"*($_-1)+" $a  $a   \/"}

コードゴルフのために、私は、r \だと思う\ nはまだそれは同じことはないので、nは\としてカウント
MilkyWay90

6

PHP- 84 79 78バイト

<?php
define('N',3); // <- didnt count these bytes as TS said I could take var N as input
?>
<?="__
\ \
 \ \ ".str_repeat("
__\ \
\  __\
 \ \ ",N-1)."
  \ \ 
   \/"

結果ソースを表示するか、ラップし<pre />て結果を確認します。コードには改行が必要です。
-1はに移動できますdefineが、私はチートだと考えました。

1番目の改善:\n実際の改行で置き換える
2番目:varを定義できるので、CONTANTを使用しました$。+ str_repeat
3番目の不要なスペース:誤って-1を削除しましたが<?=、エコーの代わりにバイトを保存しました。


6

Pyth、60 54バイト(@isaacgに感謝)

Pythでの最初の試みは、おそらく非常に悪いでしょう。

"__
\ \ "VtQ" \ \ 
__\ \ 
\  __\ ")" \ \ 
  \ \ 
   \/

ここで確認してください


Pythへようこそ!ちなみに、Pythでは文字列にリテラルの改行を使用できます。改行は、よりも1文字短くなり\nます。また、\\ プログラムの最初のものは単にである可能性があり\ ます。
isaacg

@isaacgありがとう。
JNV


4

Brainfuck、164バイト

,<++++++++++++++++[>--->+>++++++>++>++++++>+++<<<<<<-]>->--->---->>->-<..<<<.>.>
.<.<.>>.<.>.<.<.<[>>>>..<<.>.<.<.>.>..>..<<.<.>>.<.>.<.<.<-]>>>..<.>.<.<.>>...<.
>>>.

コメント付き:

Initialise n and character set with i as counter
Memory = in♪\ _/
,<++++++++++++++++[>--->+>++++++>++>++++++>+++<<<<<<-]>->--->---->>->-

Draw top of lightning bolt
<..<<<.>.>.<.<.>>.<.>.<.<.<

Draw lightning bolt zigzags
[>>>>..<<.>.<.<.>.>..>..<<.<.>>.<.>.<.<.<-]

Draw lightning bolt tip
>>>..<.>.<.<.>>...<.>>>.

さて、このBrainfuckはJavaとC#を破ってどのように答えますか?


うわー、素敵なゴルフ、特にBFで!
MilkyWay90

4

> <>(魚)、409バイト

Run by fish.py bolt.fish --value nwhere bolt.fishはプログラム名でn、正の整数入力です。

\
\         "__"       a
\         "\ \"      a
\         " \ \"     a
\r1-:?!vr "__\ \"    a
\     !0  "\  __\"   a
\     !6  " \ \"  a04.
>r   9a.  "__\ \"    \
      /   "\  __\"  \ 
       /  " \ \"   \  
        / "  \ \" \   
         /"   \/"\    
                 aaaaa
|o|!~r           /    
         \        /   
        \          /  
       \            / 
      \              /

短くはありませんが、かっこよく見えます。私の試みは、それを落雷のように見せることでした。また、完了時に常にエラーが発生します。


3

Perl、69 + 1

69文字、プラス -n標準入力から入力を取得コマンドラインスイッチ。

$s="\\ \\$/";print"__$/$s $s".("__$s\\  __\\$/ $s"x--$_)."  $s   \\/"

使用例:

perl -ne '$s="\\ \\$/";print"__$/$s $s".("__$s\\  __\\$/ $s"x--$_)."  $s   \\/"' <<<"2"
__
\ \
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

1
いくつかの改善が可能ですperl -pe'$_="__\ns s"."__s\\ __\\\n s"x--$_." s \\/";s!s!\\ \\\n!g'。また\n、保存された別の3文字のリテラルの改行に置き換えることができます。
-nutki

3

Javascript(ES6)、86

勝つつもりはありませんが、1行のソリューションが大好きで、スラッシュは嫌いです。

f=n=>atob("X18KXCBc"+"CiBcIFwKX19cIFwKXCAgX19c".repeat(n-1)+"CiBcIFwKICBcIFwKICAgXC8")

クール!何をしているの?
rpax

1
@rpax \\と\ nを避けるためにbase64エンコーディングを使用しました。見ていatob ドキュメントを
マイケル・M.

3

C、101バイト

私のCではそれほどオリジナルではない実装

f(n){puts("__\n\\ \\");for(;--n;puts(" \\ \\\n__\\ \\\n\\  __\\"));puts(" \\ \\\n  \\ \\\n   \\/");}

3

C#、221バイト

class C{static void Main(string[]n){int e=System.Int32.Parse(n[0]);var o=@"__{0}\ \{0} \ \{0}";while(e>1){o+=@"__\ \{0}\  __\{0} \ \{0}";e--;}System.Console.WriteLine(o + @"  \ \{0}   \/{0}",System.Environment.NewLine);}}

これは最善でも最小の答えでもありませんが、試してみようと思いました。 Fsacerの答えははるかに短いので、ぜひチェックしてみてください。私はまさにこれを代替方法として実際に行うことにしました。


1
ねえ、ここで簡単に182Bに落としました。コード:class C{static void Main(string[]n){var e=int.Parse(n[0]);var o=@"__{0}\ \{0} \ \{0}";while(e-->1){o+=@"__\ \{0}\ __\{0} \ \{0}";}System.Console.Write(o+@" \ \{0} \/{0}","\n");}}
fsacer

素晴らしく、好奇心just盛ですが、なぜeの型をintからvarに変更したのですか?まだ3文字です:P

理由はありません。おそらく、varキーワードが大好きだからです:)
fsacer

3

C#、166バイト

class I{static void Main(string[]a){System.Console.Write(("__\na a"+"".PadLeft(int.Parse(a[0])-1).Replace(" ",@"__a\  __\
 a")+@"  a   \/").Replace("a",@"\ \
"));}}

編集1:結果を186Bから173Bに改善しました。
編集2:編集のPadLeft代わりに使用して1Bを保存しました。3 の2番目のパラメーターをドロップし、逐語的文字列リテラルを使用して8Bを保存しました。PadRight
PadLeft


ニース... public開始時に廃止することができ、char配列を使用する代わりに、を使用できますString.PadRight(int, char)。これは短く、エスケープを必要としないASCII文字を使用できます。
VisualMelon

いくつかの調整:* 2番目のパラメーターをPadLeft()にドロップします。暗示されています(-4)*文字列の2つを逐語的に変更します(OPは改行は問題なく、必要なのは\ nのみで、完全な\ r \ nではないため、-4)最終結果:クラスI {static void Main( string [] a){System.Console.Write(( "__ \ na a" + ""。PadLeft(int.Parse(a [0])-1).Replace( ""、@ "__ a \ __ \ a ")+" a \\ / ")。Replace(" a "、@" \ \ "));}} [コメントに改行を表示できませんが、元の回答を編集できます!]
sellotape

素敵なヒント、順序どおりにフォーマットするのは難しいことでした:)
fsacer

3

Awk、101 + 8バイト

101文字、および-v n=$1シェルから整数を取得するための8文字。

'{l="\\ \\";print"__\n"l"\n "l;for(i=1;i<n;++i)print"__"l"\n\\  __\\\n "l}END{print"  "l"\n   \\/"}'

このSEサイトの新機能、これらのパラメーターをカウントすべきどうかは不明です。

非ゴルフ

awk 
-v n=$1
'{
  l="\\ \\";
  print "__\n"l"\n "l;
  for(i=1; i<n; ++i)
    print "__"l"\n\\  __\\\n "l
}
END
{
  print "  "l"\n   \\/"
}'

使用例:

lightning() { echo | awk -v n=$1 '{l="\\ \\";print"__\n"l"\n "l;for(i=1;i<n;++i)print"__"l"\n\\  __\\\n "l}END{print"  "l"\n   \\/"}'; }
lightning 3
__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/


それは「正しく計算された」として定式化しましょう。なぜなら、間違いなく正しく行われていないからです。変数の割り当てがコードの後に​​置かれる場合、-v パーツは必要ありません。独立したENDブロックのように、可変アイデア全体が不要であることは言及していません。89の文字:{l="\\ \\";print"__\n"l"\n "l;for(;--$1;)print"__"l"\n\\ __\\\n "l;print" "l"\n \\/"} pastebin.com/NCznF9kH
manatwork

3

Python 97 82 78char:

print(("__\nl l"+"__l\  __\\\n l"*~-input()+"  l   \/").replace('l','\ \\\n'))

これは私の最初のコードゴルフです

@(^ _ ^)@

ここでテスト


これはPython 3ですか?そのinput()は整数に対して機能しますか?
レナエライダー

2

C、119108バイト

p(t){for(;t;t/=4)putchar(" \\_\n"[t%4]);}main(c){for(p(13434);p(836),--c;p(57154842));p(265488);puts("/");}

最初の試行、150バイト

v(a){putchar(a);}s(b){b--?v(32),s(b):v(92);}l(b){s(b);s(1);v(10);}main(c){for(puts("__\n\\ \\");l(1),--c;puts("__\\ \\\n\\  __\\"));l(2);s(3);v(47);}

mainint引数を受け入れているので、次のように実行します:引数として./lightning . . .渡し4ます。


2

Python 3、126 118 117バイト

私たちを始めるための何かです。

n=int(input())
p=print
p('__\n\\ \\')
for i in[0]*~-n:p(r''' \ \
__\ \
\  __\
''',end='')
p(r''' \ \
  \ \
   \/
''')

ループ変数が必要ない場合は、トラフ[0]*(n-1)n-1反復して反復を取得できます。(n-1)として書くこともでき~-nます。
ランダラ

に変更i in [0]すると、1バイト節約できますi in[0]
mbomb007

ようこそ!ループ内の1行の印刷も短くなりますfor i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\')
randomra

2

Python 2、76バイト

print'__\n\ \\\n \ \\\n'+r'''__\ \
\  __\
 \ \
'''*~-input()+'  \ \\\n   \/'

最初の3行を印刷してから、次の3行n-1を印刷し、最後の2行を印刷します。一度にすべて。

そして、ここで(残念ながら)まったく同じバイト数を使用する代替案を試します。

print('__\n| |'+'__|\  __\\\n |'*~-input()+'  |   \/').replace('|','\ \\\n')

中間部分に%sフォーマットを使用しようとしましたか?
Sp3000

@ Sp3000で動作させるには、中括弧が必要です。77 *バイトになります-またはインライン化されませんが、79バイトかかります。:(
マティ

2

F#、98文字、105バイト

let l n=(@"__♪◙\z"+String.replicate(n-1)@" \z__\z\  __\♪◙"+ @" \z  \z   \/").Replace("z"," \\\n")


2

パスカル:149の 142 141 137文字

var n:Word;begin
Read(n);Writeln('__'#10'\ \'#10' \ \');for n:=2to n do Writeln('__\ \'#10'\  __\'#10' \ \');Write('  \ \'#10'   \/')end.

結局のところ、パスカルの唯一のゴルフの強みは、バックスラッシュがエスケープする必要がないということです…


1
for n:=2 to n do動作します。
randomra

ありがとう、@ randomra。この可能性に気付いたのは〜18年前だったと思います…覚えておいてよかったです。
マナトワーク

2

Googleスプレッドシート、60バイト

範囲から入力を受け取り[A1]、呼び出しセルに出力する匿名ワークシート関数。

="__
\ \
 \ \
"&REPT("__\ \
\  __\
 \ \
",A1-1)&"  \ \
   \/


1

SpecBAS - 135の 104バイト

PRINTステートメントのアポストロフィは、カーソルを新しい行に移動します。

SpecBASでは、を経由してASCII文字を文字列に組み込むことができる#nため、いくつかのキャリッジリターン(ASCII 13)が組み込まれています。

キャリッジリターンとその他の文字を使用して文字列を作成しREP$、必要な回数だけ繰り返し使用します。

1 LET b$="\ \": INPUT n: PRINT "__"'b$+REP$(#13" "+b$+#13"__"+b$+#13"\  __\",n-1)'" ";b$'"  ";b$'"   \/"

1

PHP 155

$l=PHP_EOL;echo$l;echo "__$l";for($i=0;$i<$argv[1];$i++){if($i>=1)echo "__\\ \\$l\\  __\\$l";else echo "\\ \\$l";echo " \\ \\$l";}echo "  \\ \\$l   \\/$l";

非ゴルフバージョン

$n = $argv[1];

echo PHP_EOL;
echo '__'.PHP_EOL;
for($i=0;$i<$n;$i++)
{
    if($i>=1) {
        echo '__\\ \\'.PHP_EOL.'\\  __\\'.PHP_EOL;

    }
    else
    {
        echo '\\ \\'.PHP_EOL;
    }   
    echo ' \\ \\'.PHP_EOL; 


}    
echo '  \\ \\'.PHP_EOL;
echo '   \\/';
echo PHP_EOL;

コードをさらに改善して、121バイトまで減らすことができます。echo$l=PHP_EOL,"__$l";$g="\\ \\$l";for($i=0;$i<$argv[1];$i++){echo($i?"__$g\\ __\\$l":$g)," $g";}echo" $g",' \\/',$l;
Octfx

さらに、$i=0;を削除します。forループのブラケットを削除します。ループ内のカウンターをインクリメントします(echo($i++?"…)。
ブラックホール

1

Java、183 180バイト

class L{public static void main(String[]a){String b="__\n\\ \\\n \\ \\\n";for(int i=1;i<new Long(a[0]);++i)b+="__\\ \\\n\\  __\\\n \\ \\\n";System.out.print(b+"  \\ \\\n   \\/");}}

Lua、110バイト

function l(n)print("__\n\\ \\\n \\ \\\n"..string.rep("__\\ \\\n\\  __\\\n \\ \\\n",n-1).."  \\ \\\n   \\/")end

1

網膜、46バイト

.+
__#r r$0x  r   \/
1x

1
__r\  __\# r
r
\ \#   

入力を単項として受け取ります。

各行は独自のファイルに移動#し、ファイル内の改行に変更する必要があります。これは実用的ではありませんが-s#マーカーを保持したままフラグを付けて1つのファイルとしてコードをそのまま実行できます。#必要に応じて、読みやすくするために、出力のを改行に変更できます。例えば:

> echo -n 11|retina -s lightning|tr # '\n'
__
\ \
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

アルゴリズムは非常に簡単です。行のペア(正規表現-置換ペア)は、次の置換手順を実行します。

  • 稲妻の上下で入力を囲みます。
  • 1単項入力から減算します。
  • すべての単項数字を稲妻の中央部分に変更します。
  • \ \雷の圧縮された部分を解凍して、目的の出力を取得します。

オンラインでお試しください!(10進変換を含む)が、45バイトで実行できました。オンラインで試してください!(10進変換を含む)。
ニール

1

Powershell、59バイト

'__
\ \'
,' \ \
__\ \
\  __\'*--$args[0]
' \ \
  \ \
   \/'

テストスクリプト:

$f = {

'__
\ \'
,' \ \
__\ \
\  __\'*--$args[0]
' \ \
  \ \
   \/'

}

&$f 1
&$f 2
&$f 3
&$f 4

出力:

__
\ \
 \ \
  \ \
   \/
__
\ \
 \ \
__\ \
\  __\
 \ \
  \ \
   \/
__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/
__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

説明:

このスクリプトは伝統的なtop+ middle+ bottomです。賢いことは1つだけです。中央の文字列の前のコンマは、文字列ではなく配列要素を繰り返すことを強制します。したがって、それぞれmiddleが新しい行に表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.