画一个ASCII闪电


35

介绍

受此StackOverflow问题的部分启发,让我们绘制一个ASCII闪电螺栓。

编写一个程序,该程序n通过STDIN或命令行使用正整数,并在下面输出ASCII Lightning Bolt。

输入值

正整数,n表示要绘制的闪电曲折线层数。

示例输出

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

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

n = 3

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

n = 4

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

。。。等等


附加条款

  • 您可以编写一个函数n作为唯一参数,并打印或返回字符串。
  • 尾随空格和换行符都可以。
  • 除适用于指定模式的地方外,没有前导空格。
  • 以字节为单位的最短代码获胜。

2
到目前为止,我们已经看到了哪些挑战?
瑕疵的

@flawr太多😯–
Beta Decay

Answers:


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方法主体之前已经迷失的语言。
David Richerby 2015年

2
有时我确实认为main不应将其计入字节数,并且应允许使用一些具有冗长关键字的语言。那将很有趣
Alec Teal

@AlecTeal完全同意,有些问题实际上表明它们仅需要功能性片段,而大多数不需要。
David Mulder

6
您可以编写一个将n作为唯一参数并输出或返回字符串的函数。因此,嗯,您可能应该这样做;)
Geobits 2015年

可能要晚6个月,但是codegolf.stackexchange.com/a/64713/42736或使用函数可以缩短时间。
J Atkin

10

CJam,41个字节

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

我可能可以再压缩几个字节,但这是一些压缩。我选择了一个不会导致无法打印的基础。

在线尝试

闪电被分成top + middle * (input-1) + bottom,其中topmiddlebottom(使用碱转化压缩)是

__
\. 

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

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

(空格以.s 标记)

40字节

感谢Optimizer

“¹Ñ³Û-+ΔDx^áД 254b6b“
_ \ 0 /“ f =)/〜ri(* \


感谢您的解释top + middle * (input-1) + bottom,它使我想起powershell可以乘以字符串:P
Nacht-恢复Monica 2015年

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,但我认为是作弊。

第一个改进:\n用实际的换行符替换
第二个:由于可以定义var,因此我使用了CONTANT,可以保护$。+ str_repeat
3rd中不需要的空间:意外删除了-1,但通过使用<?=代替echo 节省了一个字节。


6

Pyth,60 54字节(感谢@isaacg)

我第一次尝试Pyth,可能非常糟糕。

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

在这里验证


欢迎来到佩斯!顺便说一句,Pyth允许在字符串中使用文字换行符,该字符串比短1个字符\n。此外,\\ 程序中的第一个可能只是一个\
isaacg 2015年

@isaacg谢谢。
JNV 2015年


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


哇,打高尔夫很好,尤其是在高炉!
MilkyWay90

4

> <>(鱼),409字节

程序名fish.py bolt.fish --value n在哪里运行bolt.fishn是您的正整数输入。

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

它不短,但看起来很酷。我的尝试是尝试使其看起来像雷击。同样,它总是在完成时出错。


3

Perl,69 + 1

69个字符,外加1个-n命令行开关以从stdin获取输入。

$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 2015年

3

Javascript(ES6),86

不会赢,但是我喜欢一线解决方案,我讨厌斜线。

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

凉!它在做什么?
rpax 2015年

1
@rpax我使用base64编码来避免\\和\ n。看一下atob 文档
Michael M.

3

C,101字节

我不是那么原始的实现

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

很好,而且很好奇,但是为什么将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而不是PadRight
编辑 3B 保存了1B 通过删除PadLeft's第二个参数并使用逐字字符串文字,保存了8B


很好...您可以public从一开始就取消使用,而不是使用char数组,而可以使用String.PadRight(int, char),它更短,可以让您使用不需要转义的ascii char。
VisualMelon 2015年

进行一些调整:*将第二个参数放置到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 2015年

3

AWK,101 + 8字节

101个字符,外加8个用于-v n=$1从shell中获取整数。

'{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()是否可用于整数?
Renae Lider 2015年

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);}

main接受一个int参数,所以像这样运行:作为参数./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
randomra 2015年

您可以通过更改i in [0]为保存一个字节i in[0]
mbomb007

欢迎!循环中的单行打印也更短:for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\')
randomra 2015年

2

Python 2,76个字节

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

只需打印前三行,然后打印后三行,然后n-1再打印最后两行。一口气。

这是一个很好的尝试(不幸)使用完全相同的字节数的替代方法:

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

您是否尝试过在中间部分使用%s格式?
Sp3000

@ Sp3000我需要用括号括起来以使其与一起使用*,这给了我77个字节-或不内联它,但它花费了79个字节。:(
马蒂2015年

2

F#,98个字符,105个字节

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

2

果酱54字符

不是最短的,但是自从我今天开始CJam以来,我对此很满意。

rd(:T;{'__}:W~N{'\:XSXN}:V~SV{WVXSSWXNSV;N}T*SSVSSSX'/

试试吧


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.

毕竟,帕斯卡(Pascal)唯一的高尔夫实力是反斜杠无需逃脱……


1
for n:=2 to n do也可以。
randomra 2015年

谢谢@randomra。我想是在18年前,当我意识到这种可能性时。
manatwork 2015年

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

另外:删除$i=0; 拆下for循环支架;在循环(echo($i++?"…)中增加计数器。
Blackhole,2015年

1

Java,183180字节

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标志一起作为一个文件直接运行,并保留#标记。您可以根据#需要在输出中将更改为换行符,以提高可读性。例如:

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

该算法非常简单。线对(正则表达式-替换对)执行以下替换步骤:

  • 用闪电的顶部和底部环绕输入。
  • 减去1一元输入。
  • 将每个一进制数字更改为闪电的中间部分。
  • 解压缩\ \闪电的压缩部分以获得所需的输出。

在线尝试!(包括十进制转换),但我能够做到45字节:在线尝试!(包括十进制转换)。
尼尔

1

Powershell,59个字节

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

测试脚本:

$f = {

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

}

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

输出:

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

说明:

这个脚本是传统top+ middle+ bottom。只有一件聪明的事:中间字符串前面的逗号强制重复数组元素而不是字符串。因此,每个middle显示在新行上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.