Намалюйте блискавку ASCII


35

Вступ

Частково натхненний цим питанням StackOverflow , давайте намалюємо блискавку ASCII.

Напишіть програму, яка приймає позитивний цілий номер nчерез STDIN або командний рядок і виводить ASCII Lightning Bolt внизу.

Вхідні дані

Позитивний цілий показник, який nпредставляє кількість блискавкових зигзагоподібних ярусів для малювання.

Приклад Вихід

n = 1

__
\ \
 \ \
  \ \
   \/

n = 2

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

n = 3

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

n = 4

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

. . . тощо


Додаткові нотатки

  • Ви можете записати функцію, яка бере nєдиний аргумент і друкує або повертає рядок.
  • Пробіли та нові лінії в порядку.
  • Ні провідних пробілів, за винятком випадків, коли це підходить для визначеного шаблону.
  • Виграє найкоротший код у байтах.

2
Скільки цих викликів ми бачили досі?
недолік

@flawr Забагато 😯
бета-розпад

Відповіді:


19

Java, 201 196 189 186 182 байт

Очевидно, не найкраще, але воно є на 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
Ах, Java, мова, на якій ти вже загубився, перш ніж почати вводити тіло свого mainметоду.
Девід Річербі

2
Я інколи думаю, що mainне слід вважати кількість байтів, і, мабуть, кілька мов, які мають багатослівні ключові слова, можуть бути дозволені макросами. Тоді було б цікаво
Alec Teal

@AlecTeal Повністю згоден, деякі запитання фактично вказують, що вони вимагають лише функціональних фрагментів, але більшість - ні.
Девід Малдер

6
Ви можете записати функцію, яка приймає n як єдиний аргумент і друкує або повертає рядок. Отже, гмм, мабуть, ви повинні це зробити;)
Геобіц

Може пізніше на 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 байт

Завдяки оптимізатору

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


спасибі за пояснення top + middle * (input-1) + bottom, мені нагадали, що паттерн може перемножувати рядки: P
Nacht - Відновити Моніку

8

JavaScript ( ES6 ) 76

Використовуючи рядок шаблону, 3 нові рядки є значущими та підраховуються

Тест запуску фрагмента (лише 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 байти

Дурна Windows та ваші \ r \ n ... Це могло бути 67 59 байт!

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

Щодо гольф-коду, я думаю, що \ r \ 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, я використав ЗМІСТ, зберігає $. + зайвий пробіл у str_repeat
3rd: випадково видалено -1, але збережено байт, використовуючи <?=замість echo.


6

Pyth, 60 54 байт (спасибі @isaacg)

Моя перша спроба Pyth, певно, дуже погана.

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

Перевірте це тут .


Ласкаво просимо в Pyth! До речі, Pyth допускає в своїх рядках буквальні новинки, що було б на 1 символ коротше \n. Також першим \\ у програмі міг бути просто а \ .
isaacg

@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

69 символів плюс 1 для -nперемикача командного рядка для отримання вводу з stdin.

$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

Javascript (ES6), 86

Не виграю, але я люблю однолінійне рішення і ненавиджу косої риски.

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

Класно! Що це робить?
rpax

1
@rpax Я використовував кодування base64, щоб уникнути \\ і \ n. Погляньте на atob документацію
Майкл М.

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

Без причин, можливо тому, що я люблю вар. Ключове слово :)
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",@"\ \
"));}}

EDIT 1: покращив результат з 186B до 173B
EDIT 2: збережено 1B за допомогою PadLeftзамість PadRight
EDIT 3: збережено 8B шляхом випадання PadLeftдругого параметра та використання дослівних рядкових літералів


Приємно ... Ви можете покінчити з publicпочатком, і замість того, щоб використовувати масив char, ви можете використовувати String.PadRight(int, char), який коротший і дозволить вам використовувати діаграму ascii, якій не потрібно бігти.
VisualMelon

Деякі налаштування: * передайте другий параметр PadLeft (); мається на увазі (-4) * змініть 2 рядки на дослівні (ОП говорить, що нові рядки є нормальними, і нам потрібно лише \ n, не повне \ r \ n, тому -4) Кінцевий результат: клас I {статична недійсна Головна ( string [] a) {System.Console.Write (("__ \ na a" + "". PadLeft (int.Parse (a [0]) - 1) .Replace ("", @ "__ a \ __ \ a ") +" a \\ / "). Замінити (" a ", @" \ \ "));}} [Я не можу відображати нові рядки в коментарях, але ви можете редагувати оригінальну відповідь!]
sellotape

Приємні поради, важко було
дословно

3

Awk, 101 + 8 байт

101 символ, плюс 8 для -v n=$1отримання цілого числа з оболонки.

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


Давайте сформулюємо це як " обчислене право", тому що точно не зроблено правильно. Якщо призначення коду змінної ставиться після коду, то для -v частини немає потреби . Не кажучи вже про те, що вся ідея змінної непотрібна, як і окремий ENDблок. 89 символів: {l="\\ \\";print"__\n"l"\n "l;for(;--$1;)print"__"l"\n\\ __\\\n "l;print" "l"\n \\/"} pastebin.com/NCznF9kH
манатура

3

Python 97 82 78char:

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

Це мій перший гольф з кодом

@ (^ _ ^) @

Тестуйте тут


Це пітон 3? Чи буде цей вхід () працювати для цілих чисел?
Рена Лідер

2

C, 119 108 байт

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

Python 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]на i in[0].
mbomb007

Ласкаво просимо! Одна лінія друку в петлі також коротше: for i in[0]*~-n:p(' \\ \\\n__\\ \\\n\\ __\\').
випадкова

2

Python 2, 76 байт

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

Просто надрукуйте перші три рядки, а потім надрукуйте наступні три рядки n-1 раз, а потім надрукуйте останні 2 рядки. Усі за один раз.

І ось приємна спроба альтернативи, яка (на жаль) використовує точно стільки ж байтів:

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

Ви спробували використовувати форматування% s для середньої частини?
Sp3000

@ Sp3000 Мені потрібні дужки навколо нього, щоб він працював з тим *, що дає мені 77 байт - або не вкладене в нього, але це коштує 79 байт. :(
Матті

2

F #, 98 символів, 105 байт

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

2

CJam 54 Chars

не найкоротший, але оскільки я розпочав 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 Я думаю, що це було ~ 18 років тому, коли я усвідомлював таку можливість ... Приємно це пам’ятати.
манатура

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

Java, 183 180 байт

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прапором, зберігаючи #маркери. Ви можете змінити #'s на нові рядки у висновку для читабельності, якщо бажаєте. Наприклад:

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

Алгоритм дуже простий. Пари рядків (регулярні параметри - пара-заміна) виконують наступні етапи заміни:

  • Оточуючий вхід з верхом і низом блискавки.
  • Віднімайте 1з одинарного введення.
  • Змініть кожну одинарну цифру на середню частину блискавки.
  • Декомпресуйте стиснуті \ \частини блискавки, щоб отримати бажаний вихід.

Спробуйте в Інтернеті! (включає десяткове перетворення), але мені вдалося це зробити в 45 байт: Спробуйте в Інтернеті! (включає десяткове перетворення).
Ніл

1

Powershell, 59 байт

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

Тестовий сценарій:

$f = {

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

}

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

Вихід:

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

Пояснення:

Цей сценарій є традиційним top+ middle+ bottom. Є лише одна розумна річ: кома перед середнім рядком змушує повторювати елемент масиву, а не рядок. Тому кожен middleвідображається в новому рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.