Напишите программу или функцию, которая принимает строку, гарантированно содержащую только печатаемые символы ASCII, за исключением пробела, и длину положительного треугольного числа (1, 3, 6, 10, 15, ...).
Выведите или верните ту же строку, но в форме треугольника, используя пробелы. Некоторые примеры лучше всего покажут, что я имею в виду:
Если входной, R
то выходной будет
R
Если входной, cat
то выходной будет
c
a t
Если входной, monk3y
то выходной будет
m
o n
k 3 y
Если входной, meanIngfu1
то выходной будет
m
e a
n I n
g f u 1
Если входной, ^/\/|\/[]\
то выходной будет
^
/ \
/ | \
/ [ ] \
Если вход
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
тогда вывод будет
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
В основном, новые строки вставляются между подстроками треугольной длины, пробелы добавляются между всеми символами, а каждая строка имеет отступы, чтобы соответствовать форме треугольника.
Допускается одиночная завершающая новая строка и строки с завершающими пробелами, но в противном случае ваш вывод должен точно соответствовать этим примерам. Последняя линия треугольника не должна иметь начальных пробелов.
Самый короткий код в байтах побеждает.
Ответы:
Pyth, 22 байта
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
Python, 81 байт
Рекурсивная функция. Идет с конца
s
, отрубает и печатает символы. Количество символов, которое нужно взять, рассчитывается по длинеs
. Функция настроена на печать в обратном порядке рекурсивных вызовов, которые завершаются, когдаs
пусто, а затем разрешаются обратно на линию. К каждому слою префиксаp
добавляется дополнительное пространство.В Python 3 это
if
можно сделать с помощью короткого замыкания, хотя это, похоже, не спасает символы:Не менее длинная альтернатива с цепочкой неравенства:
Оба
print
иf
возвращаютсяNone
, что сложно использовать.источник
Retina ,
1081029487826463 байтаСпасибо Sp3000 за то, что он заставил меня следовать моему первоначальному подходу, благодаря которому количество байтов уменьшилось со 108 до 82.
Огромное спасибо Коби, который нашел гораздо более элегантное решение, которое позволило мне сэкономить еще 19 байтов.
Где
<space>
представляет один пробел (который в противном случае был бы удален SE). Для целей подсчета каждая строка помещается в отдельный файл и\n
должна быть заменена реальным символом перевода строки. Для удобства вы можете запустить код как есть из одного файла с-s
флагом.Попробуйте онлайн.
объяснение
Ну ... как обычно, я не могу дать полное представление о балансирующих группах здесь. Для начинающих см. Мой ответ переполнения стека .
Первая ступень представляет собой
S
плоскую стадию, которая разбивает входные данные на линии увеличивающейся длины._
Указывает на то, что пустые куски должны быть исключены из расщепления (которое влияет только на конец, потому что там будет матч в последней позиции). Само регулярное выражение полностью содержится в осмотре, поэтому оно не будет совпадать ни с какими символами, а только с позициями.Эта часть основана на решении Коби с некоторой дополнительной игрой в гольф, которую я нашел сам. Обратите внимание на то, что lookbehinds совпадают справа налево в .NET, поэтому следующее объяснение лучше всего читать снизу вверх. Я также вставил другой
\G
в объяснение для ясности, хотя это не обязательно для работы шаблона.Я все еще восхищаюсь работой Коби здесь. Это даже более элегантно, чем регулярное регулярное выражение. :)
Давайте перейдем к следующему этапу:
Просто: вставьте пробел после каждого символа перевода строки.
На последнем этапе правильно выравнивают все линии, образуя треугольник. Это
m
просто обычный многострочный режим для^
сопоставления начала строки.+
Говорит Retina повторить этот этап , пока строка не перестает меняться (что, в данном случае означает , что регулярное выражение больше не соответствует).Так что это соответствует началу любой строки, которая не имеет большего отступа, чем следующая. В любой такой позиции мы вставляем пробел. Этот процесс завершается, когда линии располагаются в аккуратном треугольнике, потому что это минимальный макет, где каждая строка имеет больший отступ, чем следующая.
источник
Конфеты ,
675957 байт&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
или:
длинная форма:
источник
CJam,
2726 байтовСпасибо Sp3000 за сохранение 1 байта.
Удивительно близко к Пифу, давайте посмотрим, может ли это быть в гольф ...Проверьте это здесь.
объяснение
источник
'
наS
???S
что это строка, а не символ, поэтомуf
будет отображаться поверх этой строки вместо списка строк.Рубин,
847773 байта77 байт
Уменьшил еще несколько байтов, удалив переменную,
r
как предложено steveverrill.84 байта
Ungolfed:
Первый расчет треугольного числа из входной строки
например, размер входной строки равен 120, а наше треугольное число n будет равно 15.
В приведенной выше строке он печатает пробелы, за которыми следуют серии строк, которые извлекаются из входной строки с использованием следующего шаблона
[[0,0],[1,2],[3,5],[6,9]]
Использование:
источник
upto
, не требует целочисленного аргумента, (times
скорее всего, делает.) Я включил некоторые из вашего синтаксиса в пересмотр моего ответа. Самый большой совет, который у меня есть для вас - вам не нужна эта переменнаяr
. Просто используйте,
вместо,..
а число после запятой - это общее количество возвращаемых элементов, а не конец диапазона.Pyth, 27 байт
Тестирование
Интересный подход - императив, и использует
.I
. Вероятно, гольф.источник
C
138136134 байтаПринимает строку в качестве ввода:
источник
printf(" ")
иprintf("\n")
наputs(" ")
иputs("\n")
. Каждая замена сэкономит вам 2 байта. :)Рубиновый подход 2 рев 1, 76 байт
Оптимизирован с использованием идей синтаксиса из ответа Васу Адари, плюс несколько моих собственных поворотов.
Рубиновый подход 2 rev 0, 93 байта
Совершенно другой подход. Сначала мы добавляем пробелы между символами ввода. Затем мы печатаем строки построчно.
Рубиновый подход 1, 94 байта
это закончилось намного дольше, чем ожидалось.
w
содержит количество печатаемых символов в нижней строке или, что эквивалентно, количество строк.Каждая строка содержит
w
пробельные символы (последний из которых - символ новой строки), поэтому идея состоит в том, чтобы напечатать эти пробельные символы и вставить печатные символы, где это необходимо.источник
Минколанг 0,14 , 42 байта
Попробуй это здесь.
объяснение
источник
Python 2,
8885 байтСпасибо xnor за сохранение 3 байта.
источник
s
вычисление количества пробелов?S=s=raw_input()
?CJam, 50 байтов
Попробуй это здесь.
объяснение
источник
JavaScript (ES6), 135 байт
Де-гольф + демо:
источник
for (s = j = 0; j < w.length; j += s++);
? Кроме того, внутри<pre>
, вы можете использовать\n
вместо<br>
. Также вы забыли упомянуть, что это ES6.Ява,
258194Golfed:
Ungolfed:
Выход программы:
источник
import static System.out;
25 байтов иSystem.
7 байтов. Он используется три раза, и 21 <25, так что он фактически увеличит размер на 4 байта. Хорошее лидерство, тем не менее, статический импорт может сэкономить место, и не все знают о них.JavaScript (ES6), 106 байт
Использует рекурсию вместо цикла for для построения строки.
Чтобы найти длину самого длинного ряда, используйте формулу для n-го треугольного числа
T_n
isT_n = (n^2 + n)/2
. Учитываяn
и решая сT_n
помощью квадратичной формулы, имеем:Оказывается, что после добавления пола 1/4 внутри квадратного корня результат не изменится, поэтому формула для самой длинной строки будет
Math.sqrt(2*a.length)|0
.источник
TeaScript , 44 байта
Это использует тот же метод, что и мой ответ JavaScript , но намного короче.
Ungolfed
источник
Powershell, 69 байт
Менее гольф тестовый скрипт:
Выход:
источник
C #, 202
Я не знаю, допустимо ли это в code-golf, но стоит ли передавать список в функции? Я не могу найти способ повторить это без List <string>, объявленного вне функции, поэтому я поместил его в качестве параметра.
Использование:
источник
C, 102 байта
источник
Баш + Сед, 87
источник
R, 142 байта
Уверен, я смогу это исправить. Все еще работаю над этим, хотя. Я чувствую, что пропускаю легкую рекурсию - но я не смог сократить ее правильно.
ungolfed
источник
05AB1E , 11 байт
Попробуйте онлайн!
источник