Нарисуйте молнию ASCII


35

Введение

Отчасти вдохновленный этим вопросом StackOverflow , давайте нарисуем ASCII Lightning Bolt.

Напишите программу, которая принимает положительное целое число nчерез STDIN или командную строку и выводит молнию ASCII ниже.

вход

Положительное целое nчисло, представляющее количество зигзагообразных ярусов молнии для рисования.

Пример вывода

п = 1

__
\ \
 \ \
  \ \
   \/

п = 2

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

п = 3

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

п = 4

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

, , , так далее


Дополнительные замечания

  • Вы можете написать функцию, которая принимает nв качестве единственного аргумента и печатает или возвращает строку.
  • Конечные пробелы и новые строки в порядке.
  • Нет начальных пробелов, кроме случаев, когда это подходит для обозначенного шаблона.
  • Самый короткий код в байтах побеждает.

2
Сколько из этих проблем мы уже видели?
flawr

@flawr Слишком много 😯
бета-распад

Ответы:


19

Ява, 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не должно учитываться при подсчете байтов, и в некоторых языках, которые имеют подробные ключевые слова, возможно, следует разрешить макросы. Тогда было бы интересно
Алек Тил

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

6
Вы можете написать функцию, которая принимает n в качестве единственного аргумента и печатает или возвращает строку. Так что, наверное, вам следует это сделать;)
Geobits

Это может быть на 6 месяцев позже, но codegolf.stackexchange.com/a/64713/42736 или с помощью функции делают его короче.
Дж Аткин

10

CJam, 41 байт

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

Я, вероятно, могу выжать еще несколько байтов, но вот немного сжатия. Я выбрал базу, которая не привела бы к печати.

Попробуйте онлайн .

Молнии разделяются на top + middle * (input-1) + bottom, где top, middle, bottom(сжато с использованием преобразования базового) являются

__
\. 

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

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

(Пробелы отмечены . )

40 байт

Благодаря Оптимизатору

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


спасибо за объяснение top + middle * (input-1) + bottom, он напомнил мне, что powershell может умножать строки: P
Nacht - Восстановить Monica

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 байта

Глупая винда и твой \ 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-е: Поскольку я могу определить переменную, я использовал CONTANT, сохраняя $. + ненужный пробел в str_repeat
3-й: Случайно удалил -1, но сохранил байт, используя <?=вместо echo.


6

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

Моя первая попытка Pyth, вероятно, очень плохо.

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

Проверьте это здесь .


Добро пожаловать в Pyth! Кстати, Pyth допускает буквальные символы новой строки в своих строках, которые будут на 1 символ короче, чем \n. Также первым \\ в программе может быть просто \ .
Исаак

@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

Perl, 69 + 1

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

$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

Не выиграю, но я люблю 1-строчное решение и ненавижу слэши.

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

Нет причин, может быть потому, что я люблю ключевое слово var :)
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 char, который не нуждается в экранировании.
VisualMelon

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

Хорошие советы, было трудно дословно форматировать по порядку :)
fsacer

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, неясно , должны ли эти параметры учитываться.

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

Пример использования:

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
manatwork

3

Python 97 82 78чар:

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

Это мой первый код гольф

@ (^ _ ^) @

Тест здесь


Это питон 3? Будет ли этот input () работать для целых чисел?
Рене Лидер

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

Питон 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.
Рандомра

Вы можете сохранить один байт, изменив 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 символа

не самое короткое, но с тех пор, как я начал 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.

В конце концов, единственная сила Pascal в игре в гольф заключается в том, что обратные слеши не нужно убегать


1
for n:=2 to n doтоже работает.
Рандомра

Спасибо, @randomra. Я думаю, это было ~ 18 лет назад, когда я осознал эту возможность ... Приятно помнить это.
manatwork

2

Google Sheets, 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

Ява, 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флагом, сохраняя #маркеры. При желании вы можете изменить #символы на новые строки в выходных данных. Например:

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

Алгоритм очень прост. Пары строк (regex - замещающие пары) выполняют следующие шаги замещения:

  • Объемный ввод сверху и снизу молнии.
  • вычитать 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.