Напишите программу или функцию, которая принимает положительное целое число (через stdin, командную строку или функцию arg) и печатает или возвращает строку из множества этих маленьких треугольников, связанных друг с другом, чередуя то, как они указывают:
/\
/__\
Этот единственный треугольник является выходным, если на входе есть 1
.
Если вход есть 2
, то выход
____
/\ /
/__\/
Если вход есть 3
, то выход
____
/\ /\
/__\/__\
Если вход есть 4
, то выход
________
/\ /\ /
/__\/__\/
И так далее. Ваша программа должна поддерживать входы до 2 16 - 1 = 65535.
подробности
- Крайний левый треугольник всегда указывает вверх.
- Могут быть пробелы, но не может быть лишних начальных пробелов.
- Там может быть необязательный завершающий перевод строки.
- Обратите внимание, что для
1
вывода две строки, но в противном случае это три. Это обязательно. - Самая короткая подача в байтах побеждает.
SQL,
182175173187 байтНе то, чтобы это когда-либо было самым коротким, но все еще забавно пытаться минимизировать sql;) lol Я сделал это в Oracle 11, однако, это должен быть базовый SQL. [edit], как указано, я не применял правило когда input = 1 - показывать только 2 строки. не могу придумать лучшего способа сделать это, однако, я сохранил пару байтов, изменив логику v;) добавление 2 раньше времени экономит пару байтов, не повторяя их позже [/ edit]
[edit1] удалил некоторые ненужные пробелы [/ edit1] [edit2] изменил && i на просто & i. Он сокращает 2 символа, но вынуждает пользователя дважды вводить число треугольников ...: PI понял, что мои "хорошие привычки кодирования" с использованием && я стоили 2 байта !! Ужас!! [/ Edit2]
Пояснение (примечание: я использую && 1 в этом объяснении, поэтому он запрашивает только один раз, приведенный выше & 1 экономит место кода, но запрашивает несколько раз;))
Выход
источник
from
? Если так, то это сэкономит вам байт.Python 2,
8988878583 названных / 81 неназванных(Спасибо @orlp за байт и @xnor за еще три)
Это функция, которая принимает int
n
и возвращает треугольники в виде строки, используя построчный подход.например
print f(10)
даетДля первой строки вместо того,
(n>1)*
чтобы использовать1%n*
, так1%n
как 0, еслиn == 1
и 1, еслиn > 1
.источник
" /\\ "
в" /\ "
."\n".join()
к 3 элементам, даже если список используется для условного удаления первого элемента. Может быть, что-то вродеb*(x+"\n")+y+"\n"+z
короче?JavaScript (ES6), 101
109Слишком долго
объяснение
Использование жирной стрелки для определения функции. Кроме того, нет
{}
блока: тело функции является единственным выражением, которое является возвращаемым значением.f=(a,b,c)=>expr
эквивалентноВнутри одного выражения вы не можете использовать такие выражения, как
if
илиvar
, но?:
работают хорошо вместоif else
w
является вторым (неиспользованным) параметром функцииz
Мы можем переписать
f
функцию какТест в консоли Firefox / FireBug
Выход
источник
w
n=>(n>1?' '+'____'.repeat(n/2)+'\n':'')+' /\\ '.repeat(n).slice(0,n*2+2-n%2)+'\n'+'/__\\'.repeat(n).slice(0,n*2+1+n%2)
для 119 (намеренно не используя строки шаблона и т. Д., Чтобы соответствовать вашему ответу).CJam,
555351 байтЯ попытался перенести мой ответ Python, и он оказался короче, чем другие CJams.
Постоянная ссылка .
источник
Haskell
155153139131 байтЯ нашел немного другой подход, который оказался короче, чем мой оригинальный метод. Моя первоначальная попытка сохранилась ниже. Как и прежде, советы по игре в гольф приветствуются.
Спасибо Ними за советы по игре в гольф.
Предыдущая попытка
197179 байтисточник
(mod n 2)==0
этоeven n
или лучше использоватьodd n
и свопthen
иelse
часть.concat.take(div n 2).repeat
этоtake(4*div n 2).cycle
потому , что все элементы списка имеют длину 4. Присвоить короткие имена для функций с длинными именами, например ,z=zipWith
- использоватьz
. Вы можете выбросить несколько пробелов...repeat""else[...
.foldr z["","",""]
естьfoldr1 z
, потому что список для свертывания никогда не бывает пустым. Вместо этогоall(==' ')
вы можете использовать==" "
(<- два пробела между), потому что он используется для удаления пустой строки в случае n = 1 и здесь первая строка" "
. Первое определениеt
можно записать в одной строке:t n|odd...
.CJam,
7368636260 байтЭто определенно нуждается в игре в гольф ...
Проверьте это здесь.
объяснение
источник
Юлия, 115 байт
Это создает безымянную функцию, которая принимает целое число и печатает треугольники. Чтобы назвать его, дайте ему имя, например
f=n->(...)
.Ungolfed + объяснение:
Пример вывода:
Я очень расстроен, что это так долго. Я уверен, что есть множество возможностей для игры в гольф, но они мне пока не ясны. Дайте мне знать, если у вас есть какие-либо предложения или вы хотите получить дальнейшие объяснения!
источник
CJam,
68 6260 байтНасколько я понимаю, это совершенно другой подход, чем другое решение CJam. Это может быть много в гольфе.
Попробуйте онлайн здесь
источник
C # 190
Ungolfed
источник
while
цикл, а использоватьfor
цикл. В этом случае вы можете сохранить 2 байта, включив определениеm
в инициализацию цикла for и,b=!b
в конце концов, как бы он ни вызывался. Вы также можете сэкономить, заменивstring
иbool
сvar
. Вы также не нуждаетесь в предложениях "()" вокругn>1
, и в этомs+=
предложении вы можете использовать не короткое замыкание,&
а не&&
как побочные эффекты или разыменования, чтобы пойти не так. Наконец,1>0
корочеtrue
;)C #,
257183 байтаИзменить: Благодаря подсказкам от @VisualMelon, сэкономлено 74 байта.
Я знаю, что это далеко не лучший язык для игры в гольф, но больше всего мне интересно узнать о различных нюансах C #, а не выигрывать соревнования. Это в основном порт этого ответа Pyth.
Я думаю, что циклы for можно было бы продолжить, но я не совсем уверен, как, учитывая встроенные в них третичные утверждения.
Пример (1, 2, 3, 10):
Ungolfed:
источник
s+=
это ваш друг. Действительно, вы за петли можете сделать немного более компактным. Радость / ужас операторов++
and--
означает, что вы можете выполнять большую часть работы в условной проверкеfor(i=0;i++<=t;)
(эта проверка проверяет,i
меньше или равна, аt
затем увеличивает ее). Вы бы неплохо определилиint i
внешний цикл for и использовали его повторно, и, поскольку вы можете гарантировать, чтоi
он никогда не будет отрицательным,i%2==0
можно поменять его местамиi%2<1
. С этими изменениями легко получить оценку ниже 200 байт.Enumerable
обычно требуетсяusing System.Linq
директива, и я думаю, что обычно предполагается, что такие пункты включены. Однако в этом случае можно заменить толькоvar s=" "+string.Join("____",new string[1+t/2])+n;
один LINQ, который не содержит LINQ и короче текущего кода;) Он объединяет множество пустых строк вместе с тем, что нас действительно волнует, «____» (1 + t / 2 потому что нам нужна еще одна нулевая строка, чтобы соответствовать другой "____" раньше). Переменнаяn
объявлена как "\ r \ n".Console.Write
вместо этогоConsole.WriteLine
Ява, 185
объяснение
источник
C # -
151146141138Вдохновленный ответом @ bacchusbeale
Ungolfed
источник
new String
является новой для меня! Похоже, вы пропустили свойt=""
вариант игры в гольф, но лучше было бы инициализироватьt
как "\ n". Вы можете сохранить несколько байтов, присоединяя кt
где вы щелкаетеb
, спасая «{}» на для цикла:t+=(b=!b)?"/":"__\\"
.t
ранееs
и добавитеt
к строке, а не"\n"
;)Идти,
156144Ungolfed:
Единственный реальный трюк здесь (и он даже не очень хороший) - это использование 3 аккумуляторов, чтобы я мог сконденсировать решение до 1 цикла.
Код можно запустить здесь: http://play.golang.org/p/urEO1kIjKv
источник
c += `__\`
вместоif i<n{c+="_"}
> <> (Рыба) ,
215183156 байтИзменить: Notepad ++ дал мне 5 дополнительных байтов из-за CR, поэтому изменил количество соответственно
Немного больше в гольфе, но это моя первая рыбная программа на данный момент> _ <Требование не иметь пустой первой строки для 1 треугольника удвоило размер программы.
Можно проверить на http://fishlanguage.com/ (Int на начальном стеке для длины)
Объяснение:
источник
Perl
109108106Я думаю, что это нормально для моего первого гольфа, я использовал раздел Vynce для первой строки, а остальную часть своего кода, чтобы преодолеть проблему новой линии с 1 треугольником.
Теперь посмотрим, смогу ли я сократить его :)
Изменить : пробелы
Изменить 2 : заменено
"\n"
на$/
источник
С89, 150
Версия без гольфа:
Выход:
Стек переполняется, если я вхожу
65535
(но не если вы компилируете-O3
!), Но теоретически это должно работать ;-)edit: программа теперь удовлетворяет требованию, что только две строки должны быть выведены, если
1
передано программе edit 2: использоватьint*
вместоchar*
источник
main
какmain(c,v)**v;
будто это работает.c
илиn
как глобальную переменную, так что вам не нужно передавать этот параметрr()
. Я не думаю, что ваш ответ соответствуетNote that for 1 the output is two lines long but otherwise it's three. This is required.
error: expected declaration specifiers before ‘*’ token main(c,v)**v;{
n
илиc
это короче либо.int**
?C ++ stdlib, 194 байта
Тестовая программа:
источник
Баш,
166127125119105 байтВ функции:
С некоторыми презентациями:
Может сделать (если у вас установлен figlet ):
Сохранить 2 символа, если ввод из переменной вместо
$1
: 103В цикл:
Будет оказывать (примерно) то же самое:
источник
Древесный уголь , 27 байт (неконкурентный)
Неконкурентоспособен, потому что язык ставит перед собой задачу.
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Создайте список чередующихся битов длины
n
и зациклите их.Нарисуйте
____
без перемещения курсора.На первом и каждом другом треугольнике нарисуйте левую
/
сторону.Нарисуйте
\
сторону, не перемещая курсор.На втором и каждом другом треугольнике
\
снова нарисуйте левую сторону, чтобы переместить курсор.На втором и каждом другом треугольнике нарисуйте правую
/
сторону, не перемещая курсор.источник
PowerShell ,
11695 байтБольшое спасибо Mazzy и ASCII-Only за сохранение 21 байта
Попробуйте онлайн!
Не допускается пустая строка для n = 1, как
14 14байт. Это решениедовольно умопомрачительно,теперь намного умнее с минимальным количеством повторяющегося кода. Округление Банкира все еще является настоящим дьяволом.источник
C 368 байт
Лучше, если вы посчитаете
#include
утверждения, но они скомпилированы на gcc, хотя и с предупреждениями, без них. Я знаю, что это не самое короткое время, но мне все еще нравится, что я сделал это на C.источник
#define p(c)printf(c)
короче вашей функции. Вы можете опустить возвращаемые типы для функций (они по умолчаниюint
). Вы также можете определить функцию вC89
стиле, как этоmain(c,v)char**v;{}
. Это коротко дляint main(int c, char** v){}
Perl (простой)
131125120довольно простой первый проход:
ой кому нужен явный int?
источник
Пролог, 126 байт
Вызывать как
$3
.Более читабельно:
Пример:
источник
C #: 1 строка LINQ, 198 байт
источник
Сетчатка , 88 байт (неконкурентная)
Неконкурентоспособен, потому что язык ставит перед собой задачу.
Попробуйте онлайн! Объяснение:
Замените ввод парой треугольников.
Умножьте треугольники на исходный ввод.
Разделите треугольники на 2.
Удалите оставшуюся половину треугольника.
Удалите первую строку, если она сейчас пуста.
источник
Perl 6 , 83 байта
Попробуйте онлайн!
Блок анонимного кода, который принимает число и возвращает строку.
источник
C (gcc) ,
117115 байтов-2 благодаря потолку.
Все эти скобки предполагают, что что-то менее неуклюжее, безусловно, возможно.
Попробуйте онлайн!
источник
05AB1E , 37 байт
Попробуйте онлайн или проверьте первые 10 выходов .
Объяснение:
источник
Java 11, 122 байта
Попробуйте онлайн.
Объяснение:
источник