РЕДАКТИРОВАТЬ Я изменил формулировку правил, чтобы сделать некоторые вещи, которые были неявными, более явными. Я также добавил некоторые акценты, чтобы прояснить некоторые моменты кажущейся путаницы, и явно определил возможность создания отдельной программы вместо функции.
Целью здесь является создание функции, которая принимает текстовый файл (или строку) и транспонирует его так, чтобы строки становились столбцами, и наоборот.
Пример:
Я текст. Транспонировать меня. Ты можешь сделать это?
Результаты в:
ITC ра аан Миннесота сы апо ОУ Т.С. ПЕД XO тм .ei .t ?
Правила:
- Вы можете предположить, что используются только пробельные символы
" "
и"\n"
что ни в одной строке нет пробельных символов . - Вы можете предположить, что файл ASCII. Какой конечный маркер вы хотите использовать, зависит от вас (CRLF или LF). Он должен работать правильно на примере, но он также должен работать на любом входе, который удовлетворяет вышеуказанным предположениям.
- Возможно, вам придется вставить пробелы (как в примере), где их не было, чтобы столбцы были в строке.
- Ваш результат не должен содержать пробелы в конце строки .
- Последний символ новой строки (для последней строки) является необязательным.
- Это должна быть либо функция, либо полная программа. Если ваша функция принимает строку, то она должна возвращать результаты в виде строки. Если он принимает имя файла, вы возвращаете имя файла, в котором вы сохранили результат. Вам также разрешено написать полную программу, которая принимает входные данные из STDIN и выводит правильный результат в STDOUT; если вы сделаете это, вы не должны ничего выводить в STDERR.
- Кратчайшая процедура выигрывает, но я буду одобрять любой ответ, который мне нравится.
Исходя из правил, выходные данные в примере имеют длину 53 или 52 байта (для новых строк LF) в зависимости от того, включен последний заключительный символ или нет.
Примечание. Это не является конкретным требованием, но если ваша функция при двухкратном последовательном запуске не идентична оригиналу (последний символ новой строки может отличаться, и любые пустые строки в конце файла будут удалены), тогда вы возможно нарушая одно из правил.
Ответы:
Japt , 6 байт
Попробуйте
запустить его дважды - возвращает исходную строку
объяснение
Транспонировать вход
Карта над каждой линией
Подгонка справа
источник
J (
3140)Это функция, которая принимает строку и возвращает строку (т. Е. Символьный вектор с переводами строк, вставленными в нужных местах, а не матрицей).
Редактировать: без пробелов ни в одной строке.
Тест:
источник
?\n
.cut
ниdlb
по умолчанию, и написание их самостоятельно занимает кучу символов даже в APL.Ruby 111
Golfed:
Ungolfed:
В Ruby есть функция транспонирования массива, поэтому она просто дополняет строки, превращает их в массив символов, использует функцию Ruby Array # transpose, а затем превращает массив символов обратно в строки.
Игра в гольф состояла в простом использовании односимвольных идентификаторов, удалении пробелов, использовании временного для text.lines и размещении вычисления для max_length inline (нет никаких точек для эффективности).
источник
"\n"
на?\n
..to_a
это лишнее. Вы можете получить еще 5 символов там.R 171
Пример использования:
Конечный пробел удаляется.
источник
Python 2.7 (
97799490)РЕДАКТИРОВАТЬ: пропущено требование к функции;
Я вполне уверен, что это будет улучшено, так как я здесь начинающий, но для начала;
Код использует простое
split
для разделения строки на вектор строк. Затем он используетmap
со значением функции asNone
(функция unity) и оператор splat для транспонирования иzip_longest
дополнения вектора (аналогично функциональности в Python3)Остальная часть кода просто отображается
None
в пространство, обрезает и снова собирает матрицу в одну строку.источник
map
. Я продолжаю искать место, чтобы использовать это ... и ты просто избил меня до этого. ;)Bash + coreutils + sed, 83
fold
иpaste
сделать важную работу. Остальное просто форматирование.Принимает ввод из stdin и выводит в stdout:
источник
C (278 байт)
Редактировать: это на самом деле нарушает правила, так как он принимает имя файла в качестве аргумента, но записывает в стандартный вывод. Я отредактирую это позже, чтобы записать в файл и затем напечатать имя файла на стандартный вывод.
Это мой первый гольф-код, так что помилуй. Какой-то старый добрый C. Поместите вход
test.txt
и дайте ему поработать!clang transpose.c -o transpose && ./transpose test.txt
Благодаря использованию коротких имен переменных, удалению произвольного форматирования, разрешению утечки файловых дескрипторов и отключению всех предупреждений это сокращается до 278 байт. (Так как при этом используется неявный импорт, он может не связываться должным образом на всех системах. Работает на моей машине!)
источник
int
чтобы сократить некоторые ваши заявления, или это сейчас незаконно?A,B,D,I,J,*F
как глобальные переменные, чтобы избежатьint
ключевого слова. Точно так же вы можете удалитьint
изmain
объявления иC
аргумент. ВC
, неint
является обязательным во многих местах.AutoHotkey 210
Тест
источник
Рубин: 88 символов
(Размещено потому, что оно короче, чем у других решений Ruby. Не проверял, вводит ли мой код что-то новое по сравнению с ними. Если вы уже опубликовали решение Ruby и считаете, что это в основном ваша копия, прокомментируйте, и я удалю свой ответ. )
Образец прогона:
источник
Баш, 124 байта
Он читает стандартный ввод и записывает стандартный вывод. Попытайся:
Как это работает:
split
ввод в одну строку (файлы во временном каталоге$D
)grep
(файлы * +)paste
(столбцы, разделенные табуляцией)sed
Редактировать:
;rm -r $D
(спасибо, Тим)+
вместо_
суффикса и сократить${F}_
до$F+
L
из файлов результатов разделенияисточник
rm
бит из числа ваших персонажей.Рубин - 144 символа
Вот моя первая попытка игры в гольф:
Для вывода выполните
puts f text
гдеtext
любая многострочная строка, соответствующая приведенным выше правилам. Развернутая версия ниже:Для аналогичного, но в конечном итоге лучшего решения в Ruby, посмотрите код Уэйна Конрада выше.
источник
transpose
в вашем ответе, прежде чем я написал свой. Для меня не совсем кошмарно переписать твой ответ, только чуть лучше. :(transpose
, возможно, лучшее решение Ruby не появилось бы. Одна из вещей, которые мне больше всего нравятся в программировании, это желание сотрудничать и перекрестно опылять идеи. До новой встречи, добрый сэр. Ура!PHP 194
Non-golfed:
Это моя первая попытка игры в гольф, поэтому будьте добры! Также, советы / предложения будут с благодарностью!
источник
"
окружающих"trim"
. php выдаст предупреждение, но работает нормально.@
для подавления предупреждений.MATHEMATICA 117 символов
источник
f
! .. tksPerl (92 + 1)
читает стандартный ввод и пишет в стандартный вывод. добавив 1 к баллу за
say
источник
CJam,
3225 байтCJam новее, чем этот вызов, поэтому этот ответ не может быть принят.
Значительно сокращено пользователем 23013.
Проверьте это здесь.
источник
Javascript, 103
Меньше гольфа
Тест
источник
Сетчатка , 40 байт
Попробуйте онлайн!
Основанный на этой программе, которую я создал для транспонирования прямоугольника любого размера, который использует предложение Лео для транспонирования прямоугольника известного размера.
Изменить: Гольф больше и больше не имеет пробелы на линиях.
источник
Perl 5 , 25 байт
Обратите внимание, что здесь используются escape-последовательности ANSI и, как таковые, они не работают на TIO, однако вы можете увидеть это в действии здесь .
объяснение
Этот код сначала меняет значение list separator (
$"
) на вертикальную табуляцию, за которой следует escape-последовательность ANSI для «go backwards 1 column» (\x1b[1D
), затем мы устанавливаем неявно напечатанную переменную$_
как строку, начинающуюся с escape-последовательности ANSI для 'начать печать в строке 1 столбца$.
(где$.
находится текущая строка текста)' (\x1b1;$.H
) и интерполирует список@F
(который представляет собой список всех символов в этой строке, заполненный функцией autosplit (-a
) с пустым шаблоном split (-F
)) который помещает содержимое$"
между каждым элементом, перемещая курсор вертикально вниз вместо продолжения вывода после предыдущего символа.Попробуйте онлайн!
источник
C ++ (243 символа)
Вот функция, которая принимает и возвращает строку.
Я мог бы побрить пару десятков символов, но решил оставить его как не глупый код (работает быстро, читает нормально). Может быть, я только решил сделать это, потому что это мой первый гольф-код ... Я еще не достаточно хардкор :)
С форматированием:
источник
using namespace std;
.using namespace std;
следует добавить количество символов.Python 2,7 - 115 символов :
один лайнер:
и в более чистой печати:
в 115 символов:
источник
\n
считаетсяlen
одним символом, но это два :)\n
- это одно. Поэтому я говорю, что все в порядке.len("\n")
покажет 1, хотя это, безусловно, 2 отдельных символа в исходном коде. Сохранение исходного кода в файл приведет кls
отображению 116. Просто сказать, чтоlen
это не лучший способ измерить размер кода из-за обработки управляющих символов перед измерением :)GolfScript, 51 символ
Это первая попытка; Я подозреваю, что это может быть улучшено. Большая часть кода должна соответствовать требованиям заполнения и удаления пробела - без них просто
n%zip n*
было бы достаточно.Ps. Следующая 46- символьная версия выполнит работу для данного примера ввода, но потерпит крах, если любой столбец ввода будет состоять исключительно из пробелов:
Я предполагаю, что этого достаточно, чтобы дисквалифицировать его, даже если в заявке явно не говорится об этом.
источник
Схема / Ракетка 113
Текст:
Без новых строк и лишних пробелов:
Дружественная версия
источник
Haskell
Это было так коротко, мне нужно было добавить в пустое пространство ...
источник
I am a text..?
Transpose met
Can you do i
.Python
89103 символаЯ чувствую себя грязным
90104 символа для версии промышленного уровня. : ^)источник
Mathematica, 95 символов
источник
К, 56
Это должно соответствовать спецификации сейчас.
Принимает строку, возвращает строку.
,
источник
{`/:x@'/:!max@#:'x:`\:x}
за 26.Groovy, 98 символов
онлайн
ungolfed:
источник
Pyth , 11 байт
Попробуйте онлайн!
Принимает ввод в виде строки, выводит список списков
Pyth , 25 байт
Принимает ввод как строку, выводит строку.
Попробуйте онлайн!
источник
J,
2826 байтСохранено 2 байта благодаря frownyfrog
Принимает строку, возвращает строку. Я не уверен, что есть более короткая версия глагола
функцииcutopen, который я мог бы использовать.Там также короче
Но я не уверен, что это соответствует рекомендациям OP, так как он возвращает массив символов.
Как это работает:
Другая версия работает так же, но не преобразует транспонированный массив в правильно отформатированную строку.
Примеры:
источник
cutLF
.0|:>@cutLF
Луа ,
203189 байтПопробуйте онлайн!
Я видел другое решение Lua здесь, но я не думаю, что есть проблема с размещением 2 решений на одном языке. Если есть, скажите мне :)
источник