El reto:
Cree un cuadro ASCII de las palabras más utilizadas en un texto dado.
Las normas:
- Solo acepta
a-z
yA-Z
(caracteres alfabéticos) como parte de una palabra. - Ignorar la carcasa (
She
==she
para nuestro propósito). - Ignora las siguientes palabras (bastante arbitrario, lo sé):
the, and, of, to, a, i, it, in, or, is
Aclaración: considerando
don't
: esto se tomaría como 2 'palabras' diferentes en los rangosa-z
yA-Z
: (don
yt
).Opcionalmente (es demasiado tarde para cambiar formalmente las especificaciones ahora), puede optar por eliminar todas las 'palabras' de una sola letra (esto también podría acortar la lista de ignorados).
Analice un determinado text
(lea un archivo especificado a través de argumentos de línea de comando o entorpecido; presuma us-ascii
) y construya un a word frequency chart
con las siguientes características:
- Muestre la tabla (también vea el ejemplo a continuación) para las 22 palabras más comunes (ordenadas por frecuencia descendente).
- El bar
width
representa el número de ocurrencias (frecuencia) de la palabra (proporcionalmente). Agregue un espacio e imprima la palabra. - Asegúrese de que estas barras (más espacio-palabra-espacio) siempre encajan :
bar
+[space]
+word
+[space]
siempre deben tener <=80
caracteres (asegúrese de tener en cuenta las posibles longitudes de barra y palabra diferentes: por ejemplo: la segunda palabra más común podría ser mucho más larga que el primero aunque no difiere mucho en frecuencia). Maximice el ancho de la barra dentro de estas restricciones y escale las barras adecuadamente (de acuerdo con las frecuencias que representan).
Un ejemplo:
El texto para el ejemplo se puede encontrar aquí ( Alice's Adventures in Wonderland, por Lewis Carroll ).
Este texto específico produciría el siguiente cuadro:
_________________________________________________________________________ | _________________________________________________________________________ | ella | _______________________________________________________________ | tú | ____________________________________________________________ | dijo | ____________________________________________________ | Alicia | ______________________________________________ | estaba | __________________________________________ | ese | ___________________________________ | como | _______________________________ | su | ____________________________ | con | ____________________________ | a | ___________________________ | s | ___________________________ | t | _________________________ | en | _________________________ | todas | ______________________ | esta | ______________________ | para | ______________________ | tenido | _____________________ | pero | ____________________ | ser | ____________________ | no | ___________________ | ellos | __________________ | entonces
Para su información: estas son las frecuencias sobre las que se basa la tabla anterior:
[('ella', 553), ('usted', 481), ('dijo', 462), ('alicia', 403), ('era', 358), ('que ', 330), (' como ', 274), (' ella ', 248), (' con ', 227), (' en ', 227), (' s ', 219), (' t ' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' pero ', 175), (' be ', 167), (' not ', 166), (' they ', 155), (' so ', 152)]
Un segundo ejemplo (para verificar si implementó la especificación completa):
reemplace cada aparición you
en el archivo vinculado Alicia en el país de las maravillas con superlongstringstring
:
________________________________________________________________ | ________________________________________________________________ | ella | _______________________________________________________ | superlongstringstring | _____________________________________________________ | dijo | ______________________________________________ | Alicia | ________________________________________ | estaba | _____________________________________ | ese | ______________________________ | como | ___________________________ | su | _________________________ | con | _________________________ | a | ________________________ | s | ________________________ | t | ______________________ | en | _____________________ | todas | ___________________ | esta | ___________________ | para | ___________________ | tenido | __________________ | pero | _________________ | ser | _________________ | no | ________________ | ellos | ________________ | entonces
El ganador:
La solución más corta (por número de caracteres, por idioma). ¡Que te diviertas!
Editar : Tabla que resume los resultados hasta el momento (15/02/2012) (originalmente agregado por el usuario Nas Banov):
Lenguaje Relajado Estricto ========= ======= ====== GolfScript 130 143 Perl 185 Windows PowerShell 148 199 Mathematica 199 Ruby 185 205 Unix Toolchain 194228 Python 183 243 Clojure 282 Scala 311 Haskell 333 Awk 336 R 298 Javascript 304 354 Groovy 321 Matlab 404 C # 422 Smalltalk 386 PHP 450 F # 452 TSQL 483 507
Los números representan la longitud de la solución más corta en un idioma específico. "Estricto" se refiere a una solución que implementa la especificación por completo (dibuja |____|
barras, cierra la primera barra en la parte superior con una ____
línea, explica la posibilidad de palabras largas con alta frecuencia, etc.). "Relajado" significa que se tomaron algunas libertades para acortar la solución.
Solo se incluyen soluciones de menos de 500 caracteres. La lista de idiomas está ordenada por la longitud de la solución 'estricta'. 'Unix Toolchain' se usa para significar varias soluciones que usan el tradicional * nix shell más una combinación de herramientas (como grep, tr, sort, uniq, head, perl, awk).
fuente
s
yt
están representadas.Respuestas:
LabVIEW 51 nodos, 5 estructuras, 10 diagramas
Enseñarle al elefante a bailar tap nunca es bonito. Voy a, ah, omitir el recuento de caracteres.
El programa fluye de izquierda a derecha:
fuente
Ruby 1.9, 185 caracteres
(fuertemente basado en las otras soluciones de Ruby)
En lugar de usar cualquier cambio de línea de comando como las otras soluciones, simplemente puede pasar el nombre del archivo como argumento. (es decir
ruby1.9 wordfrequency.rb Alice.txt
)Como estoy usando literales de caracteres aquí, esta solución solo funciona en Ruby 1.9.
Editar: Se sustituyen los punto y coma por saltos de línea para "legibilidad". :PAGS
Edición 2: Shtééf señaló que olvidé el espacio final, lo arreglé.
Edición 3: se eliminó el espacio final nuevamente;)
fuente
GolfScript,
177175173167164163144131130 caracteresLento: 3 minutos para el texto de muestra (130)
Explicación:
"Correcto" (con suerte). (143)
Menos lento: medio minuto. (162)
Salida visible en los registros de revisión.
fuente
206
shell, grep, tr, grep, sort, uniq, sort, head, perl
hm, acabo de ver arriba:sort -nr
->sort -n
y luegohead
->tail
=> 208 :)update2: erm, por supuesto, lo anterior es una tontería, ya que se revertirá entonces. Entonces, 209.
update3: optimizó la exclusión regexp -> 206
Por diversión, aquí hay una versión solo para Perl (mucho más rápido):
fuente
Solución basada en el conjunto Transact SQL (SQL Server 2005)
1063892873853827820783683647644630 caracteresGracias a Gabe por algunas sugerencias útiles para reducir el recuento de caracteres.
NB: se agregaron saltos de línea para evitar barras de desplazamiento, solo se requiere el último salto de línea.
Versión legible
Salida
Y con la larga cuerda
fuente
0.000
a justo0
y luego usar en-C
lugar de1.0/C
. Y haciendoFLOAT
enREAL
ahorrará un derrame cerebral también. Sin embargo, lo más importante es que parece que tienes muchasAS
instancias que deberían ser opcionales.SELECT [ ] FROM (SELECT $0 O, ' '+REPLICATE('_', MAX(C)*@F)+' ' [ ] FROM # UNION SELECT $1/C, '|'+REPLICATE('_',C*@F)+'| '+W FROM #)X ORDER BY O
?Ruby
207213211210207203201200 caracteresUna mejora en Anurag, incorporando sugerencias de rfusca. También elimina el argumento para ordenar y algunos otros juegos de golf menores.
Ejecutar como:
Editar: poner 'pone' nuevamente, debe estar allí para evitar tener comillas en la salida.
Edit2: archivo modificado-> IO
Edit3: eliminado / i
Edit4: paréntesis eliminados alrededor (f * 1.0), recuento
Edit5: utilice la suma de cadenas para la primera línea; expandirse
s
en el lugar.Edit6: hecho m flotante, eliminado 1.0. EDITAR: No funciona, cambia longitudes. EDITAR: No peor que antes
Edit7: Uso
STDIN.read
.fuente
Mathematica (
297284248244242199 caracteres) Funcional puroy pruebas de la ley de Zipf
Mira mamá ... sin vars, sin manos ... sin cabeza
Edición 1> algunas shorthands definidas (284 caracteres)
Algunas explicaciones
Salida
texto alternativo http://i49.tinypic.com/2n8mrer.jpg
Mathematica no es muy adecuado para el golf, y eso se debe solo a los nombres largos y descriptivos de las funciones. Funciones como "RegularExpression []" o "StringSplit []" solo me hacen sollozar :(.
Prueba de la ley de Zipf
La ley de Zipf predice que para un texto en lenguaje natural, la trama Log (Rank) vs Log (ocurrencias) sigue una relación lineal .
La ley se utiliza en el desarrollo de algoritmos para la criptografía y la compresión de datos. (Pero NO es la "Z" en el algoritmo LZW).
En nuestro texto, podemos probarlo con lo siguiente
El resultado es (bastante bien lineal)
texto alternativo http://i46.tinypic.com/33fcmdk.jpg
Edición 6> (242 caracteres)
Refactorización de la expresión regular (ya no hay función de selección)
Descartar 1 palabras char
Definición más eficiente para la función "f"
Editar 7 → 199 caracteres
f
conTranspose
ySlot
(#1
/#2
) argumentos.f@x
lugar def[x]
donde sea posible)fuente
|i|
es redundante en su expresión regular porque ya lo tiene.|
.C # -
510451436446434426422 caracteres (minificado)No es tan corto, ¡pero ahora probablemente sea correcto! Tenga en cuenta que la versión anterior no mostraba la primera línea de las barras, no escalaba las barras correctamente, descargaba el archivo en lugar de obtenerlo de stdin y no incluía toda la verbosidad de C # requerida. Podría afeitarse fácilmente muchos trazos si C # no necesitara tanta basura adicional. Quizás Powershell podría hacerlo mejor.
422 caracteres con lendivisor en línea (lo que lo hace 22 veces más lento) en la siguiente forma (líneas nuevas utilizadas para espacios seleccionados):
fuente
Perl
237229209 caracteres(Actualizado nuevamente para vencer a la versión Ruby con más trucos de golf sucios, reemplazando
split/[^a-z/,lc
conlc=~/[a-z]+/g
, y la eliminación de un cheque de cadena vacía en otro lugar. Estos fueron inspirados por la versión de Ruby, por lo que el crédito a quien crédito merece.)Actualización: ¡ahora con Perl 5.10! Reemplace
print
consay
y use~~
para evitar amap
. Esto tiene que ser invocado en la línea de comando comoperl -E '<one-liner>' alice.txt
. Dado que todo el script está en una línea, escribirlo como una línea no debería presentar ninguna dificultad :).Tenga en cuenta que esta versión se normaliza para el caso. Esto no acorta la solución, ya que eliminar
,lc
(para la carcasa inferior) requiere que agregueA-Z
a la expresión regular dividida, por lo que es un lavado.Si está en un sistema donde una nueva línea es un carácter y no dos, puede acortar esto en otros dos caracteres utilizando una nueva línea literal en lugar de
\n
. Sin embargo, no he escrito la muestra anterior de esa manera, ya que es "más claro" (¡ja!) De esa manera.Aquí hay una solución perl mayormente correcta, pero no remotamente corta:
Lo siguiente es lo más corto que puede ser mientras se mantiene relativamente legible. (392 caracteres).
fuente
foreach
s se pueden escribir comofor
s. Eso es 8 caracteres menos. Luego tienes elgrep{!($_~~@s)}map{lc=~/[a-z]+/g}<>
, que creo que podría escribirsegrep{!(/$_/i~~@s)}<>=~/[a-z]+/g
para ir 4 más abajo. Reemplace" "
con$"
y estás abajo 1 más ...sort{$c{$b}-$c{$a}}...
para salvar dos más. También puede pasar en%c
lugar dekeys %c
a lasort
función y guardar cuatro más.Windows PowerShell, 199 caracteres
(El último salto de línea no es necesario, pero se incluye aquí para facilitar la lectura).
(El código actual y mis archivos de prueba están disponibles en mi repositorio SVN . Espero que mis casos de prueba detecten los errores más comunes (longitud de la barra, problemas con la coincidencia de expresiones regulares y algunos otros))
Suposiciones
Historia
Versión relajada (137), ya que eso se cuenta por separado por ahora, aparentemente:
Las variaciones de las longitudes de barra de un carácter en comparación con otras soluciones se deben a que PowerShell utiliza redondeo en lugar de truncamiento al convertir números de punto flotante en enteros. Sin embargo, dado que la tarea solo requería una longitud de barra proporcional, esto debería estar bien.
En comparación con otras soluciones, tomé un enfoque ligeramente diferente para determinar la longitud de barra más larga simplemente probando y tomando la longitud más alta en la que ninguna línea tiene más de 80 caracteres.
Una versión anterior explicada se puede encontrar aquí .
fuente
-split("\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z]")
? Esto funciona para mi."|$('_'*($w*$_.count/$x[0].count))| $($_.name) "
(o eliminar el último espacio, ya que es algo automático). Y puede usar-split("(?:\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z])+")
para guardar algunos más al no incluir espacios en blanco (o uso[-2..-23]
).Ruby, 215,
216,218,221,224,236,237caracteresactualización 1: ¡ Hurra ! Es un empate con la solución de JS Bangs . No puedo pensar en una forma de reducir más :)
Actualización 2: jugué un truco de golf sucio. Cambiado
each
amap
para guardar 1 personaje :)Actualización 3: cambiado
File.read
aIO.read
+2.Array.group_by
no fue muy fructífero, cambió areduce
+6. No es necesaria una comprobación de mayúsculas y minúsculas después de la carcasa inferior condowncase
regex +1. La clasificación en orden descendente se realiza fácilmente al negar el valor +6. Ahorro total +15actualización 4: en
[0]
lugar de.first
+3. (@ Shtééf)Actualización 5: expandir la variable
l
en el lugar, +1. Expandir variables
en el lugar, +2. (@ Shtééf)Actualización 6: Use la suma de cadenas en lugar de la interpolación para la primera línea, +2. (@ Shtééf)
Actualización 7: pasé por un montón de hoopla para detectar la primera iteración dentro del bucle, usando variables de instancia. Todo lo que obtuve es +1, aunque quizás haya potencial. Preservar la versión anterior, porque creo que esta es magia negra. (@ Shtééf)
Versión legible
Usar:
Salida:
fuente
scan
embargo, su uso me dio una mejor idea, así que me adelanté otra vez :).Python 2.x, enfoque latitudinariano =
227183caracteresPermitiendo libertad en la implementación, construí una concatenación de cadenas que contiene todas las palabras solicitadas para exclusión (
the, and, of, to, a, i, it, in, or, is
), además de que también excluye las dos "palabras" infamess
yt
del ejemplo, y arrojé la exclusión gratisan, for, he
. Intenté todas las concatenaciones de esas palabras contra el corpus de las palabras de Alicia, la Biblia del Rey James y el archivo de la jerga para ver si hay alguna palabra que la cadena excluya erróneamente. Y así es como terminé con dos cadenas de exclusión:itheandtoforinis
yandithetoforinis
.PD. prestado de otras soluciones para acortar el código.
Despotricar
Con respecto a las palabras a ignorar, uno pensaría que se tomarían de la lista de las palabras más usadas en inglés. Esa lista depende del corpus de texto utilizado. Según una de las listas más populares ( http://en.wikipedia.org/wiki/Most_common_words_in_English , http://www.english-for-students.com/Frequency-Used-Words.html , http: // www. sporcle.com/games/common_english_words.php ), las 10 palabras principales son:
the be(am/are/is/was/were) to of and a in that have I
Las 10 palabras principales del texto Alicia en el país de las maravillas son
the and to a of it she i you said
Las 10 palabras principales del archivo de jerga (v4.4.7) son
the a of to and in is that or for
Entonces, la pregunta es por qué
or
se incluyó en la lista de ignorar del problema, donde es ~ 30 en popularidad cuando la palabrathat
(el octavo más utilizado) no lo es. etc, etc. Por lo tanto, creo que la lista de ignorados debería proporcionarse dinámicamente (o podría omitirse).La idea alternativa sería simplemente omitir las 10 palabras principales del resultado, lo que en realidad acortaría la solución (elemental, tiene que mostrar solo las entradas 11 a 32).
Python 2.x, enfoque puntiagudo =
277243 caracteresEl gráfico dibujado en el código anterior se simplifica (usando solo un carácter para las barras). Si se desea reproducir exactamente el gráfico de la descripción del problema (que no era obligatorio), este código lo hará:
Tengo un problema con la elección algo aleatoria de las 10 palabras para excluir,
the, and, of, to, a, i, it, in, or, is
por lo que se deben pasar como parámetros de línea de comando, así:python WordFrequencyChart.py the and of to a i it in or is <"Alice's Adventures in Wonderland.txt"
Esto es 213 caracteres + 30 si tenemos en cuenta la lista de ignorados "original" pasada en la línea de comando = 243
PD. El segundo código también "ajusta" las longitudes de todas las palabras principales, por lo que ninguna de ellas se desbordará en caso degenerado.
fuente
\W
o usar\b
en una expresión regular porque es muy probable que no estén de acuerdo con las especificaciones, lo que significa que no se dividirán en dígitos o_
que tampoco eliminarán las palabras vacías de las cadenas tales comothe_foo_or123bar
. Puede que no aparezcan en el texto de prueba, pero la especificación es bastante clara en ese caso.sys.argv
re.findall(r'\b(?!(?:the|and|.|of|to|i[tns]|or)\b)\w+',sys.stdin.read().lower())
Haskell -
366351344337333 caracteres(Se
main
agregó un salto de línea para facilitar la lectura, y no se necesita un salto de línea al final de la última línea).La mejor manera de ver cómo funciona es leyendo el argumento al
interact
revés:map f
alfabéticos en minúsculas, reemplaza todo lo demás con espacios.words
produce una lista de palabras, dejando caer el espacio en blanco de separación.filter (
notElemwords "the and of to a i it in or is")
descarta todas las entradas con palabras prohibidas.group . sort
ordena las palabras y agrupa las idénticas en listas.map h
asigna cada lista de palabras idénticas a una tupla del formulario(-frequency, word)
.take 22 . sort
clasifica las tuplas por frecuencia descendente (la primera entrada de tuplas) y mantiene solo las primeras 22 tuplas.b
asigna tuplas a barras (ver más abajo).a
antepone la primera línea de guiones bajos para completar la barra superior.unlines
une todas estas líneas junto con nuevas líneas.Lo difícil es obtener la longitud correcta de la barra. Supuse que solo los guiones bajos contaban para la longitud de la barra, por
||
lo que sería una barra de longitud cero. La función deb
los mapasc x
másx
, dondex
es la lista de los histogramas. La lista completa se pasa ac
, de modo que cada invocación dec
pueda calcular el factor de escala por sí mismo llamandou
. De esta manera, evito usar matemática de punto flotante o racionales, cuyas funciones de conversión e importaciones se comerían muchos caracteres.Tenga en cuenta el truco de usar
-frequency
. Esto elimina la necesidad dereverse
lasort
ya de clasificación (ascendente)-frequency
se coloca las palabras con la frecuencia descendiente. Más tarde, en la funciónu
,-frequency
se multiplican dos valores, lo que cancelará la negación.fuente
div
, en realidad! Pruébalo, la salida es incorrecta. La razón es que hacer lodiv
anterior*
pierde precisión.JavaScript 1.8 (SpiderMonkey) - 354
Lamentablemente, la
for([k,v]in z)
versión de Rhino no parece querer trabajar en SpiderMonkey, yreadFile()
es un poco más fácil que usarla,readline()
pero pasar a 1.8 nos permite usar cierres de funciones para cortar algunas líneas más ...Agregar espacios en blanco para facilitar la lectura:
Uso:
js golf.js < input.txt
Salida:
(versión base - no maneja los anchos de barra correctamente)
JavaScript (Rhino) -
405395387377368343304 caracteresCreo que mi lógica de clasificación está apagada, pero ... lo sé.Brainfart arreglado.Minified (abuso que se
\n
interpreta como a;
veces):fuente
i[tns]?
parte. Muy astuto.replace(/[^\w ]/g, e).split(/\s+/).map(
puede ser reemplazado.replace(/\w+/g,
y usar la misma función que.map
tuviste ... Tampoco estoy seguro si Rhino admite enfunction(a,b)b.c-a.c
lugar de tu función de clasificación (spidermonkey sí), pero eso será afeitado{return }
...b.c-a.c
es un mejor tipo quea.c<b.c
por cierto ... Edición de una versión de Mono Araña en la parte inferior con estos cambios?:
gran base para trabajar!Versión de PHP CLI (450 caracteres)
Esta solución tiene en cuenta el último requisito que la mayoría de los puristas han optado por ignorar. ¡Eso costó 170 caracteres!
Uso:
php.exe <this.php> <file.txt>
Minified:
Legible por humanos:
Salida:
Cuando hay una palabra larga, las barras se ajustan correctamente:
fuente
Python 3.1 -
245229 caracteresSupongo que usar Counter es una especie de trampa :) Acabo de leerlo hace una semana, así que esta fue la oportunidad perfecta para ver cómo funciona.
Imprime:
Parte del código fue "prestado" de la solución de AKX.
fuente
open('!')
lee desde stdin, ¿en qué versión / OS está? o tienes que nombrar el archivo '!'Perl,
205191189 caracteres / 205 caracteres (totalmente implementado)Algunas partes se inspiraron en las presentaciones anteriores de perl / ruby, se llegaron a un par de ideas similares de forma independiente, las otras son originales. La versión más corta también incorpora algunas cosas que vi / aprendí de otras presentaciones.
Original:
Última versión de hasta191 caracteres:Última versión de hasta 189 caracteres:
Esta versión (205 caracteres) representa las líneas con palabras más largas que las que se encontrarían más adelante.
fuente
Perl:
203202201198195208203/231 caracteresImplementación alternativa completa que incluye el comportamiento indicado (compresión global de barras) para el caso patológico en el que la palabra secundaria es popular y lo suficientemente larga como para combinarse con más de 80 caracteres ( esta implementación es de 231 caracteres ):
La especificación no indicaba en ninguna parte que esto tenía que ir a STDOUT, por lo que utilicé perl's warn () en lugar de print: cuatro caracteres guardados allí. Usé el mapa en lugar de foreach, pero siento que aún podría haber más ahorros en la división (join ()). Aún así, lo bajé a 203, podría dormir sobre él. Al menos Perl está ahora bajo el recuento de caracteres "shell, grep, tr, grep, sort, uniq, sort, head, perl" por ahora;)
PD: Reddit dice "Hola";)
Actualización: Se eliminó la combinación () a favor de la asignación y la combinación de conversión escalar implícita. Hasta 202. También tenga en cuenta que he aprovechado la regla opcional "ignorar palabras de 1 letra" para eliminar 2 caracteres, así que tenga en cuenta que el conteo de frecuencias reflejará esto.
Actualización 2: Se cambió la asignación y la unión implícita por matar $ / para obtener el archivo de una vez usando <> en primer lugar. Mismo tamaño, pero más desagradable. Se cambia si (! $ Y) {} por $ y || {} &&, guarda 1 char más> 201.
Actualización 3: Tomé el control de las minúsculas temprano (lc <>) al mover lc fuera del bloque del mapa - Cambié ambas expresiones regulares para no usar más la opción / i, ya que ya no era necesario. Construcción condicional explícita intercambiada x? Y: z para perlgolf tradicional || construcción condicional implícita - /^...$/i?1:$x{$ } ++ para /^...$/||$x{$ } ++ ¡Guardado tres caracteres! => 198, rompió la barrera de 200. Podría dormir pronto ... tal vez.
Actualización 4: la falta de sueño me ha vuelto loco. Bien. Más loco. Suponiendo que esto solo tiene que analizar los archivos normales de texto feliz, hice que renunciara si llega a un valor nulo. Guardado dos personajes. Reemplazado "length" por el 1-char más corto (y mucho más golfish) y /// c - ¿me escuchas, GolfScript? Voy por ti !!! sollozo
Actualización 5: Sleep Dep me hizo olvidar el límite de 22 hileras y la limitación de la línea posterior. Retroceda hasta 208 con los manejados. No está mal, 13 personajes para manejarlo no es el fin del mundo. Jugué con la evaluación en línea de expresiones regulares de perl, pero tuve problemas para que funcione y ahorre caracteres ... jaja. Se actualizó el ejemplo para que coincida con la salida actual.
Actualización 6: Se eliminaron los brackets innecesarios que protegen (...), ya que el candy sintáctico ++ permite empujarlo contra el para felizmente. Gracias a las aportaciones de Chas. Owens (recordando mi cerebro cansado), obtuvo la solución de clase de personaje i [tns] allí. De vuelta a 203.
Actualización 7: Se agregó un segundo trabajo, implementación completa de especificaciones (incluido el comportamiento de barra de compresión completa para palabras largas secundarias, en lugar del truncamiento que está haciendo la mayoría de las personas, según la especificación original sin el caso de ejemplo patológico)
Ejemplos:
Implementación alternativa en caso de caso patológico:
fuente
is|in|it|i
eni[snt]?
- y luego no hay ninguna diferencia con la regla opcional más. (Hm, nunca habría pensado en decirle a un chico de Perl cómo hacer Regex: D). Solo tengo un problema ahora: tengo que ver cómo puedo eliminar tres bytes de mi propia solución para ser mejor que Perl nuevamente: - |F #, 452 caracteres
Fácil: obtenga una secuencia
a
de pares de conteo de palabras, encuentre el mejor multiplicador de conteo de palabras por columnak
, luego imprima los resultados.Ejemplo (tengo recuentos de frecuencia diferentes a los tuyos, sin saber por qué):
fuente
float
s.|>
?Python 2.6, 347 caracteres
Salida:
fuente
bm=(76.-len(W[0][0]))/W[0][1]
ya que solo está usando bm una vez (haga la siguiente líneaU=lambda n:"_"*int(n*(76.-len(W[0][0]))/W[0][1])
, elimina 5 caracteres. Además: ¿por qué usaría un nombre de variable de 2 caracteres en golf de código? ;-)* sh (+ curl), solución parcial
Esto está incompleto, pero por el simple hecho, aquí está la mitad del problema de conteo de frecuencia de palabra en 192 bytes:
fuente
Gawk - 336 (originalmente 507) caracteres
(después de arreglar el formato de salida; arreglar lo de las contracciones; ajustar; ajustar de nuevo; eliminar un paso de clasificación completamente innecesario; ajustar una y otra vez; y otra vez (Ups, este rompió el formato); ajustar un poco más; asumiendo el desafío de Matt, modifico desesperadamente mucho más; encontré otro lugar para guardar algunos, pero devolví dos para corregir el error de longitud de la barra)
¡Je je! ¡Estoy momentáneamente por delante del desafío de contador de soluciones [Matt's JavaScript] [1] ! ;) y [la pitón de AKX] [2].
El problema parece requerir un lenguaje que implemente matrices asociativas nativas, por lo que, por supuesto , he elegido uno con un conjunto de operadores terriblemente deficientes. En particular, no puede controlar el orden en que awk ofrece los elementos de un mapa hash, por lo que escaneo repetidamente todo el mapa para encontrar el elemento más numeroso actualmente, imprimirlo y eliminarlo de la matriz.
Todo es terriblemente ineficiente, con todas las vacaciones de golf que he hecho también ha resultado ser bastante horrible.
Minified:
saltos de línea solo por claridad: no son necesarios y no deben contarse.
Salida:
Legible; 633 caracteres (originalmente 949):
fuente
LISP común, 670 caracteres
Soy un novato de LISP, y este es un intento de usar una tabla hash para contar (por lo que probablemente no sea el método más compacto).
se puede ejecutar por ejemplo con
cat alice.txt | clisp -C golf.lisp
.En forma legible es
fuente
C (828)
Se parece mucho al código ofuscado, y usa glib para string, list y hash. Char cuenta con
wc -m
dice 828 . No considera palabras de un solo carácter. Para calcular la longitud máxima de la barra, considere la palabra más larga posible entre todas, no solo las primeras 22. ¿Es esta una desviación de la especificación?No maneja fallas y no libera memoria usada.
fuente
*v=*v*(77-lw)/m
, dará 929. .. pero creo que puede estar bien a menos que encuentre una manera de hacerlo mucho más corto)int c
en lamain
declaración ymain
está implícitamenteint
(como lo son los argumentos sin tipo, que yo sepa):main(c){...}
. Probablemente también podrías escribir en0
lugar deNULL
.-Wall
o con la-std=c99
bandera encendida ... pero supongo que esto no tiene sentido para un código de golf, ¿verdad?Without freeing memory stuff, it reaches 866 (removed some other unuseful space)
a otra cosa para no dejar que la gente piense que la diferencia con la versión de memoria libre es todo eso: ahora la versión sin memoria libre tiene muchas más "mejoras".Perl, 185 char
200 (ligeramente roto)199197195193187185 caracteres. Las dos últimas líneas nuevas son significativas. Cumple con la especificación.La primera línea carga conteos de palabras válidas en
%X
.La segunda línea calcula el factor de escala mínimo para que todas las líneas de salida sean <= 80 caracteres.
La tercera línea (contiene dos caracteres de nueva línea) produce la salida.
fuente
Java -
886865756744742744752742714680 caracteresActualizaciones antes del primer 742 : expresiones regulares mejoradas, tipos parametrizados superfluos eliminados, espacios en blanco superfluos eliminados.
Actualización 742> 744 caracteres : reparó el hack de longitud fija. Solo depende de la primera palabra, no de otras palabras (todavía). Encontró varios lugares para acortar el código (
y
\\s
en regex reemplazado porArrayList
reemplazado porVector
). Ahora estoy buscando una forma corta de eliminar la dependencia de IO de Commons y leer de stdin.Actualización 744> 752 caracteres : eliminé la dependencia de los comunes. Ahora se lee de stdin. Pegue el texto en stdin y presione
Ctrl+Z
para obtener el resultado.Actualización 752> 742 caracteres : eliminé
public
y un espacio, hice classname 1 char en lugar de 2 y ahora ignora las palabras de una letra.Actualización 742> 714 caracteres : actualizado según los comentarios de Carl: se eliminó la asignación redundante (742> 730), se reemplazó
m.containsKey(k)
porm.get(k)!=null
(730> 728), se introdujo la subcadena de la línea (728> 714).Actualización 714> 680 caracteres : actualizado según los comentarios de Rotsor: cálculo de tamaño de barra mejorado para eliminar fundición innecesaria y mejorado
split()
para eliminar innecesariareplaceAll()
.Versión más legible:
Salida:
Bastante apesta que Java no tenga
String#join()
y cierres (todavía).Editar por Rotsor:
He realizado varios cambios en su solución:
El código condensado tiene
688711684 caracteres de longitud:La versión rápida (
720693 caracteres)Versión más legible:
La versión sin mejoras de comportamiento es de 615 caracteres:
fuente
IOUtils
lugar de importarlo? Hasta donde puedo ver, de todos modos lo estás usando solo una vez.b
un String en lugar de un StringBuffer. Sin embargo, no quiero pensar en cuál sería la actuación (especialmente porque está agregando un personaje a la vez).Scala 2.8, 311
314320330332336341375caracteresincluyendo el ajuste de palabras largas. Ideas tomadas de las otras soluciones.
Ahora como un script (
a.scala
):Corre con
Por cierto, la edición de 314 a 311 caracteres en realidad elimina solo 1 carácter. Alguien se equivocó al contar antes (¿CR de Windows?).
fuente
Clojure 282 estricto
Algo más legible:
fuente
Scala, 368 caracteres
Primero, una versión legible en 592 caracteres:
La salida de la consola se ve así:
Podemos hacer una minificación agresiva y reducirla a 415 caracteres:
La sesión de la consola se ve así:
Estoy seguro de que un experto en Scala podría hacerlo aún mejor.
Actualización: En los comentarios, Thomas dio una versión aún más corta, con 368 caracteres:
Legiblemente, a 375 caracteres:
fuente
object A{def main(a:Array[String]){val t=(Map[String, Int]()/:(for(x<-io.Source.fromFile(a(0)).getLines;y<-"(?i)\\w+\\b(?<!\\bthe|and|of|to|a|i|it|in|or|is)".r findAllIn x) yield y.toLowerCase).toList)((c,x)=>c+(x->(c.getOrElse(x,0)+1))).toList.sortBy(_._2).reverse.take(22);val w=76-t.head._1.length;print(" "+"_"*w);t map (s=>"\n|"+"_"*(s._2*w/t.head._2)+"| "+s._1) foreach print}}
Java - 896 caracteres
931 caracteres1233 caracteres hechos ilegibles1977 caracteres "sin comprimir"Actualización: reduje agresivamente el recuento de caracteres. Omite palabras de una letra por especificación actualizada.
Envidio mucho a C # y LINQ.
"Legible":
Salida de Alice:
Salida de Don Quijote (también de Gutenberg):
fuente