¿Cuál es la palabra más frecuente?


26

¿Cuál es la palabra más frecuente?

Dada una oración, su programa debe atravesarla, contando las frecuencias de cada palabra, luego generar la palabra más utilizada. Debido a que una oración no tiene una longitud fija y, por lo tanto, puede ser muy larga, su código debe ser lo más corto posible.

Reglas / requisitos

  • Cada presentación debe ser un programa completo o una función. Si es una función, debe ser ejecutable solo necesitando agregar la llamada a la función al final del programa. Cualquier otra cosa (por ejemplo, encabezados en C), debe incluirse.
  • Debe haber un intérprete / compilador gratuito disponible para su idioma.
  • Si es posible, proporcione un enlace a un sitio donde se pueda probar su programa.
  • Su programa no debe escribirle nada STDERR.
  • Su programa debe recibir información de STDIN(o la alternativa más cercana en su idioma).
  • Las lagunas estándar están prohibidas.
  • Su programa debe ser sensible a las mayúsculas ( tHe, They thecontribuir a la cuenta de the).
  • Si no hay una palabra más frecuente (vea el caso de prueba # 3), su programa no debería generar nada.

Definición de una 'palabra':

Obtiene la lista de palabras dividiendo el texto de entrada en espacios. La entrada nunca contendrá ningún otro tipo de espacio en blanco que los espacios simples (en particular, no hay líneas nuevas). Sin embargo, las palabras finales solo deben contener caracteres alfanuméricos (az, AZ, 0-9), guiones (-) y apóstrofes ('). Puede hacerlo eliminando todos los demás caracteres o reemplazándolos por espacios antes de dividir la palabra. Para seguir siendo compatible con versiones anteriores de las reglas, no es necesario incluir apóstrofes.

Casos de prueba

The man walked down the road.
==> the

-----

Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
==> he

-----

This sentence has no most frequent word.
==> 

-----

"That's... that's... that is just terrible!" he said.
==> that's / thats

-----

The old-fashioned man ate an old-fashioned cake.
==> old-fashioned

-----

IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
==> IPv6

-----

This sentence with words has at most two equal most frequent words.
==>

Nota: Los casos de prueba tercero y séptimo no tienen salida, puede elegir cualquiera de los cuatro.

Tanteo

Los programas se puntúan según los bytes. El juego de caracteres habitual es UTF-8; si está utilizando otro, especifíquelo.

Cuando finalice el desafío, el programa con la menor cantidad de bytes (se llama ), ganará.

Envíos

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

# Perl, 43 + 2 (-p flag) = 45 bytes

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Tabla de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.


2
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Pomo de la puerta

1
Entonces, dada su nueva definición de 'palabra', ¿cuál es la palabra más común aquí don't d'ont dont a a? ¿Lo sería dont?
DJMcMayhem

@DrGreenEggsandHamDJ Si usted tiene una petición que hace apóstrofes eliminar, dont. Si no es así, a. pero la mayoría de las presentaciones lo hacen, por lo que dontes una respuesta correcta.
George Gibson

1
¿La salida distingue entre mayúsculas y minúsculas? Entonces, ¿es ipv6una salida válida para el último caso de prueba?
kirbyfan64sos

1
Puede ser útil un caso de prueba adicional: "Esta oración con palabras tiene como máximo dos palabras iguales más frecuentes". -> <nada>
philcolbourn

Respuestas:


6

Pyke, 26 25 bytes

l1dcD}jm/D3Sei/1qIi@j@
(;

Pruébalo aquí!

O 23 22 bytes (sin competencia, agregue el nodo donde mata la pila si es falso)

l1cD}jm/D3Sei/1q.Ii@j@

Pruébalo aquí!

O con puntuación, 23 bytes (creo que esto compite? Comprometerse antes de la edición)

l1.cD}jm/D3Sei/1q.Ii@j@

Pruébalo aquí!

O 12 bytes (definitivamente sin competencia)

l1.cj.#jR/)e

Pruébalo aquí!

l1           -     input.lower()
  .c         -    punc_split(^)
    j        -   j = ^
     .#   )  -  sort(V(i) for i in ^)
       jR/   -   j.count(i)
           e - ^[-1]

Su respuesta de 23 bytes competiría si la única puntuación preservada fuera -y '(guión y apóstrofe).
George Gibson

Solo conserva la puntuación que no está al final de una palabra
azul

Oh, está bien (no entiendo Pyke). Supongo que compite entonces ...
George Gibson

1
@GeorgeGibson Estoy bastante seguro de que la versión de 23 bytes no compite, podría entrar en lagunas estándar. Además, no espero que ninguna persona entienda Pyke, lo estoy haciendo como mi propio idioma
azul

Bien entonces. Creo que todavía ganas de todos modos, así que realmente no importa.
George Gibson


11

Pyth - 23 30 bytes

Tiene que haber una mejor manera de incluir dígitos y guiones, pero solo quiero arreglar esto ahora.

Kc@s+++GUTd\-rzZ)I!tJ.M/KZ{KhJ

Test Suite .


1
Las reglas revisadas requieren preservar dígitos y guiones.
Dennis

@GeorgeGibson arreglado.
Maltysen

6

Octava, 115 94 bytes

[a,b,c]=unique(regexp(lower(input('')),'[A-z]*','match'));[~,~,d]=mode(c); try disp(a{d{:}})

Cuentas para el caso sin palabras más frecuentes mediante el uso try. En este caso, no genera nada y "toma un descanso" hasta que detecta la excepción.

Ahorró 21 (!) Bytes gracias a la sugerencia de Luis Mendo (usando la tercera salida de modepara obtener la palabra más común).


Las reglas han cambiado bastante desde que publiqué mi respuesta original. Veré la expresión regular más tarde.


1
me ganaste, pensaré en otra cosa ahora.
Abr001am

Aplicar modeen ctal vez? Su tercer resultado da todos los valores vinculados, si mal no recuerdo
Luis Mendo

Cuento 115 bytes.
Conor O'Brien

Creo que tu expresión regular debería ser ['\w\d]porque tienes que preservar los apóstrofes y los dígitos. A menos que estén entre mayúsculas y minúsculas en ASCII, en cuyo caso ignóreme porque no tengo una tabla a mano.
Financia la demanda de Mónica

1
@StewieGriffin [~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])daout = {1 2}
Luis Mendo

5

Perl 6, 80 bytes

{$_>1&&.[0].value==.[1].value??""!!.[0].key given .lc.words.Bag.sort:{-.value}}

Dividamos la respuesta en dos partes ...

given .lc.words.Bag.sort:{-.value}

givenes una declaración de control (como ifo for). En Perl 6, están permitidos como postfixes. ( a if 1o como aquí foo given 3) givenpone su tema (lado derecho) en la variable especial $_para su lado izquierdo.

El "tema" en minúsculas ( lc), se divide por palabra ( words), coloca los valores en una bolsa (conjunto con número de ocurrencias), luego se ordena por valor (DESC). Como sortsolo sabe cómo operar en listas, aquí Bagse transforma en una Listde Pairs.

$_>1&&.[0].value==.[1].value??""!!.[0].key

un condicional simple ( ?? !!se usa en Perl 6, en lugar de ? :).

$_ > 1

Simplemente verifica que la lista tenga más de un elemento.

.[0].value==.[1].value

Los accesos a $_se pueden acortar ... Al no especificar la variable. .aes exactamente igual $_.a. Entonces esto es efectivamente "¿tienen los dos elementos superiores el mismo número de ocurrencias? - Si es así, imprimimos" (la cadena vacía).

De lo contrario, es la impresión de la clave del elemento superior (la cuenta): .[0].key.


77
Es como mitad inglés, mitad ruido de línea. Asombroso.
gato

1
es curioso cómo son las características de estilo OO que parecen inglesas: P
Ven

2
También se las arregla para ser menos legible que Perl 5 mientras contiene más inglés que Perl 5. D:
gato

1
@cat lo arregló - debería ser totalmente ilegible ahora
Ven

55
value??!!(Sé que es un operador ternario, es entretenido)
gato


4

JavaScript (ES6), 155 bytes

s=>(m=new Map,s.toLowerCase().replace(/[^- 0-9A-Z]/gi,'').split(/\ +/).map(w=>m.set(w,-~m.get(w))),[[a,b],[c,d]]=[...m].sort(([a,b],[c,d])=>d-b),b==d?'':a)

Basado en la respuesta de Python de @ Blue.


Parece que su reemplazo de expresiones regulares deja caer números y romperá el caso de prueba de IPv6, ¿es así?
TessellatingHeckler

@TessellatingHeckler La definición de palabra cambió desde que leí originalmente la pregunta, pero ahora actualicé mi respuesta.
Neil

4

Python 3.5, 142 137 134 112 117 110 127 bytes:

( +17 bytes, porque aparentemente, incluso si hay palabras más frecuentes que el resto, pero tienen la misma frecuencia, todavía no se debe devolver nada ) .

def g(u):import re;q=re.findall(r"\b['\-\w]+\b",u.lower());Q=q.count;D=[*map(Q,{*q})];return['',max(q,key=Q)][1in map(D.count,D)]

Ahora debe satisfacer todas las condiciones. Esta presentación supone que se ingresa al menos 1 palabra.

¡Pruébelo en línea! (Ideone)

Además, si desea una, aquí hay otra versión de mi función desprovista de expresiones regulares a un costo de aproximadamente 43 bytes, aunque esta no es competitiva de todos modos, por lo que realmente no importa. Solo lo puse aquí por el gusto de hacerlo:

def g(u):import re;q=''.join([i for i in u.lower()if i in[*map(chr,range(97,123)),*"'- "]]).split();Q=q.count;D=[*map(Q,{*q})];return['',max(q,key=Q)][1in map(D.count,D)]

¡Prueba esta nueva versión en línea! (Ideone)


Del comentario del desafío "si hay dos palabras que son más frecuentes que el resto, pero con la misma frecuencia", la salida es 'nada'.
RootDos

@RootTwo fijo! :)
R. Kap

@TessellatingHeckler Sin embargo, esas son palabras diferentes. That'ses una contracción that ismientras thatsque en realidad no es una palabra.
R. Kap

@TessellatingHeckler ¿Me puede dar alguna prueba de este comentario? Porque estoy revisando todos los comentarios en la publicación y no veo ese comentario.
R. Kap

4

Ruby, 94 92 102 bytes

Tengo que ir rápido (respuesta FGITW). Devuelve la palabra en mayúsculas, o nilsi no hay una palabra más frecuente.

Ahora actualizado a nuevas especificaciones, creo. Sin embargo, me las arreglé para jugar golf un poco, ¡así que el conteo de bytes es el mismo!

->s{w=s.upcase.tr("_'",'').scan /[-\w]+/;q=->x{w.count x};(w-[d=w.max_by(&q)]).all?{|e|q[e]<q[d]}?d:p}

55
Gotta go fast?
gato

@cat sí, 'porque estaba FGITW esta vez
Value Ink


3

JavaScript (ES6), 99 bytes

F=s=>(f={},w=c='',s.toLowerCase().replace(/[\w-']+/g,m=>(f[m]=o=++f[m]||1)-c?o>c?(w=m,c=o):0:w=''),w)
#input { width: 100%; }
<textarea id="input" oninput="output.innerHTML=F(this.value)"></textarea>
<div id="output"></div>


3

Sqlserver 2008, 250 bytes

DECLARE @ varchar(max) = 'That''s... that''s... that is just terrible!" he said.';

WITH c as(SELECT
@ p,@ x
UNION ALL
SELECT LEFT(x,k-1),STUFF(x,1,k,'')FROM
c CROSS APPLY(SELECT patindex('%[^a-z''-]%',x+'!')k)k
WHERE''<x)SELECT max(p)FROM(SELECT top 1with ties p
FROM c WHERE p>''GROUP BY p
ORDER BY count(*)DESC
)j HAVING count(*)=1

Pruébalo en línea!

Sqlserver 2016, 174 bytes

No se pueden manejar datos como este ejemplo (contando los iguales como 3 palabras):

DECLARE @ varchar(max) = 'That''s... that''s... that is just terrible!" he said. = = ='

SELECT max(v)FROM(SELECT TOP 1WITH TIES value v
FROM STRING_SPLIT(REPLACE(REPLACE(REPLACE(@,'"',''),',',''),'.',''),' ')GROUP
BY value ORDER BY count(*)DESC)x HAVING count(*)=1

No me gusta el enfoque variable porque es una especie de trampa :) Una entrada -> nada o algo, con el enfoque basado en conjuntos tiene que ser más largo, porque debe agregar GROUP BY, LEFT JOIN, or PARTITION BYAnyway SQL Server adicional con la función SPLIT incorporada. La demostración sin golf no dude en hacerlo lo más breve posible.
lad2025

@ lad2025 muchas gracias, no conocía ninguna característica de 2016. SPLIT_STRING seguramente es una característica que se ha retrasado mucho. Traté de descifrar el script usando split, lo bajé a 174, sin embargo, no podrá filtrar texto como "= = ="
t-clausen.dk

3

PostgreSQL, 246 , 245 bytes

WITH z AS(SELECT DISTINCT*,COUNT(*)OVER(PARTITION BY t,m)c FROM i,regexp_split_to_table(translate(lower(t),'.,"''',''),E'\\s+')m)
SELECT t,CASE WHEN COUNT(*)>1 THEN '' ELSE MAX(m)END
FROM z WHERE(t,c)IN(SELECT t,MAX(c)FROM z GROUP BY t)
GROUP BY t  

Salida:

ingrese la descripción de la imagen aquí

Ingrese si alguien está interesado:

CREATE TABLE i(t TEXT);

INSERT INTO i(t)
VALUES ('The man walked down the road.'), ('Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.'),
       ('This sentence has no most frequent word.'), ('"That''s... that''s... that is just terrible!" he said. '), ('The old-fashioned man ate an old-fashioned cake.'), 
       ('IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.'), ('a   a            a b b b c');


Normalmente lo usaría MODE() WITHIN GROUP(...)y será mucho más corto, pero violará:

Si no hay una palabra más frecuente (vea el caso de prueba # 3), su programa no debería generar nada.


EDITAR:

Manejo ':

WITH z AS(SELECT DISTINCT*,COUNT(*)OVER(PARTITION BY t,m)c FROM i,regexp_split_to_table(translate(lower(t),'.,"!',''),E'\\s+')m)
SELECT t,CASE WHEN COUNT(*)>1 THEN '' ELSE MAX(m)END
FROM z WHERE(t,c)IN(SELECT t,MAX(c)FROM z GROUP BY t)
GROUP BY t  

SqlFiddleDemo

Salida:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              t                                                ║      max      ║
╠═══════════════════════════════════════════════════════════════════════════════════════════════╬═══════════════╣
║ a a a b b b c                                                                                 ║               ║
║ The old-fashioned man ate an old-fashioned cake.                                              ║ old-fashioned ║
║ IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.  ║ ipv6          ║
║ This sentence has no most frequent word.                                                      ║               ║
║ "That's... that's... that is just terrible!" he said.                                         ║ that's        ║
║ The man walked down the road.                                                                 ║ the           ║
║ Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.        ║ he            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝

no podría ser tan bajo como usted, sqlserver aún no tiene una división dividida de compilación. Sin embargo, la parte seleccionada es más corta.
t-clausen.dk

@GeorgeGibson Claro, fijo + agregado demostración en vivo.
lad2025

@ lad2025 De común acuerdo en el chat, lo que hiciste ya no es necesario, no dudes en volver atrás.
George Gibson

@GeorgeGibson Sí, editar será muy claro. La demostración en vivo funciona ahora, cuando escribí la respuesta sqlfiddle no respondía.
lad2025

2

R, 115 bytes

function(s)if(sum(z<-(y=table(tolower((x=strsplit(s,"[^\\w']",,T)[[1]])[x>""])))==max(y))<2)names(which(z))else NULL

Esta es una función que acepta una cadena y devuelve una cadena si una sola palabra aparece con más frecuencia que otras y de lo NULLcontrario. Para llamarlo, asígnelo a una variable.

Sin golf:

f <- function(s) {
    # Create a vector of words by splitting the input on characters other
    # than word characters and apostrophes
    v <- (x <- strsplit(s, "[^\\w']", perl = TRUE))[x > ""]

    # Count the occurrences of each lowercased word
    y <- table(tolower(v))

    # Create a logical vector such that elements of `y` which occur most
    # often are `TRUE` and the rest are fase
    z <- y == max(y)

    # If a single word occurs most often, return it, otherwise `NULL`
    if (sum(z) < 2) {
        names(which(z))
    } else {
        NULL
    }
}

2

Retina, 97 bytes

Las reglas siguen cambiando ...

T`L`l
[^-\w ]

O`[-\w]+
([-\w]+)( \1\b)*
$#2;$1
O#`[-\w;]+
.*\b(\d+);[-\w]+ \1;[-\w]+$

!`[-\w]+$

Pruébalo en línea!

Banco de pruebas.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Gracias, arreglado.
Leaky Nun

1
Y lo jugaste 11 bytes ._. impresionante
Conor O'Brien

También falla por "El hombre anticuado comió un pastel anticuado".
t-clausen.dk

Esto tampoco parece correcto (esperando aser la palabra más común allí)
TessellatingHeckler

2

Python, 132 bytes

import collections as C,re
def g(s):(a,i),(b,j)=C.Counter(re.sub('[^\w\s-]','',s.lower()).split()).most_common(2);return[a,''][i==j]

El código anterior supone que la entrada tiene al menos dos palabras.


Tengo que amar esa expresión regular, aunque.
Azul

Esto es incorrecto. La clase de caracteres \wincluye guiones bajos.
mbomb007

1

PHP, 223 bytes

$a=array_count_values(array_map(function($s){return preg_replace('/[^A-Za-z0-9]/','',$s);},explode(' ',strtolower($argv[1]))));arsort($a);$c=count($a);$k=array_keys($a);echo($c>0?($c==1?$k[0]:($a[$k[0]]!=$a[$k[1]]?$k[0]:'')):'');

1

Python 2, 218 bytes

Asume más de 2 palabras. Deshacerme de la puntuación me destruyó ...

import string as z
def m(s):a=[w.lower()for w in s.translate(z.maketrans('',''),z.punctuation).split()];a=sorted({w:a.count(w)for w in set(a)}.items(),key=lambda b:b[1],reverse=1);return a[0][0]if a[0][1]>a[1][1]else''

¿Esta tira, ',-etc.?
Tim

@Tim No, hice este desafío antes de que las reglas se desarrollaran por completo. Cambiará.
Azul

¿Se puede asignar el resultado sorteda una tupla en lugar de tener que indexar manualmente en la matriz?
Neil

@Neil, ¿quieres decir solo obtener el primer y el segundo elemento para comparar en lugar de toda la matriz? No sé cómo hacer eso
Azul

1

Matlab (225)

  • Reglas cambiadas: /

.

      function c=f(a),t=@(x)feval(@(y)y(y>32),num2str(lower(x)-0));f=@(x)num2str(nnz(x)+1);e=str2num(regexprep(a,'([\w''-]+)',' ${t($1)} ${f($`)} ${f([$`,$1])}'));[u,r,d]=mode(e);try c=find(e==d{:});c=a((e(c(1)+1)):(e(c(1)+2)));end
  • Toolbox es necesario para ejecutar esto.

  • ¿Cómo funciona esto? Uno de los mejores privilegios de regex reemplaza en matlab: ejecuta tokens en el campo llamando a funciones ambientales externas parametrizadas por los tokens capturados en el entorno interno, por lo que cualquier secuencia de "Word_A Word_B .."se reemplaza por enteros "A0 A1 A2 B0 B1 B2 ..."donde el primer entero es la firma numerica ascii de la palabra, el segundo es el índice inicial, el tercero es el índice final, estos dos últimos enteros no se reduplican en toda la secuencia, así que aproveché esta ventaja para transponerlo a una matriz, luego lo modelé y luego busqué el dar como resultado esa matriz, por lo que los índices iniciales / finales seguirán en consecuencia.

  • Editar: después de cambiar algunos detalles, el programa se llama función mediante un parámetro de cadena.


20 bytes guardados gracias a @StewieGriffin, 30 bytes añadieron reproches a las lagunas comunes acordadas.


Tendré mi voto positivo cuando usted (u otra persona) demuestre que esto realmente funciona, tanto para las entradas que tienen una palabra más común como para las entradas que no. =) (No puedo probarlo, desafortunadamente)
Stewie Griffin

@StewieGriffin, creo que el programa se comporta mal con oraciones con palabras de
equifrecuencia,

1

05AB1E , 22 21 20 bytes

žK„- JÃl#{D.MDgiJëõ?

Explicación:

žK                     # Push [a-zA-Z0-9]
  „-                   # Push 2-char string containing a hyphen and a space
     J                 # Join the stack into a single element
      Ã                # Removes all characters from implicit input except those specified above
       l               # Converts to lowercase
        #              # Split string by spaces
         {             # Sorts array
          D            # Duplicates
           .M          # Finds most common element
             Dg        # Gets length of string without popping
                 iJ    # If length == 1, then convert the array to a string (otherwise the output would be ['example'] instead of example
                   ëõ? # Else push an empty string.

Nota: Si está de acuerdo con las nuevas líneas finales en la salida para cuando se supone que no debe generar nada, elimine ?al final para guardar un byte.

Nota # 2: El programa no funcionará con una sola palabra, pero dudo que esto sea un problema. Si desea solucionar este problema, reemplace #con ð¡un byte adicional.

05AB1E usa CP-1252 como el juego de caracteres, no UTF-8.

Pruébalo en línea!


1

Perl, 60 56 55 54 bytes

Incluye +3 para -p

#!/usr/bin/perl -p
s/[\pL\d'-]+/$;[$a{lc$&}++]++or$\=$&/eg}{$\x=2>pop@

Si una palabra no puede ser solo un número, también puede soltar aun puntaje de 53.


¿El guión en el -anEno cuenta? Lo hace en la otra respuesta (+2 bytes para la -pbandera) ...
George Gibson

@GeorgeGibson No, consulte meta.codegolf.stackexchange.com/questions/273/… . El guión, el espacio y el Eno cuentan. La otra respuesta normalmente solo tendría que hacer +1 bytes para -p, pero su solución tiene 'que no puede verse como una extensión de -eo -E. Por lo tanto, debería contar +3 (no +2) ya que debería contar el espacio y el guión (pero cada opción adicional solo sería +1).
Ton Hospel

@TomHospel Oh, cierto.
George Gibson

¿Se considera esto válido dada la regla del apóstrofe? [\pL\d-]parece que podría reducirse a [\w-](a menos que nos preocupemos por los guiones bajos) pero cualquiera de las versiones informará en thatlugar de that'so thatspara la prueba 4. De lo contrario, debe agregar 4 bytes para insertar \x27en esa clase de caracteres (a menos que tenga una mejor manera de agregar un apóstrofe)
Adam Katz

@AdamKatz La definición de 'palabra' cambió bastante mientras se ejecutaba y nunca adopté por completo la última versión. Pero para mantenerte feliz, creé una versión fija (y más corta) :-). Y sí, me importan los guiones bajos
Ton Hospel

0

PowerShell (v4), 117 bytes

$y,$z=@($input-replace'[^a-z0-9 \n-]'-split'\s'|group|sort Count)[-2,-1]
($y,($z,'')[$y.Count-eq$z.Count])[!!$z].Name

La primera parte es bastante fácil:

  • $input es ~ = stdin
  • Regex reemplaza los caracteres irrelevantes con nada, mantenga líneas nuevas para que no mezclemos dos palabras del final de una línea y el comienzo de la siguiente línea en una por error. (Nadie más ha discutido varias líneas, podría jugar golf -2 si la entrada es siempre una sola línea).
  • Regex dividido, Grouppor frecuencia (~ = colecciones de Python. Contador ), Sortpara poner las palabras más frecuentes al final.
  • PowerShell no distingue entre mayúsculas y minúsculas por defecto para todo.

Manejo si no hay una palabra más frecuente:

  • Tome los dos últimos elementos [-2, -1] en $ y y $ z;
  • una lista de N elementos, donde N> = 2, hace que $ y y $ z sean los dos últimos elementos
  • una lista de 1 elemento convierte $ y en el último elemento y $ z nulo
  • una lista vacía hace que ambos sean nulos

Use el campo bool-as-array-index fake-ternary-operator golf (0,1)[truthyvalue], anidado, para elegir "", $ z o $ y como salida, luego tome .Name.

PS D:\> "The man walked down the road."|.\test.ps1
The

PS D:\> "Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy."|.\test.ps1
he

PS D:\> "`"That's... that's... that is just terrible!`" he said."|.\test.ps1
Thats

PS D:\> "The old-fashioned man ate an old-fashioned cake."|.\test.ps1
old-fashioned

PS D:\> "IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses."|.\test.ps1
IPv6

0

Lua, 232 199 175 bytes

w,m,o={},0;io.read():lower():gsub("[^-%w%s]",""):gsub("[%w-]+",function(x)w[x]=(w[x]or 0)+1 end)for k,v in pairs(w)do if m==v then o=''end if(v>m)then m,o=v,k end end print(o)

1
if not w[x]then w[x]=0 end w[x]=w[x]+1 end->w[x]=(w[x]or0)+1
Leaky Nun

if m==v then o=''end->o=m==v and '' or o
Leaky Nun

0

Perl 5, 96 92 84 + 2 ( -pbandera) = 86 bytes

++$h{+lc}for/\w(?:\S*\w)?/g}{$m>$e[1]||$e[1]>$m&&(($_,$m)=@e)||($_="")while@e=each%h

Utilizando:

> echo "The man walked down the road." | perl -p script.pl

Su -pbandera debe invocar una penalización de 3 bytes. Las reglas son más o menos: cada indicador de línea de comando es +1 byte, ya que esa es la cantidad de bytes adicionales que necesita para extender su -e'code'línea de comando de estilo libre . Entonces, normalmente -pes solo +1 byte. Pero aquí tiene su código, 'por lo que no se puede ejecutar simplemente desde la línea de comandos sin escapar. Por lo tanto, no se debe combinar con -ey el -y el espacio antes de que psean adicionales y también se deben contar
Ton Hospel

@TonHospel fijo.
Denis Ibaev

Esto es en realidad 84 + 1 ( -pmarca) si lo invoca en la línea de comando como perl -pe'…'(se pone a disposición eliminando lo 'que se indica en los primeros comentarios)
Adam Katz

0

Python, 158 bytes

def g(s):import collections as c,re;l=c.Counter(re.sub('[^\w\s-]',"",s.lower()).split());w,f=l.most_common(1)[0];return[w,""][all(f==i[1]for i in l.items())]

Toma su entrada así:

g("Bird is the word")

Debe coincidir con todos los requisitos, aunque falla en cadenas vacías, ¿es necesario verificarlos? Perdón por el retraso.

Consejos / comentarios / consejos de magia negra para guardar bytes son siempre bienvenidos


Hola y bienvenidos a PPCG! Marcamos código de golf retos por el número de bytes en la respuesta. Seguí adelante y lo edité con la información correcta.
Rɪᴋᴇʀ

2
Bienvenido a PPCG! Desafortunadamente, su envío no cumple con todos los requisitos de este desafío, ya que, en primer lugar, NO distingue entre mayúsculas y minúsculas. Por ejemplo, NO contará las ocurrencias de la palabra Thatcomo ocurrencias de la palabra thatya que la primera comienza con mayúscula Ty la segunda comienza con minúscula t. Además, esto NO elimina todas las demás formas de puntuación, excepto los guiones ( -) y, opcionalmente, los apóstrofes ( ') y, como resultado, esto NO funcionaría para el cuarto caso de prueba dado en la pregunta.
R. Kap

1
Además, esto NO genera nada si no hay una palabra más frecuente. Por ejemplo, usando el tercer caso de prueba ( This sentence has no most frequent word.) como ejemplo, su función se genera [('This', 1)], cuando en su lugar no debería generar nada. Podría seguir y seguir sobre más problemas, por lo que recomendaría solucionarlos lo antes posible.
R. Kap

Lo haré pronto, cuando tenga tiempo
¿No te gustaría saber?

Esto es incorrecto. La clase de caracteres \wincluye guiones bajos.
mbomb007

0

Tcl 8.6, 196 bytes

lmap s [join [read stdin] \ ] {dict incr d [regsub -all {[^\w-]} [string tol $s] {}]}
set y [dict fi $d v [lindex [lsort [dict v $d]] end]]
if {[llength $y]!=2} {set y {}}
puts "==> [lindex $y 0]"

(Por desgracia, no puedo entender cómo hacerlo más pequeño que eso ...)

Explicación

Utiliza varios modismos oscuros de Tcl para hacer cosas.

  • [join [read stdin] " "] - cadena de entrada → lista de palabras separadas por espacios en blanco
  • lmap ... - iterar sobre cada elemento de esa lista. (Más corto que foreachy efectivamente idéntico ya que el resultado se descarta).
  • [regsub ... [string tolower ...]] - Convierta la cadena en minúsculas y elimine todos los caracteres, excepto los caracteres de palabras y el guión.
  • [dict incr d ...] - Crear / modificar un diccionario / palabra → contar histograma.
  • set y ... - Ordene los valores del diccionario, tome el más grande y devuelva todos los pares (clave, valor) correspondientes.
  • if... - Debe haber exactamente dos elementos: un solo par (clave, valor), de lo contrario no hay nada que imprimir.
  • puts... - Imprima la clave en el par de valores clave, si corresponde. (Ninguna palabra tiene espacios).

Puedes jugar con él usando CodeChef .



0

REXX 109 128 122 bytes

pull s;g.=0;m=0;do i=1 to words(s);w=word(s,i);g.w=g.w+1;if g.w>=m then do;m=g.w;g.m=g.m+1;r=w;end;end;if g.m=1 then say r

Bastante impreso ...

pull s
g.=0
m=0
do i=1 to words(s)
  w=word(s,i)
  g.w=g.w+1
  if g.w>=m
  then do
    m=g.w
    g.m=g.m+1
    r=w
  end
end
if g.m=1 then say r

No creo que esto maneje todos los casos de palabras más frecuentes vinculadas - ver (nuevo) último caso de prueba - Cometí un error similar.
philcolbourn

Con suerte, eso ya está solucionado
aja

0

golpe, 153 146 131 154 149 137 bytes

declare -iA F
f(){ (((T=++F[$1])==M))&&I=;((T>M))&&M=$T&&I=$1;}
read L
L=${L,,}
L=${L//[^- a-z0-9]}
printf -vA "f %s;" $L
eval $A;echo $I

Operación:

declarar una matriz asociativa F de enteros (declarar -iA F)

f es una función que, dado un parámetro de palabra $ 1, incrementa el conteo de frecuencia para esta palabra (T = ++ F [$ 1]) y se compara con el conteo máximo hasta ahora (M).

Si es igual, tenemos un empate, por lo que no consideraremos que esta palabra sea más frecuente (I =)

Si es mayor que el recuento máximo hasta ahora (M), establezca el recuento máximo hasta el momento en el recuento de frecuencia de esta palabra hasta el momento (M = $ T) y recuerde esta palabra (I = $ 1)

Función final f

Leer una línea (leer L) Hacer minúsculas (L = $ {L ,,}) Eliminar cualquier carácter excepto az, 0-9, guión (-) y espacio (L = $ {L // [^ - a-z0- 9]}) Haga una secuencia de sentencias bash que invoque f para cada palabra (printf -vA "f% s;" $ L). Esto se guarda en la variable A. eval A e imprime el resultado (eval $ a; echo $ I)

Salida:

This quick brown fox jumps over this lazy dog.
-->this
This sentence with the words has at most two equal most frequent the words.
-->
The man walked down the road.
-->the
This sentence has no most frequent word.
-->
Slowly, he ate the pie, savoring each delicious bite. He felt like he was truly happy.
-->he
"That's... that's... that is just terrible!" he said.
-->thats
The old-fashioned man ate an old-fashioned cake.
-->old-fashioned
IPv6 looks great, much better than IPv4, except for the fact that IPv6 has longer addresses.
-->ipv6

Error: CORREGIDO Tengo un error que no se revela en estos casos de prueba. Si la entrada es

This sentence with words has at most two equal most frequent words.

entonces mi código no debería mostrar nada.

Tengo una solución, pero parece que he encontrado un error bash ... Tengo un comportamiento muy extraño si M no se declara un entero: ++ F [$ 1] == M (después de algunas palabras repetidas) incrementa ambos F [$ 1 ] ¡¡y M!! - mi error.


0

Python 3, 76 98100 bytes

import re,statistics as S
try:print(S.mode(re.split("([a-z0-9-]+)",input().lower())[1::2]))
except:1

Pruébalo en línea

Emite la palabra más común en minúsculas. No incluye apóstrofes porque "no es necesario incluir apóstrofes".

statistics.mode requiere Python 3.4

Desafortunadamente, no stderrse permite la salida a , o sería mucho más corto.


¿No tiene permiso para imprimir STDERR, a menos que este programa no produzca ningún error de salida?
Okx

¡Su nuevo programa no admite guiones! i- test i-
Probé

Lo arregló todo. Aún corto.
mbomb007

0

R, 96 bytes

19 bytes más corto que la respuesta R existente , con un enfoque algo diferente.

t=table(gsub("[^a-z0-9'-]","",tolower(scan(,''))))
`if`(sum(t==max(t))-1,'',names(which.max(t)))

Lee desde stdin, por lo que la entrada se separa automáticamente por espacios. Convertimos a minúsculas y las usamos gsubpara eliminar todos los caracteres no alfanuméricos (más -y '). Contamos las instancias de cada palabra con tabley guardamos el resultado en t. A continuación, verificamos si hay más de 1 máximo en t(al ver si hay más de un elemento que es igual a max(t). Si es así, devolvemos la cadena vacía ''. Si no, devolvemos la palabra correspondiente al máximo en t.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.