Este desafío es similar al anterior , pero con algunas partes poco claras de la especificación elaboradas y requisitos de E / S menos estrictos.
Dada una entrada de una cadena que consta de solo ASCII imprimible y nuevas líneas, genera sus diversas métricas (byte, palabra, recuento de líneas).
Las métricas que debe generar son las siguientes:
Recuento de bytes. Como la cadena de entrada permanece dentro de ASCII, este también es el recuento de caracteres.
El recuento de palabras. Esta es
wc
la definición de una "palabra:" cualquier secuencia de espacio no en blanco. Por ejemplo,abc,def"ghi"
es una "palabra".Recuento de líneas. Esto se explica por sí mismo. La entrada siempre contendrá una nueva línea final, lo que significa que el recuento de líneas es sinónimo de "recuento de nuevas líneas". Nunca habrá más de una nueva línea final.
La salida debe replicar exactamente la wc
salida predeterminada (excepto el nombre del archivo):
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
Tenga en cuenta que el recuento de líneas es lo primero, luego el recuento de palabras y finalmente el recuento de bytes. Además, cada recuento debe ir rellenado a la izquierda con espacios para que todos tengan el mismo ancho. En el ejemplo anterior, 5501
es el número "más largo" con 4 dígitos, por lo que 165
se rellena con un espacio y 90
con dos. Finalmente, todos los números deben unirse en una sola cadena con un espacio entre cada número.
Como se trata de code-golf , ganará el código más corto en bytes.
(Ah, y por cierto ... no puedes usar el wc
comando en tu respuesta. En caso de que eso ya no sea obvio).
Casos de prueba ( \n
representa una nueva línea; opcionalmente, también puede requerir una nueva línea adicional):
"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"
Respuestas:
Perl, 49 bytes
Se agregó +3 por
-an0
Ingrese en STDIN o 1 o más nombres de archivo como argumentos. Correr como
perl -an0 wc.pl
wc.pl
:Explicación:
fuente
Python 2,
10077 bytesEsta solución es una función de Python que acepta una cadena de varias líneas e imprime los recuentos necesarios en stdout. Tenga en cuenta que uso una cadena de formato para construir una cadena de formato (que requiere una
%%
para escapar del primer marcador de posición de formato).Editar: Guardado 23 bytes debido a optimizaciones de impresión por Dennis.
Antes del minificador, se ve así:
fuente
Pyth, 21 bytes
Banco de pruebas
Pyth tiene algunas muy buenas incorporaciones aquí. Comenzamos haciendo una lista (
[
) de las nuevas líneas en la cadena (@bQ
), las palabras en la cadena (cQ)
) y la cadena en sí (Q
). Luego, rellenamos (.[
) la longitud de cada cadena (ld
) con espacios (;
en este contexto) a la longitud del número de caracteres (l`lQ
). Finalmente, únete en espacios (jd
).fuente
POSIX awk,
79756765 bytesEditar: ahorrado 4 bytes desde POSIX permite que un desnudo
length
, salvó 7 bytes mediante el descuento de la parte invocación, y salvó dos bytes gracias a punta de Pomo para añadird %
ad
.Esto fue originalmente para GNU awk, pero lo mejor que puedo decir es que solo usa la funcionalidad POSIX awk.
Mejor formateado:
fuente
d
delength(c)"d %"
debería permitirle cambiarprintf
a"%"d d"d\n"
, lo que ahorra dos bytes.En serio , 39 bytes
Pruébalo en línea!
Explicación (las nuevas líneas se reemplazan por
\n
):fuente
AppleScript, 253 bytes
Esto supone que los delimitadores de elementos de texto de AppleScript están configurados en espacio (si necesito contar las cosas para forzar esa suposición, la agregaré).
fuente
CJam,
3126 bytesPruébalo en línea!
Cómo funciona
fuente
Julia,
11281 bytesEsta es una función que acepta una cadena y devuelve una cadena.
Guardamos lo siguiente como argumentos de función:
n = endof
función, que obtiene el último índice de una colección indexable (en este caso es la longitud de la cadena)l = "$(n(s))
, la longitud de la entrada convertida en una cadena mediante interpolacióng
que acepta una expresión regular y devuelve la longitud - 1 de la división de entrada en esa expresión regular, rellena a la izquierda con espacios para que coincida con la longitud del
.Obtenemos el número de líneas usando
g(r"\n")
y el número de palabras usandog(r"\S+")
, luego las unimos conl
delimitadas por espacios.¡Ahorré 31 bytes gracias a Dennis!
fuente
MATL, 38 bytes
¡Puedes probarlo en línea! Sin embargo, esto no debería ser tan largo ...
Explicación, para el cálculo,
La última parte hace el formato de salida
fuente
!3Z"vX:!
porZ{Zc
(cellstr
seguido destrjoin
)JavaScript (ES6), 115 bytes
No requiere ninguna entrada. El formateo fue doloroso. Si hubiera un límite superior en la cantidad de relleno, podría reducirlo
(' '.repeat(99)+n)
a algo más corto, por ejemplo` ${n}`
.fuente
/[^]/g
con/./g
para guardar dos bytesPowerShell, 140 bytes
(Nueva línea dejada en claro: D)
La primera línea toma entrada
$a
, y luego la siguiente parte es una sola declaración. Estamos estableciendo$c
igual a algunas cadenas.length
. Esto formará nuestro relleno necesario. Dentro de la cadena hay un bloque de código inmediato$(...)
, por lo que ese código se ejecutará antes de evaluarlo en la cadena.En el bloque de código, enviamos tres elementos a través del
|sort
comando y luego tomamos el más grande(...)[-1]
. Aquí es donde nos aseguramos de que las columnas tengan el ancho correcto. Los tres elementos son$l
el recuento de líneas, dónde estamos-split
en las nuevas líneas, el$w
recuento de palabras, dónde estamos-split
en los espacios en blanco y$b
la longitud.La segunda línea es nuestra salida usando el
-f
operador (que es una pseudo-abreviatura paraString.Format()
). Es otra forma de insertar variables expandidas en cadenas. Aquí, estamos diciendo que queremos que toda la salida se rellene a la izquierda para que cada columna sea$c
ancha. El relleno se realiza a través de espacios. El0
,1
y2
corresponden a la$l
,$w
y$b
que son argumentos para el operador de formato, por lo que el número de líneas, recuento de palabras, y la cuenta de bytes son acolchado y salida adecuadamente.Tenga en cuenta que esto requiere que la cadena tenga líneas nuevas ya expandidas (p. Ej., Haciendo un
Get-Content
en un archivo de texto o algo, y luego canalizando o guardando eso en una variable, luego llamando a este código en esa entrada), o use el PowerShell- caracteres de escape con estilo con backticks (es decir, en`n
lugar de\n
).Ejemplo
fuente
Jalea , 14 bytes
Pruébalo en línea!
-1 gracias a Dennis .
fuente
Ruby, 108 bytes
fuente
Perl,
716261 bytesincluye +1 para
-n
Comentado:
fuente
y///c
como una longitud más corta de$_
.split$"
en contexto escalar da el número de palabras en$_
. Al usar una variable de puntuación como en$;
lugar de$W
, puede colocar und
justo después de la interpolación en la cadena de formato. A continuación, puede caer eld
en$W
y soltar el paréntesis. Y-p
no gana nada-n
, solo deja queprintf
haga la impresión (agrega una nueva línea al gusto)$a=foo;$b=bar$a
generalmente se puede escribir como$b=bar($a=foo)
, guardando un byte. Aplicable aquí a$;
y$b
. No te importa si$;
se recalcula cada vezLua,
7466 bytesGolfizado:
Sin golf:
Recibe información a través de argumentos de línea de comando.
Cambiamos el nombre del primer argumento (
arg[1]
) para guardar bytes.string.gsub
devuelve el número de reemplazos, así como la cadena modificada, por lo que estamos usando eso para contar primero'\n'
(nuevas líneas), luego'%S+'
(instancias de uno o más caracteres que no son espacios en blanco, tantos como sea posible, es decir, palabras). Podemos usar lo que queramos para la cadena de reemplazo, por lo que usamos la cadena vacía (''
) para guardar bytes. Luego solo usamosstring.len
para encontrar la longitud de la cadena, es decir, el número de bytes. Luego, finalmente, lo imprimimos todo.fuente
Retina, 65
Pruébalo en línea!
La primera etapa es el programa wc real, el resto es para relleno. Lo del
a
marcador de posición es probablemente innecesario, y algunos de los grupos probablemente se pueden simplificar un poco.fuente
Haskell, 140 bytes
La versión sin golf se detalla a continuación, con nombres de variables y funciones expandidos:
Esta es una función que acepta una cadena y devuelve una cadena. Solo usa las
Prelude
funcioneswords
(resp.lines
) Para obtener el número de palabras (líneas resp.) Dado que parecen usar la misma definiciónwc
, luego obtiene el valor más largo (como una cadena) entre los recuentos y usa el formato printf tomando el ancho entre sus argumentos para formatear.fuente
C,
180178 bytesfuente
05AB1E ,
2423 bytesj
actualmente tiene errores, por lo que podría haber sido de 21 bytes sin el§
yJ
..Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Pip
-s
, 25 bytesToma la cadena multilínea como argumento de línea de comando. Pruébalo en línea!
Gracias a la respuesta de Dennis CJam por hacerme darme cuenta de que el número más largo siempre es el recuento de caracteres.
Explicación
Aquí hay una solución de 29 bytes con banderas
-rs
que toma información de stdin:Pruébalo en línea!
fuente
PowerShell,
123115 bytesScript de prueba:
Salida:
Explicación:
$args|% t*y
divide las cadenas de arumentos en caracteresswitch -r($args|% t*y)
evaluar todos los casos coincidentes'\s'
caso para cualquier espacio en blanco'\S'
caso para cualquier espacio no en blanco'(?s).'
estuche para cualquier char (nueva línea incluida)'\n'
caso para newline char (newline se representa a sí mismo)$c="$b".Length
calcular una longitud de número de bytes. $ b siempre es máximo ($ l, $ w, $ b) por diseño"{0,$c} {1,$c} $b"-f$l,+$w
Números de formato con la misma longitud. La variable $ w se convierte en int. Necesita cuerdas sin palabras. Otros formatos de variables 'como están' porque 'La entrada siempre contendrá una nueva línea final' y $ ly $ b no pueden ser 0.fuente