Скажем, у меня есть такой текст (каждое слово в одной строке, без пробелов)
Programming
Puzzles
&
Code
Golf
Это не имеет смысла! Это полностью противоречит законам физики.
Ваша задача - исправить эту невозможную ситуацию и свернуть текст следующим образом:
P
Prog
&uzz
Coderam
Golflesming
Так что под любым символом нет пустого пространства, но символы сохраняют свой вертикальный порядок.
Цель состоит в том, чтобы удовлетворить требования, но использовать как можно меньше байтов исходного кода.
Ответы:
Pyth, 10 байт
Попробуйте это онлайн в Pyth Compiler / Executor .
идея
Мы можем достичь желаемого результата, применив четыре простых преобразования:
Обратный порядок строк:
Транспонировать строки и столбцы:
Эта вершина оправдывает, сворачивая оригинальные столбцы.
Транспонировать строки и столбцы:
Обратный порядок строк:
Код
источник
Haskell, 62 байта
Я очень зрелый.
источник
Python 2, 104 байта
Итеративный однопроходный алгоритм. Мы проходим каждую строку по порядку, обновляя список
l
строк для вывода. Новое слово эффективно выталкивает снизу, сдвигая все буквы над ним на один пробел. Например, в тестовом случаепосле того, как мы сделали до
Code
, мы имеема затем добавить
Golf
результаты вкоторый мы можем рассматривать как комбинацию из двух частей
где первая часть была сдвинута вверх
golf
. Мы выполняем это смещениеzip
списка вывода с элементом в конце (слева) и приоритетом списка вывода пустой строкой (справа), обрезая каждую часть по длине нового элемента.Может показаться более естественным вместо этого выполнять итерацию в обратном направлении, позволяя новым буквам падать сверху, но моя попытка сделать это оказалась более длительной.
Для сравнения вот
zip
/filter
подход,map(None,*x)
используемый дляiziplongest
(109 байт):источник
CJam, 11 байт
Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
Идея такая же, как и в моем Pyth-ответе .
источник
JavaScript (ES6), 146
(2 строки в шаблонных строках значимы и учитываются)
Идея @Dennis реализована в JavaScript. Длинная функция S выполняет транспонирование строка за строкой и символ за символом, оставляя результат в
t
массиве.Меньше гольфа внутри фрагмента (попробуйте в Firefox)
источник
S(t.reverse()),t.reverse().join
наS(R=t.reverse()),R.join
.R 223 байта
Это абсурдно длинный, наивный способ сделать это.
Ungolfed:
Вы можете попробовать это онлайн .
источник
Matlab / Octave, 99 байт
Пример :
Определите входную строку в переменной, скажем
s
.10
символ перевода строки:Вызов функции
f
с входомs
:Или попробуйте онлайн (спасибо @beaker за помощь с онлайн-переводчиком Octave)
источник
JavaScript ES6, 119 байт
Вот это и есть в ES5 с комментариями, объясняющими, как это работает:
источник
APL (Dyalog Extended) ,
1311 байтов SBCS-2 с моими расширениями для Dyalog APL.
Анонимная молчаливая функция, принимающая и возвращающая символьную матрицу.
Попробуйте онлайн!
~
удалить∘
те' '
пробелы⍤
из1
строк (букв 1D суб-массивов) ,⍢
а⍉
транспонированная в⍢
то время как⊖
перевернутыйисточник
R
190178175 байтВероятно, еще есть место для игры в гольф. Возможно, пара ненужных операций там
Разгромил и объяснил
Тестовый забег. Интересно отметить, что из-за того, как работает сканирование, все предложение может быть введено с пробелами и по-прежнему выдавать результат, как указано.
источник
STATA, 323 байта
Вводит в файл с именем ab. Теперь работает только до 24 символов. Буду обновлять позже, чтобы заставить его работать больше. Кроме того, не работает в онлайн-компиляторе. Требуется несвободный компилятор.
Редактировать: тихо (для подавления вывода) перемещается в сам цикл из каждого оператора в цикле, сохраняя 8 байтов.
источник
R 171 байт
С переводом строки и отступом:
Использование:
источник
Желе , 6 байт (не конкурирует)
Попробуйте онлайн!
Как это устроено
Идея такая же, как и в моем Pyth-ответе .
источник
Turtlèd , 72 байта, неконкурентный
Я уверен, что смогу изменить подход к экономии байтов, но позже.
: p Не-гольф esolang бьет обычные языки: p
Странная вещь в Turtlèd заключается в том, что она изначально была сделана после обсуждения ascii art langs, но на самом деле кажется, что она лучше всех справляется с подобными задачами
Turtlèd не может принимать ввод новой строки, но для нескольких вводов, и для этого требуется только один ввод: заканчивать каждое слово пробелом, включая последнее.
Попробуйте онлайн!
Объяснение:
источник
Perl, 133 байта
Это была одна из тех проблем, которые изменились в моей голове от того, чтобы быть слишком сложным, чтобы быть легким, чтобы быть намного большим количеством кода, чем я ожидал ... Я не особенно доволен подходом, я уверен, что есть намного лучший способ уменьшить
print pop@F...
бит, возможно, используя-n
или просто регулярное выражение, но я не могу получить это прямо сейчас ... Первоначально я использовалsay
, но я думаю, что из-за этого я должен был бы выиграть это выше (use 5.01
)$'
.использование
Сохранить как
vertically-collapse-text.pl
.источник
SmileBASIC, 90 байт
Применяет гравитацию ко всему тексту в консоли. Я не уверен, является ли это допустимым, или я должен использовать массив строк.
источник
Рубин,
9982 байтаПопасть туда...
Попытка объяснения:
Запустите это так:
источник
К, 30
,
объяснение
x@\:!|/#:'x
расширяет каждую строку для создания квадратной матрицы символов.+
переносит это{(-#x)$x@&~^x}
удалит все пробелы из строки, а затем дополнит строку ее исходной длинойПримените эту функцию к каждой из транспонированных строк, затем переверните вывод, чтобы получить результат
источник
{+{(-#x)$x@&~^x}'+(|/#:'x)$x}
для 29.pb - 310 байт
Какая катастрофа. Я почти ничего не помню о том, как это работает.
Из-за того, как работает ввод pb (одна строка за раз), вы должны использовать пробелы вместо новых строк во вводе. Если интерпретатор не был мусором, и вы могли бы включить переводы строк во входные данные, единственным изменением было бы
[B=32]
начало[B=10]
.Я работаю над обновлением pbi (интерпретатора), которое будет очищать визуальные эффекты, если вы хотите наблюдать за запуском программы. Это все еще требует большой работы, но пока вы можете посмотреть эту программу на YouTube .
источник
J, 17 байт
Довольно приятное решение.
Объяснение:
Тестовый пример объяснил
Контрольные примеры
источник
;@;:&.(|:@|.)
для 13На самом деле , 13 байтов
При этом используется алгоритм, описанный в ответе Денниса «Желе» . Вход и выход - оба списка строк. К сожалению, встроенная функция транспонирования работает не очень хорошо, если внутренние списки или строки не имеют одинаковую длину, что, во-первых, могло бы преодолеть точку вертикального коллапса. Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Ungolfing
источник
Ракетка 312 байт
Ungolfed:
Тестирование:
Выход:
источник
JavaScript (ES6), 103 байта
Разделенная на CR внешняя карта гарантирует, что мы зациклимся достаточно раз, чтобы позволить гравитации отбрасывать буквы так, как им нужно.
Внутренняя карта сначала проверяет, есть ли следующая строка, если она есть, и она короче, сбрасывает переполнение на следующую строку. т. е. если в 1-й строке указано «ABCD», а во 2-й строке указано «FG», поместите «CD» из 1-й строки во 2-ю, чтобы 1-я строка стала «AB», а вторая - «FGCD».
Поскольку мы делаем это столько раз, сколько строк, буквы падают так далеко, как следовало, оставляя нам желаемый результат.
источник
Japt , 8 байт
Попробуйте онлайн!
Как это устроено
Есть также,
z
который поворачивает 2D строку на кратное 90 градусов, но это как-то обрезает строку, когдаheight > length
.источник
05AB1E ,
109 байтовПопробуйте онлайн.
или с альтернативным началом:
Попробуйте онлайн.
Подобный подход, как @ Деннис ♦ Пайт ответ .
-1 байт благодаря замене @Emigna
ðõ:
наðм
.Объяснение:
Альтернативное объяснение:
источник
R,
s8152 байтаЯ взял на себя смелость при интерпретации вопроса и предположил, что текст представлен в виде матрицы по одному символу на ячейку, таким образом:
Итак, х становится:
Теперь я использую
order
и[
сортирую столбцы так, чтобы вначале стояли NA, а затем все остальные значения:Это становится длиннее, если требуется, чтобы на выходе были слова:
источник
function(x)
должны быть включены в число байтов.R
196189170 байтЧеловекочитаемая версия:
Как это устроено:
(Или, другими словами, «лишние» детали падают до тех пор, пока не упадет все, что может упасть.)
Ввод: символьный вектор.
источник
Юлия 0,6 , 141 байт
Попробуйте онлайн!
Трансляция с помощью
g.([w], [d d])
позволяет мне избавиться от любого оператора карты и экономит мне около 7 байтов.источник