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
wcla 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 wcsalida 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, 5501es el número "más largo" con 4 dígitos, por lo que 165se rellena con un espacio y 90con 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 wccomando en tu respuesta. En caso de que eso ya no sea obvio).
Casos de prueba ( \nrepresenta 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
-an0Ingrese en STDIN o 1 o más nombres de archivo como argumentos. Correr como
perl -an0 wc.plwc.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
ddelength(c)"d %"debería permitirle cambiarprintfa"%"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 = endoffunció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óngque 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 conldelimitadas 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(cellstrseguido 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
/[^]/gcon/./gpara 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$cigual 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
|sortcomando 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$lel recuento de líneas, dónde estamos-spliten las nuevas líneas, el$wrecuento de palabras, dónde estamos-spliten los espacios en blanco y$bla longitud.La segunda línea es nuestra salida usando el
-foperador (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$cancha. El relleno se realiza a través de espacios. El0,1y2corresponden a la$l,$wy$bque 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-Contenten 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`nlugar 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
-nComentado:
fuente
y///ccomo 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 undjusto después de la interpolación en la cadena de formato. A continuación, puede caer elden$Wy soltar el paréntesis. Y-pno gana nada-n, solo deja queprintfhaga la impresión (agrega una nueva línea al gusto)$a=foo;$b=bar$ageneralmente 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.gsubdevuelve 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.lenpara 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
amarcador 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
Preludefuncioneswords(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 bytesjactualmente 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
-rsque toma información de stdin:Pruébalo en línea!
fuente
PowerShell,
123115 bytesScript de prueba:
Salida:
Explicación:
$args|% t*ydivide 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".Lengthcalcular 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,+$wNú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