Учитывая список, состоящий как минимум из двух слов (состоящий только из строчных букв), создайте и отобразите ASCII-лестницу слов, чередуя направление написания сначала направо, затем налево относительно начального направления слева направо. ,
Когда вы закончите писать слово, измените направление и только потом начинайте писать следующее слово.
Если ваш язык не поддерживает списки слов или он более удобен для вас, вы можете воспринимать ввод как строку слов, разделенную одним пробелом.
Допускаются начальные и конечные пробелы.
["hello", "world"]
или "hello world"
hello
w
o
r
l
d
Здесь мы начинаем с записи, hello
и когда мы переходим к следующему слову (или в случае ввода в виде строки - пробел найден), мы меняем относительное направление вправо и продолжаем писатьworld
Тестовые случаи:
["another", "test", "string"] or "another test string" ->
another
t
e
s
tstring
["programming", "puzzles", "and", "code", "golf"] or "programming puzzles and code golf" ->
programming
p
u
z
z
l
e
sand
c
o
d
egolf
["a", "single", "a"] or "a single a" ->
a
s
i
n
g
l
ea
Критерии победы
Самый короткий код в байтах на каждом языке выигрывает. Не позволяйте разочаровываться языками игры в гольф!
Ответы:
Древесный уголь , 9 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: Работает, рисуя текст в обратном направлении, транспонируя холст после каждого слова. 10 байтов для ввода строки:
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: Рисует текст в обратном направлении, транспонируя холст для пробелов.
источник
C (gcc) ,
947874 байта-4 из Йохан дю Туа
Попробуйте онлайн!
Печатает лестницу, по одному символу (ввода) за раз. Принимает разделенную пробелами строку слов.
источник
*s==32
в*s<33
сохранить байты.05AB1E ,
1916 байт-3 байта благодаря @Emigna .
Попробуйте онлайн.
Общее объяснение:
Так же , как @Emigna 05AB1E ответ «s (убедитесь , что upvote его кстати !!), я использую встроенный Canvas
Λ
.Однако варианты, которые я использую, отличаются (вот почему мой ответ длиннее ..):
b
(строки для печати): я оставляю первую строку в списке без изменений и добавляю завершающий символ к каждой следующей строке в списке. Например["abc","def","ghi","jklmno"]
станет["abc","cdef","fghi","ijklmno"]
.a
(размеры строк): это будет равно этим строкам, как[3,4,4,7]
в примере выше.c
(направление для печати):,[2,4]
которое будет отображаться в[→,↓,→,↓,→,↓,...]
Таким образом, приведенный выше пример шаг за шагом сделает следующее:
abc
в направлении2
/→
.cdef
в направлении4
/↓
(где первый символ перекрывается с последним символом, поэтому нам пришлось изменить список следующим образом)fghi
в направлении2
/→
снова (также с перекрытием конечных / ведущих символов)ijklmno
в направлении4
/↓
снова (также с перекрытием)Объяснение кода:
источник
€θ¨õšsøJ
.€θ¨õšsøJ
являютсяõIvy«¤})
,õUεXì¤U}
иε¯Jθ줈}
(последние два требуют--no-lazy
). К сожалению, они все одинаковой длины. Это было бы намного проще, если бы одна из переменных по умолчанию была""
...""
... " Вы ищетеõ
, или вы имеете в виду, если быX
/Y
/®
было бы""
? Кстати, хороший 13 байт в комментарии ответа Эмигны. Совсем иначе, чем у меня и у него, с указаниями,[→,↙,↓,↗]
которые вы использовали.õ
не является переменной Да, я имею в виду переменную по умолчанию""
. Я буквально делаю этоõU
в начале одного из фрагментов, поэтому, если X (или любая другая переменная) по умолчанию""
, это будет тривиально сохранить два байта. Благодарность! Да, new немного нововведен, но у меня появилась идея перемежать истинные записи длиной 2 манекена из ответа Эминьи.05AB1E ,
1413 байтСохранено 1 байт благодаря Grimy
Попробуйте онлайн!
объяснение
источник
€Y¦
может быть2.ý
(не то, чтобы он сохранял здесь любые байты). И это первый раз, когда я увидел, что новое поведение по€
сравнению с обычной картой полезно..ý
раньше, но никогда не использовал себя, поэтому я не думал об этом.€
это обычная карта для меня, и я часто использовал ее, другая - "новая" карта;)Холст ,
17121110 байтПопробуй это здесь!
Объяснение:
источник
JavaScript (ES8),
91 7977 байтПринимает ввод как массив слов.
Попробуйте онлайн!
комментарии
источник
p
ОченьPython 2 , 82 байта
Попробуйте онлайн!
источник
брейкфук , 57 байт
Попробуйте онлайн!
Принимает входные данные в виде разделенных NUL строк. Обратите внимание, что это использует EOF как 0, и перестанет работать, когда лестница превышает 256 пробелов.
Объяснение:
источник
.
в строке 3 символа (закомментированной версии)? Я пытался играть с входом на TIO. На Mac я переключил клавиатуру на ввод текста Unicode и попытался создать новые границы слов, набрав,option+0000
но это не сработало. Есть идеи почему бы и нет?-
вместо.
объяснения. Для добавления NUL-байтов в TIO я рекомендую использовать консоль и выполнить команду вроде$('#input').value = $('#input').value.replace(/\s/g,"\0");
. Я не знаю, почему у тебя не получилосьJavaScript, 62 байта
Попробуйте онлайн!
Спасибо Рик Хичкок , 2 байта сохранены.
JavaScript, 65 байт
Попробуйте онлайн!
источник
t
сa
последующим удалениемt=
Ахей (эзотоп) ,
490458455 байтПопробуйте онлайн!
Слегка играется с использованием символов полной ширины (2 байта) вместо корейских (3 байта).
объяснение
Aheui похож на esolang. Вот код с цветом :? 1 часть проверяет, является ли текущий символ пробелом или нет.
? 2 части проверяют, написаны ли слова справа налево или сверху вниз.
? 3 часть является условием разрыва цикла, который печатает пробелы.
? 4 части проверяют, является ли текущий символ концом строки (-1).
Красная часть - инициализация стека. Aheui использует стеки (от
Nothing
доㅎ
: 28 стеков) для хранения значения.Оранжевая часть принимает input (
뱋
) и проверяет, является ли она пробелом, вычитая с помощью32
(ascii code of space).Зеленая часть добавляет 1 к стеку, который хранит значение длины пробела, если писать справа налево.
Фиолетовая часть - это петля для печати пробелов, если писать сверху вниз.
Серая часть проверяет наличие текущего символа
-1
, добавляя его к текущему символу.Синяя часть печатает текущий символ и готовится к следующему символу.
источник
Japt
-P
, 15 байтПопытайся
источник
Баш, 119 символов
Это использует последовательности управления ANSI для перемещения курсора - здесь я использую только сохранение
\e7
и восстановление\e8
; но для восстановления необходимо добавить префикс,\n
чтобы прокрутить вывод, если он уже находится внизу терминала. По какой - то причине не работает , если вы не уже в нижней части терминала. * пожимает плечами *Текущий символ
$c
выделяется как односимвольная подстрока из входной строки$w
, используяfor
индекс цикла$i
в качестве индекса в строке.Единственный реальный трюк, который я здесь использую, это
[ -z $c ]
возвращениеtrue
, то есть строка пустая, когда$c
пробел, потому что она не заключена в кавычки. При правильном использовании bash вы должны указать строку, с которой вы тестируете,-z
чтобы избежать именно такой ситуации. Это позволяет нам перевернуть флаг направления$d
между1
и0
, который затем используется в качестве индекса в массиве последовательностей управления ANSI,X
для следующего непробельного значения$c
.Мне было бы интересно увидеть что-то, что использует
printf "%${x}s" $c
.О боже, давайте добавим немного пробела. Я не вижу, где я ...
источник
Perl 6 , 65 байт
Попробуйте онлайн!
Блок анонимного кода, который принимает список слов и печатает прямо в STDOUT.
объяснение
источник
Древесный уголь , 19 байт
Ввод в виде списка строк
Попробуйте онлайн (подробно) или попробуйте онлайн (чисто)
Объяснение:
Петля в ассортименте
[0, input-length)
:Если индекс нечетный:
Выведите строку по индексу
i
в направлении вниз:А затем переместите курсор один раз к верхнему правому углу:
Остальное (индекс четный):
Выведите строку в индексе
i
в правильном правильном направлении:А затем переместите курсор один раз к левому нижнему углу:
источник
Python 2 ,
8988 байтПопробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 122 байта
Попробуйте онлайн!
источник
J ,
474543 байтПопробуйте онлайн!
Я нашел забавный, другой подход ...
Я начал возиться с левыми накладками и застежками-молниями с циклическими герундами и так далее, но потом понял, что будет проще просто рассчитать положение каждой буквы (это сводится к сумме сканирования правильно выбранного массива) и применить поправку
}
к пробелу. холст на разрушенном входе.Решение почти полностью решено Amend
}
:; ( single verb that does all the work ) ]
общая вилка;
левая часть стирает ввод, т. е. помещает все буквы в непрерывную строку]
правая часть является сам вход(stuff)}
мы используем форму поправки Герунда}
, которая состоит из трех частейv0`v1`v2
.v0
дает нам «новые значения», что является раз (то есть, все символы ввода в виде одной строки), поэтому мы используем[
.v2
дает нам начальную ценность, которую мы трансформируем. мы просто хотим чистый холст с пробелами нужных размеров.([ ' '"0/ [)
дает нам один из размеров(all chars)x(all chars)
.v1
определяет, в какие позиции мы будем помещать заменяющие символы. В этом суть логики ...0 0
в верхнем левом углу, мы замечаем, что каждый новый символ либо 1 справа от предыдущей позиции (т.е.prev + 0 1
), либо один вниз (т.е.prev + 1 0
). Действительно, мы делаем первый раз «лен слова 1», затем второй «лен слова 2» и т. Д., Чередуясь. Таким образом, мы просто создадим правильную последовательность этих движений, затем просканируем их сумму, и у нас будут наши позиции, которые мы затем пометим, потому что так работает Amend. Далее следует только механика этой идеи ...([: <@(+/)\ #&> # # $ 1 - e.@0 1)
#:@1 2
создается постоянная матрица0 1;1 0
.# $
затем расширяет его, чтобы в нем было столько строк, сколько входных данных. Например, если вход содержит 3 слова, он будет производить0 1;1 0;0 1
.#&> #
левая часть этого представляет собой массив длин входных слов и#
является копией, поэтому он копирует0 1
«длина слова 1», затем1 0
«длина слова 2 раза» и т. д.[: <@(+/)\
делает сумму сканирования и поле.источник
T-SQL, 185 байт
Попробуйте онлайн
источник
Сетчатка , 51 байт
Попробуйте онлайн!
Довольно простой подход, который помечает каждое другое слово и затем применяет преобразование напрямую.
объяснение
Мы помечаем каждое другое слово точкой с запятой, сопоставляя каждое слово, но применяя замену только к совпадениям (с нулевым индексированием), начиная с совпадения 1, затем 3 и так далее.
+(m
устанавливает некоторые свойства для следующих этапов. Плюс начинается петлей «в то время как эта группа этапов что-то меняет», а открытая скобка означает, что плюс должен применяться ко всем следующим этапам, пока не будет закрывающая скобка перед обратным тылом (который является всеми этапами в этот случай).m
просто указывает регулярному выражению,^
что оно также считается совпадающим с начала строк, а не только с начала строки.Фактическое регулярное выражение довольно просто. Мы просто сопоставляем соответствующее количество элементов перед первой точкой с запятой и затем используем
*
синтаксис замены Retina, чтобы ввести правильное количество пробелов.Этот этап применяется после последнего для удаления точек с запятой и пробелов в конце слов, которые мы изменили на вертикальные.
источник
Сетчатка 0.8.2 , 58 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Альтернативное решение, также 58 байт:
Попробуйте онлайн! Ссылка включает в себя тестовые случаи.
Я намеренно не использую здесь Retina 1, поэтому я не получаю операции с альтернативными словами бесплатно; вместо этого у меня есть два подхода. Первый подход разбивает все буквы в альтернативных словах путем подсчета предшествующих пробелов, тогда как второй подход заменяет альтернативные пробелы символами новой строки, а затем использует оставшиеся пробелы, чтобы помочь разбить альтернативные слова на буквы. Каждый подход должен затем соединить последнюю вертикальную букву со следующим горизонтальным словом, хотя код отличается, потому что они разделяют слова по-разному. Заключительный этап обоих подходов затем дополняет каждую строку до тех пор, пока ее первый непробельный символ не будет выровнен под последним символом предыдущей строки.
Обратите внимание, что я не предполагаю, что слова - это просто буквы, потому что мне это не нужно.
источник
PowerShell ,
101 8983 байта-12 байт благодаря маззи .
Попробуйте онлайн!
источник
& $b @p
(каждое слово в качестве одного аргумента), 3) использовать более короткую форму дляnew line
константы. см 3,4 строки в этом примереfoo
. см код .Given a list of at least two words...
PowerShell ,
7465 байтПопробуйте онлайн!
источник
R , 126 байт
Попробуйте онлайн!
источник
T-SQL, 289 байт
Это работает на SQL Server 2016 и других версиях.
@ содержит список, разделенный пробелами. @ Я отслеживаю позицию индекса в строке. @S отслеживает общее количество пробелов для отступа слева. @B отслеживает, по какой оси выровнена строка в точке @I.
Количество байтов включает в себя минимальный список примеров. Сценарий просматривает список, символ за символом, и изменяет строку, чтобы она отображалась в соответствии с требованиями. Когда достигнут конец строки, строка печатается.
источник
JavaScript (Node.js) , 75 байт
Попробуйте онлайн!
Объяснение и ungolfed
источник
Stax , 12 байт
Запустите и отладьте его
источник
Желе , 21 байт
Попробуйте онлайн!
Полная программа, принимающая входные данные в виде списка строк и неявно выводящие на стандартный вывод слова ladder.
источник
C (gcc) ,
9387 байтовСпасибо гастропнеру за предложения.
Эта версия принимает массив строк, оканчивающихся указателем NULL.
Попробуйте онлайн!
источник
Brain-Flak , 152 байта
Попробуйте онлайн!
Я подозреваю, что это может быть короче, комбинируя два цикла для нечетных и четных слов.
источник
J,
3533 байтаЭто глагол, который принимает входные данные в виде одной строки со словами, разделенными пробелами. Например, вы можете назвать это так:
Вывод представляет собой матрицу букв и пробелов, которую интерпретатор выводит с необходимыми символами новой строки. Каждая строка будет дополнена пробелами, чтобы они имели одинаковую длину.
Есть одна небольшая проблема с кодом: он не будет работать, если ввод содержит более 98 слов. Если вы хотите разрешить более длинный ввод, замените
_98
код в,_998
чтобы разрешить до 998 слов и т. Д.Позвольте мне объяснить, как это работает, на нескольких примерах.
Предположим, у нас есть матрица букв и пробелов, которую мы представляем как частичный вывод для некоторых слов, начиная с горизонтального слова.
Как мы можем добавить новое слово перед этим по вертикали? Это не сложно: просто включите новое слово в матрицу из одного столбца букв с глаголом
,.
, а затем добавьте вывод к этой матрице из одного столбца. (Глагол,.
удобен, потому что он ведет себя как функция тождества, если вы применяете его к матрице, которую мы используем для игры в гольф.)Теперь мы не можем просто повторить этот способ добавления слова как есть, потому что тогда мы получим только вертикальные слова. Но если мы транспонируем выходную матрицу между каждым шагом, то каждое другое слово будет горизонтальным.
Итак, наша первая попытка найти решение состоит в том, чтобы поместить каждое слово в матрицу из одного столбца, а затем сложить их, добавляя и перемещая между ними.
Но есть большая проблема с этим. Это помещает первую букву следующего слова перед поворотом на прямой угол, но спецификация требует поворота перед тем, как поставить первую букву, поэтому вывод должен быть примерно таким:
Способ, которым мы достигаем этого, заключается в обращении всей входной строки, как в
затем используйте описанную выше процедуру для построения зигзага, но поворачивайте только после первой буквы каждого слова:
Затем переверните вывод:
Но теперь у нас есть еще одна проблема. Если ввод содержит нечетное количество слов, то выход будет иметь первое слово по вертикали, тогда как в спецификации сказано, что первое слово должно быть горизонтальным. Чтобы это исправить, мое решение дополняет список слов ровно 98 словами, добавляя пустые слова, поскольку это не меняет вывод.
источник