Напишите программу или функцию, которая принимает непустую однострочную строку. Вы можете предположить, что он содержит только печатные ASCII исключая пробел.
Напечатайте или верните ASCII художественную ромбовидную форму, похожую на лимон или лайм, сделанные из префиксов строки.
Предположим, что длина входной строки составляет n букв. Затем такая форма состоит из 2n - 1 столбцов искусства ASCII, сшитых вместе, каждая из которых состоит из 2n - 1 линий. Считая от 1, k-й столбец имеет ширину f (k) = min (k, 2n - k) символов и содержит f (k) копии первых f (k) символов ввода, по центру по вертикали с одним пробелом линии, разделяющие копии.
Например, если на входе Lemon
, выход должен быть:
Lemon
Lemo Lemo
Lem Lemon Lem
Le Lemo Lemo Le
L Lem Lemon Lem L
Le Lemo Lemo Le
Lem Lemon Lem
Lemo Lemo
Lemon
Если на входе lime
вывод, должен быть:
lime
lim lim
li lime li
l lim lim l
li lime li
lim lim
lime
И тот же шаблон применяется для других входов:
a
a
Be
Be
B B
Be
/\
/\
/ /
/\
cat
cat
ca ca
c cat c
ca ca
cat
|||
|||
|| ||
| ||| |
|| ||
|||
.__.
.__.
.__ .__
._ .__. ._
. .__ .__ .
._ .__. ._
.__ .__
.__.
$tring
$tring
$trin $trin
$tri $tring $tri
$tr $trin $trin $tr
$t $tri $tring $tri $t
$ $tr $trin $trin $tr $
$t $tri $tring $tri $t
$tr $trin $trin $tr
$tri $tring $tri
$trin $trin
$tring
У строк в выходных данных могут быть завершающие пробелы, и может быть одна дополнительная конечная новая строка.
Самый короткий код в байтах побеждает.
Ответы:
Matlab,
140 136 128124 байтовВ основном сначала начинается со средней секции, а затем шаг за шагом добавляет / добавляет сокращенные / измененные версии.
Спасибо за 8 байтов @LuisMendo!
Например,
MATLAB
мы получаем:источник
flip
: /Python 2,
121110 байт116 байт при использовании
raw_input
. Программа по существу делает маску на основе L1-нормы / манхэттенского расстояния от центра, а также четности этого расстояния по сравнению с четностью входной длины.(Спасибо @Lynn за -9 байтов и еще 2)
источник
s
используется в конце длинной строки, поэтому, к сожалению, это невозможноR
.R
делает код намного аккуратнее!MATL , 44 байта
Я черпал вдохновение из ответа @ flawr (хотя алгоритм не тот же)
Ввод - это строка с одинарными кавычками.
Попробуйте онлайн!
источник
JavaScript (ES6), 132 байта
Тест
источник
Pyth, 32 байта
демонстрация
источник
Желе,
3226 байтПопробуйте онлайн!
РЕДАКТИРОВАТЬ: Деннис спас 6 байтов. Благодарность!
источник
JavaScript,
187178 байтПобитовый подход. Функция
m
определяет маску, начиная с2 ** length
, например,00100
в двоичном, и определяяm(n) = m(n-1) << 1 | m(n-1) >> 1
для первой половины. Интересно, что вторая половина может быть определена какm(n) = m(n-1) << 1 & m(n-1) >> 1
. (хотя программа вместо этого выбирает определениеm(n) = m(2 * length - 1)
для второй половины) Отсюда эти маски могут использоваться, чтобы определить, должно ли слово или пробел появляться, проверяя2 ** column & m(row)
. Конечно, в JavaScript писать проще2 ** something
с помощью1 << something
...примечание: написано, когда устал
Можетпочти наверняка есть ошибки.источник
Haskell, 109 байт
источник
Брахилог , 46 байт
Попробуйте онлайн!
Ужасное количество байтов и, возможно, худший подход (не говоря уже о том, что Brachylog не совсем предназначен для ASCII-искусства), но я все равно потратил достаточно времени, чтобы опубликовать его.
Почти единственной умной частью всего этого является использование
a₁
для генерации вертикальных пробелов с наибольшими первыми, в то время какa₀
генерирует префиксы слов наименьший из первых, иzz
для расширения одиночных пробелов в блоки пространства, соответствующие ширине префиксов.источник
TSQL, 259 байт
Golfed:
Ungolfed:
скрипка
источник
C 167 байт
Эта программа ожидает, что входной текст будет передан в качестве первого параметра программе (через командную строку или как-либо еще), и запишет вывод в стандартный вывод.
Это моя первая попытка сыграть в гольф в коде, потому что это казалось разумным испытанием, поэтому, вероятно, я могу сыграть в гольф больше, чем я смог, просто благодаря тому, как я это сделал.
объяснение
Достаточно важно отметить использование
(n < m) ? n : (m * 2) - n
в программе как минимум дважды, чтобы получить инвертированное расстояние от центральной позицииm
в диапазонеm * 2
с входомn
. Если есть более короткий способ сделать это, его можно было бы упростить, так как этот алгоритм важен для работы этой программы.источник
C, 137 байтов
Сломать:
Это рисует каждый элемент сетки 2n-1 x 2n-1 с функцией маски, решающей, должен ли текущий элемент быть пробелом или входным словом (маска проверяет форму ромба и рисунок шахматной доски).
источник