Quel est le mot le plus fréquent?


26

Quel est le mot le plus fréquent?

Étant donné une phrase, votre programme doit la parcourir, compter les fréquences de chaque mot, puis sortir le mot le plus utilisé. Parce qu'une phrase n'a pas de longueur fixe et peut donc devenir très longue, votre code doit être aussi court que possible.

Règles / exigences

  • Chaque soumission doit être soit un programme complet soit une fonction. S'il s'agit d'une fonction, elle doit pouvoir être exécutée en n'ajoutant que l'appel de fonction au bas du programme. Tout autre élément (par exemple en-têtes en C) doit être inclus.
  • Un interprète / compilateur gratuit doit être disponible pour votre langue.
  • Si c'est possible, fournissez un lien vers un site où votre programme peut être testé.
  • Votre programme ne doit rien écrire STDERR.
  • Votre programme doit prendre en compte STDIN(ou l'alternative la plus proche dans votre langue).
  • Les failles standard sont interdites.
  • Votre programme doit être insensible à la casse ( tHe, Theet thetous contribuent au nombre de the).
  • S'il n'y a pas de mot le plus fréquent (voir cas de test n ° 3), votre programme ne devrait rien produire.

Définition d'un «mot»:

Vous obtenez la liste des mots en divisant le texte d'entrée sur les espaces. L'entrée ne contiendra jamais d'autre type d'espaces que des espaces simples (en particulier aucun retour à la ligne). Cependant, les derniers mots ne doivent contenir que des caractères alphanumériques (az, AZ, 0-9), des tirets (-) et des apostrophes ('). Vous pouvez le faire en supprimant tous les autres caractères ou en les remplaçant par un espace avant de séparer le mot. Pour rester compatible avec les versions précédentes des règles, il n'est pas nécessaire d'inclure des apostrophes.

Cas de test

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.
==>

Remarque: Les troisième et septième cas de test n'ont pas de sortie, vous pouvez choisir l'un ou l'autre sur le quatrième.

Notation

Les programmes sont notés en octets. Le jeu de caractères habituel est UTF-8, si vous en utilisez un autre, veuillez le préciser.

Lorsque le défi se termine, le programme avec le moins d'octets (appelé ), gagne.

Soumissions

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

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

Classement

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.


2
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Poignée de porte

1
Donc, étant donné votre nouvelle définition de «mot», quel est le mot le plus courant ici don't d'ont dont a a? Serait-ce dont?
DJMcMayhem

@DrGreenEggsandHamDJ Si vous avez une demande qui ne supprime apostrophes, dont. Dans le cas contraire, a. mais la plupart des soumissions le font, tout dontcomme la bonne réponse.
George Gibson

1
La sortie est-elle sensible à la casse? La ipv6sortie est-elle donc valide pour le dernier cas de test?
kirbyfan64sos

1
Un cas de test supplémentaire peut être utile: "Cette phrase avec des mots a au plus deux mots égaux les plus fréquents." -> <rien>
philcolbourn

Réponses:


6

Pyke, 26 25 octets

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

Essayez-le ici!

Ou 23 22 octets (non compétitif, ajouter un noeud où tue la pile si faux)

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

Essayez-le ici!

Ou avec ponctuation, 23 octets (je pense que cela est en concurrence? Commit était avant l'édition)

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

Essayez-le ici!

Ou 12 octets (certainement non compétitifs)

l1.cj.#jR/)e

Essayez-le ici!

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

Votre réponse de 23 octets serait en concurrence si la seule ponctuation conservée était -et '(trait d'union et apostrophe).
George Gibson

Il ne conserve que la ponctuation qui n'est pas à la fin d'un mot
Blue

Oh, OK (je ne comprends pas Pyke). Je suppose qu'il concourt alors ...
George Gibson

1
@GeorgeGibson Je suis à peu près sûr que la version 23 octets n'est pas compétitive - elle pourrait tomber sous des failles standard. De plus, je ne m'attends pas à ce que (m) personne comprenne Pyke, je le fais comme ma propre langue
Blue

Très bien alors. Je pense que vous gagnez quand même, donc ça n'a pas vraiment d'importance.
George Gibson


11

Pyth - 23 30 octets

Il doit y avoir une meilleure façon d'inclure des chiffres et des tirets, mais je veux juste résoudre ce problème maintenant.

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

Suite de tests .


1
Les règles révisées exigent de conserver les chiffres et les tirets.
Dennis

@GeorgeGibson corrigé.
Maltysen

6

Octave, 115 94 octets

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

Tient compte du cas sans mot le plus fréquent en utilisant try. Dans ce cas, il ne produit rien et "prend une pause" jusqu'à ce que vous interceptiez l'exception.

Enregistrement de 21 (!) Octets grâce à la suggestion de Luis Mendo (en utilisant la troisième sortie de modepour obtenir le mot le plus courant).


Les règles ont beaucoup changé depuis que j'ai publié ma réponse d'origine. J'examinerai le regex plus tard.


1
tu m'as battu, je vais penser à autre chose maintenant.
Abr001am

Appliquer modesur cpeut-être? Sa troisième sortie donne toutes les valeurs liées, si je me souviens bien
Luis Mendo

Je compte 115 octets.
Conor O'Brien

Je crois que votre regex devrait être ['\w\d]parce que vous devez conserver les apostrophes et les chiffres. À moins que ceux-ci soient entre majuscules et minuscules en ASCII, auquel cas ignorez-moi car je n'ai pas de table à portée de main.
Action en justice de Fund Monica

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

5

Perl 6, 80 octets

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

Divisons la réponse en deux parties ...

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

givenest une instruction de contrôle (comme ifou for). En Perl 6, ils sont autorisés en tant que suffixes. ( a if 1, ou comme ici, foo given 3). givenplace son sujet (côté droit) dans la variable spéciale $_pour son côté gauche.

Le "sujet" lui-même minuscule ( lc), se divise par mot ( words), place les valeurs dans un sac (défini avec le nombre d'occurrences), puis trie par valeur (DESC). Puisqu'il sortne sait que fonctionner sur des listes, le Bagest ici transformé en un Listde Pairs.

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

un conditionnel simple ( ?? !!utilisé en Perl 6, au lieu de ? :).

$_ > 1

Vérifie simplement que la liste a plus d'un élément.

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

Les accès à $_peuvent être raccourcis ... En ne spécifiant pas la variable. .aest exactement comme $_.a. Donc, c'est effectivement "les deux éléments supérieurs ont-ils le même nombre d'occurrences" - Si c'est le cas, alors nous imprimons '' (la chaîne vide).

Dans le cas contraire, nous imprimons la clé de l'élément supérieur (le comte): .[0].key.


7
C'est comme la moitié de l'anglais, la moitié du bruit de ligne. Incroyable.
chat

1
c'est marrant comme ce sont les fonctionnalités de style OO qui ressemblent à l'anglais: P
Ven

2
Parvient également à être moins lisible que Perl 5 tout en contenant plus d'anglais que Perl 5. D:
cat

1
@cat l'a corrigé - devrait être totalement illisible maintenant
Ven

5
value??!!(je sais que c'est un opérateur ternaire, c'est juste amusant)
chat


4

JavaScript (ES6), 155 octets

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)

Basé sur la réponse Python de @ Blue.


Votre regex remplace semble avoir chuté et va casser le cas de test IPv6, n'est-ce pas?
TessellatingHeckler

@TessellatingHeckler La définition du mot a changé depuis que j'ai lu la question à l'origine, mais j'ai mis à jour ma réponse maintenant.
Neil

4

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

( +17 octets, car apparemment même s'il y a des mots plus fréquents que les autres, mais ils ont la même fréquence, rien ne doit quand même être retourné. )

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)]

Devrait maintenant remplir toutes les conditions. Cette soumission suppose qu'au moins 1 mot est entré.

Essayez-le en ligne! (Ideone)

De plus, si vous en voulez une, voici une autre version de ma fonction dépourvue d'expressions régulières au prix d'environ 43 octets, bien que celle-ci soit de toute façon non compétitive, donc cela n'a pas vraiment d'importance. Je viens de le mettre ici pour le diable:

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)]

Essayez cette nouvelle version en ligne! (Ideone)


D'après les commentaires du défi "s'il y a deux mots qui sont plus fréquents que les autres, mais avec la même fréquence", la sortie est "rien".
RootTwo

@RootTwo Fixed! :)
R. Kap

@TessellatingHeckler Ce sont cependant des mots différents. That'sest une contraction pour that isalors que ce thatsn'est pas vraiment un mot.
R. Kap

@TessellatingHeckler Pouvez-vous me donner une preuve de ce commentaire? Parce que je passe en revue tous les commentaires sur le post et ne vois aucun commentaire de ce type.
R. Kap

4

Rubis, 94 92 102 octets

Je dois aller vite (réponse FGITW). Renvoie le mot en majuscule ou nils'il n'y a pas de mot le plus fréquent.

Maintenant mis à jour selon de nouvelles spécifications, je pense. Cependant, j'ai réussi à jouer un peu au golf, donc le nombre d'octets est le même!

->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}

5
Gotta go fast?
chat

@cat ouais, 'cuz j'étais FGITW cette fois
Value Ink


3

JavaScript (ES6), 99 octets

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 octets

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

Essayez-le en ligne!

SQL Server 2016, 174 octets

Impossible de gérer des données comme cet exemple (en comptant les égaux comme 3 mots):

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

Je n'aime pas l'approche variable car c'est une sorte de tricherie :) Une entrée -> rien ou quelque chose, avec une approche basée sur un ensemble, elle doit être plus longue, car vous devez ajouter des GROUP BY, LEFT JOIN, or PARTITION BYAnyway SQL Server supplémentaires a intégré la fonction SPLIT. Démo non golfée n'hésitez pas à la rendre aussi courte que possible.
lad2025

@ lad2025 merci beaucoup, je ne connaissais aucune fonctionnalité de 2016. SPLIT_STRING est sûrement une fonctionnalité attendue depuis longtemps. J'ai essayé de jouer le script en utilisant split, je l'ai réduit à 174, mais il ne pourra pas filtrer le texte comme "= = ="
t-clausen.dk

3

PostgreSQL, 246 , 245 octets

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  

Sortie:

entrez la description de l'image ici

Entrez si quelqu'un est intéressé:

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');


Normalement, j'utiliserais MODE() WITHIN GROUP(...)et ce sera beaucoup plus court, mais cela violera:

S'il n'y a pas de mot le plus fréquent (voir cas de test n ° 3), votre programme ne devrait rien produire.


MODIFIER:

Manipulation ':

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

Sortie:

╔═══════════════════════════════════════════════════════════════════════════════════════════════╦═══════════════╗
║                                              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            ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╩═══════════════╝

n'a pas pu être aussi bas que vous, sqlserver n'a pas encore de build en split. Cependant, la partie sélectionnée est plus courte.
t-clausen.dk

@GeorgeGibson Bien sûr, démo en direct + ajoutée.
lad2025

@ lad2025 D'un commun accord dans le chat, ce que vous avez fait n'est plus nécessaire, n'hésitez pas à revenir en arrière.
George Gibson

@GeorgeGibson Yup, l'édition sera beaucoup plus claire. La démo en direct fonctionne maintenant, quand j'ai écrit la réponse sqlfiddle ne répondait pas.
lad2025

2

R, 115 octets

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

Il s'agit d'une fonction qui accepte une chaîne et renvoie une chaîne si un seul mot apparaît plus souvent que les autres et NULLsinon. Pour l'appeler, affectez-le à une variable.

Non 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

Rétine, 97 octets

Les règles changent constamment ...

T`L`l
[^-\w ]

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

!`[-\w]+$

Essayez-le en ligne!

Suite de tests.



@ CᴏɴᴏʀO'Bʀɪᴇɴ Merci, corrigé.
Leaky Nun

1
Et vous l'avez joué au golf 11 octets ._. impressionnant
Conor O'Brien

Échoue également pour "L'homme à l'ancienne a mangé un gâteau à l'ancienne."
t-clausen.dk

Cela ne semble pas non plus correct (en attendant aqu'il soit le mot le plus courant là-bas)
TessellatingHeckler

2

Python, 132 octets

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]

Le code ci-dessus suppose que l'entrée a au moins deux mots.


Je dois aimer ce regex, tho.
Bleu

Ceci est une erreur. La classe de caractères \wcomprend des traits de soulignement.
mbomb007

1

PHP, 223 octets

$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 octets

Suppose plus de 2 mots. Se débarrasser de la ponctuation m'a détruit ...

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''

Est-ce que cette bande, ',-etc.?
Tim

@Tim Non, j'ai fait ce défi avant que les règles ne soient complètement étoffées. Changera.
Blue

Pouvez-vous attribuer le résultat de sortedà un tuple plutôt que de devoir l'indexer manuellement dans le tableau?
Neil

@Neil, vous voulez simplement obtenir les premier et deuxième éléments à comparer au lieu de l'ensemble du tableau? Je ne sais pas comment faire
Blue

1

Matlab (225)

  • Règles chaneged: /

.

      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 est nécessaire pour exécuter ceci.

  • Comment cela fonctionne-t-il, l'un des plus beaux privilèges de regex remplacer dans matlab ce qu'il exécute sur le terrain des jetons en appelant des fonctions environnementales externes paramétrées par les jetons pris dans l'environnement interne, donc toute séquence de "Word_A Word_B .."est remplacée par des entiers "A0 A1 A2 B0 B1 B2 ..."où le premier entier est la signature numerica ascii du mot, la seconde est l'index de départ, la troisième est l'index de fin, ces deux derniers entiers ne se redoublent pas dans toute la séquence, j'ai donc profité de cet avantage pour le transposer dans un tableau, puis le moduler puis rechercher dans le résultat dans ce tableau, donc les indices de début / fin suivront par conséquent.

  • Edit: après avoir modifié certains détails, le programme est appelé fonction par un paramètre de chaîne.


20 octets économisés grâce à @StewieGriffin, 30 octets ont ajouté des reproches aux failles communes.


Vous aurez mon vote positif lorsque vous (ou quelqu'un d'autre) montrez que cela fonctionne réellement, à la fois pour les entrées qui ont un mot le plus courant et pour les entrées qui n'en ont pas. =) (Je ne peux pas le tester, malheureusement)
Stewie Griffin

@StewieGriffin je pense que le programme se comporte mal avec des phrases avec des mots d'équi-fréquence je vais corriger ça
Abr001am

1

05AB1E , 22 21 20 octets

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

Explication:

ž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.

Remarque: Si vous êtes satisfait de la fin des sauts de ligne dans la sortie lorsque vous n'êtes pas censé produire quoi que ce soit, supprimez le ?à la fin pour enregistrer un octet.

Note # 2: Le programme ne fonctionnera pas avec un seul mot, mais je doute que ce soit un problème. Si vous souhaitez résoudre ce problème, remplacez #par ð¡pour un octet supplémentaire.

05AB1E utilise CP-1252 comme jeu de caractères, pas UTF-8.

Essayez-le en ligne!


1

Perl, 60 56 55 54 octets

Comprend +3 pour -p

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

Si un mot ne peut pas être simplement un nombre, vous pouvez également laisser tomber apour un score de 53.


Le tiret dans le -anEpas compte? C'est le cas sur l'autre réponse (+2 octets pour l' -pindicateur) ...
George Gibson

@GeorgeGibson Non, voir meta.codegolf.stackexchange.com/questions/273/… . Le tiret, l'espace et le Ene comptent pas. L'autre réponse ne devrait normalement faire que +1 octet pour -p, mais sa solution l'a 'donc ne peut pas être considérée comme une extension de -eou -E. Il devrait donc en fait compter +3 (pas +2) car il devrait compter l'espace et le trait d'union (mais chaque option supplémentaire ne serait que +1).
Ton Hospel

@ TomHospel Oh, c'est vrai.
George Gibson

Est-ce considéré comme valide étant donné la règle de l'apostrophe? [\pL\d-]On dirait qu'il pourrait être réduit à [\w-](sauf si nous nous soucions des traits de soulignement) mais l'une ou l'autre version rapportera thatau lieu de that'sou thatspour le test 4. Sinon, vous devez ajouter 4 octets à insérer \x27dans cette classe de caractères (à moins que vous ayez une meilleure façon d'ajouter une apostrophe).
Adam Katz

@AdamKatz La définition de «mot» a beaucoup changé pendant que cela fonctionnait et je n'ai jamais complètement adopté la dernière version. Mais pour vous satisfaire, j'ai créé une version fixe (et plus courte) :-). Et oui, je me soucie des soulignés
Ton Hospel

0

PowerShell (v4), 117 octets

$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 première partie est assez simple:

  • $input est ~ = stdin
  • Regex remplace les caractères non pertinents par rien, garde les nouvelles lignes afin de ne pas écraser deux mots de la fin d'une ligne et du début de la ligne suivante en un par erreur. (Personne d'autre n'a discuté de plusieurs lignes, pourrait jouer au golf -2 si l'entrée est toujours une seule ligne).
  • Regex divisé, Grouppar fréquence (~ = collections Python.Counter), Sortpour mettre les mots les plus fréquents à la fin.
  • PowerShell est insensible à la casse par défaut pour tout.

Traitement s'il n'y a pas un mot le plus fréquent:

  • Prenez les deux derniers éléments [-2, -1] dans $ y et $ z;
  • une liste de N éléments, où N> = 2, fait de $ y et $ z les deux derniers éléments
  • une liste à 1 élément fait de $ y le dernier élément et de $ z nul
  • une liste vide les rend tous les deux nuls

Utilisez le bool-as-array-index fake-ternary-operator golf (0,1)[truthyvalue], nested, pour choisir "", $ z ou $ y en sortie, puis prenez .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 octets

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 ( -pindicateur) = 86 octets

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

En utilisant:

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

Votre -pdrapeau doit invoquer une pénalité de 3 octets. Les règles sont à peu près: chaque indicateur de ligne de commande est de +1 octet car c'est le nombre d'octets supplémentaires dont vous avez besoin pour étendre votre -e'code'ligne de commande de style libre . Donc normalement, -pc'est seulement +1 octet. Mais ici, votre code 'ne peut donc pas être exécuté simplement à partir de la ligne de commande sans s'échapper. Donc, ne pas combiner avec -eet l' -espace avant l'espace psont supplémentaires et doivent également être comptés
Ton Hospel

@TonHospel Fixed.
Denis Ibaev

Il s'agit en fait de 84 + 1 ( -pindicateur) si vous l'invoquez sur la ligne de commande en tant que perl -pe'…'(rendu disponible en supprimant le 'comme indiqué dans les premiers commentaires)
Adam Katz

0

Python, 158 octets

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())]

Prend son entrée comme ceci:

g("Bird is the word")

Doit correspondre à toutes les exigences, bien qu'il échoue sur les chaînes vides, est-il nécessaire de les vérifier? Désolé pour le retard.

Les conseils / commentaires / astuces de magie noire pour économiser des octets sont toujours les bienvenus


Bonjour et bienvenue chez PPCG! Nous notons les défis de code-golf par le nombre d'octets dans la réponse. Je suis allé de l'avant et l'ai édité pour vous avec les informations correctes.
Rɪᴋᴇʀ

2
Bienvenue chez PPCG! Malheureusement, votre soumission ne satisfait pas à toutes les exigences de ce défi car, tout d'abord, elle n'est PAS sensible à la casse. Par exemple, il ne comptera PAS les occurrences du mot Thatcomme des occurrences du mot thatpuisque la première commence par une majuscule Tet la seconde commence par une minuscule t. De plus, cela ne supprime PAS toutes les autres formes de ponctuation à l'exception des traits d'union ( -) et, éventuellement, des apostrophes ( ') et, par conséquent, cela ne fonctionnerait PAS pour le quatrième cas de test donné dans la question.
R. Kap

1
De plus, cela ne produit rien s'il n'y a pas de mot le plus fréquent. Par exemple, en utilisant le troisième cas de test ( This sentence has no most frequent word.) comme exemple, votre fonction sort [('This', 1)], alors qu'elle ne devrait rien produire. Je pourrais continuer encore et encore sur plus de problèmes, donc je recommanderais de les résoudre dès que possible.
R. Kap

Fera bientôt, quand j'aurai le temps
N'aimeriez-vous pas savoir

Ceci est une erreur. La classe de caractères \wcomprend des traits de soulignement.
mbomb007

0

Tcl 8.6, 196 octets

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]"

(Hélas, je ne sais pas comment l'obtenir plus petit que ça ...)

Explication

Il utilise plusieurs idiomes obscurs de Tcl pour faire des choses.

  • [join [read stdin] " "] - chaîne d'entrée → liste de mots séparés par des espaces
  • lmap ... - parcourir chaque élément de cette liste. (Plus court que foreachet effectivement identique puisque le résultat est rejeté.)
  • [regsub ... [string tolower ...]] - Convertissez la chaîne en minuscules et supprimez tous les caractères à l'exception des mots et du tiret.
  • [dict incr d ...] - Créer / modifier un dictionnaire / mot → compter l'histogramme.
  • set y ... - Triez les valeurs du dictionnaire, prenez la plus grande et renvoyez toutes les paires (clé, valeur) qui lui correspondent.
  • if... - Il doit y avoir exactement deux éléments: une seule paire (clé, valeur), sinon il n'y a rien à imprimer.
  • puts... - Imprimez la clé dans la paire de valeurs de clé, le cas échéant. (Aucun mot n'a d'espaces.)

Vous pouvez jouer avec lui en utilisant CodeChef .



0

Rexx, 109 128 122 octets

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

Joli imprimé ...

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

Je ne pense pas que cela gère tous les cas de mots liés les plus fréquents - voir (nouveau) dernier cas de test - j'ai fait une erreur similaire.
philcolbourn

Avec un peu de chance, c'est réglé maintenant
aja

0

bash, 153 146 131 154 149 137 octets

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

Opération:

déclarer un tableau associatif F d'entiers (déclarer -iA F)

f est une fonction qui, étant donné un paramètre de mot $ 1, incrémente le nombre de fréquences pour ce mot (T = ++ F [$ 1]) et se compare au nombre max jusqu'à présent (M).

Si égal, nous avons une égalité donc nous ne considérerons pas ce mot comme le plus fréquent (I =)

S'il est supérieur au nombre maximal jusqu'à présent (M), définissez le nombre maximal jusqu'à présent sur le nombre de fréquences de ce mot jusqu'à présent (M = $ T) et souvenez-vous de ce mot (I = $ 1)

Fonction de fin f

Lire une ligne (lire L) Faire des minuscules (L = $ {L ,,}) Supprimer tout caractère sauf az, 0-9, tiret (-) et espace (L = $ {L // [^ - a-z0- 9]}) Créez une séquence d'instructions bash qui appelle f pour chaque mot (printf -vA "f% s;" $ L). Ceci est enregistré dans la variable A. eval A et résultat d'impression (eval $ a; echo $ I)

Sortie:

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

Bug: CORRIGÉ J'ai un bug qui n'est pas révélé dans ces cas de test. Si l'entrée est

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

alors mon code ne devrait rien produire.

J'ai un correctif mais je semble avoir rencontré un bug bash ... J'ai un comportement très étrange si M n'est pas déclaré comme un entier: ++ F [$ 1] == M (après quelques mots répétés) incrémente les deux F [$ 1 ] et M!! - mon erreur.


0

Python 3, 76 98 100 octets

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

Essayez-le en ligne

Sort le mot le plus courant en minuscules. N'inclut pas les apostrophes car "les apostrophes ne doivent pas nécessairement être incluses".

statistics.mode nécessite Python 3.4

Malheureusement, aucune sortie vers stderrn'est autorisée, ou ce serait beaucoup plus court.


Vous n'êtes pas autorisé à imprimer sur STDERR, à moins que ce programme ne produise aucune sortie d'erreur?
Okx

Votre nouveau programme ne prend pas en charge les tirets! J'ai essayé l'entréei- test i-
Okx

A tout résolu. Toujours court.
mbomb007

0

R, 96 octets

19 octets de moins que la réponse R existante , avec une approche quelque peu différente.

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

Lit à partir de stdin, donc l'entrée est automatiquement séparée par des espaces. Nous convertissons en minuscules et utilisons gsubpour supprimer tous les caractères non alphanumériques (plus -et '). Nous comptons les instances de chaque mot avec tableet enregistrons le résultat t. Ensuite, nous vérifions s'il y a plus d'un maximum dans t(en voyant s'il y a plus d'un élément qui est égal à max(t). Si oui, nous retournons la chaîne vide ''. Sinon, nous retournons le mot correspondant au maximum dans t.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.