Между вопросом о котенке и появлением этого вопроса в U & L о какой-то sed
магии, как насчет реализации tac
?
Задача
Реализуйте программу, которая перевернет и напечатает строки в файле.
вход
Файл, предоставленный как имя или через стандартный ввод
Выход
Линии, перевернутые, чтобы выровнять.
счет
Байты исходного кода.
tac
немного странно, когда речь заходит о переводе строки. Он преобразуетсяa\nb\n
(завершающий перевод строки) вb\na\n
иa\nb
(без завершающего перевода строки) вba\n
. Это то, как наш код должен себя вести?tac
являются лишь вопросом времени ...\n
.tac
меняет порядок этих строк Если an\n
удален из середины файла, строка, которую он завершил, присоединяется к следующей строке, но в случае последней строки следующей строки нет, к которой можно присоединиться.Ответы:
GS2, 3 байта
Три байта - это по порядку разделенные линии, обратные и соединительные строки.
источник
Perl, 11 байт
Ведет себя точно так же, как
tac
. Для этого кода требуется-p
переключатель, который я посчитал 1 байтом.Тестовые прогоны
Как это работает
Как объясняется здесь ,
-p
переключатель в основномwhile (<>) { ... ; print }
охватывает программу, поэтому исходный код эквивалентенДля каждой строки ввода мы добавляем текущую строку (
$_
) к$\
(изначально неопределенному), обновляя последнюю с результатом.После обработки всех строк
print
печатается значение локальной переменной$_
(не определено в этой области), за которым следует разделитель выходных записей ($\
).источник
-p
переключателя оборачивает ваш код в цикл, который начинаетсяwhile(<>){
и заканчивается} continue { print }
, что позволяет фильтровать входные данные просто путем изменения$_
.$\=$_.$\
добавляет каждую строку ввода к разделителю выходной записи, и преждевременно}{
завершает поставляемый perlwhile
блок, поэтомуcontinue
блок больше не присоединяется к нему. Таким образом, все строки ввода добавляются$\
в обратном порядке, а затем, в концеcontinue { print }
концов, запускается, печатая «ничто» ($_
будет не определено после конца ввода), но с разделителем$\
.Pyth, 4 байта
.z
является вводом, разделенным строками в виде списка,_
переворачивает его иj
соединяет его символом, который по умолчанию является\n
.источник
FlogScript , 2 байта
(Попробуйте на анархии гольф .)
Режим
)
enable--in-out-line-array
, а остальная часть программы -"
реверсирование массива строк.источник
Сетчатка , 7 байт
Retina работает в режиме Match с одним регулярным выражением. Обычно это просто печатает количество совпадений, но при этом
!
мы настраиваем его для печати реальных совпадений (разделенных переводом строки).Фактическое регулярное выражение просто
.*$
..*
соответствует любой строке (потенциально пустой), потому что.
может соответствовать любому символу, кроме перевода строки. Я вернусь$
через минуту.Как мы заставим его печатать спички в обратном порядке? Используя .NET режим сопоставления справа налево, активируется с помощью
r
. Это означает, что механизм регулярных выражений запускается в конце строки при поиске совпадений и работает в обратном направлении.И, наконец,
m
делает$
матч конец строки , а не в конце строки. Зачем нам это вообще нужно? Беда в том, что.*
генерирует посторонние совпадения. Рассмотрим подстановку регулярных выраженийприменяется к входу
baaababaa
. Вы могли бы подумать, что это дастbaaaxbaxbaax
, но на самом деле это дает вамbaaaxxbaxxbaaxx
. Зачем? Потому что после сопоставленияaaa
курсор двигателя находится междуa
иb
. Теперь он не может больше соответствоватьa
s, ноa*
также удовлетворен пустой строкой. Это означает, что после каждого совпадения вы получаете еще одно пустое совпадение.Мы не хотим этого здесь, потому что это введет дополнительные пустые строки, поэтому мы отбрасываем эти посторонние совпадения (которые находятся в начале строк, из-за режима справа налево), требуя, чтобы совпадения включали конец линия.
источник
Haskell, 34 байта
[редактировать]
Сохраняется один байт путем замены
unlines
наconcat
.источник
CJam, 7 байтов
Читает стандартный вывод, выводит на стандартный вывод.
Объяснение:
источник
Pyth, 5 байт
Это меняет порядок строк с помощью простого подхода разделения-обратного соединения, но не совсем так, как TAC .
Попробуйте онлайн.
источник
Befunge-93, 17 байт
Здесь нет ничего особенного; просто положите все в стек, а затем вытолкните.
источник
Pure Bash (без внешних утилит), 56
Это один из немногих ответов для точной
tac
эмуляции, о чем спрашивается в комментарии Денниса :источник
Рубин, 16 байт
источник
JavaScript (SpiderMonkey Shell), 38 байт
Довольно просто
read()
читает файлreadline()
читает строку из STDIN[...str]
разделит str на массив символовreverse()
обратит массивjoin``
объединит массив в строкуисточник
Python 2, 52 байта
источник
import sys;print sys.stdin.read()[::-1]
?C #,
179171 байтЧитает строки, помещая их в стек, а затем записывает их назад. Я бы использовал Mathematica для этого, но он не имеет смысла EOF.
источник
sed, 9 байт
Никакого upvote не хотел, это знаменитый сед-лайнер.
источник
Perl, 16 байт
источник
Powershell, 41 байт
Сохраняет содержимое файла построчно
a
, переворачиваетa
и, наконец, печатает его.источник
GolfScript, 7 байт
Онлайн тест здесь .
источник
Бурлеск , 6 байтов
ln
разбивает линии,<-
переворачивает,uN
объединяет строки и форматы для необработанного вывода.источник
Баш,
4843 персонажа(Вдохновленный ответом Digital Trauma 's Bash . Ответы за идею должны пойти к нему.)
Образец прогона:
источник
mapfile -c1 -Cf
вместоmapfile -c1 -Cf a
.-C
сначала попробовал что-то непростое .GNU Awk, 27 символов
(Вдохновленный Ed Мортон «s GNU Awk ответ . CW , как я не намеревался похитить его решение.)
Обратите внимание, что при изменении
RT
→RS
это становится переносимым стандартным Awk, но теряет способность сохранять отсутствие последнего перевода строки.Образец прогона:
источник
СНОБОЛ, 42 байта
источник
Гема, 25 знаков
Образец прогона:
источник
Калий ,
90 байт86 байтСмотрите расширенный здесь
источник
for
синтаксисом. Смотрите образец здесьsed, 7 байт
Это работает для меня (и это самое короткое решение в других местах), но я действительно не хочу выяснять, почему. Я просто возился со знаменитым 9-байтовым трюком, пока не нашел это. Я думаю,
G
что первая строка ничего не делает?источник
G
добавляет новую строку и содержимое пространства удержания к пространству шаблона. Хотя добавление содержимого пустого пространства удержания действительно безвредно,JavaScript (Node.js), 91 байт
источник
console.log((require('fs').readFileSync(process.argv[2])+"").split(d="\n").reverse().join(d))
(92 байта)? Ваш текущий код не меняет линии.Баш + коммунальные услуги, 25
Здесь
^G
буквальныйBEL
характер. Я предполагаю, что ввод только для печати ASCII.Это
tr
анонсирует весь ввод в одну строку, заменяя символы новой строки на BEL, затемrev
перебрасывает эту строку, затемtr
возвращает обратно в многострочное, затемrev
снова перебирает каждую строку, чтобы получить желаемый результат.источник
МАТЛАБ, 44
Разбивает строку на новые строки, переворачивает результирующий массив, а затем соединяется с символами новой строки.
источник
Юлия, 65 байт
Это принимает файл в качестве аргумента командной строки и печатает его строки в обратном порядке. Конечные символы новой строки перемещаются на фронт, в отличие от того
tac
, что законно.Ungolfed:
источник
Пип , 3 + 2 = 5 байт
Использует
r
иn
флаги; читает со стандартного ввода.r
Флага считывает стандартный ввод и сохраняет его в виде списка линий вg
(который , как правило , список командной строки ар г ы). Затем мы переворачиваем этот список, и он автоматически печатается. Вn
списках флагов причины для вывода с новой строки в качестве разделителя.источник