проблема
Вдохновленный предыдущим испытанием, делающим что-то подобное
С учетом положительного целочисленного ввода n
выведите форму, которая следует этому шаблону:
вход n=1
:
* *
*
* *
вход n=2
:
** **
****
**
****
** **
вход n=3
:
*** ***
*** ***
*****
***
*****
*** ***
*** ***
и так далее...
У него есть эти свойства:
n*2+1
высокие линии
«руки» n
широко, за исключением случаев, когда они сливаются
центральная линия n
широкая
если n
четные линии выше и ниже центра n*2
широкие
если n
нечетно, линии выше и ниже центра n*2-1
широкие
правила
- Конечные переводы приняты
- Применяются стандартные лазейки
- Кратчайшие байты выигрывают
- Вывод может быть распечатан или строка или массив строк
Правки
n=0
не нужно обрабатывать- Трейлинг допускается
1
вместо*
и0
вместо пробела?Ответы:
Древесный уголь ,
1312 байтСпасибо @ErikTheOutgolfer за байт
Попробуйте онлайн!
Это мой первый в истории ответ на вопрос об угле, и я уверен, что он не так хорош, как мог, но я решил, что начну где-нибудь.
источник
I
для -1.MATL , 16 байт
Попробуйте онлайн!
объяснение
Рассмотрим ввод
2
в качестве примера. Содержимое стека показано ниже.источник
Желе , 15 байт
Попробуйте онлайн!
источник
»
векторизоваться ...V ,
1817 байтСохраненный байт благодаря трюку ввода @ DJMcMayhem.
Попробуйте онлайн!
объяснение
Это вставки
[n]*'*'+[n]*' '+[n]*'*'
Каждая итерация цикла, из которого идет буфер
к
Где
|
курсор с*
под нимисточник
Àé*ÄJÀäl
вместоÀá*Àá Àá*
, и вы можете сделать<M-c>
, то естьã
(мнемоника: центр ), чтобы перейти к середине строки, которая на байт короче, чемÀl
. Попробуйте онлайн!<M-c>
перерывы для больших чисел05AB1E , 18 байт
Попробуйте онлайн!
объяснение
Пример для
n=2
источник
V , 23 байта
Попробуйте онлайн!
HexDump:
По какой-то причине эта задача значительно сложнее в V, чем предыдущая. Поскольку наш общий подход n раз, растущий 'x' здесь не сработает, мы вместо этого построим вершину X, скопируем ее и перевернем, а затем соединим две части вместе.
Объяснение:
Делая отступ в конце цикла, мы можем использовать неявные окончания . Это также удобно создает n + 1 строк, которые являются точно верхней половиной «X». Допустим, входное значение было 4. Тогда на этом этапе буфер выглядит так:
И мы на последней строчке. Итак, мы:
источник
ãxx
Сначала я тоже это сделал , но я думаю, что он сломался, например, при n = 8?ãl
, или если вы сделаете отступ перед центрированием, но на самом деле это не спасает байты. Я не понимаю, почему это работает для меньших чисел, хотя.C #,
139 130115 байтов-1 байт, создав строку и вызвав ее
WriteLine
, сохранив при этом проверку новой строки.-6 байт благодаря Кевину и его мастерским методам игры в гольф!
-2 байта путем замены
n*3-n
наn*2
.-15 байт после того, как Кевин любезно указал мне правильное направление: я могу просто вернуть строку вместо ее печати, сохранив, таким образом, вызов
System.Console.WriteLine()
. И некоторые другие советы также ...Попробуйте онлайн!
Ungolfed:
Он просто перебирает строки и столбцы пространства, необходимого для печати большого X, и печатает либо a,
'*'
либо a в' '
зависимости от условия.источник
&&
может быть&
и||
может быть|
в этом случае.for(int j=0;
может быть,for(int j=0,i;
а затем вы можете удалитьint
передi
во внутренней петле. Кроме того, после первого изменения&
и|
вы также можете удалитьi++
внутреннюю часть цикла for и изменитьi==n*3-1?...
наi++==n*3-1?...
.WriteLine
, сохранил только 1 байт. Так что теперь я не уверен, что делать с твоим последним советом.System.Console.WriteLine
? Возвращаем строку:n=>{string s="";for(int i,j=0;j<n*2+1;j++,s+="\n")for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>n*2-j-1?'*':' ';return s;}
короче [ 120 байт ] (а также избавляемся от скобок, помещая все в цикл for. Вот TIO-ссылка чтобы показать, что она работает. Кроме того, не стесняйтесь добавлять это (или свое) TIO-ссылка на ваш ответ. :)WriteLine
в код, потому что OP попросил вывести большой X, а не просто вернуть его, поэтому я чувствовал, что вывод X (путем вызоваWriteLine
метода) должен быть частью кода. Тем не менее, я до сих пор не привык к правилам код-гольфа и не знаю, какие лицензии я могу получить при написании кода. Я только что видел, что некоторые другие ответы здесь печатают X в коде, а некоторые другие печатают его в нижнем колонтитуле. Каков правильный подход в этом случае?j<n*2+1
можете играть в гольф: может бытьj<=n*2
. Я также создал порт Java 8 для вашего ответа с тем же количеством байтов, что, конечно, заслуживает вашего удивительного ответа.Haskell ,
888786 байт-1 благодаря @Laikoni
Попробуйте онлайн!
источник
zipWith max m(reverse m)
можно сократить доzipWith max(reverse m)m
. Это то же самоеzipWith max=<<reverse$m
, что и в последующем:m
можно попробовать онлайн!Желе ,
242316 байтПопробуйте онлайн!
источник
MATLAB,
153126 байт (17,6% ↓)Благодаря комментарию @ LuisMendo, функция
disp()
может выводить символы без одинарных кавычек, поэтому я могу запретить использованиеfprintf
сformats
и пропустить несколько байтов. Кроме того, его комментарий напоминает мне, что мне нужно использоватьchar(32)
для представления пробела, а неchar(0)
(ноль).Попробуйте онлайн!
MATLAB, 153 байта
Пример результата: n = 10
источник
Python 2 ,
93908983 байта-3 байта благодаря Leaky Nun
-1 байт благодаря Zachary T
-6 байтов благодаря xnor
[Попробуйте онлайн!] [TIO-j3xwsktf]
Начинается со строки наподобие
'*** '
forn=3
, применяяmap/max
для выбора*
пробелы для каждой позиции, затем добавляя пробел, удаляя последний символ из строки и повторяя все это.источник
n*2*' '
наn*' '
?map(max
Может быть сделано непосредственно безzip
. Такжеn*2+1
естьn-~n
.Haskell , 70 байт
Попробуйте онлайн!
Выводит список строк.
Для каждой позиции строки
r
, столбцаc
, используется формула, чтобы определить, попадает ли она в одну из двух диагональных полос, и так оно и есть*
.источник
Java 8,
119118 байтПортируйте из удивительного ответа C # @CarlosAlejo , после того, как я помог ему кое-что сыграть в гольф. Так что убедитесь, что проголосовали за него!
Попробуй это здесь.
источник
Javascript (ES2017),
155157 байтВозвращает массив строк. Я выполняю операции над массивами, затем отражаю их. Вероятно, это можно оптимизировать с помощью матриц, как и другие ответы, но я хотел быть уникальным.
Редактировать: Как отметил Нил, для четных значений
n
центральная линия была неn
широкой, поэтому я добавил модуль для определения четности / нечетности при разрезании столбца.Ungolfed
квадрант
Зеркальный по горизонтали
Зеркальный по вертикали
источник
n
- центральная линия не являетсяn
широкой.Mathematica, 148 байт
источник
R, 102 байта
Код:
Тестовое задание:
источник
CJam, 24 байта
Это блок, который берет число из стека и выводит список строк в стек.
Объяснение:
источник
Python 2 , 110 байт
Эта программа разбивает каждую строку на 4 части: первые пробелы, первые звезды, вторые пробелы и затем вторые звезды. Для каждой горизонтальной линии X он вычисляет, сколько звездочек или пробелов необходимо для каждого из 4 участков линии, затем строит и печатает эту строку.
источник
Сетчатка , 144 байта
Попробуйте онлайн! Объяснение:
Добавьте 2n + 1 пробел перед входным значением (по одному на каждую выходную строку).
Замените каждый пробел на
#
и соберите результаты. Это дает диагональную линию#
s, заполненную пробелом с обеих сторон, с добавленным входным значением.Удалите исходное значение ввода, так как теперь у нас есть копия в каждой строке.
Создайте две диагональные линии n
*
s, с разделителем столбцовn
пробелов, обернутых в пару#
s.На тех линиях, где
*
s ближе к середине, поменяйте местами две половины. Это дает вид, напоминающий> | | <
.Переместите
| |
s как можно дальше влево, создавая>> > <
вид.Для каждого пробела между
#
s удалите три следующих символа. Это присоединяется> <
кX
.Удалите ненужные теперь
#
s.источник