Gambar Baut Petir ASCII


35

pengantar

Sebagian terinspirasi oleh pertanyaan StackOverflow ini , mari kita menggambar ASCII Lightning Bolt.

Tulis program yang menggunakan Integer positif nmelalui STDIN atau baris perintah dan output ASCII Lightning Bolt di bawah ini.

Memasukkan

Integer Positif yang nmewakili jumlah tingkatan petir zig-zag untuk menggambar.

Contoh Output

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

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

n = 3

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

n = 4

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

. . . dll


Catatan tambahan

  • Anda dapat menulis fungsi yang nhanya sebagai argumen dan mencetak atau mengembalikan string.
  • Ruang tambahan dan garis baru tidak apa-apa.
  • Tidak ada spasi mengarah kecuali jika sesuai untuk pola yang ditunjuk.
  • Kode terpendek dalam byte menang.

2
Berapa banyak tantangan yang telah kita lihat sejauh ini?
flawr

@ flawr Terlalu banyak 😯
Pembusukan Beta

Jawaban:


19

Java, 201 196 189 186 182 byte

Jelas bukan yang terbaik, tetapi adalah di Jawa.

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
Ah, Jawa, bahasa tempat Anda sudah kehilangan sebelum mulai mengetik tubuh mainmetode Anda .
David Richerby

2
Kadang-kadang saya berpikir bahwa mainseharusnya tidak dihitung terhadap jumlah byte, dan beberapa bahasa yang memiliki kata kunci verbose mungkin boleh makro. Maka itu akan menarik
Alec Teal

@AlecTeal Sepenuhnya setuju, beberapa pertanyaan sebenarnya menentukan bahwa mereka hanya memerlukan potongan fungsional, tetapi sebagian besar tidak.
David Mulder

6
Anda dapat menulis fungsi yang menggunakan n sebagai satu-satunya argumen dan mencetak atau mengembalikan string. Jadi, umm, Anda mungkin harus melakukan itu;)
Geobits

Mungkin terlambat 6 bulan, tetapi codegolf.stackexchange.com/a/64713/42736 atau menggunakan fungsi membuatnya lebih pendek.
J Atkin

10

CJam, 41 byte

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

Saya mungkin dapat memeras beberapa byte lagi, tetapi inilah beberapa kompresi. Saya memilih sebuah pangkalan yang tidak akan menghasilkan apa-apa.

Cobalah online .

Petir dibagi menjadi top + middle * (input-1) + bottom, di mana top, middle, bottom(dikompresi menggunakan konversi dasar) yang

__
\. 

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

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

(Spasi ditandai dengan .s)

40 byte

Terima kasih kepada Pengoptimal

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


terima kasih atas penjelasannya top + middle * (input-1) + bottom, itu mengingatkan saya bahwa PowerShell dapat melipatgandakan string: P
Nacht - Reinstate Monica

8

JavaScript ( ES6 ) 76

Menggunakan string template, 3 baris baru signifikan dan dihitung.

Tes menjalankan cuplikan (khusus 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 byte

Windows yang bodoh dan \ r \ n ... Anda bisa mencapai 67 59 byte!

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

Untuk golf kode, saya pikir \ r \ n masih dianggap sebagai \ n, karena ia melakukan hal yang sama
MilkyWay90

6

PHP - 84 79 78 byte

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

Lihat sumber hasil atau bungkus <pre />untuk memeriksa hasil. Baris baru diperlukan dalam kode.
-1 dapat dipindahkan ke define, tetapi saya menganggap itu sebagai cheat.

Peningkatan 1: ganti \ndengan baris baru yang sebenarnya
2: Karena saya bisa mendefinisikan var, saya menggunakan KONTAN, menyimpannya $. + ruang yang tidak dibutuhkan di str_repeat
ke-3: Secara tidak sengaja menghapus -1, tetapi menyimpan byte dengan menggunakan <?=gantinya.


6

Pyth, 60 54 byte (Terima kasih @isaacg)

Upaya pertama saya di Pyth, mungkin sangat buruk.

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

Verifikasi di sini .


Selamat datang di Pyth! Omong-omong, Pyth memungkinkan baris baru literal dalam string-nya, yang akan menjadi 1 karakter lebih pendek dari \n. Juga, yang pertama \\ dalam program ini bisa saja a \ .
isaacg

@isaacg Terima kasih.
JNV


4

Brainfuck, 164 byte

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

Dengan komentar:

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

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

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

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

Oke, bagaimana jawaban Brainfuck ini mengalahkan Java dan C #?


Woah, golf bagus, terutama di BF!
MilkyWay90

4

> <> (Ikan), 409 byte

Dijalankan oleh fish.py bolt.fish --value nmana bolt.fishnama program dan nmerupakan input bilangan bulat positif Anda.

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

Ini tidak pendek, tetapi terlihat keren. Upaya saya adalah mencoba membuatnya tampak seperti sambaran petir. Selain itu, selalu ada kesalahan saat selesai.


3

Perl, 69 +1

69 karakter, ditambah 1 untuk -nsaklar baris perintah untuk mengambil input dari stdin.

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

Contoh penggunaan:

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

1
Beberapa perbaikan yang mungkin: perl -pe'$_="__\ns s"."__s\\ __\\\n s"x--$_." s \\/";s!s!\\ \\\n!g'. Juga \ndapat diganti dengan istirahat garis literal untuk 3 karakter lain yang disimpan.
nutki

3

Javascript (ES6), 86

Tidak akan menang, tapi saya suka solusi 1-line dan saya benci tebasan.

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

Keren! Apa yang dilakukannya?
rpax

1
@ rpax Saya menggunakan pengkodean base64 untuk menghindari \\ dan \ n. Lihatlah atob dokumentasi
Michael M.

3

C, 101 byte

Implementasi saya tidak begitu asli di c

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

3

C #, 221 Bytes

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

Ini bukan yang terbaik, atau jawaban terkecil, tetapi saya pikir saya akan mencobanya. Jawaban Fsacer jauh lebih pendek dan saya pikir Anda harus memeriksanya. Saya baru saja memutuskan untuk melakukan ini hanya sebagai metode alternatif.


1
Hei, di sini saya dengan mudah menjatuhkannya ke 182B. Kode: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

Bagus, dan hanya ingin tahu, tetapi mengapa Anda mengubah jenis e dari int ke var? Itu masih 3 karakter: P

Tanpa alasan, mungkin karena saya suka kata kunci var :)
fsacer

3

C #, 166 byte

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

EDIT 1: meningkatkan hasil dari 186B menjadi 173B
EDIT 2: menyelamatkan 1B dengan menggunakan PadLeftbukannya PadRight
EDIT 3: menyelamatkan 8B dengan menjatuhkan PadLeftparameter kedua dan menggunakan string literal kata demi kata


Bagus ... Anda dapat menghapus dengan publicdi awal, dan alih-alih menggunakan array char, Anda dapat menggunakan String.PadRight(int, char), yang lebih pendek dan akan membiarkan Anda menggunakan char ascii yang tidak perlu melarikan diri.
VisualMelon

Beberapa penyesuaian: * drop parameter kedua ke PadLeft (); tersirat (-4) * ubah 2 string menjadi kata demi kata (OP mengatakan baris baru baik-baik saja, dan kita hanya perlu \ n, tidak penuh \ r \ n, jadi -4) Hasil akhir: kelas I {static void Main ( string [] a) {System.Console.Write (("__ \ na a" + "". PadLeft (int.Parse (a [0]) - 1). Ganti ("", @ "__ a \ __ \ a ") +" a \\ / "). Ganti (" a ", @" \ \ "));}} [Saya tidak dapat menampilkan baris baru dalam komentar, tetapi Anda dapat mengedit jawaban asli!]
sellotape

Tip yang bagus, sulit untuk memformat kata demi kata :)
fsacer

3

Awk, 101 + 8 byte

101 karakter, ditambah 8 untuk -v n=$1mendapatkan integer dari shell.

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

Baru di situs SE ini, tidak jelas apakah parameter tersebut harus dihitung.

Tidak disatukan

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   \\/"
}'

Contoh penggunaan:

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
__
\ \
 \ \
__\ \
\  __\
 \ \
__\ \
\  __\
 \ \
  \ \
   \/

Berikut adalah konsensus tentang penghitungan flag-command-line. Jadi saya pikir Anda sudah melakukannya dengan benar.
Martin Ender

Mari kita merumuskannya sebagai " dihitung itu benar", karena pasti tidak dilakukan dengan benar. Jika penugasan variabel diletakkan setelah kode, tidak perlu -v bagian itu. Tidak menyebutkan bahwa seluruh gagasan variabel tidak perlu, sama seperti ENDblok terpisah . 89 karakter: {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'))

Ini golf kode pertamaku

@ (^ _ ^) @

Tes di sini


Ini python 3? Apakah input () itu berfungsi untuk bilangan bulat?
Renae Lider

2

C, 119 108 byte

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

Upaya pertama, 150 byte

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

mainmenerima argumen int, jadi jalankan seperti ini: ./lightning . . .untuk lulus 4sebagai argumen.


2

Python 3, 126 118 117 byte

Hanya sesuatu yang bisa kita mulai.

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

Jika Anda tidak memerlukan variabel loop, Anda dapat beralih melalui [0]*(n-1)untuk mendapatkan n-1iterasi. Anda juga dapat menulis (n-1)sebagai ~-n.
randomra

Anda dapat menyimpan satu byte dengan mengubah i in [0]ke i in[0].
mbomb007

Selamat datang! Sebuah cetak baris dalam lingkaran juga lebih pendek: for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\').
randomra

2

Python 2, 76 byte

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

Cukup cetak tiga baris pertama, lalu cetak tiga baris berikutnya n-1kali, dan kemudian cetak 2 baris terakhir. Semuanya sekaligus.

Dan ini adalah percobaan yang bagus untuk alternatif yang (sayangnya) menggunakan jumlah byte yang persis sama:

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

Sudahkah Anda mencoba menggunakan pemformatan% s untuk bagian tengah?
Sp3000

@ Sp3000 Saya perlu kawat gigi di sekitarnya untuk membuatnya bekerja dengan *, yang memberi saya 77 byte - atau tidak inlining, tapi harganya 79 byte. :(
Matty

2

F #, 98 karakter, 105 byte

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

2

CJam 54 Chars

bukan yang terpendek, tapi karena saya memulai CJam hari ini, saya senang dengan itu.

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

Cobalah


2

Pascal: 149 142 141 137 karakter

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

Bagaimanapun, satu-satunya kekuatan golf Pascal adalah backslash tidak perlu melarikan diri ...


1
for n:=2 to n dojuga berfungsi.
randomra

Terima kasih, @randomra. Saya pikir ~ 18 tahun yang lalu ketika saya menyadari kemungkinan ini ... Senang mengingatnya.
manatwork

2

Google Sheets, 60 Bytes

Fungsi lembar kerja anonim yang mengambil input dari jangkauan [A1]dan keluaran ke sel panggilan.

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


1

SpecBAS - 135 104 byte

Apostrof dalam pernyataan PRINT memindahkan kursor ke baris baru.

SpecBAS memungkinkan Anda menggabungkan karakter ASCII dalam string melalui cara #n , jadi beberapa carriage return (ASCII 13).

Membangun string menggunakan carriage return dan karakter lain, lalu digunakan REP$untuk mengulanginya beberapa kali.

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";

Versi Tidak Serigala

$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;

Kode Anda dapat ditingkatkan lebih lanjut, turun menjadi 121 byte. echo$l=PHP_EOL,"__$l";$g="\\ \\$l";for($i=0;$i<$argv[1];$i++){echo($i?"__$g\\ __\\$l":$g)," $g";}echo" $g",' \\/',$l;
Octfx

Selain itu: hapus $i=0; lepaskan tanda kurung untuk forloop; increment counter di dalam loop ( echo($i++?"…).
Blackhole

1

Jawa, 183 180 byte

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 byte

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

1

Retina , 46 byte

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

1
__r\  __\# r
r
\ \#   

Mengambil input sebagai unary.

Setiap baris harus menuju ke file sendiri dan #harus diubah ke baris baru di file. Ini tidak praktis tetapi Anda dapat menjalankan kode sebagaimana adanya, sebagai satu file, dengan-s bendera, menjaga #spidol. Anda dapat mengubah #'s ke baris baru di output untuk dibaca jika Anda inginkan. Misalnya:

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

Algoritma ini sangat sederhana. Pasangan garis (regex - pasangan pengganti) melakukan langkah-langkah substitusi berikut:

  • Input surround dengan bagian atas dan bawah petir.
  • Mengurangi 1 dari input unary.
  • Ubah setiap digit unary menjadi bagian tengah petir.
  • Dekompres bagian terkompresi \ \dari petir untuk mendapatkan hasil yang diinginkan.

Cobalah online! (termasuk konversi desimal) tetapi saya dapat melakukannya dalam 45 byte: Coba online! (termasuk konversi desimal).
Neil

1

Powershell, 59 byte

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

Skrip uji:

$f = {

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

}

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

Keluaran:

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

Penjelasan:

Skrip ini tradisional top+ middle+ bottom. Hanya ada satu hal yang cerdas: koma sebelum kekuatan string tengah untuk mengulang elemen array daripada string. Oleh karena itu, masing middle- masing ditampilkan pada baris baru.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.