Narysuj Błyskawicę ASCII


35

Wprowadzenie

Częściowo zainspirowany tym pytaniem StackOverflow , narysujmy Błyskawicę ASCII.

Napisz program, który przyjmuje dodatnią liczbę całkowitą nza pośrednictwem STDIN lub wiersza poleceń i wyprowadza poniżej Błyskawicę ASCII.

Wkład

Dodatnia liczba całkowita nreprezentująca liczbę zygzakowatych poziomów do narysowania.

Przykładowy wynik

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

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

n = 3

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

n = 4

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

. . . itp


Dodatkowe uwagi

  • Możesz napisać funkcję, która bierze njako jedyny argument i wypisuje lub zwraca ciąg.
  • Końcowe spacje i nowe linie są w porządku.
  • Brak spacji wiodących, z wyjątkiem przypadków, gdy jest to właściwe dla wyznaczonego wzoru.
  • Najkrótszy kod w bajtach wygrywa.

2
Ile z tych wyzwań widzieliśmy do tej pory?
wada

@flawr Too many 😯
Beta Decay

Odpowiedzi:


19

Java, 201 196 189 186 182 bajtów

Oczywiście nie najlepsze, ale jest w Javie.

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
Ach, Java, język, w którym już straciłeś, zanim zaczniesz pisać treść swojej mainmetody.
David Richerby

2
Czasami myślę, że mainnie powinno się liczyć do liczby bajtów, a niektóre języki, które mają pełne słowa kluczowe, powinny mieć możliwość makr. Wtedy byłoby ciekawie
Alec Teal

@AlecTeal Całkowicie się zgadzam, niektóre pytania w rzeczywistości określają, że wymagają one tylko funkcjonalnych fragmentów, ale większość nie.
David Mulder

6
Możesz napisać funkcję, która bierze n jako jedyny argument i wyświetla lub zwraca ciąg znaków. Powinieneś chyba to zrobić;)
Geobits,

Może to być 6 miesięcy spóźnienie, ale codegolf.stackexchange.com/a/64713/42736 lub użycie funkcji skraca go.
J Atkin

10

CJam, 41 bajtów

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

Prawdopodobnie mogę wycisnąć jeszcze kilka bajtów, ale oto kompresja. Wybrałem bazę, która nie doprowadziłaby do braku druków.

Wypróbuj online .

Błyskawicy jest podzielony na top + middle * (input-1) + bottom, w top, middle, bottom(skompresowany przy użyciu przekształcenia zasady)

__
\. 

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

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

(Miejsca są oznaczone .s)

40 bajtów

Dzięki Optimizer

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


dzięki za wyjaśnienie top + middle * (input-1) + bottom, przypomniało mi, że PowerShell może pomnożyć ciągi znaków: P
Nacht - Przywróć Monikę

8

JavaScript ( ES6 ) 76

Przy użyciu ciągu szablonu 3 nowe znaki są znaczące i zliczane.

Przetestuj uruchomienie fragmentu kodu (tylko 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 bajty

Głupi Windows i twój \ r \ n ... To mogło być 67 59 bajtów!

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

W przypadku golfa kodowego myślę, że \ r \ n nadal liczy się jako \ n, ponieważ robi to samo
MilkyWay90

6

PHP - 84 79 78 bajtów

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

Wyświetl źródło wyników lub zawiń, <pre />aby sprawdzić wyniki. Nowe wiersze są wymagane w kodzie.
-1 można przenieść na define, ale uważałem to za oszustwo.

1. ulepszenie: zamień na \nnowe wiersze
2.: Ponieważ mogę zdefiniować var, użyłem CONTANT, sejfuje $. + niepotrzebne miejsce w str_repeat
3rd: przypadkowo usunąłem -1, ale zapisałem bajt, używając <?=zamiast echa.


6

Pyth, 60 54 bajtów (Dzięki @isaacg)

Moja pierwsza próba Pytha, prawdopodobnie bardzo zła.

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

Sprawdź to tutaj .


Witamy w Pyth! Nawiasem mówiąc, Pyth dopuszcza dosłowne znaki nowej linii w swoich ciągach, które byłyby o 1 znak krótsze niż \n. Również pierwszy \\ w programie może być po prostu \ .
isaacg

@isaacg Dzięki.
JNV


4

Brainfuck, 164 bajty

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

Z komentarzami:

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

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

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

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

Okej, jak ta odpowiedź Brainfuck pokonuje Javę i C #?


Woah, fajna gra w golfa, szczególnie w BF!
MilkyWay90

4

> <> (Ryba), 409 bajtów

Uruchom przez fish.py bolt.fish --value ngdzie bolt.fishjest nazwa programu i njest to dodatnia liczba całkowita.

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

Nie jest krótki, ale wygląda świetnie. Moja próba polegała na tym, aby wyglądało to jak uderzenie pioruna. Ponadto zawsze kończy się błędem po zakończeniu.


3

Perl, 69 + 1

69 znaków plus 1 dla -nprzełącznika wiersza poleceń, aby pobrać dane wejściowe ze standardowego wejścia.

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

Przykład użycia:

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

1
Niektóre ulepszenia możliwe: perl -pe'$_="__\ns s"."__s\\ __\\\n s"x--$_." s \\/";s!s!\\ \\\n!g'. Również \nmoże być zastąpiony dosłowny podział wiersza na kolejne 3 charakterze zapisany.
nutki

3

JavaScript (ES6), 86

Nie wygra, ale uwielbiam rozwiązanie 1-liniowe i nienawidzę cięć.

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

Fajne! Co on robi
rpax

1
@rpax Użyłem kodowania base64, aby uniknąć \\ i \ n. Zobacz atob dokumentację
Michael M.

3

C, 101 bajtów

Moja nie tak oryginalna implementacja w ok

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

3

C #, 221 bajtów

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

To nie jest najlepsza ani najmniejsza odpowiedź, ale pomyślałem, że spróbuję. Odpowiedź Fsacera jest znacznie krótsza i myślę, że powinieneś to sprawdzić. Właśnie postanowiłem zrobić to tak naprawdę jako alternatywną metodę.


1
Hej, tutaj łatwo upuściłem go do 182B. 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

Fajnie i po prostu ciekawie, ale dlaczego zmieniłeś typ e z int na var? Nadal są to 3 znaki: P

Bez powodu, może dlatego, że uwielbiam słowo kluczowe var :)
fsacer

3

C #, 166 bajtów

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

EDYCJA 1: poprawiono wynik z 186B do 173B
EDYCJA 2: zapisano 1B, używając PadLeftzamiast PadRight
EDYCJA 3: zapisano 8B, usuwając PadLeftdrugi parametr i używając dosłownych ciągów literałów


Fajnie ... Możesz zrezygnować z publicpoczątku i zamiast używać tablicy znaków, możesz użyć String.PadRight(int, char), która jest krótsza i pozwoli ci użyć znaku ascii, który nie wymaga ucieczki.
VisualMelon,

Niektóre poprawki: * upuść drugi parametr do PadLeft (); sugeruje (-4) * zmień 2 ciągi na dosłownie (OP twierdzi, że nowe wiersze są w porządku, a potrzebujemy tylko \ n, nie pełne \ r \ n, więc -4) Wynik końcowy: klasa I {static void Main ( string [] a) {System.Console.Write (("__ \ na a" + "". PadLeft (int.Parse (a [0]) - 1) .Replace ("", @ "__ a \ __ \ a „) +„ a \\ / ”). Zamień („ a ”, @„ \ \ ”));}} [Nie mogę wyświetlić nowych linii w komentarzach, ale możesz edytować oryginalną odpowiedź!]
sprzedam taśmę

Fajne wskazówki, ciężko było sformatować formatowanie w porządku :)
fsacer

3

Awk, 101 + 8 bajtów

101 znaków plus 8 dla -v n=$1uzyskania liczby całkowitej z powłoki.

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

Nowość w tej witrynie SE, niejasne, czy te parametry powinny się liczyć.

Bez golfa

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

Przykład użycia:

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


Sformułujmy to jako „ obliczone tak dobrze”, ponieważ zdecydowanie nie zrobione dobrze. Jeśli przypisanie zmiennej jest wstawiane po kodzie, część nie jest potrzebna -v . Nie wspominając, że cała idea zmiennej jest niepotrzebna, podobnie jak osobny ENDblok. 89 znaków: {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'))

To jest mój pierwszy golfowy kod

@ (^ _ ^) @

Przetestuj tutaj


To jest python 3? Czy to input () będzie działać dla liczb całkowitych?
Renae Lider,

2

C, 119 108 bajtów

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

Pierwsza próba, 150 bajtów

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

mainprzyjmuje argument int, więc uruchom w ten sposób: ./lightning . . .podaj 4jako argument.


2

Python 3, 126 118 117 bajtów

Po prostu coś na początek.

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

Jeśli nie potrzebujesz zmiennej pętli, możesz iterować koryta, [0]*(n-1)aby uzyskać n-1iteracje. Możesz także napisać (n-1)jako ~-n.
randomra

Możesz zapisać jeden bajt, zmieniając i in [0]na i in[0].
mbomb007

Witamy! Pojedyncza linia wydruku w pętli jest również krótszy: for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\').
randomra

2

Python 2, 76 bajtów

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

Wystarczy wydrukować pierwsze trzy linie, a następnie wydrukować kolejne trzy linie n-1 razy, a następnie wydrukować ostatnie 2 wiersze. Wszystko za jednym razem.

A oto fajna próba alternatywy, która (niestety) wykorzystuje dokładnie taką samą liczbę bajtów:

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

Czy próbowałeś użyć formatowania% s dla środkowej części?
Sp3000,

@ Sp3000 Potrzebuję wokół niego nawiasów klamrowych, aby działał z *, co daje mi 77 bajtów - lub nie wstawiam go, ale kosztuje 79 bajtów. :(
Matty

2

F #, 98 znaków, 105 bajtów

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

2

CJam 54 znaków

nie najkrótszy, ale odkąd zacząłem CJam dzisiaj, jestem z tego zadowolony.

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

Spróbuj


2

Pascal: 149 142 141 137 znaków

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

W końcu jedyną siłą golfową Pascala jest to, że odwrotne ukośniki nie potrzebują ucieczki…


1
for n:=2 to n dodziała również.
randomra

Dziękuję, @Randomra. Myślę, że było to około 18 lat temu, kiedy zdałem sobie sprawę z tej możliwości… Miło to zapamiętać.
manatwork

2

Arkusze Google, 60 bajtów

Anonimowa funkcja arkusza roboczego, która pobiera dane wejściowe z zakresu [A1]i dane wyjściowe do komórki wywołującej.

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


1

SpecBAS - 135 104 bajtów

Apostrof w instrukcjach PRINT przenosi kursor do nowego wiersza.

SpecBAS pozwala na włączenie znaków ASCII do ciągu #n, więc wbudowano niektóre znaki powrotu karetki (ASCII 13).

Zbudowano ciąg za pomocą znaków powrotu karetki i innych znaków, a następnie REP$powtórzono go wymaganą liczbę razy.

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

Wersja bez golfa

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

Twój kod można ulepszyć, zmniejszając go do 121 bajtów. echo$l=PHP_EOL,"__$l";$g="\\ \\$l";for($i=0;$i<$argv[1];$i++){echo($i?"__$g\\ __\\$l":$g)," $g";}echo" $g",' \\/',$l;
Octfx

Ponadto: usuń $i=0; usuń wsporniki forpętli; zwiększ licznik wewnątrz pętli ( echo($i++?"…).
Blackhole

1

Java, 183 180 bajtów

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 bajtów

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

1

Siatkówka , 46 bajtów

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

1
__r\  __\# r
r
\ \#   

Traktuje dane wejściowe jako jednoargumentowe.

Każda linia powinna przejść do własnego pliku i #powinna zostać zmieniona na nową linię w plikach. Jest to niepraktyczne, ale możesz uruchomić kod w postaci pliku z -sflagą, zachowując #znaczniki. Jeśli chcesz, możesz zmienić te #znaki wyjściowe na nowe wiersze w celu zwiększenia czytelności. Na przykład:

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

Algorytm jest bardzo prosty. Pary linii (regex - pary zastępcze) wykonują następujące kroki podstawiania:

  • Wejście surround z górną i dolną częścią błyskawicy.
  • Odejmij 1od danych jednostkowych.
  • Zmień każdą pojedynczą cyfrę na środkową część błyskawicy.
  • Rozpakuj skompresowane \ \części pioruna, aby uzyskać pożądaną moc wyjściową.

Wypróbuj online! (obejmuje konwersję dziesiętną), ale udało mi się to zrobić w 45 bajtach: Wypróbuj online! (obejmuje konwersję dziesiętną).
Neil

1

PowerShell, 59 bajtów

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

Skrypt testowy:

$f = {

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

}

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

Wydajność:

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

Wyjaśnienie:

Ten skrypt jest tradycyjny top+ middle+ bottom. Jest tylko jedna mądra rzecz: przecinek przed środkowym ciągiem wymusza powtórzenie elementu tablicy zamiast ciągu. Dlatego każdy middlejest wyświetlany w nowym wierszu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.