Снова вдохновленный задачей для программирования 101, вот еще одна проблема.
Входные данные:
- Целое положительное число
n >= 3
. (должно быть странно)
Выход:
n
линии звездочек, где в первой строке естьn
звездочки, а в каждой новой строке на две звездочки меньше, чем в предыдущей строке. До удара 1 звездочка. Оттуда каждая новая строка имеет на две звездочки больше, чем строка до возвращения кn
звездочкам. Для выравнивания звездочек необходимо использовать пробелы или что-то вроде пробелов, чтобы они действительно выглядели как песочные часы.
Основные правила:
- Конечные переводы строк разрешены, но не должны использоваться.
- отступ является обязательным.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
- Поскольку курс преподается на C ++, мне не терпится увидеть решения на C ++.
Тестовый пример (n = 5):
*****
***
*
***
*****
Ответы:
Древесный уголь , 6 байт
Смертельно просто. Draw поли G на из
*
, с длиной стороны , взятой из входного N умбры, где стороны идут вниз и вправо, влево по горизонтали, а также вверх и вправо:Затем автозаполните контур и заполните его.
Попробуйте онлайн!
источник
Python 2, 57 байт
Полная программа. Идет построчно, печатая нужное количество звездочек по центру.
Рекурсивная функция была длиннее (67 байт):
или
источник
max
сabs
, но все , что я получил этоabs(n-1)+1
, что еще хуже , потому что добавление требует скобки'*'*-~abs(n-1)
, но тогда они имеют ту же длину, что и'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
на 61 байт, но все еще длиннее. Даже с лидирующим символом новой строкиdef f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+r
все равно остается 58 байт ...center
. Никогда не знал, что существовало до сих пор.V , 12 байт
Попробуйте онлайн!
Мне нравятся такие вызовы, потому что я могу продемонстрировать преимущества 2D-характера V. Объяснение. Для начала нам нужно создать строку из n звездочек. Итак, мы делаем это:
В качестве примечания, это прямо эквивалентно
@ai*<esc>
vim, а регистр@a
предварительно инициализирован как «arg1». Это делает числовой ввод намного более удобным.Затем мы перемещаемся на символ справа с
h
. Вот самое интересное:Технически, эта последняя часть
Потому что команда indent на самом деле
>>
. V удобно предполагает, что к текущей строке применяются неполные команды, а также неявно заполняет второйò
символ для цикла.источник
Метаданные C ++, 186 байт
С явной формулой из моего ответа C, Metatemplates конкурируют!
Ungolfed:
использование:
не конкурирующих
Просто для удовольствия
Использование:
источник
PowerShell v2 +, 54 байта
Принимает входной сигнал
$n
(гарантированно будет нечетное целое число), конструирует два диапазона с$n..1
и2..$n
и сцепляет их вместе, а затем используетWhere-Object
для выбора только нечетные с|?{$_%2}
. Те питаются в петле. На каждой итерации мы строим соответствующее количество пробелов, соединенных строкой с соответствующим количеством звездочек. Эти строки остаются в конвейере и выводятся через неявныеWrite-Output
вставки между ними строк при завершении программы.Примеры
источник
Python, 78 байт
Так что только с отступом:
Использование:
источник
C
114109 байтungolfed:
Предыдущее рекурсивное решение:
источник
JavaScript (ES6), 66 байт
Идея состоит в том, чтобы сгенерировать каждый песочные часы из предыдущего: добавить пробел в начале каждой строки, а также добавить и добавить
n
звездочки.источник
05AB1E ,
21201917 байтЭкономия 2 байта благодаря carusocomputing
Попробуйте онлайн!
объяснение
источник
Ir"*"×.pRû
- Дошло так далеко, лицо было ладонями, когда я понял, насколько далеко я был, увидел, что вы ответили, собираюсь попытаться выучить итерацию на этом языке сейчас, используя этот пример. Благодарность!;ƒ'*¹N·-×Nð×ì})û»
используйте новую команду palindromize. -2 байта.ÅÉ
и ,.c
вероятно , не были доступны еще в то время , вы отправили это. :)MATL , 12 байт
Попробуйте онлайн!
объяснение
Это использует недавно добавленную функцию симметричного диапазона .
источник
PHP, 95 байт
Вместо того, чтобы хранить строки в массиве и затем выводить все, цикл for уменьшается до 1, а затем возвращается к исходному числу.
источник
C ++ 11, 93 байта
Слегка разгульный
Использование:
источник
'\n'
на10
:)MATL , 20 байтов
Попробуйте онлайн!
источник
R 77 байт
Создает матрицу символов, через которую она затем распечатывает
cat
, сfill=n
обеспечением правильного выравнивания линий. Обратите внимание, что элементы хранятся в матрице столбец-первый (т. Е. Первые два элементаM[1,1]
иM[2,1]
, а неM[1,2]
.)источник
Java 7,
170 165164 байтаСпасибо @Hypino за сохранение 5 байтов.
Спасибо Кевину за сохранение 1 байта.
источник
s=
из нихs=s+"\n"
и еще 2 байта, изменивreturn(n=--n-1)
значениеreturn(n=n-2)
на 4 байта.String s="",c="",t="";
String s,c,t=s=c="";
return(n=n-2)>=0?s+"\n"+c+c(n,++x)+
return n-1>0?s+"\n"+c+c(n-2,++x)+
n=n-2
->,n-1>0
потому что n следует использовать в другом аргументе функции.n
кn-2
в этой части.return(n=n-2)>=0 ... n
быть измененным наreturn n-1>0 ... n-2
все еще короче. PS: Вы поблагодарили меня за сохранение байтов, но не изменили свой код при редактировании. ;)String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}
безt
( тест идеона - 133 байта )PHP - 95 байт
Сохраненный байт, используя новую строку вместо
"\r"
источник
Pyth, 22 байта
Программа, которая принимает ввод целого числа в STDIN и печатает результат.
Попробуйте онлайн
Как это работает
источник
C
195191 BytesГольф должен быть немного меньше
Мы можем проверить это здесь на Ideone
источник
C, 79 байтов
Он разбивает переменную обратного отсчета
k
на индексы строк и столбцов. Если индекс столбца равен 0 (последний символ в строке), он выводит символ новой строки (10). Затем он корректирует индексы строк и столбцов так, чтобы они находились вокруг центральной звездочки. Тогдаabs(x) < abs(y)
это короткое условие для вывода пробела.источник
Рубин,
5554 байтаисточник
?**n
работает; вам не нужно место там.Java 7, 156 байт
Довольно просто. Отслеживает линии с
n
, звезды сj
, пробелы сs
и направление сd
. Я действительно просто хотел нерекурсивный ответ Java на доске, но это не повредит, что он также немного короче :)С переносами строк:
источник
APL, 19 байт
Тест:
Объяснение:
источник
1+
и используйте APL, который имеет⎕IO←0
.Haskell, 84 байта
источник
putStr
, и вы можете избавиться от ,fromEnum
как это .C (gcc) ,
8074 байтаСпасибо за потолок за 6 байт
Попробуйте онлайн!
источник
PowerShell ,
5450 байтПопробуйте онлайн!
источник
PHP ,
10488 байтПопробуйте онлайн!
Это не побеждает самые низкие оценки для PHP в этом соревновании, но я просто схожу с ума, чтобы отбросить.Итак, теперь я играю в гольф, чтобы быть (недолго) самым низким показателем для PHP в этом соревновании, но это не меняет того факта, что он все еще сумасшедший.
источник
Groovy, 66 байт
Попробуйте это: https://groovyconsole.appspot.com/script/5145735624392704
Разъяснение:
((n..1)+(2..n))
- обратный палиндромиз[n,..,1,..,n]
.each{if(it%2>0){...}
- Перебирать нечетные элементы.println(("*"*it).center(n))
- Центрировать n звездочек и напечатать каждую на новой строке.источник
.each
Кодовый блок может быть{it%2&&println(("*"*it).center(n))}
.PHP, 191 байт
Беги как
php -f golf_hourglass.php 15
Идея заключается в том, чтобы создать верхнюю половину (часть перед синглом
*
), а затем просто повторить верхнюю часть дважды, но второй раз в обратном порядке.источник
for(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;
это лучше\n
фактической новой строкой, чтобы сохранить байт.Пайк,
2219 байтПопробуй это здесь!
источник
C 117 байт
Ungolfed
источник