Esse desafio é semelhante ao anterior , mas com algumas partes pouco claras das especificações e requisitos de E / S menos rigorosos.
Dada a entrada de uma sequência que consiste apenas em ASCII e novas linhas imprimíveis, produz várias métricas (bytes, palavras, contagem de linhas).
As métricas que você deve gerar são as seguintes:
Contagem de bytes. Como a sequência de entrada permanece em ASCII, também é a contagem de caracteres.
Contagem de palavras. Esta é
wc
a definição de uma "palavra": qualquer sequência de espaço não em branco. Por exemplo,abc,def"ghi"
é uma "palavra".Contagem de linhas. Isso é auto-explicativo. A entrada sempre conterá uma nova linha à direita, o que significa que a contagem de linhas é sinônimo de "contagem de novas linhas". Nunca haverá mais do que uma única nova linha à direita.
A saída deve replicar exatamente a wc
saída padrão (exceto o nome do arquivo):
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
Observe que a contagem de linhas vem primeiro, depois a contagem de palavras e, finalmente, a contagem de bytes. Além disso, cada contagem deve ser preenchida à esquerda com espaços para que tenham a mesma largura. No exemplo acima, 5501
é o número "mais longo" com 4 dígitos, portanto, 165
é preenchido com um espaço e 90
com dois. Finalmente, todos os números devem ser unidos em uma única sequência de caracteres com um espaço entre cada número.
Como esse é o código-golfe , o código mais curto em bytes será vencedor.
(Ah, e a propósito ... você não pode usar o wc
comando na sua resposta. Caso isso já não fosse óbvio.)
Casos de teste ( \n
representa uma nova linha; opcionalmente, você também pode precisar de uma nova linha à direita):
"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"
Respostas:
Perl, 49 bytes
Adicionado +3 para
-an0
Entrada em STDIN ou 1 ou mais nomes de arquivos como argumentos. Correr como
perl -an0 wc.pl
wc.pl
:Explicação:
fonte
Python 2,
10077 bytesEsta solução é uma função Python que aceita uma string de várias linhas e imprime as contagens necessárias no stdout. Observe que eu uso uma string de formato para criar uma string de formato (que requer um
%%
para escapar do primeiro espaço reservado de formato).Editar: salvou 23 bytes devido a otimizações de impressão de Dennis.
Antes do minifier, fica assim:
fonte
Pitão, 21 bytes
Suíte de teste
Pyth tem alguns ótimos embutidos aqui. Começamos fazendo uma lista (
[
) das novas linhas da string (@bQ
), das palavras da string (cQ)
) e da própria string (Q
). Em seguida, preenchemos (.[
) o comprimento de cada string (ld
) com espaços (;
nesse contexto) para o comprimento do número de caracteres (l`lQ
). Por fim, junte-se aos espaços (jd
).fonte
Awk POSIX,
79756765 bytesEdit: salvo 4 bytes desde POSIX permite que um nu
length
, salvo 7 bytes descontando a parte invocação, e salvou dois bytes, graças a ponta do Doorknob para adicionard %
ad
.Isso foi originalmente para o GNU awk, mas o melhor que posso dizer é que ele usa apenas a funcionalidade do POSIX awk.
Melhor formatado:
fonte
d
comolength(c)"d %"
deve permitir que você altereprintf
para"%"d d"d\n"
, o que salva dois bytes.Sério , 39 bytes
Experimente online!
Explicação (novas linhas são substituídas por
\n
):fonte
AppleScript, 253 bytes
Isso pressupõe que os delimitadores de itens de texto do AppleScript estejam configurados no espaço (se precisar contar as coisas para forçar essa suposição, adicionarei).
fonte
CJam,
3126 bytesExperimente online!
Como funciona
fonte
Julia,
11281 bytesEsta é uma função que aceita uma string e retorna uma string.
Salvamos o seguinte como argumentos de função:
n = endof
função, que obtém o último índice de uma coleção indexável (nesse caso, é o comprimento da string)l = "$(n(s))
, o comprimento da entrada convertida em uma sequência usando interpolaçãog
que aceita uma expressão regular e retorna o comprimento - 1 da divisão de entrada nesse regex, preenchida à esquerda com espaços para corresponder ao comprimento del
.Nós obtemos o número de linhas usando
g(r"\n")
e o número de palavras usandog(r"\S+")
, depois juntamos as que sãol
delimitadas por espaços.Economizou 31 bytes graças a Dennis!
fonte
MATL, 38 bytes
Você pode experimentá-lo online! Isso não deve demorar tanto ...
Explicação, para o cálculo,
A última parte faz a formatação de saída
fonte
!3Z"vX:!
porZ{Zc
(cellstr
seguido destrjoin
)JavaScript (ES6), 115 bytes
Não requer nenhuma entrada. A formatação foi dolorosa. Se houvesse um limite superior na quantidade de preenchimento, eu poderia reduzir
(' '.repeat(99)+n)
para algo mais curto, por exemplo` ${n}`
.fonte
/[^]/g
com/./g
a salvar dois bytesPowerShell, 140 bytes
(nova linha deixada para maior clareza: D)
A primeira linha recebe entrada
$a
e, em seguida, a próxima parte é toda uma declaração. Estamos definindo$c
igual a algumas cordas.length
. Isso formará nosso preenchimento necessário. Dentro da sequência há um bloco de código imediato$(...)
, para que o código seja executado antes de ser avaliado na sequência.No bloco de código, estamos enviando três itens através do
|sort
comando e, em seguida, pegando o maior(...)[-1]
. É aqui que garantimos que as colunas tenham a largura correta. Os três itens são$l
a contagem de linhas, onde estamos-split
em novas linhas, a$w
contagem de palavras, onde estamos-split
em espaços em branco e$b
o comprimento.A segunda linha é a nossa saída usando o
-f
operador (que é uma pseudo-abreviação paraString.Format()
). É outra maneira de inserir variáveis expandidas em strings. Aqui, estamos dizendo que queremos que toda a saída seja preenchida à esquerda para que cada coluna seja$c
larga. O preenchimento é feito através de espaços. A0
,1
, e2
correspondem a uma$l
,$w
e$b
que são argumentos para o operador de formato, de modo que o número de linhas, número de palavra, e contagem de bytes são acolchoado e saída de forma apropriada.Observe que isso exige que a string tenha novas linhas já expandidas (por exemplo, fazendo um
Get-Content
em um arquivo de texto ou algo assim, e então canalizando ou salvando isso em uma variável e chamando esse código nessa entrada) ou use o PowerShell- caracteres de escape com estilo com reticências (ou seja, em`n
vez de\n
).Exemplo
fonte
Gelatina , 14 bytes
Experimente online!
-1 graças a Dennis .
fonte
Ruby, 108 bytes
fonte
Perl,
716261 bytesinclui +1 para
-n
Comentado:
fonte
y///c
como um comprimento menor de$_
.split$"
no contexto escalar fornece o número de palavras em$_
. Usando uma variável de pontuação como em$;
vez de$W
você pode colocar umd
logo após a interpolação na string de formato. Depois, você pode soltar od
em$W
e soltar o parêntese. E-p
não ganha nada mais-n
, deixe-oprintf
fazer a impressão (adicionar uma nova linha a gosto)$a=foo;$b=bar$a
geralmente pode ser escrita como$b=bar($a=foo)
, economizando um byte. Aplicável aqui a$;
e$b
. Você não se importa se$;
é recalculado toda vezLua,
7466 bytesGolfe:
Ungolfed:
Recebe entrada através de argumentos de linha de comando.
Renomeamos o primeiro argumento (
arg[1]
) para salvar bytes.string.gsub
retorna o número de substituições e a sequência modificada. Por isso, usamos isso para contar primeiro'\n'
(novas linhas) e, em seguida,'%S+'
(instâncias de um ou mais caracteres que não sejam espaços em branco, o maior número possível, ou seja, palavras). Podemos usar o que quisermos para a string de substituição, portanto, usamos a string vazia (''
) para salvar bytes. Então nós apenas usamosstring.len
para encontrar o comprimento da string, ou seja, o número de bytes. Então, finalmente, imprimimos tudo.fonte
Retina, 65
Experimente Online!
O primeiro estágio é o programa wc real, o restante é para preenchimento. O
a
espaço reservado provavelmente é desnecessário, e alguns dos grupos provavelmente podem ser um pouco simplificados.fonte
Haskell, 140 bytes
A versão ungolfed está abaixo, com nomes expandidos de variáveis e funções:
Esta é uma função que aceita uma string e retorna uma string. Apenas usa as
Prelude
funçõeswords
(resp.lines
) Para obter o número de palavras (resp. Linhas), uma vez que elas parecem usar a mesma definição dewc
, então obtém o maior valor (como uma string) entre as contagens e usam o formato printf usando a largura entre seus argumentos para formatação.fonte
C,
180178 bytesfonte
05AB1E ,
2423 bytesj
está atualmente com problemas, então poderia ter 21 bytes sem o§
eJ
..Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Pip
-s
, 25 bytesLeva a cadeia de linhas múltiplas como um argumento da linha de comandos. Experimente online!
Graças a resposta CJam de Dennis por me fazer perceber que o número mais longo é sempre a contagem de caracteres.
Explicação
Aqui está uma solução de 29 bytes com sinalizadores
-rs
que recebe a entrada do stdin:Experimente online!
fonte
Powershell,
123115 bytesScript de teste:
Saída:
Explicação:
$args|% t*y
divide seqüências de caracteres de argumentos em caracteresswitch -r($args|% t*y)
avaliar todos os casos correspondentes'\s'
caso para qualquer espaço em branco'\S'
caso para qualquer espaço não em branco'(?s).'
caso de qualquer caractere (nova linha incluída)'\n'
caso para newline char (nova linha representa a si mesma)$c="$b".Length
calcular um comprimento de número de bytes. $ b é sempre máximo ($ l, $ w, $ b) por design"{0,$c} {1,$c} $b"-f$l,+$w
formatar números com o mesmo comprimento. A variável $ w é convertida em int. Precisa de strings sem palavras. Outras variáveis são formatadas 'como estão' porque 'A entrada sempre conterá uma nova linha à direita' e $ le $ b não podem ser 0.fonte