Zeichnen Sie einen ASCII-Blitz


35

Einführung

Lassen Sie uns, teilweise inspiriert von dieser StackOverflow-Frage , einen ASCII-Blitz zeichnen.

Schreiben Sie ein Programm, das eine positive Ganzzahl nüber STDIN oder die Befehlszeile annimmt und den folgenden ASCII-Blitz ausgibt.

Eingang

Positive ganze Zahl n die die Anzahl der zu zeichnenden Blitz-Zick-Zack-Ebenen darstellt.

Beispielausgabe

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

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

n = 3

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

n = 4

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

. . . etc


Zusätzliche Bemerkungen

  • Sie können eine Funktion schreiben, die nals einziges Argument die Zeichenfolge ausgibt oder zurückgibt.
  • Nachgestellte Leerzeichen und neue Zeilen sind in Ordnung.
  • Keine führenden Leerzeichen, außer wenn dies für das angegebene Muster angemessen ist.
  • Kürzester Code in Bytes gewinnt.

2
Wie viele dieser Herausforderungen haben wir bisher gesehen?
Fehler

@flawr Zu viele 😯
Beta Decay

Antworten:


19

Java, 201 196 189 186 182 Bytes

Offensichtlich nicht das Beste, aber es ist in 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, die Sprache, die Sie bereits verloren haben, bevor Sie den Text Ihrer mainMethode eingeben .
David Richerby

2
Ich denke manchmal, dass das mainnicht zur Byteanzahl zählen sollte, und einigen Sprachen, die ausführliche Schlüsselwörter haben, sollten möglicherweise Makros erlaubt sein. Dann wäre es interessant
Alec Teal

@AlecTeal Völlig einverstanden, einige Fragen geben tatsächlich an, dass sie nur funktionale Ausschnitte benötigen, die meisten jedoch nicht.
David Mulder

6
Sie können eine Funktion schreiben, die n als einziges Argument verwendet und die Zeichenfolge ausgibt oder zurückgibt. Also, ähm, das solltest du wahrscheinlich machen;)
Geobits

Es kann 6 Monate zu spät sein, aber codegolf.stackexchange.com/a/64713/42736 oder die Verwendung einer Funktion machen es kürzer.
J Atkin

10

CJam, 41 Bytes

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

Ich kann wahrscheinlich ein paar Bytes mehr herauspressen, aber hier ist etwas Komprimierung. Ich suchte eine Basis aus, die zu keinen Unprintables führen würde.

Probieren Sie es online aus .

Der Blitz teilt ich in top + middle * (input-1) + bottom, in der top, middle, bottom(komprimierte Basisumwandlung unter Verwendung) sind

__
\. 

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

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

(Leerzeichen sind mit .s gekennzeichnet)

40 Bytes

Dank an Optimizer

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


top + middle * (input-1) + bottomVielen Dank für die Erklärung mit , es erinnerte mich daran, dass Powershell Strings multiplizieren konnte: P
Nacht - Reinstate Monica

8

JavaScript ( ES6 ) 76

Unter Verwendung der Vorlagenzeichenfolge werden die 3 Zeilenvorschübe signifikant und gezählt.

Testlauf des Snippets (nur 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

Dummes Windows und dein \ r \ n ... Das könnten 67 bis 59 Bytes gewesen sein!

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

Für Codegolf denke ich, dass \ r \ n immer noch als \ n gilt, da es dasselbe tut
MilkyWay90

6

PHP - 84 79 78 Bytes

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

Zeigen Sie die Ergebnisquelle an oder binden Sie sie ein <pre />, um die Ergebnisse zu überprüfen. Die Zeilenumbrüche sind im Code erforderlich.
Die -1 könnte auf die verschoben werden define, aber ich hielt das für einen Betrüger.

1. Verbesserung: durch \naktuelle Zeilenumbrüche ersetzen
2. Da ich einen var definieren kann, habe ich einen CONTANT verwendet, der die $. + ein nicht benötigtes Leerzeichen in str_repeat
3.: Entfernt versehentlich den Wert -1, speichert aber ein Byte, indem <?=anstelle von Echo verwendet wird.


6

Pyth, 60 54 Bytes (Danke @isaacg)

Mein erster Versuch bei Pyth, wahrscheinlich sehr schlecht.

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

Überprüfen Sie es hier .


Willkommen bei Pyth! Pyth erlaubt übrigens wörtliche Zeilenumbrüche in seinen Zeichenketten, die 1 Zeichen kürzer wären als \n. Auch die erste \\ könnte in dem Programm nur ein \ .
Isaacg

@isaacg Danke.
7.


4

Brainfuck, 164 Bytes

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

Mit Kommentaren:

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

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

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

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

Okay, wie diese Brainfuck-Antwort Java und C # schlägt?


Woah, schönes Golfen, besonders in BF!
MilkyWay90

4

> <> (Fisch), 409 Bytes

Führen Sie den Befehl aus, fish.py bolt.fish --value nwobei bolt.fishder Programmname und nIhre positive Ganzzahleingabe ist.

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

Es ist nicht kurz, aber es sieht cool aus. Mein Versuch war es, es wie einen Blitzschlag aussehen zu lassen. Außerdem treten immer Fehler beim Abschluss auf.


3

Perl, 69 + 1

69 Zeichen plus 1 für die -nBefehlszeilenoption zum Abrufen der Eingabe von stdin.

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

Anwendungsbeispiel:

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

1
Einige Verbesserungen möglich: perl -pe'$_="__\ns s"."__s\\ __\\\n s"x--$_." s \\/";s!s!\\ \\\n!g'. Auch \nkann mit einem wörtlichen Zeilenumbruch für eine weiteres 3 - Zeichen gespeichert ersetzt werden.
Nutki

3

Javascript (ES6), 86

Ich werde nicht gewinnen, aber ich liebe 1-Zeilen-Lösung und ich hasse Schrägstriche.

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

Cool! Was macht es?
rpax

1
@rpax Ich habe Base64-Codierung verwendet, um \\ und \ n zu vermeiden. Schauen Sie sich die atob Dokumentation an
Michael M.

3

C 101 Bytes

Meine nicht so originelle Implementierung in c

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

3

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

Dies ist nicht die beste oder die kleinste Antwort, aber ich dachte, ich würde es versuchen. Fsacers Antwort ist viel kürzer und ich denke, Sie sollten es überprüfen. Ich habe mich gerade dazu entschlossen, dies wirklich nur als alternative Methode zu tun.


1
Hey, hier habe ich es leicht auf 182B fallen lassen. Code: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

Schön und nur neugierig, aber warum haben Sie den Typ von e von int in var geändert? Es sind immer noch 3 Zeichen: P

Kein Grund, vielleicht, weil ich var Schlüsselwort lieben :)
fsacer

3

C #, 166 Bytes

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: Verbesserte das Ergebnis von 186B auf 173B.
EDIT 2: 1B wurde mit PadLeftanstelle von gespeichertPadRight
EDIT 3: gespeicherte 8B durch Eintropfen PadLeft‚s zweite Parameter und unter Verwendung von wortgetreuen Stringliterale


Nizza ... Sie können publicam Anfang auf das verzichten, und statt eines char-Arrays können Sie ein String.PadRight(int, char)kürzeres Array verwenden , mit dem Sie ein ASCII-Zeichen verwenden können, das nicht entkommen muss.
VisualMelon

Einige Verbesserungen: * Lasse den zweiten Parameter auf PadLeft () fallen; es ist impliziert (-4) * Ändern Sie 2 der Zeichenfolgen in wörtlich (das OP sagt, dass Zeilenumbrüche in Ordnung sind, und wir brauchen nur \ n, nicht voll \ r \ n, also -4) Endergebnis: Klasse I {statische Leere Main ( string [] a) {System.Console.Write (("__ \ na" + "". PadLeft (int.Parse (a [0]) - 1) .Replace ("", @ "__ a \ __ \ a ") +" a \\ / "). Replace (" a ", @" \ \ "))}} [Ich kann keine Zeilenumbrüche in Kommentaren anzeigen, aber Sie können die ursprüngliche Antwort bearbeiten!]
Klebeband

Schöne Tipps, es war schwer, die Formatierung wörtlich zu ordnen :)
Fsacer

3

Awk, 101 + 8 Bytes

101 Zeichen plus 8 -v n=$1, um eine Ganzzahl aus der Shell zu erhalten.

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

Neu auf dieser SE-Site, unklar ob diese Parameter zählen sollten.

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

Anwendungsbeispiel:

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


Formulieren wir es als „ berechnet das richtig“, weil auf jeden Fall nicht getan richtig. Wenn die Variablenzuweisung hinter dem Code steht, ist das -v Teil nicht erforderlich . Ganz zu schweigen davon, dass die gesamte variable Idee nicht erforderlich ist, genau wie der separate ENDBlock. 89 Zeichen: {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'))

Dies ist mein erster Code Golf

@ (^ _ ^) @

Hier testen


Das ist Python 3? Funktioniert diese Eingabe () für ganze Zahlen?
Renae Lider

2

C 119 108 Bytes

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

Erster Versuch, 150 Bytes

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

mainAkzeptiert ein int-Argument. Führen Sie den folgenden Befehl aus: ./lightning . . .to pass4 als Argument.


2

Python 3, 126 118 117 Bytes

Nur etwas, mit dem wir anfangen können.

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

Wenn Sie die Schleifenvariable nicht benötigen, können Sie sie durchlaufen [0]*(n-1), um n-1Iterationen zu erhalten . Sie können auch schreiben (n-1)als ~-n.
Randomra

Sie können , indem ein Byte speichern i in [0]zu i in[0].
mbomb007

Herzlich willkommen! Ein einziger Zeilendruck in der Schleife ist auch kürzer: for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\').
Randomra

2

Python 2, 76 Bytes

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

Drucken Sie einfach die ersten drei Zeilen und dann die nächsten drei Zeilen n-1 und drucken Sie dann die letzten zwei Zeilen. Alles auf einen Streich.

Und hier ist ein netter Versuch einer Alternative, die (leider) genau die gleiche Anzahl von Bytes verwendet:

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

Haben Sie versucht,% s für den mittleren Teil zu formatieren?
Sp3000,

@ Sp3000 Ich brauche geschweifte Klammern, damit es funktioniert *, das gibt mir 77 Bytes - oder nicht, aber das kostet 79 Bytes. :(
Matty

2

F #, 98 Zeichen, 105 Bytes

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

2

CJam 54 Chars

nicht die kürzeste, aber seit ich heute mit CJam angefangen habe, bin ich damit zufrieden.

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

Versuch es


2

Pascal: 149 142 141 137 Zeichen

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

Schließlich ist Pascals einzige Stärke beim Golfen, dass Backslashes kein Entkommen brauchen ...


1
for n:=2 to n dofunktioniert auch.
Randomra

Vielen Dank, @randomra. Ich denke, es war ungefähr 18 Jahre her, als mir diese Möglichkeit bewusst wurde… Schön, dass ich mich daran erinnere.
Manatwork

2

Google Sheets, 60 Bytes

Anonyme Arbeitsblattfunktion, die Eingaben aus dem Bereich [A1]und Ausgaben in die aufrufende Zelle übernimmt .

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


1

SpecBAS - 135 104 Bytes

Der Apostroph in PRINT-Anweisungen bewegt den Cursor in eine neue Zeile.

Mit SpecBAS können Sie ASCII-Zeichen in eine Zeichenfolge über einbinden #n , sodass einige Wagenrückläufe (ASCII 13) eingebaut sind.

Erstellen Sie eine Zeichenfolge aus Wagenrückläufen und anderen Zeichen, und REP$wiederholen Sie sie dann so oft wie erforderlich.

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 Version

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

Ihr Code kann weiter verbessert werden und ist auf 121 Bytes gesunken. echo$l=PHP_EOL,"__$l";$g="\\ \\$l";for($i=0;$i<$argv[1];$i++){echo($i?"__$g\\ __\\$l":$g)," $g";}echo" $g",' \\/',$l;
Octfx,

Zusätzlich: Entfernen Sie das $i=0; Entferne die Klammern für die forSchlaufe. Inkrementiere den Zähler in der Schleife ( echo($i++?"…).
Blackhole

1

Java, 183 180 Bytes

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 Bytes

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

1

Netzhaut , 46 Bytes

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

1
__r\  __\# r
r
\ \#   

Nimmt Eingaben als unär.

Jede Zeile sollte in eine eigene Datei und gehen # in den Dateien in eine neue geändert werden. Dies ist unpraktisch, aber Sie können den Code so wie er ist als eine Datei mit dem -sFlag ausführen , wobei die #Markierungen erhalten bleiben. Sie können die #Zeilenumbrüche in der Ausgabe zur besseren Lesbarkeit ändern . Z.B:

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

Der Algorithmus ist sehr einfach. Die Linienpaare (Regex - Ersatzpaare) führen die folgenden Substitutionsschritte aus:

  • Surround-Eingang mit dem oberen und unteren Rand des Blitzes.
  • Subtrahieren Sie 1von der unären Eingabe.
  • Ändern Sie jede unäre Ziffer in den mittleren Teil des Blitzes.
  • Dekomprimieren Sie die komprimierten \ \Teile des Blitzes, um die gewünschte Ausgabe zu erhalten.

Probieren Sie es online! (inklusive Dezimalumwandlung) aber ich konnte es in 45 Bytes machen: Online ausprobieren! (einschließlich Dezimalumrechnung).
Neil

1

Powershell, 59 Bytes

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

Testskript:

$f = {

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

}

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

Ausgabe:

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

Erläuterung:

Dieses Skript ist traditionell top+ middle+ bottom. Es gibt nur eine clevere Sache: Das Komma vor der mittleren Zeichenfolge erzwingt die Wiederholung eines Array-Elements anstelle einer Zeichenfolge. Daher wird jeder middlein einer neuen Zeile angezeigt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.