ASCII 번개 그리기


35

소개

이 StackOverflow 질문 에서 부분적으로 영감을 받아 ASCII Lightning Bolt를 그립니다.

nSTDIN 또는 명령 행을 통해 양의 정수 를 취하고 아래에 ASCII Lightning Bolt를 출력 하는 프로그램을 작성하십시오 .

입력

n그릴 번개 지그재그 계층의 수를 나타내는 양의 정수 .

출력 예

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

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

n = 3

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

n = 4

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

. . . 기타


추가 사항

  • n유일한 인수로 사용하고 문자열을 인쇄하거나 반환 하는 함수를 작성할 수 있습니다 .
  • 후행 공백과 줄 바꾸기는 괜찮습니다.
  • 지정된 패턴에 적절한 경우를 제외하고 선행 공백이 없습니다.
  • 바이트 단위의 최단 코드가 이깁니다.

2
우리는 지금까지 얼마나 많은 도전을 보았습니까?
flawr

@flawr 너무 많은 😯
Beta Decay

답변:


19

자바 201 196 189 186 182 바이트

분명히, 그러나 그것은 최고의하지 입니다 자바.

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
아, 자바, main메소드 본문을 입력하기 전에 이미 잃어버린 언어 .
David Richerby 2016 년

2
때로는 main바이트 수로 계산해서는 안되며 키워드가 많은 일부 언어에는 매크로가 허용되어야한다고 생각합니다. 그렇다면 흥미로울 것입니다
Alec Teal

@AlecTeal 일부 질문은 실제로 기능적 스 니펫 만 필요하지만 대부분은 그렇지 않다고 명시합니다.
David Mulder

6
n을 유일한 인수로 사용하고 문자열을 인쇄하거나 반환하는 함수를 작성할 수 있습니다. 음, 아마도 그렇게해야 할 것입니다;)
Geobits

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, 여기서 top, middle, bottom(기본 변환하여 압축)이다

__
\. 

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

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

(공백은 .s 로 표시됨 )

40 바이트

Optimizer 덕분에

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


와 설명에 대한 감사 top + middle * (input-1) + bottomP : 그것은 PowerShell에서 문자열 곱 수 있음을 생각 나게
분석 재개 모니카 - 밤

8

자바 스크립트 ( ES6 ) 76

템플릿 문자열을 사용하면 세 줄 바꿈이 중요하고 계산됩니다.

스 니펫 실행 테스트 (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 바이트

바보 같은 창문과 당신의 \ r \ n ... 이것은 67 59 바이트 일 수 있습니다 !

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

이 같은 일이 없기 때문에 코드 골프, 나는 여전히 카운트 \ 연구 \ 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 의 불필요한 공간 +3 : 실수로 -1을 제거했지만 <?=echo 대신에 바이트를 저장했습니다 .


6

Pyth, 60 54 바이트 (감사합니다 @isaacg)

Pyth에서의 첫 시도는 아마도 매우 나빴을 것입니다.

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

여기에서 확인하십시오 .


Pyth에 오신 것을 환영합니다! 그건 그렇고, Pyth는 문자열에서 리터럴 개행을 허용 \n합니다. 또한 \\ 프로그램 의 첫 번째 는 단지 \ .
isaacg 2016 년

@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 바이트

에 의해 실행 fish.py bolt.fish --value n경우 bolt.fish프로그램 이름이고 n당신의 양의 정수를 입력합니다.

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

짧지는 않지만 시원해 보입니다. 나의 시도는 번개처럼 보이게하려고했다. 또한 완료시 항상 오류가 발생합니다.


3

펄, 69 + 1

-nstdin에서 입력을 페치 하기 위해 명령 행 스위치에 69자를 더한 1 .

$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

자바 스크립트 (ES6), 86

이길 수는 없지만 단선 솔루션을 좋아하고 슬래시가 싫어요.

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

멋지고 호기심이 많지만 왜 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로 개선
EDIT 2 : EDIT 3PadLeft 대신 에 사용하여 1B 저장 PadRight
: 3PadLeft 번째 매개 변수 를 삭제 하고 그대로 문자열 리터럴을 사용하여 8B 저장


Nice ... public처음에를 사용하지 않고 char 배열을 사용하는 대신을 사용할 수 있습니다 String.PadRight(int, char).이 길이는 더 짧으며 탈출 할 필요가없는 ASCII 문자를 사용할 수 있습니다.
VisualMelon

일부 조정 : * 두 번째 매개 변수를 PadLeft (); 암시 적으로 (-4) * 문자열의 2 개를 그대로 변경하십시오 (OP는 줄 바꿈이 훌륭하다고 말하며 \ r만이 아니라 \ n 만 필요합니다. -4) 최종 결과 : class I {static void Main ( string [] a) {System.Console.Write (( "__ \ na a"+ "". PadLeft (int.Parse (a [0])-1) .Replace ( "", @ "__ a \ __ \ a ") +"a \\ / "). Replace ("a ", @"\ \ "));}} [댓글에는 줄 바꿈을 표시 할 수 없지만 원래 답변은 편집 할 수 있습니다!]
sellotape

좋은 팁, 순서대로 형식화하기
어려웠습니다

3

Awk, 101 + 8 바이트

-v n=$1쉘에서 정수를 얻으려면 101 문자와 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
__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

다음은 명령 행 플래그 계산에 대한 합의입니다. 그래서 당신이 그 일을했다고 생각합니다.
Martin Ender 2016 년

“ 올바로 계산 된 것 ”으로 공식화합시다 . 왜냐하면 제대로 수행 되지 않았기 때문 입니다. 변수 할당이 코드 뒤에 있으면 -v 부품이 필요하지 않습니다 . 별도의 END블록 과 마찬가지로 전체 변수 아이디어가 필요하지 않다는 것을 언급하지 않았습니다 . 89 자 : {l="\\ \\";print"__\n"l"\n "l;for(;--$1;)print"__"l"\n\\ __\\\n "l;print" "l"\n \\/"} pastebin.com/NCznF9kH
manatwork

3

파이썬 97 82 78char :

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

이것은 내 첫 번째 코드 골프입니다

@ (^ _ ^) @

여기서 테스트


이것은 파이썬 3입니까? 해당 input ()이 정수에 적용됩니까?
Renae Lider

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

파이썬 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

로 변경 i in [0]하여 1 바이트를 저장할 수 있습니다 i in[0].
mbomb007

환영! 루프에서 한 줄 인쇄도 짧습니다 for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\').
randomra

2

파이썬 2, 76 바이트

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

처음 세 줄을 인쇄 한 후 다음 세 줄을 인쇄 한 다음 n-1마지막 두 줄을 인쇄하십시오. 한 번에 모두.

그리고 불행히도 정확히 같은 수의 바이트를 사용하는 대안을 시도해보십시오.

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

중간 부분에 % s 형식을 사용해 보셨습니까?
Sp3000

@ Sp3000 나는 그것을 사용하기 위해 괄호가 필요하다 *. :(
Matty

2

F #, 98 자, 105 바이트

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

2

CJam 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.

결국 파스칼의 유일한 골프 강점은 백 슬래시가 탈출 할 필요가 없다는 것입니다.


1
for n:=2 to n do작동합니다.
randomra 2016 년

감사합니다, @randomra. ~ 18 년 전이 가능성을 알고 있었을 것 같아요.
manatwork

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++?"…).
Blackhole

1

자바, 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   \\/");}}

루아, 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

파워 쉘, 59 바이트

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

테스트 스크립트 :

$f = {

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

}

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

산출:

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

설명:

이 스크립트는 전통 top+ middle+ bottom입니다. 한 가지 현명한 일이 있습니다. 중간 문자열 앞의 쉼표는 문자열이 아닌 배열 요소를 반복합니다. 따라서 각각 middle은 새 줄에 표시됩니다.

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