Bir ASCII Yıldırım Cıvatası Çizin


35

Giriş

Kısmen bu StackOverflow sorusundan esinlenerek , bir ASCII Lightning Bolt çizelim.

nSTDIN veya komut satırı üzerinden pozitif bir Tamsayı alan ve aşağıdaki ASCII Yıldırım Cıvatasını çıkaran bir program yazın .

Giriş

nÇizilecek yıldırım zikzak katmanlarının sayısını temsil eden Pozitif Tamsayı .

Örnek çıktı

n = 1 '

__
\ \
 \ \
  \ \
   \/

n = 2 '

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

n = 3

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

n = 4

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

. . . vb


Ek Notlar

  • nTek argüman olarak alan ve dizeyi basan ya da döndüren bir işlev yazabilirsiniz .
  • Sondaki boşluklar ve yeni çizgiler tamam.
  • Belirlenen model için uygun olan yer dışında ön boşluk yoktur.
  • Bayt cinsinden en kısa kod kazanır.

2
Şimdiye kadar bu zorluklardan kaç tanesini gördük?
kusur

@flawr Çok fazla 😯
Beta Decay

Yanıtlar:


19

Java, 201 196 189 186 182 bayt

Açıkçası, ancak en iyi değil ise 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
Ah, Java, mainmetodunuzun gövdesini yazmaya başlamadan önce zaten kaybettiğiniz dil .
David Richerby

2
Bazen mainbayt sayımı için sayılmaması gerektiğini düşünüyorum ve ayrıntılı anahtar kelimeleri olan birkaç dilin de makrolara izin verilmesi gerektiğini düşünüyorum. O zaman ilginç olurdu
Alec Teal

@AlecTeal Tamamen katılıyorum, bazı sorular aslında yalnızca işlevsel snippet'leri gerektirdiklerini, ancak çoğunun gerekmediğini belirtti.
David Mulder

6
N'yi sadece argüman olarak alan ve dizeyi basan ya da döndüren bir işlev yazabilirsiniz. Öyleyse, umarım bunu yapmalısın;)
Geobits

6 ay gecikmiş olabilir, ancak codegolf.stackexchange.com/a/64713/42736 veya bir işlevi kullanmak onu kısaltır.
J Atkin

10

CJam, 41 bayt

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

Muhtemelen birkaç bayt daha sıkabilirim, ama işte bazı sıkıştırma. Yazdırılamaz bir yol açmayacak bir üs seçtim.

Çevrimiçi deneyin .

Şimşek ayrılmıştır top + middle * (input-1) + bottomburada, top, middle, bottom(baz dönüşümü kullanılarak sıkıştırılmış) olan

__
\. 

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

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

(Boşluklar .s ile işaretlenmiştir )

40 bayt

Doktoru sayesinde

"¹Ñ³Û- + IDX ^ Reklam" 254b6b"
_ \ 0 / "f =) / ~ ri (* \


açıklama için teşekkürler top + middle * (input-1) + bottom, bana powershell dizeleri çarpabileceğini hatırlattı: P
Nacht - Reinstate Monica

8

JavaScript ( ES6 ) 76

Şablon dizesini kullanarak, 3 yeni satır önemli ve sayılır.

Pasajı çalıştırma testi (yalnızca 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 bayt

Aptal Windows ve senin \ r \ n ... Bu 67 59 bayt olabilirdi!

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

Kod golf için, sanırım hala aynı şeyi yapıyor çünkü \ n \ n \ 'nin saydığını düşünüyorum
MilkyWay90

6

PHP - 84 79 78 bayt

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

Sonuç kaynağını görüntüleyin veya <pre />sonuçları kontrol etmek için kaydırın. Yeni satırlar kodda gereklidir.
-1 taşınmış olabilir define, ama ben aldatma olarak düşündüm.

1. gelişme: \ngerçek yeni satırlarla değiştirin
2.: Bir var tanımlayabildiğim için, bir CONTANT kullandım, güvenliğini sağladım $. + str_repeat 3'te gereksiz bir alan
: -1 yanlışlıkla kaldırıldı, ancak <?=yankı yerine bir bayt kaydetti .


6

Pyth, 60 54 bayt (Thanks @isaacg)

Pyth'deki ilk denemem, muhtemelen çok kötü.

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

Burada doğrulayın .


Pyth'a Hoşgeldiniz! Bu arada Pyth, karakterlerinden 1 karakterden daha kısa olacak şekilde yeni satırlara izin verir \n. Ayrıca, \\ programda ilk sadece bir olabilir \ .
isaacg

@isaacg Teşekkürler.
JNV


4

Brainfuck, 164 bayt

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

Yorumlarla:

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

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

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

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

Tamam, nasıl bu Brainfuck Java ve C # yenerek cevap?


Vay, güzel golf, özellikle de BF!
MilkyWay90

4

> <> (Balık), 409 bayt

Tarafından işletilen fish.py bolt.fish --value nnerede bolt.fishprogramı adıdır ve nsizin pozitif tamsayı girişidir.

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

Kısa değil, ama harika görünüyor. Benim girişimim, yıldırım düşmesi gibi görünmesini sağlamaya çalışmaktı. Ayrıca, her zaman tamamlandığında hataları.


3

Perl, 69 + 1

69 karakter, artı 1 -nkomut satırı için stdin'den girdi almak için geçiş yapın.

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

Kullanım örneği:

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

1
Olası bazı iyileştirmeler: perl -pe'$_="__\ns s"."__s\\ __\\\n s"x--$_." s \\/";s!s!\\ \\\n!g'. Ayrıca \nkaydedilen başka bir 3 karakter için değişmez satır sonu ile değiştirilebilir.
nutki

3

Javascript (ES6), 86

Kazanmayacağım ama 1 hatlı çözümü seviyorum ve eğik çizgilerden nefret ediyorum.

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

Güzel! Ne yapıyor?
rpax

1
@ rpax Ben \\ ve \ n önlemek için base64 kodlama kullandım. atob Belgelere
Michael M.

3

C, 101 bayt

Benim çok özgün olmayan uygulama c

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

3

C #, 221 Bayt

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

Bu en iyisi ya da en küçük cevabı değil, ama bir deneyeyim dedim. Fsacer'in cevabı çok daha kısa ve bence kontrol etmelisin. Bunu gerçekten alternatif bir yöntem olarak yapmaya karar verdim.


1
Hey, kolayca 182B'ye düşürdüm. Kod: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

Güzel ve sadece meraklı, ama neden e türünü int'den var'a değiştirdiniz? Hala 3 karakter var: P

Sebebi yok, belki var var anahtar kelimesini seviyorum :)
fsacer

3

C #, 166 bayt

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

DÜZENLEME 1: 173B için 186b sonucunu geliştirilmiş
DÜZENLEME 2: kullanarak 1B kaydedilen PadLeftyerine PadRight
3 Düzenleme: bırakarak 8B kaydedilen PadLeftbirebir dize hazır 'in ikinci parametre kullanılarak


Güzel ... publicBaşlangıçta başarabilirsiniz ve bir karakter dizisi kullanmak yerine String.PadRight(int, char), daha kısa olan ve kaçmaya gerek duymayan bir karakter karakterini kullanmanıza izin veren kullanabilirsiniz.
VisualMelon

Bazı değişiklikler: * ikinci parametreyi PadLeft () öğesine bırakın; ima edilir (-4) *, dizelerin 2'sini tersine çevirir (OP, yeni satırların iyi olduğunu söylüyor ve sadece \ n'ye ihtiyacımız var \ r \ n, bu yüzden -4) Sonuç: sınıf I {statik void Main ( [] a) {System.Console.Write (("" \ "a" + ""). PadLeft (int.Parse (a [0]) - 1) .Replace ("", @ "__a \ __ \ a ") +" a \\ / "). Değiştir (" a ", @" \ \ "));}} [Yorumlarda yeni satırları görüntüleyemiyorum, ancak orijinal cevabı düzenleyebilirsiniz!]
sellotape

Güzel ipuçları, sırayla biçimlendirme biçimlendirmek zordu :)
fsacer

3

Awk, 101 + 8 bayt

101 karakter, artı 8'den -v n=$1kabuktan tamsayı almak için .

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

Bu SE sitesinde yeni, bu parametrelerin sayılması gerekip gerekmediği belli değil .

Ungolfed

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

Kullanım örneği:

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


Bunu kesinlikle “doğru hesaplanmış ” olarak formüle edelim , çünkü kesinlikle doğru şekilde yapılmadı . Değişken ataması koddan sonra verilirse, -v parçaya gerek yoktur . Değişken fikrin gereksiz olduğu, ayrı ENDbloklar gibi gereksiz olduğundan bahsetmiyorum . 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'))

Bu benim ilk golf kodum

@ (^ _ ^) '

Burada test et


Bu piton 3 mü? Bu input () tamsayılar için işe yarar mı?
Renae Lider

2

C, 119 108 bayt

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

İlk deneme, 150 bayt

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

mainbir int argümanı kabul ediyor, öyleyse şöyle koş: argüman olarak ./lightning . . .geçmek 4.


2

Python 3, 126 118 117 bayt

Sadece bizi başlatacak bir şey.

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

Döngü değişkenine ihtiyacınız yoksa, yinelemeleri [0]*(n-1)almak için oluk yineleyebilirsiniz n-1. Ayrıca (n-1)olarak da yazabilirsiniz ~-n.
randomra

Sen değiştirerek bir bayt kaydedebilirsiniz i in [0]için i in[0].
mbomb007 19

Hoşgeldiniz! Döngüde bir tek satır baskı da kısadır: for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\').
randomra

2

Python 2,76 bayt

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

Sadece ilk üç satırı yazdırın, ardından sonraki üç satırı n-1defa yazdırın ve son 2 satırı yazdırın. Hepsi bir arada.

Ve burada (ne yazık ki) tamamen aynı sayıda bayt kullanan bir alternatif de iyi bir deneme:

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

Orta kısım için% s biçimlendirmesini kullanmayı denediniz mi?
Sp3000

@ Sp3000 ile çalışmasını sağlamak için etrafındaki ayraçlara ihtiyacım var *, bu bana 77 bayt veriyor - ya da içini çizmiyor , ama bu 79 bayta mal oluyor. :(
Matty

2

F #, 98 karakter, 105 bayt

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

2

CJam 54 Karakterler

en kısa değil, fakat bugün CJam'ı başlattığım için mutluyum.

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

Dene


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.

Sonuçta, Pascal'ın tek golf gücü, ters eğik çizgilerin kaçmaya gerek olmamasıdır…


1
for n:=2 to n doayrıca çalışır.
randomra

Teşekkürler, @randomra. Sanırım ~ 18 yıl önce bu olasılığın farkındaydım… Bunu hatırlamak güzel.
Manatwork

2

Google Sayfaları, 60 Bayt

Aralıktan girdi alan [A1]ve çağıran hücreye çıktı alan adsız çalışma işlevi

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


1

SpecBAS - 135 104 bayt

PRINT ifadelerindeki kesme işareti, imleci yeni bir satıra taşır.

SpecBAS, ASCII karakterlerini bir dizge aracılığıyla eklemenizi sağlar #n, bu nedenle bazı satır başı iadeleri (ASCII 13) oluşturduk.

Satır başı ve diğer karakterleri kullanarak bir dize inşa ettikten sonra REP$istenen sayıda tekrarlamak için kullanılır .

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

Ungolfed Sürümü

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

Kodunuz daha da geliştirilebilir, onu 121 bayta indirdi. echo$l=PHP_EOL,"__$l";$g="\\ \\$l";for($i=0;$i<$argv[1];$i++){echo($i?"__$g\\ __\\$l":$g)," $g";}echo" $g",' \\/',$l;
Octfx

Ayrıca: çıkarın $i=0; fordöngü için braketleri çıkarın ; döngünün içindeki sayacı arttırın ( echo($i++?"…).
Karadelik

1

Java, 183 180 bayt

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 bayt

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

1

Retina , 46 bayt

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

1
__r\  __\# r
r
\ \#   

Tekli girişi alır.

Her satır kendi dosyasına gitmeli #ve dosyalardaki yeni satırla değiştirilmelidir. Bu pratik değildir ancak kodu, tek bir dosya gibi -s, #işaretçileri tutarak bayrakla çalıştırabilirsiniz . İsterseniz #okunabilirlik için çıkıştaki yeni satırları değiştirebilirsiniz . Örneğin:

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

Algoritma çok basittir. Satır çiftleri (regex - yedek çiftler) aşağıdaki değiştirme adımlarını gerçekleştirir:

  • Yıldırım üst ve alt ile surround giriş.
  • 1Unary girişinden çıkarın .
  • Her bir sayı hanesini şimşek ortasına değiştir.
  • \ \İstenilen çıktıyı elde etmek için yıldırımın sıkıştırılmış kısımlarını açın.

Çevrimiçi deneyin! (ondalık dönüştürmeyi içerir) ancak bunu 45 baytta yapabildim: Çevrimiçi deneyin! (ondalık dönüşüm içerir).
Neil

1

Powershell, 59 bayt

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

Test komut dosyası:

$f = {

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

}

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

Çıktı:

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

Açıklama:

Bu senaryo geleneksel top+ middle+ bottom. Tek bir akıllı şey var: orta dize önündeki virgül, dize yerine bir dizi öğesini tekrarlamaya zorlar. Bu nedenle, her middlebiri yeni bir satırda görüntülenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.