Напишите программу, которая принимает (через STDIN / командную строку) неотрицательное целое число N.
Когда N равно 0, ваша программа должна печатать O
(это заглавная буква О, а не ноль).
Когда N равно 1, ваша программа должна напечатать
\|/
-O-
/|\
Когда N равно 2, ваша программа должна напечатать
\ | /
\|/
--O--
/|\
/ | \
Когда N равно 3, ваша программа должна напечатать
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
Для больших N этот шаблон продолжается точно таким же образом. Каждый из восьми лучей «солнца» должен быть сделан из N соответствующих -
, |
, /
или \
символов.
Детали
- Вместо программы вы можете написать функцию, которая принимает целое число. Функция должна нормально печатать солнечный дизайн или возвращать его в виде строки.
Вы должны либо
- не иметь никаких пробелов или
- только достаточно пробелов, поэтому шаблон представляет собой идеальный (2N + 1) * (2N + 1) прямоугольник.
Вывод для любого или всех N может опционально содержать завершающий перевод строки.
счет
Самый короткий код в байтах побеждает.
code-golf
ascii-art
kolmogorov-complexity
Кальвин Хобби
источник
источник
N=0
.Ответы:
Pyth,
393836 байтПопробуйте онлайн: Pyth Compiler / Executor
объяснение
Другое решение 36 байтов будет:
источник
C:
11610299959290Я думаю, что я довольно близко подхожу к минимальному решению, используя этот подход, но я не могу перестать чувствовать, что в C. Ungolfed есть гораздо лучший подход:
источник
c,r;s(n){for(r=c=-n;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
GNU sed, 252 + 1
Фу - я бью ответ php!
Оценка + 1 за использование
-r
параметра.Из-за ограничений sed мы должны сжечь почти 100 байтов, просто преобразовав N в строку из N пробелов. Остальное самое интересное.
объяснение
:
) преобразуют N в строку из N пробеловs/ //
удаляет один пробелs^.*^\\&|&/^;ta
преобразует N-1 пробелов в:\
+ N-1 пробелов +|
+ N-1 пробелов +/
\
одного пробела вправо и/
одного пробела влево ...\|/
, который заменяется-O-
и перейти кn
меткена
-
и распечатать-0-
на/|\
, заменитьна
-
и перейти обратно в основной цикл\
одного пробела вправо и/
одного пробела влево ...\$
что указывает, что были закончены, и выйти.Выход
источник
J,
373440 байтИспользование:
Пояснение (слева направо):
i:
генерирует список-n, -(n-1), ..., n-1, n
( )"*/~@i:
создает продукт Декарта i: с собой в матричном расположении, например, дляn = 1
создает следующую3-by-3
матрицудля каждого матричного элемента с целыми числами
x y
мы делаем следующее+&|,-,+,[,]
рассчитать список свойств+&|
abs(x)+abs(y)
, равно0
если (если и только если)x=0
иy=0
-
xy, равно0
тогда и только тогда , когдаx=y
мы находимся на диагонали+
х + у, равен0
тогда и только тогда , когдаx=-y
мы находимся на антидиагональной[
х, равен0
тогда и только тогда , когдаx=0
мы находимся в среднем ряду]
у, равен0
тогда и только тогда , когдаy=0
мы находимся в среднем столбце'O\/-|'#~0=
сравните эти значения свойств выше0
и возьмитеi
символ th из строки,'O\/-|'
еслиi
свойство th имеет значение true.{.
принимает первый символ строки и, если его нет, возвращает пробел в качестве заполнения, как нам нужно1:echo
Попробуйте это онлайн здесь.
источник
PHP, 182 байта
Это казалось забавным занятием для моего первого ответа. Комментарии к моему коду приветствуются.
Вот код для игры в гольф с комментариями:
Отредактировано с помощью кода Royhowie
источник
if(($y-$h)==($x-$h))
делает так же, какif(($y==$x)
. Вы можете сохранить другого персонажа, заменивif($x==y$)foo();else bar();
наif($x^$y)bar();else foo();
. Вам также следует попробовать использовать троичные операторы вместоif .. else
операторов.function s($n){$e=2*$n+1;for($i=0;$i<$e*$e;$i++){$x=$i%$e;$y=floor($i/$e);echo$y==$x?($x==$n?"O":"\\"):($e-1==$x+$y?"/":($y==$n?"-":($x==$n?"|":" ")));echo$x==$e-1?"\n":"";}}
$r
; просто используйтеecho
($r.=
такое же количество байтов, какecho
). 2. используется троичный оператор (сохраняет много символов). 3.$h
было бесполезно , так как он составил$n
. 4. Вам не нужно использоватьfloor
для$x = floor($i%$e);
, так как модуль на целое число не нужно будет округлять в меньшую сторону.Python 2, 99
Отпечатки построчно, создавая каждую строку посредством проверки координат
(i,j)
( с центром в точке(0,0)
) удовлетворяетj==-i
,j==0
,j==i
или нет, с хак, чтобы сделать работу центральной линии.источник
R
вместо того,.5
чтобы сохранить 1 байт.CJam,
48 45 43 4138 байтЭто все еще слишком долго, и я все еще делаю некоторые избыточные вещи, но здесь идет:
Попробуйте онлайн здесь
источник
SpecBAS - 117 байт
Это печатает косые черты и черточки в одну петлю, а затем добавляет «О» в середине.
Вывод с использованием 1, 2 и 9
источник
"-": NEXT y: PRINT AT s,s;"O"
в ,"-";AT s,s;"O": NEXT y
чтобы сохранить два байта.JavaScript (ES6) 97
98Это кажется достаточно другим ...
источник
OS / 2 Classic Rexx, 102 ... или 14 для "читерской версии"
Уберите переводы, чтобы «поиграть в гольф».
Версия мошенника, назовите скрипт с любым исходным кодом длиной не более 255 символов (требуется диск HPFS):
РЕДАКТИРОВАТЬ: Просто чтобы быть ясно, версия мошенника не предназначен для подсчета! Это просто быть глупым и показать, что старая собака все еще может делать трюки. :)
Например, для настоящего развлечения и игр - реализация «лямбда-выражений» в стиле Java-8 / C11 в итераторе списка. Не проверено, но должно работать на мэйнфрейме IBM приблизительно 1979 года. ;)
- Код вызова предполагает, что вы уже сделали стебель (массив), естественно.
источник
Haskell,
1099896 байтСпасибо Ними и Маурис за помощь!
Объяснение:
Оператор
#
указывает, какой символ появляется в координатах (i, j), а солнце центрировано в точке (0,0). Функцияf
строит результирующий String путем сопоставления#
всех пар координат в диапазоне от -n до n.Использование:
источник
s
, например0#0='O'
,0#_='-'
и т. Д. И1<2
вместоTrue
.map(i#)[-n..n]
чтобы сохранить два байта.R
177149 байтМикки Т. человек! Он помог мне исправить мое изначально неправильное решение и сэкономить 28 байт. Спасибо, Микки!
Ungolfed + объяснение:
Любые дальнейшие предложения приветствуются!
источник
scan
самом деле не нужноw=
. Это может также быть перемещено глубже в команды.if
Можно угробил , если изменить способ матрицы обрабатываются в нескольких случаях. Применяя их, я получаюm=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)-rev(col(m))==0]='/';diag(m)="\\";m[,n]='|';m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],'\n');cat(t(m),sep='')
. Дальнейшее игра в гольф возможно, я думаю.C #,
230226 байтВ соответствии с просьбой версия без заглавных букв: string ug (int n) {
Это мой первый пост, поэтому прошу прощения, если я сделал что-то не так. Любые комментарии и исправления приветствуются.
источник
s=2*n+1
вместо того, чтобыs=(n*2)+1
иw==s-h-1
скорееw==(s-h)-1
сделаем это немного короче.Рубин:
9892 символовПроц, который возвращает строку с Солнцем.
Образец прогона:
источник
Ржавчина, 215 символов
Я попытался использовать метод среза строки (создавая строку
n-1
пробелов и нарезая индекс и обратно) следующим образом:Но это на самом деле на 3 символа больше.
Ungolfed код:
Мне нравится то, как я брею несколько символов на строках форматирования. Например,
эквивалентно
потому что «автоинкремент» для позиции аргумента строки формата не зависит от ручного указания числа и действует совершенно независимо.
источник
Октава 85
Построение матриц как всегда =)
eye
создает единичную матрицу, остальное самоочевидно, я думаю.источник
IDL 8,3, 135 байт
Не знаю, если это можно играть в гольф больше ... Это очень просто. Сначала мы создаем
m x m
массив (m=2n+1
) пустых строк; Затем мы рисуем символы в строках (y=x
,y=-x
,y=n
иx=n
). Затем мы опускаем точку O в точке(n, n)
и печатаем все это, отформатированные в видеm
строк длиной 1 в каждой строке, чтобы не было лишних интервалов при исходной печати массива.Тест:
источник
Matlab,
9387 байтК сожалению, заголовок функции должен быть таким большим ... Кроме того, я думаю, что он очень неплохой. Интересно, можно ли это сделать лучше с некоторыми синтаксическими различиями в Octave.
источник
N=input('')
чтобы сохранить 2 символа. Кроме этого, вы можете просто написать[E V D;H 79 H;D V E '']
для преобразования всей матрицы в массив символов, что сэкономит вам еще один или два байта. (Я только что представил программу Octave с немного другим подходом, но прежде чем я нашел вашу =)Javascript ( ES7 Draft ) 115
источник
Pyth - 52 байта
Сложнее всего было выяснить, как переключать слэши с каждой стороны. Я решил определить лямбду, которая использует символы для использования.
Скорее всего, можно играть в гольф больше, объяснение скоро.
Попробуйте это онлайн здесь .
источник
Perl, 94
Здесь много вложенных тернарных операторов, но я думаю, что код достаточно прост.
Попробуйте это здесь: ideone.com/E8MC1d
источник
for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}
- Несколько твиков: конвертируем inner for в map и меняем $ y на $ _; рядный($n=<>)
.C # - 291 (полная программа)
источник
JavaScript (ES6),
139135140 + 1 байт(+1 для
-p
флага с узлом в консоли)исправлено:
использование:
ungolfed:
источник
(A=Array).from(A(m))
Python 3,
193186 байтGolfed
Выход
Ungolfed
источник
s=' ',b='\\',f='/',d='|',g='-'
это очень долго, так что вы бы лучше сдвинув его, добавивs,b,f,d,g=" \/|-"
к второй линии." \/|-"
в виду как одну строку, а не разделять ее на отдельные символы. Вы можете распаковать из строки, какx,y,z="123"
, что делаетx="1"
,y="2"
иz="3"
.CJam,
5955 байтЭто не принесет никаких наград как есть, но я был достаточно счастлив, что это сработало!
Спасибо Sp3000 за советы по игре в гольф.
источник
S
вместо'
версии для пробела и 2) Поскольку'-A*'O'-A
вы можете сделать'-A*_'O\
вместо этого, потому что генерация его дважды длиннаPython,
175 129 127125 байтПопробуйте это онлайн здесь .
источник
Рубин - 130 байт
использование:
источник
f=->n{a=(0...n).map{|i|(s=' ')*i+?\\+s*(m=n-1-i)+?|+s*(m)+?/+s*i};puts(a+[?-*n+'O'+?-*n]+a.reverse.map(&:reverse))}
(См. Советы по игре в гольф в Ruby для получения дополнительной информации.)Perl
8591908986BUngolfed:
источник
Пролог, 219 байт
Нет, это не очень похоже на язык игры в гольф. Но я думаю, что этот сайт нуждается в большем количестве прологов.
Проверено
swipl
на Linux. Вызывать так:swipl -s asciiSun.prolog
; Затем запросите желаемый размер солнца:Ungolfed:
источник
JavaScript (ES6),
142140134117 байтПопытайся
источник