Учитывая ввод списка слов, выведите слова с их буквами, расположенными по диагонали:
p
r
o
p g
u r
z a
a z m
n l m
d e i
c s n
o g
d
g e
o
l
f
(Выше должно быть выход для ввода programming puzzles and code golf
.)
Чтобы быть точным, каждое слово начинается с первого столбца и на три строки ниже предыдущего слова, а каждая последующая буква перемещается на один столбец вправо и на одну строку вниз.
Входные данные могут быть представлены либо в виде одной строки слов, разделенных ровно одним пробелом, либо в виде списка / массива слов. Слова будут состоять только из строчных букв a-z
и всегда будут длиной не менее одного символа.
Вывод может быть одной строкой, массивом строк или массивом символов. Пробелы в начале или конце не допускаются, за исключением одного завершающего символа новой строки.
Дальнейшие тестовые случаи:
a bcd efgh i j
a
b
c
d
e
f
g
i h
j
x
x
verylongword short
v
e
r
s y
h l
o o
r n
t g
w
o
r
d
Поскольку это код-гольф , победит самый короткий код в байтах!
Ответы:
Vim,
85, 76, 66, 52 нажатия клавиш / байтКогда я впервые посмотрел на этот вызов, я подумал: «Это идеально подходит для VIM!» А потом, когда я попробовал, все пошло не так. Вот оно, во всей его грязной хакерской славе:
Попробуйте онлайн, благодаря (в основном) обратно совместимому V-интерпретатору.
Объяснение:
Сначала я думал, что смогу сделать эту красивую простую 37-байтовую версию:
К сожалению, не все так просто. Давайте рассмотрим это построчно:
Это включает функцию под названием «виртуальное редактирование». Это позволяет курсору перемещаться в столбцы, которые еще не существуют. Этот ответ был бы в принципе невозможен без него.
Теперь нам нужно разделить слова на разные строки. Таким образом, мы заменим каждый пробел 3 новыми строками. Так как это ex-команда, мы можем запустить ее одновременно с нашей последней ex-командой
:se ve=all
, разделив их двумя чертой.Теперь буфер выглядит так:
Здесь начинается самое интересное. Мы устанавливаем традиционный рекурсивный макрос с:,
qq
а затем вызываем это:Затем мы заканчиваем рекурсивный макрос с
@qq@q
. На данный момент у нас есть все диагонали, нам просто нужно немного почистить.источник
Turtlèd ,
2826 байтО боже, я, кажется, бью язык, специально разработанный для игры в гольф. это отличный день
Попробуйте онлайн!
объяснение
(запись означает запись в ячейку на сетке, точечный символ означает символ на входе, на который указывает указатель строки)
обратите внимание на конечный пробел.
Вход также нуждается в конце. видя, как python может взять список, это очень похоже на создание списка в Turtlèd
источник
MATL , 28 байт
Input - это массив ячеек с запятыми в качестве необязательных разделителей:
или же
Попробуйте онлайн! Или проверьте все тестовые случаи: 1 , 2 , 3 , 4 .
объяснение
Рассмотрим следующий вход в качестве примера:
Вы можете просмотреть частичные результаты (содержимое стека), вставив символ комментария
%
в любой точке кода. Например, просмотрите содержимое стека после четвертой функции (&n
).источник
JavaScript (ES6),
11810984 байтаПринимает ввод как массив слов. Возвращает массив массивов символов.
Альтернативная версия, 109 байт
Возвращает строку.
Показать фрагмент кода
источник
Common Lisp,
673668597 байтУжасное решение, я знаю. Я вероятно отредактирую это больше после некоторого сна.
Использование:
Это перебирает каждое слово в предоставленном списке и добавляет соответствующие символы в текущую строку. Соответствующее дополнение обеспечивается моим использованием
format
.Примечание: я новичок в Common Lisp, но знаю достаточно, чтобы понять, что в этом может быть много улучшений.
источник
C #, 336 байт:
Golfed:
Ungolfed:
Тестирование:
источник
Func<string[], string>
и внесите другие изменения для 297 байтов,s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};
однако вам нужно добавить 18 байтов дляusing System.Linq;
i
иj
к объявлению int вверху и переместил некоторые из++
них, чтобы они использовались при последнем использовании переменнойPython 2, 146 байт
Примечание: отступы для последних двух строк - это
<space>
и<tab>
, что сохраняет один байт, поскольку мне не нужно делать двойной отступ.Ввод должен быть введен в виде массива строк, например:
["hello", "world"]
или['hello', 'world']
. Вывод представляет собой массив массивов символов.Вероятно, есть лучший способ сделать это ...
РЕДАКТИРОВАТЬ Спасибо Doorknob за указание на отсутствующую квадратную скобку. Я поместил его перед
*k...
третьей строкой.источник
Mathematica, 146 байт
Я разочарован этим счетом, ну да ладно.
Определяет анонимную функцию, которая принимает список слов (например
{"this","that","these"}
) и возвращает двумерный массив символов. Чтобы просмотреть в виде сетки, добавьте//Grid
в конце.Преобразует строки в массив, добавляет дополнительные строки, транспонирует массив, добавляет необходимые сдвиги, затем снова транспонирует.
Пример результата (отформатированный как сетка):
источник
Желе , 24 байта
Попробуйте онлайн!
Как?
источник
Python 2, 182 байта
Немного длинный, но с положительной стороны, он возвращает строку без завершающего пробела в каждой строке и без конечного пробела или возврата в конце; ограничения, что некоторые другие записи не подчиняются.
Список слов передается в функцию; некоторые «пробелы» добавляются в этот список, а затем алгоритм отображает строку, пару столбцов в wordNumber, characterNumber в расширенном списке. (Это немного противоположно обычной стратегии, наблюдаемой в других решениях).
Если мы разрешаем использовать пробелы во всех строках, кроме последней, мы можем сделать немного лучше (163 байта):
источник
q / kdb +,
13010994908684 байтаРешение:
Примеры:
Объяснение (без присмотра):
Основная идея состоит в том, чтобы создать связку строк равной длины из входной строки, перевернуть (повернуть) их, затем добавить соответствующие пробелы, чтобы получить нечто похожее на это:
который переворачивается снова и выводится на стандартный вывод.
Вот строка за строкой концепции:
Примечания:
Несколько способов избавиться от (11) простых байтов, если мы действительно хотим:
f:
и оставив как анонимную функцию-1
и;
и возвращает список строк , а не печать на стандартный выводРедактирование:
rtrim
чтобы найти максимальную длину для заполнения, устранена необходимость храненияC
переменнойmax count each
лямбда-функцию,a
которая создается один раз и используется дваждыraze
в лямбда-функцию, чтобы сохранитьraze each
(+)
как сокращение дляflip
источник
Древесный уголь ,
169 байтМой первый угольный ответ. Спасибо @DLosc за предложение
P
иM
вместо использованияS
иJ
(Перейти), чтобы вернуться к началу строки (и три вниз).Попробуйте онлайн (подробно) или Попробуйте онлайн (чисто) .
Объяснение:
Цикл пока еще есть следующая строка ввода:
Напечатайте эту строку, не перемещая курсор вниз-вправо:
А затем переместите три позиции вниз для следующей итерации:
источник
θ
переменная представляет собой первый ввод, поэтому я просто назначаю тестовый ввод этой переменной в заголовке, а затем записываю оставшуюся часть кода, чтобы вы могли избавиться отα
переменной и перебрать разделенные элементыθ
. Попробуйте онлайн! (Не конкурирует из-за лидирующих мест.)Japt
-Rx
,171613 байтПринимает ввод как массив слов. Если бы разрешенные пробелы в каждой строке были разрешены, то последние 4 символа можно было бы удалить, чтобы связать с решением с древесным углем.
Попробуйте или запустите все тесты
объяснение
источник
К4 , 58 байт
Решение:
Примеры:
Объяснение:
Строки правой панели, так что они имеют одинаковую длину, транспонируют, соединяют с
" "
левой панелью, чтобы сгенерировать диагонали, затем правой клавишей, чтобы исправить длину и транспонировать обратно Принимает список строк и возвращает список строк. Вероятно, пригодный для игры в гольф, но все еще короче, чем мое решение q / kdb +.источник
Perl 6 , 73 байта
Попробуйте онлайн!
Входной аргумент - это список слов. Вывод представляет собой массив массив символов.
источник
PHP , 100 байт
Попробуйте онлайн!
источник