Напишите программу, которая принимает целое число N через stdin или командную строку.
Если N равно 0, одна буква O
должна быть напечатана на стандартный вывод.
Если N положительно , эта горизонтальная двойная спираль ASCII art , нарисованная N сегментами, должна быть напечатана.
Если N равно 1, вывод:
/\
O O
\/
Если N равно 2, вывод:
/\ /\
O / O
\/ \/
Если N равно 3, вывод:
/\ /\ /\
O / / O
\/ \/ \/
Если N равно 4, вывод:
/\ /\ /\ /\
O / / / O
\/ \/ \/ \/
Шаблон продолжается точно таким же образом для больших N. Обратите внимание, что косая черта ( /
) должна использоваться во всех местах пересечения спиралей, кроме O
концов.
Если N отрицательно , эта вертикальная двойная спираль ASCII-искусства, нарисованная -N сегментов высотой, должна быть напечатана.
Если N равно -1, вывод:
O
/ \
\ /
O
Если N равно -2, вывод:
O
/ \
\ /
\
/ \
\ /
O
Если N равно -3, результат будет:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Если N равно -4, результат будет:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Шаблон продолжается точно таким же образом для меньшего N. Обратите внимание, что косые черты ( \
) должны использоваться во всех местах пересечения спиралей, за исключением O
концов.
подробности
- Вместо программы вы можете написать функцию, которая принимает N как целое число и печатает результат в обычном порядке или возвращает его в виде строки.
- Вывод для любого N может дополнительно содержать завершающий перевод строки.
- Любая строка вывода для любого N может дополнительно содержать 4 или меньше завершающих пробелов.
- Никогда не должно быть начальных пробелов, которые не являются частью указанного шаблона.
- Самый короткий код в байтах побеждает.
источник
<spc>O<spc>
или\nO\n
. Является ли unnecesary ведущий позволил пробельному?print "."
Увеличьте масштаб, чтобы увидеть спираль. * nodnod *Ответы:
CJam,
56 55 53 5250 байтПосмотрите на этот размер! Основными виновниками являются
N = 0
особый случай, а\
не/
в вертикальной спирали.Вот как это работает:
Код делится на три части:
X0>"\/"=" / \\\ / "+
дает либо,"/ / \\\ / "
либо,"\ / \\\ / "
что имеет решающее значение, поскольку спираль просто состоит из альтернативы"/ \"
и"\ /"
присоединяется либо" / "
или" \ "
. Например, если вы считаете, что ввод будет2
, то ваша последняя повторенная строка будет"/ / \\ / / / \\ / "
(без экранирования). Это, очевидно, имеет дополнительный/
в начале и дополнительный пробел в конце.2
желаемая конечная строка без перевода строки была бы" O / \\\ / / / \\\ / O"
, но после вышеупомянутого пункта мы имеем только"/ / \\\ / / / \\\ / "
. Таким образом, мы удаляем первый символ, добавляем пробел и'O
в начале и еще один'O
в конце. Тогда мы наконец разделим это на части 3'O
(для ввода 0 регистр)Попробуйте это онлайн здесь
источник
JavaScript (ES6), 126
132 133Используя шаблонную строку, число новых строк считается.
Более читаемый
источник
n=>(
делаешь? Я никогда раньше не видел и не использовал этот оператор.Pyth, 52 байта
Демонстрация.
Объяснение:
Первый раздел,
M[Jj"/\\"*hGdjP*G+*2dH*2\O_J)
определяет функциюg
, которая принимает два входа. Первый входG
- это количество повторений, которые нужно использовать. Это абсолютное значение ввода. Второй входH
- это символ, который нужно поместить в центр спиралей.Функция возвращает список из 3 элементов, который состоит из 3 линий положительной спирали и 3 столбцов отрицательной спирали.
Первый элемент определяется как
Jj"/\\"*hGd
.*hGd
это строкаG+1
пробелов.j"/\\"*hGd
присоединяется к этой строке"/\"
в качестве разделителя. ВJ
начале сохраняет результирующее значение для будущего использования.Второй элемент есть
jP*G+*2dH*2\O
. Начнем с+*2dH
. Это два пробела, за которыми следует вводимый символ. Затем мы повторим эту строкуG
раз с*G
. Затем мы удаляем его последний символ сP
. Наконец, мы окружаем эту строку двумяO
символами, сj ... *2\O
.Третий элемент генерируется с
_J
. Это просто обратная сторона первой строки.Последний раздел
?jb?gQ\/>Q0msdCg_Q\\Q\O
выбирает между тремя различными возможностями, положительными, отрицательными и нулевыми. Первые условия if-thenQ
, вход. Второе условие>Q0
, является ли вход положительным.Если
Q
ноль,\O
символO
печатается.Если не
Q
равен нулю, мы соединяем результат второй троицы на новых строках и выводим его, используяjb
. ЕслиQ
положительно, то список присоединился и ПечатаемыйgQ\/
,g(Q,"/")
.Если значение
Q
отрицательное, список объединяется и печатаетсяmsdCg_Q\\
. Начнем с тогоg_Q\\
, что естьg(-Q,"\")
. Затем мы переносим строки и столбцы с помощьюC
.msd
превращает результирующие кортежи символов в строки, готовые для соединения на новых строках и печати.источник
Питон 2, 118
Создает вертикальную двойную спираль из списка строк и транспонирует ее, чтобы получить горизонтальную. Я уверен, что это может быть улучшено.
источник
Java,
500488 байтМоя первая попытка, и, к сожалению, она на 10 * длиннее, чем у нынешнего лидера :(. У кого-нибудь есть какие-либо советы (кроме использования другого языка)?
источник
import System.*
или что-то, чтобы сохранить записьSystem
каждый раз?import static java.lang.System.*;
или он мог сохранить стандартный поток вывода как переменную (хотя, я не знаю, сохранил бы он или мешал в этом случае, не проверял).sc
переменной, так как она вызывается только один раз. Сбривает 14 байт.class M{public static void main(String[]a){int n=new Integer(new java.util.Scanner(System.in).next()),i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");}static<T>void o(T s){System.out.print(s);}}
( 352 байта ) Попробуйте онлайн.n->{int i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");};<T>void o(T s){System.out.print(s);}
попробуйте в Интернете.Haskell, 156 байт
Затем вы можете написать это как:
источник
1<2
или что-то подобное вместоTrue
, и сохранить байт.C #,
242241238230222219 байтПодстегнутый комментарием Мартина , вот моя первая попытка чего-то подобного:
Более читабельно:
источник
C #
199197196 байтовБезголовая версия:
Идея состоит в том, чтобы построить горизонтальное отображение из вертикального отображения путем рендеринга транспонированной матрицы символов.
источник
for(;m>0;--m)
наfor(;m-->0;)
оба цикла"\n/ \\\n\\ /\n "
также может быть сокращена в соответствии с методами в моем ответе - т.е. использовать@"..."
, где каждый "\\" становится "\", а каждый "\ n" становится фактическим переводом строкиbool u
наvar u
еще один целый байт :)Python 3, 118 байт
Моя первая в истории подача кода в гольф, так что это может быть совсем не впечатляюще.
Просто использует троичный оператор Python ... if ... else ... для разделения трех сценариев. Это дает строку, состоящую из повторяющихся строк меньшего размера, определенное количество раз для печати.
источник
Юлия, 229 байт
О людях, это путь, путь слишком большой. Это самый длинный ответ до сих пор с большим отрывом. Вероятно, я мог бы сэкономить много, возвращая строку, а не печатая ее, или вообще избегая матричного подхода. Я поэкспериментирую с этим позже.
Это создает лямбда-функцию, которая принимает одно целое число и печатает соответственно отформатированную двойную спираль. Чтобы назвать его, дайте ему имя, например
f=n->(...)
.Ungolfed + объяснение:
Пара примеров:
источник
Python 3, 135 байт
Попробуйте это онлайн здесь
источник
Perl, 91
97Транспортировка оказалась слишком дорогой в конце.
Предыдущее решение:
Проверь меня .
источник
/^0/?O:etc
на$_?etc:O
$".="\23"^"\\ / \\ \\ / "x abs."O ";print/-/?$":/^0/?O:map{reverse$/,$"=~/(.).{$_}$/mg}0..2
Схема, 379 байт
Моя первая попытка кода в гольф и, к сожалению, одна из самых длинных. :(
Ungolfified:
источник
Ява, 282
Мой первый подход с особенно хорошими именами переменных:
Я понятия не имею, почему я делаю это. Должно быть, что-то развлекательное.
источник
Ява, 317
Моя первая попытка игры в гольф.
источник
Python 3, 165 байт
Попробуйте это онлайн здесь .
источник
Perl,
193197187180166163BШтраф в 1 байт для параметра командной строки -n. Запустить с
echo 1|perl -M5.10.0 -n scratch.pl
:С пробелами:
источник
-M5.10.0
не влияет на количество ваших байтов?say
это удобно для кода гольфе ...PHP, 341
Неуправляемая версия
источник
JAVA 377
384байтовисточник
С ++
269262258источник
R
228201Моя первая попытка кода в гольф. Я думаю, что это работает, но это не тонко.
источник
Groovy,
142134129125120118Наконец-то связано с питоном 2!
источник
Древесный уголь ,
282422 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Напечатайте верх
O
и оставьте курсор на одну позицию вниз и влево.Вывести строки
/
,\
и\
и повторить для абсолютного значения числа входных данных.Вернитесь к последнему
\
.Подумайте, чтобы создать правую часть спирали. Я делаю это здесь, потому что иначе
↗
бы не разбирался однозначно.Перезаписать последний
\
сO
.Если вход был положительным, поверните холст.
источник
Холст ,
333230 байтПопробуй это здесь!
Объяснение:
источник
С ++, 352
Совсем не самый короткий ответ, но пока первый в C ++ :)
Вот это в C ++ Shell с пробелами для тестирования
источник
Perl 156
Довольно прямолинейная попытка, мой второй гольф. Я думаю, что переводы строки считаются за 1 байт, верно?
Теперь, чтобы выяснить, как объединить все эти троицы вместе ... У меня есть много возможностей для совершенствования с этими
:'';
везде.источник
C 189 байтов
С пробелами и символами новой строки:
Некоторые заметки о подходе:
источник
Perl, 184 байта
Я думал, что это будет намного короче! Вероятно, есть несколько простых вещей, которые я могу сделать, чтобы сэкономить несколько байтов. Прошло пять лет с тех пор, как я серьезно программировал на Perl!
источник
PHP, 155
источник
J ,
67 59 5551 байтПопробуйте онлайн!
источник