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
, The
et the
tous 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é code-golf ), 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
où N
est 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.
/* Configuration */
var QUESTION_ID = 79576; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 53406; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
don't d'ont dont a a
? Serait-cedont
?dont
. Dans le cas contraire,a
. mais la plupart des soumissions le font, toutdont
comme la bonne réponse.ipv6
sortie est-elle donc valide pour le dernier cas de test?Réponses:
Pyke,
2625 octetsEssayez-le ici!
Ou
2322 octets (non compétitif, ajouter un noeud où tue la pile si faux)Essayez-le ici!
Ou avec ponctuation, 23 octets (je pense que cela est en concurrence? Commit était avant l'édition)
Essayez-le ici!
Ou 12 octets (certainement non compétitifs)
Essayez-le ici!
la source
-
et'
(trait d'union et apostrophe).Gelée , 25 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
la source
Pyth -
2330 octetsIl doit y avoir une meilleure façon d'inclure des chiffres et des tirets, mais je veux juste résoudre ce problème maintenant.
Suite de tests .
la source
Octave,
11594 octetsTient 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
mode
pour 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.
la source
mode
surc
peut-être? Sa troisième sortie donne toutes les valeurs liées, si je me souviens bien['\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.[~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])
donneout = {1 2}
Perl 6, 80 octets
Divisons la réponse en deux parties ...
given
est une instruction de contrôle (commeif
oufor
). En Perl 6, ils sont autorisés en tant que suffixes. (a if 1
, ou comme ici,foo given 3
).given
place 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'ilsort
ne sait que fonctionner sur des listes, leBag
est ici transformé en unList
dePair
s.un conditionnel simple (
?? !!
utilisé en Perl 6, au lieu de? :
).Vérifie simplement que la liste a plus d'un élément.
Les accès à
$_
peuvent être raccourcis ... En ne spécifiant pas la variable..a
est 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
.la source
value??!!
(je sais que c'est un opérateur ternaire, c'est juste amusant)05AB1E , 30 octets
Code:
Utilise l' encodage CP-1252 . Essayez-le en ligne! .
la source
I
commande, 05AB1E ne prendra que ce dont il a besoin.JavaScript (ES6), 155 octets
Basé sur la réponse Python de @ Blue.
la source
Python 3.5,
142137134112 112117110127 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é. )
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:
Essayez cette nouvelle version en ligne! (Ideone)
la source
That's
est une contraction pourthat is
alors que cethats
n'est pas vraiment un mot.Rubis,
9492102 octetsJe dois aller vite (réponse FGITW). Renvoie le mot en majuscule ou
nil
s'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!
la source
Gotta go fast
?Pyth, 32 octets
Suite de tests.
la source
JavaScript (ES6), 99 octets
la source
Sqlserver 2008, 250 octets
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):
la source
GROUP BY, LEFT JOIN, or PARTITION BY
Anyway 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.PostgreSQL,
246, 245 octetsSortie:
Entrez si quelqu'un est intéressé:
Normalement, j'utiliserais
MODE() WITHIN GROUP(...)
et ce sera beaucoup plus court, mais cela violera:MODIFIER:
Manipulation
'
:SqlFiddleDemo
Sortie:
la source
R, 115 octets
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
NULL
sinon. Pour l'appeler, affectez-le à une variable.Non golfé:
la source
Rétine, 97 octets
Les règles changent constamment ...
Essayez-le en ligne!
Suite de tests.
la source
a
qu'il soit le mot le plus courant là-bas)Python, 132 octets
Le code ci-dessus suppose que l'entrée a au moins deux mots.
la source
\w
comprend des traits de soulignement.PHP, 223 octets
la source
Python 2, 218 octets
Suppose plus de 2 mots. Se débarrasser de la ponctuation m'a détruit ...
la source
',-
etc.?sorted
à un tuple plutôt que de devoir l'indexer manuellement dans le tableau?Matlab (225)
.
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.
la source
05AB1E ,
222120 octetsExplication:
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!
la source
Perl,
60565554 octetsComprend +3 pour
-p
Si un mot ne peut pas être simplement un nombre, vous pouvez également laisser tomber
a
pour un score de 53.la source
-anE
pas compte? C'est le cas sur l'autre réponse (+2 octets pour l'-p
indicateur) ...E
ne 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-e
ou-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).[\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 rapporterathat
au lieu dethat's
outhats
pour le test 4. Sinon, vous devez ajouter 4 octets à insérer\x27
dans cette classe de caractères (à moins que vous ayez une meilleure façon d'ajouter une apostrophe).PowerShell (v4), 117 octets
La première partie est assez simple:
$input
est ~ = stdinGroup
par fréquence (~ = collections Python.Counter),Sort
pour mettre les mots les plus fréquents à la fin.Traitement s'il n'y a pas un mot le plus fréquent:
Utilisez le bool-as-array-index fake-ternary-operator golf
(0,1)[truthyvalue]
, nested, pour choisir "", $ z ou $ y en sortie, puis prenez .Name.la source
Lua,
232199175 octetsla source
if not w[x]then w[x]=0 end w[x]=w[x]+1 end
->w[x]=(w[x]or0)+1
if m==v then o=''end
->o=m==v and '' or o
Perl 5,
969284 + 2 (-p
indicateur) = 86 octetsEn utilisant:
la source
-p
drapeau 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,-p
c'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-e
et l'-
espace avant l'espacep
sont supplémentaires et doivent également être comptés-p
indicateur) si vous l'invoquez sur la ligne de commande en tant queperl -pe'…'
(rendu disponible en supprimant le'
comme indiqué dans les premiers commentaires)Python, 158 octets
Prend son entrée comme ceci:
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
la source
That
comme des occurrences du motthat
puisque la première commence par une majusculeT
et la seconde commence par une minusculet
. 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.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.\w
comprend des traits de soulignement.Tcl 8.6, 196 octets
(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 espaceslmap ...
- parcourir chaque élément de cette liste. (Plus court queforeach
et 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 .
la source
Rexx,
109128122 octetsJoli imprimé ...
la source
bash,
153146131154149137octetsOpé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:
Bug: CORRIGÉ J'ai un bug qui n'est pas révélé dans ces cas de test. Si l'entrée est
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.la source
Python 3,
7698100 octetsEssayez-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.4Malheureusement, aucune sortie vers
stderr
n'est autorisée, ou ce serait beaucoup plus court.la source
STDERR
, à moins que ce programme ne produise aucune sortie d'erreur?i- test i-
R, 96 octets
19 octets de moins que la réponse R existante , avec une approche quelque peu différente.
Lit à partir de stdin, donc l'entrée est automatiquement séparée par des espaces. Nous convertissons en minuscules et utilisons
gsub
pour supprimer tous les caractères non alphanumériques (plus-
et'
). Nous comptons les instances de chaque mot avectable
et enregistrons le résultatt
. Ensuite, nous vérifions s'il y a plus d'un maximum danst
(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 danst
.la source