El código debe ingresar un texto (no obligatorio puede ser cualquier archivo, stdin, cadena para JavaScript, etc.):
This is a text and a number: 31.
La salida debe contener las palabras con su número de ocurrencias, ordenadas por el número de ocurrencias en orden descendente:
a:2
and:1
is:1
number:1
This:1
text:1
31:1
Tenga en cuenta que 31 es una palabra, por lo que una palabra es cualquier cosa alfanumérica, el número no actúa como separador, por ejemplo, 0xAF
califica como una palabra. Los separadores serán cualquier cosa que no sea alfanumérica, incluidos .
(punto) y -
(guión), i.e.
o pick-me-up
que resulten en 2 respectivamente 3 palabras. Debería distinguir entre mayúsculas This
y minúsculas, y this
serían dos palabras diferentes, '
también sería un separador wouldn
y t
serían 2 palabras diferentes de wouldn't
.
Escriba el código más corto en su idioma de elección.
La respuesta correcta más corta hasta ahora:
This
igual quethis
ytHIs
)?wouldn't
2 palabras (wouldn
yt
)?This
y dethis
hecho serían dos palabras diferentes, igualeswouldn
yt
.i.e.
es una palabra, pero si dejamos el punto todos los puntos en el Se tomará el final de las frases, lo mismo con comillas o comillas simples, etc.Respuestas:
grep y coreutils
4442Prueba:
Resultados en:
Actualizar
fuente
head
final.grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
Java 8: 289
Lo cual es bastante bueno, ya que Java es un lenguaje muy ajeno al golf.
Sin golf:
Ejecutar desde la línea de comando:
fuente
"[^\\W_]"
String.split(String regex)
método toma un patrón que coincide con el delimitador para dividirlo. Entonces, por ejemplo,"aababba".split("b")
produciría la matriz{"aa", "a", "", "a"}
. Mi expresión regular[^\\w\\d]
significa 'un carácter en la palabra carácter ni en las clases de caracteres de dígitos'.[^\\W_]
es, en cambio, "un carácter que no es un guión bajo ni está en la clase de caracteres que no son palabras" y coincidiría con cualquier carácter de palabra excepto el guión bajo.\w
incluye\d
, por lo que\d
es redundante.\w
incluye guión bajo, que debe considerarse un separador de acuerdo con la pregunta. Entonces, la expresión regular correcta para la división debe ser"[\\W_]+"
.APL (57)
p.ej
Explicación:
⎕D,⎕A,⎕UCS 96+⍳26
: números, letras mayúsculas, letras minúsculas(I←⍞)∊
: leer entrada, almacenarI
, ver cuáles son alfanuméricosZ←I⊂⍨
: divididoI
en grupos de caracteres alfanuméricos, almacenar enZ
+⌿∘.≡⍨Z
: para cada elemento enZ
, vea con qué frecuencia ocurreZ,⍪
: empareja cada elemento enZ
pares con la cantidad de veces que ocurreG←⊃∪↓
: seleccione solo los pares únicos, almacene enG
⍒,1↓⍉G
: obtener índices ordenados para las ocurrenciasG[
...;]
: reordenar las líneas deG
por los índices dadosfuente
⎕s
( help.dyalog.com/latest/Content/Language/System%20Functions/… ) y el nuevo operador clave ( help.dyalog.com/latest/Content/Language/Primitive%20Operators/… ):g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
C #:
153c144c142c111c115c118c114c113c(a través de LINQPad en modo "C # Statements", sin incluir la cadena de entrada)
Versión 1: 142c
Sin golf:
Resultados:
Versión 2: 114c
(
[\w]
incluye_
, que es incorrecto;[A-z]
incluye[ \ ] ^ _ `
; establecerse[^_\W]+
)Sin golf:
Resultados: (como la Versión 1)
fuente
@"[^_\W]"
R, 58 char
Uso:
fuente
sort(table(gsub("[[:punct:]]","",scan(,""))),d=T)
. Lamentablemente, ambas soluciones no funcionan correctamentewouldn't
.perl6: 49 caracteres
Peine la entrada para la coincidencia de cosas
\w+
, coloque la lista resultante de palabras en aBag
, solicite sus pares y ordénelos por valor negativo. (El*
es una estrella Lo que sea , no es multiplicación aquí)salida:
fuente
.words
lugar de.comb(/\w+/)
:).words
no elimina el:
o.
de la entrada como se requiere :(_
no debe incluirse en una palabra debajo del enunciado del problema.Python
10197Ahora funciona con nueva línea:
fuente
PHP - 84 bytes
La entrada se acepta como un argumento de línea de comando, por ejemplo:
Salida para la cadena de muestra:
fuente
$argv[1]
_
no debe incluirse en una palabra.PowerShell (40)
$ s es una variable que contiene la cadena de entrada.
fuente
[\W]
no es lo suficientemente bueno, coincide con un espacio en mi prueba. Y no está ordenado por conteo descendente ...$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}
te acerca (con los costos, por supuesto)$s -split"\W+"|group -ca |sort count -des
-split"\W+"
está haciendo coincidir una cadena vacía entre el último.
y el final de la cadena; también\W+
coincide con lo_
que técnicamente no está permitidoPerl 69
Se agregaron recomendaciones de @primo y @protist
fuente
ge
yfor
. Además, el<=>
operador puede ser reemplazado por-
.-
lugar de<=>
es genial, no estoy seguro de que esté en los consejos de golf para el hilo de Perl. Actualizaré esto más tarde, ¡gracias!\w
incluye números (perl -e 'print for"a 1 2 3 4 b"=~/\w/g'
impresionesa1234b
), pero tu mecanismo para iterar las palabras guarda otro carácter, así que lo actualizaré. ¡Gracias!Powershell:
5755536257(sin incluir la cadena de entrada)
devoluciones:
(con accesorios para @microbian para el grupo -ca)
fuente
EcmaScript 6
Versión 1 (108 caracteres)
Versión 2 (102 caracteres)
Versión 3 (105 caracteres)
Versión 4 (94 caracteres)
Versión 5 (sin alerta; 87 caracteres)
Versión 6 (100 caracteres)
Salida:
fuente
_[a]
y_[b]
a_.a
y_.b
. También cambiar/\w+/g,_={}
a_=/\w+/g
producirá el mismo resultado._[a]
para ser_.a
porque intenta acceder a la propiedad"a"
de_
, no a la propiedada
.Object.keys
convirtiendo en un global en ES6? Su respuesta parece asumir esto, pero no recuerdo haberlo visto como estaba programado para ES6.Maravilloso
7782Se modificó la expresión regular de
[^\w]+
a[^\d\p{L}]+
para resolver el problema con el guión bajosin primera línea, 82 caracteres
salida:
fuente
nu_ber
no es alfanumérico Esto debería ser 2 palabrasnu_ber
lugar denumber
?GNU awk + coreutils:
7169Aunque
gawk asort
funciona en matrices asociativas, aparentemente no conserva los valores de índice, por lo que necesita el externosort
GNU awk 4.x:
10093Una solución gawk ligeramente más grande pero pura que se usa
PROCINFO
para establecer el orden de clasificación predeterminado para la matriz asociativa (parece requerir un gawk relativamente reciente -> 4.x?)fuente
_
no debe incluirse en una palabra.Javascript -
132126 caracteres!(Código JS más corto)
Se mejoró la expresión regular y algunas ediciones.
Sin golf
Viejo -
156143141140132 caracteresDio un primer intento en el golf. Comentarios apreciados.
fuente
EcmaScript 6,
11510087 (sin aviso y alerta)Gracias a @eithedog:
Con aviso y alerta (100):
Ejecútalo en Firefox.
fuente
var
. Además, puedes movertea={}
dentroprompt
-prompt(a={})
. También puede soltarObject.
y cambiarw=>a[w]=a[w]+1||1
aw=>a[w]=-~a[w]
a
prompt a regexp ahorrará dos caracteres más._
no debe incluirse en una palabra.Rubí
588265Prueba de funcionamiento:
Editar 58-> 80: Ok, estaba muy lejos. Olvidé ordenar las palabras por ocurrencias. Además,
Array#uniq
no es un enumerador, pero usa un bloque dado para comparar elementos, por lo que pasarloputs
no filtró duplicados (no es que diga que deberíamos).fuente
split(/\W+/)
vez en lugar descan
(no probado)?\W
excluye, por_
lo que tuvo que repararse, pero aún así guardó 2 caracteres (luego agregué 20 para corregir la clasificación que había descuidado).reverse
(a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
reverse
es demasiado detallado;) Por cierto, no es justo cambiar la pregunta.F # - 169
Degolfed:
Salida cuando se llama desde fsi:
Actualización: alguna explicación según lo solicitado en los comentarios.
Utiliza funciones de conjunto para generar una matriz de caracteres no alfanuméricos en la entrada para pasar a String.Split, luego usa funciones de secuencia para filtrar cadenas vacías, generar recuentos de palabras e imprimir el resultado.
Algunos trucos de golf: agrega una cadena vacía al argumento de función s para forzar la inferencia de tipo del argumento como una cadena en lugar de declarar explícitamente el tipo. Utiliza Seq.where en lugar de Seq.filter para guardar algunos caracteres (son sinónimos). Mezcla la aplicación de canalización hacia adelante y la función ordinaria en un intento de minimizar los caracteres. Utiliza curry y (op) sintaxis para tratar <> ~ - y <|| operadores como funciones regulares para evitar declarar lambdas para filtrar cadenas vacías, ordenar por conteo descendente e imprimir tuplas.
fuente
Python - 95 (ahora 87 gracias a @primo)
Entrada de muestra:
Salida de muestra:
Cualquier mejora en la sugestión sería apreciada
fuente
\w
partidos[a-zA-Z0-9_]
. Toda su expresión regular puede ser reemplazada porr'\w+'
. Además, lax
variable no es necesaria, solo se usaraw_input()
como segundo parámetro parafindall
.print
declaración (es decir,print map(...
), de lo contrario no es un programa completo.JavaScript
160144 (Editado: para cumplir con los requisitos)No minificado:
Registra cada palabra en la consola en orden, pasando la siguiente cadena:
s="This is sam}}ple text 31to test the effectiveness of this code, you can clearly see that this is working-as-intended, but you didn't doubt it did you?.";
Salidas:
No tengo el corazón para usar
alert()
.fuente
you
debe ser el primero._
no debe incluirse en una palabra.++o[a]||1
=>-~o[a]
k [71 caracteres]
Cualquier otro carácter, excepto los caracteres alfanuméricos, se considerará como delimitador.
ejemplo
ejemplo
fuente
Javascript (135)
No minificado:
Recorre cada número posible de coincidencias en orden descendente y genera palabras con ese número de ocurrencias. Solo para ser horrible.
Notas: La alerta habría reducido algo la longitud. Estrictamente hablando, alfanumérico debería ser
[^\W_]
fuente
Haskell (153 = 104 código + 49 importación)
Función bastante sencilla y totalmente compuesta ... ¡ni siquiera es necesario un argumento! Este es mi primer golf, así que, ¿qué tal? :)
Salida:
fuente
q (50)
editar: arreglado accidentalmente ascii 58-64 y 91-96
fuente
q
pero ¿se[0-z]
basa la expresión regular ASCII? Si es así, ¿no incluiría también los caracteres ASCII 58-64? Porque esos son: ; < = > ? @
.[A-z]
, que coincide con ASCII 91-96, que son `[\] ^ _` `[^_\W]+
por la mía, que debe ser "excluir caracteres que no son de texto y subrayado" , si su sintaxis es compatible con la\W
clase ...Pure Bash (sin programas externos), 164
Esto es más largo de lo que esperaba, pero quería ver si el recuento y la ordenación necesarios (en la dirección correcta) se podían hacer exclusivamente con
bash
matrices (asociativas y no asociativas):Guardar como un archivo de script
chmod +x
, y ejecutar:fuente
AWK
¿El trabajo sin extensiones gawkish:
Si imprime "count: word" en su lugar, sería un poco más corto, pero quería imitar el resultado del ejemplo dado ...
fuente
Tcl , 99 bytes
Pruébalo en línea!
fuente
Python 2.X (108 - Personajes)
Python 3.X (106 - Personajes)
fuente
Separators will be anything that is not alpha-numeric
- Solo se divide en espacios en blanco.Haskell - 137
fuente
Python 3 - 76
Desafortunadamente, el requisito de división en caracteres no alfanuméricos extiende el código en 19 caracteres. El resultado de lo siguiente se muestra correctamente. Si no está seguro, agregue un
.most_common()
después de.Counter(...)
.Entrada / salida
Dada la entrada de
This is a text and a number: 31.
usted obtiene la siguiente salida:Lo probé con otros valores como
para garantizar, el orden de salida no depende del valor / hash de la clave. Este ejemplo produce:
Pero como dije,
print(i('collections').Counter(i('re').findall('\w+',input())).most_common())
devolvería los resultados como una lista definitivamente ordenada de tuplas.Python 3 - 57 (si un espacio fuera suficiente para dividir: P)
fuente
_
no debe incluirse en una palabra.