Эта проблема похожа на эту старую , но с некоторыми неясными частями спецификации и менее строгими требованиями ввода / вывода.
При вводе строки, состоящей только из печатных ASCII и новых строк, выведите ее различные метрики (байт, слово, количество строк).
Метрики, которые вы должны вывести, следующие:
Количество байтов Поскольку входная строка остается в ASCII, это также количество символов.
Количество слов Это
wc
определение «слова:» любой последовательности, не являющейся пробелом. Например,abc,def"ghi"
это одно «слово».Количество строк Это говорит само за себя. Входные данные всегда будут содержать завершающий символ новой строки, что означает, что количество строк является синонимом «количество строк новой строки». Там никогда не будет больше, чем один завершающий перевод строки.
Вывод должен точно повторять wc
вывод по умолчанию (за исключением имени файла):
llama@llama:~$ cat /dev/urandom | tr -cd 'A-Za-z \n' | head -90 > example.txt
llama@llama:~$ wc example.txt
90 165 5501 example.txt
Обратите внимание, что сначала идет количество строк, затем количество слов и, наконец, количество байтов. Кроме того, каждый отсчет должен дополняться пробелами так, чтобы они были одинаковой ширины. В приведенном выше примере 5501
это «самый длинный» номер с 4 цифрами, поэтому 165
он дополняется одним пробелом и 90
двумя. Наконец, все числа должны быть объединены в одну строку с пробелом между каждым числом.
Поскольку это код-гольф , победит самый короткий код в байтах.
(Да, кстати ... вы не можете использовать wc
команду в своем ответе. В случае, если это уже не было очевидно.)
Тестовые случаи ( \n
представляет новую строку; вам также может потребоваться дополнительная завершающая новая строка):
"a b c d\n" -> "1 4 8"
"a b c d e f\n" -> " 1 6 12"
" a b c d e f \n" -> " 1 6 16"
"a\nb\nc\nd\n" -> "4 4 8"
"a\n\n\nb\nc\nd\n" -> " 6 4 10"
"abc123{}[]()...\n" -> " 1 1 16
"\n" -> "1 0 1"
" \n" -> "1 0 4"
"\n\n\n\n\n" -> "5 0 5"
"\n\n\na\nb\n" -> "5 2 7"
Ответы:
Perl, 49 байт
Добавлено +3 для
-an0
Ввод в STDIN или 1 или более имен файлов в качестве аргументов. Беги как
perl -an0 wc.pl
wc.pl
:Объяснение:
источник
Python 2,
10077 байтЭто решение представляет собой функцию Python, которая принимает многострочную строку и выводит требуемые значения в стандартный вывод. Обратите внимание, что я использую строку формата для построения строки формата (которая требует
%%
экранирования первого заполнителя формата).Редактировать: Сохранено 23 байта из-за оптимизации печати Денисом.
Перед минификатором это выглядит так:
источник
Pyth, 21 байт
Тестирование
У Пита есть несколько очень хороших встроенных модулей. Мы начинаем с создания списка (
[
) новых строк в строке (@bQ
), слов в строке (cQ)
) и самой строки (Q
). Затем мы дополняем (.[
) длину каждой строки (ld
) пробелами (;
в данном контексте) до длины количества символов (l`lQ
). Наконец, присоединяйтесь к пробелам (jd
).источник
POSIX awk,
79756765 байтРедактирование: сохранено 4 байта, поскольку POSIX позволяет пустые
length
, 7 байтов сохранены путем исключения части вызова и два байта благодаря подсказке Doorknob для добавленияd %
вd
.Первоначально это было для GNU awk, но, насколько я могу судить, он использует только функциональность POSIX awk.
Лучше отформатировано:
источник
d
дляlength(c)"d %"
позволит вам изменить ,printf
чтобы"%"d d"d\n"
, что экономит два байта.Серьезно , 39 байтов
Попробуйте онлайн!
Пояснение (новые строки заменены на
\n
):источник
AppleScript, 253 байта
Это предполагает, что разделители текстовых элементов AppleScript установлены на пробел (если мне нужно посчитать материал, чтобы заставить это предположение, я добавлю его).
источник
CJam,
3126 байтПопробуйте онлайн!
Как это работает
источник
Юлия,
11281 байтЭто функция, которая принимает строку и возвращает строку.
Мы сохраняем следующее как аргументы функции:
n = endof
функция, которая получает последний индекс индексируемой коллекции (в данном случае это длина строки)l = "$(n(s))
длина входных данных, преобразованных в строку с использованием интерполяцииg
которая принимает регулярное выражение и возвращает длину - 1 входного разбиения в этом регулярном выражении, дополненная слева пробелами, чтобы соответствовать длинеl
.Мы получаем количество используемых строк
g(r"\n")
и количество используемых словg(r"\S+")
, затем соединяем их вместе сl
разделителями пробелами.Благодаря Деннису сэкономлено 31 байт!
источник
MATL, 38 байт
Вы можете попробовать это онлайн! Это не должно быть так долго, хотя ...
Пояснение, для расчета,
Последняя часть делает форматирование вывода
источник
!3Z"vX:!
наZ{Zc
( сcellstr
последующимstrjoin
)JavaScript (ES6), 115 байт
Не требует никакого ввода. Форматирование было болезненным. Если бы был верхний предел количества заполнения, я мог бы уменьшить
(' '.repeat(99)+n)
его, например, до более короткого` ${n}`
.источник
/[^]/g
на,/./g
чтобы сохранить два байтаPowerShell, 140 байт
(новая строка оставлена для ясности: D)
Первая строка принимает входные данные
$a
, а затем следующая часть является одним оператором. Мы устанавливаем$c
равные для некоторых строк.length
. Это сформирует наши необходимые отступы. Внутри строки находится блок кода$(...)
, так что код будет выполнен до того, как будет преобразован в строку.В блоке кода мы отправляем три элемента с помощью
|sort
команды, а затем принимаем самый большой(...)[-1]
. Здесь мы обеспечиваем правильную ширину столбцов. Три элемента -$l
это количество строк, где мы-split
на новых строках, количество$w
слов, где мы-split
на пробел, и$b
длина.Вторая строка - это наш вывод с использованием
-f
оператора (который является псевдо-сокращением дляString.Format()
). Это еще один способ вставки расширенных переменных в строки. Здесь мы говорим, что мы хотим, чтобы весь вывод располагался слева, чтобы каждый столбец был$c
широким. Заполнение делается через пробелы.0
,1
И2
соответствуют$l
,$w
и$b
которые являются аргументы оператора формата, поэтому количество строк, количество слов, и счетчик байт являются подложкой и выхода соответственно.Обратите внимание, что для этого необходимо, чтобы в строке уже были развернутые символы новой строки (например, сделать
Get-Content
текст в текстовом файле или что-то в этом духе, а затем либо скопировать или сохранить его в переменной, а затем вызвать этот код для этого ввода), либо использовать PowerShell- стилизованные экранирующие символы с кавычками (то есть`n
вместо\n
).пример
источник
Желе , 14 байт
Попробуйте онлайн!
-1 спасибо Денису .
источник
Рубин, 108 байт
источник
Perl,
716261 байтвключает +1 для
-n
комментарии:
источник
y///c
как более короткую длину$_
.split$"
в скалярном контексте дает количество слов в$_
. Используя переменную пунктуации, такую как$;
вместо,$W
вы можете поместитьd
сразу после интерполяции в строку формата. После этого вы можете упастьd
в системе$W
и падение скобки. И-p
ничего не выигрывает-n
, просто позвольтеprintf
печатать (добавьте новую строку по вкусу)$a=foo;$b=bar$a
правило, может быть записана как$b=bar($a=foo)
, сохраняя один байт. Применимо здесь к$;
и$b
. Вам все равно, если$;
каждый раз пересчитываетсяЛуа,
7466 байтGolfed:
Ungolfed:
Получает ввод через аргументы командной строки.
Переименовываем первый аргумент (
arg[1]
) для сохранения байтов.string.gsub
возвращает количество замен, а также измененную строку, поэтому мы используем это для подсчета сначала'\n'
(новые строки), затем'%S+'
(экземпляры одного или нескольких непробельных символов, как можно больше, то есть слов). Мы можем использовать все, что захотим, для строки замены, поэтому мы используем пустую строку (''
) для сохранения байтов. Затем мы просто используем,string.len
чтобы найти длину строки, то есть количество байтов. Затем, наконец, мы печатаем все это.источник
Сетчатка, 65
Попробуйте онлайн!
Первый этап - это действительная wc-программа, остальная часть предназначена для заполнения.
a
Заполнитель вещь, вероятно , нет необходимости, и некоторые из групп , вероятно , может быть немного упрощен.источник
Haskell, 140 байт
Ниже приведена версия без заглавных букв с расширенными именами переменных и функций:
Это функция, которая принимает строку и возвращает строку. Он просто использует
Prelude
функцииwords
(соотв.lines
), чтобы получить количество слов (соответственно строк), учитывая, что они, похоже, используют то же определение, чтоwc
и затем, получает самое длинное значение (в виде строки) среди счетчиков и использует формат printf, принимая ширина среди его аргументов для форматирования.источник
C
180178 байтисточник
05AB1E ,
2423 байтаj
в настоящее время прослушивается, поэтому, возможно, было 21 байт без§
иJ
..Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Пип
-s
, 25 байтПринимает многострочную строку в качестве аргумента командной строки. Попробуйте онлайн!
Благодаря ответу Дениса на CJam за то, что он заставил меня понять, что самое длинное число - это всегда количество символов.
объяснение
Вот 29-байтовое решение с флагами,
-rs
которое принимает входные данные от stdin:Попробуйте онлайн!
источник
Powershell,
123115 байтТестовый скрипт:
Выход:
Объяснение:
$args|% t*y
расщепляет струныswitch -r($args|% t*y)
оценить все подходящие случаи'\s'
чехол для любого пробела'\S'
случай для любого не пробела'(?s).'
чехол для любого символа (включая новую строку)'\n'
case для символа новой строки (символ новой строки представляет себя)$c="$b".Length
вычислить длину числа байтов. $ b всегда максимально ($ l, $ w, $ b) по замыслу"{0,$c} {1,$c} $b"-f$l,+$w
форматировать числа одинаковой длины. Переменная $ w преобразуется в int. Это нужно для строк без слов. Другие переменные форматируются «как есть», потому что «входные данные всегда будут содержать завершающий символ новой строки», а $ l и $ b не могут быть 0.источник