Was ist das häufigste Wort?
Wenn ein Satz vorliegt, muss Ihr Programm ihn durchlaufen, die Häufigkeit jedes Wortes zählen und dann das am häufigsten verwendete Wort ausgeben. Da ein Satz keine feste Länge hat und daher sehr lang werden kann, muss Ihr Code so kurz wie möglich sein.
Regeln / Anforderungen
- Jede Einreichung sollte entweder ein vollständiges Programm oder eine Funktion sein. Wenn es sich um eine Funktion handelt, muss sie ausgeführt werden können, indem nur der Funktionsaufruf am Ende des Programms hinzugefügt wird. Alles andere (z. B. Überschriften in C) muss enthalten sein.
- Für Ihre Sprache muss ein kostenloser Dolmetscher / Compiler verfügbar sein.
- Wenn es möglich ist, geben Sie einen Link zu einer Site an, auf der Ihr Programm getestet werden kann.
- Ihr Programm darf nichts schreiben
STDERR
.
- Ihr Programm sollte Eingaben von
STDIN
(oder der nächstgelegenen Alternative in Ihrer Sprache) übernehmen.
- Standardlücken sind verboten.
- Ihr Programm muss Groß- und Kleinschreibung sein (
tHe
, The
und the
alle tragen zur Zählung the
).
- Wenn es kein häufigstes Wort gibt (siehe Testfall 3), sollte Ihr Programm nichts ausgeben.
Definition eines Wortes:
Sie erhalten die Liste der Wörter, indem Sie den eingegebenen Text auf Leerzeichen aufteilen. Die Eingabe enthält niemals andere Arten von Leerzeichen als Leerzeichen (insbesondere keine Zeilenumbrüche). Die letzten Wörter sollten jedoch nur alphanumerische Zeichen (az, AZ, 0-9), Bindestriche (-) und Apostrophe (') enthalten. Sie können dies tun, indem Sie alle anderen Zeichen entfernen oder durch Leerzeichen ersetzen, bevor Sie das Wort aufteilen. Um mit früheren Versionen der Regeln kompatibel zu bleiben, müssen keine Apostrophe eingefügt werden.
Testfälle
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.
==>
Hinweis: Der dritte und der siebte Testfall haben keine Ausgabe. Sie können auch den vierten Testfall auswählen.
Wertung
Programme werden nach Bytes bewertet. Der übliche Zeichensatz ist UTF-8. Wenn Sie einen anderen Zeichensatz verwenden, geben Sie diesen bitte an.
Wenn die Herausforderung beendet ist, gewinnt das Programm mit den wenigsten Bytes (es heißt Code-Golf ).
Einreichungen
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
/* 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
? Wäre esdont
?dont
. Wenn nichta
,. Aber die meisten Einreichungen tun dies, und diesdont
ist eine korrekte Antwort.ipv6
die Ausgabe für den letzten Testfall gültig?Antworten:
Pyke,
2625 BytesProbieren Sie es hier aus!
Oder
2322 Bytes (noncompeting, fügt Knoten , auf den Stapel abtötet , wenn falsch)Probieren Sie es hier aus!
Oder mit Interpunktion, 23 Bytes (ich denke das konkurriert? Commit war vor der Bearbeitung)
Probieren Sie es hier aus!
Oder 12 Bytes (definitiv nicht konkurrierend)
Probieren Sie es hier aus!
quelle
-
und'
(Bindestrich und Apostroph) erhalten bliebe .Gelee , 25 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
quelle
Pyth -
2330 BytesEs muss einen besseren Weg geben, um Ziffern und Bindestriche einzuschließen, aber ich möchte dies jetzt nur korrigieren.
Test Suite .
quelle
Oktave,
115 bis94 BytesKonten für den Fall ohne das häufigste Wort mit
try
. In diesem Fall gibt es nichts aus und "macht eine Pause", bis Sie die Ausnahme abfangen.21 (!) Bytes dank Luis Mendos Vorschlag eingespart (mit der dritten Ausgabe von wird
mode
das häufigste Wort gefunden).Die Regeln haben sich ziemlich verändert, seit ich meine ursprüngliche Antwort gepostet habe. Ich werde später in die Regex schauen.
quelle
mode
aufc
vielleicht? Sein dritter Ausgang liefert, wenn ich mich['\w\d]
weil Sie Apostrophe und Ziffern bewahren müssen. Wenn diese in ASCII nicht zwischen Groß- und Kleinschreibung liegen, ignorieren Sie mich in diesem Fall, da ich keine Tabelle zur Hand habe.[~, ~, out] = mode([1 1 2 2 1 2 3 4 5 5])
gibtout = {1 2}
Perl 6, 80 Bytes
Teilen wir die Antwort in zwei Teile auf ...
given
ist eine Steueranweisung (wieif
oderfor
). In Perl 6 sind sie als Postfixes zulässig. (a if 1
oder wie hierfoo given 3
).given
legt sein Thema (rechte Seite) in die Sondervariable$_
für die linke Seite.Das "Thema" selbst, lowercases (
lc
), teilt sich nach dem Wort (words
), legt die Werte in einen Beutel (mit der Anzahl der Vorkommen) und sortiert sie dann nach dem Wert (DESC). Dasort
nur weiß, wie man mit Listen umgeht,Bag
wird die hier in eineList
vonPair
s umgewandelt.eine einfache Bedingung (
?? !!
werden in Perl 6 anstelle von verwendet? :
).Überprüft nur, ob die Liste mehr als ein Element enthält.
Zugriffe auf
$_
können verkürzt werden ... indem die Variable nicht angegeben wird..a
ist genau wie$_.a
. Das ist also effektiv "Haben beide Top-Elemente die gleiche Anzahl von Vorkommen" - Wenn ja, dann drucken wir '' (die leere Zeichenkette).Andernfalls drucken wir den Schlüssel des oberen Elements (die Zählung):
.[0].key
.quelle
value??!!
(Ich weiß, das ist ein ternärer Operator, es ist nur unterhaltsam)05AB1E , 30 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
I
Befehl nicht wiederholt verwenden , benötigt 05AB1E nur so viel, wie erforderlich ist.JavaScript (ES6), 155 Byte
Basierend auf der Antwort von @ Blue's Python.
quelle
Python 3.5,
142137134112117110127 Bytes:( +17 Bytes, da anscheinend auch dann nichts zurückgegeben werden sollte, wenn Wörter häufiger vorkommen als die übrigen, aber dieselbe Häufigkeit aufweisen. )
Sollte jetzt alle Bedingungen erfüllen. Bei dieser Übermittlung wird davon ausgegangen, dass mindestens 1 Wort eingegeben wurde.
Probieren Sie es online! (Ideone)
Wenn Sie eine möchten, finden Sie hier eine andere Version meiner Funktion ohne reguläre Ausdrücke auf Kosten von ungefähr 43 Bytes. Diese ist jedoch sowieso nicht wettbewerbsfähig, sodass es keine Rolle spielt. Ich habe es hier nur zum Teufel hingelegt:
Probieren Sie diese neue Version online aus! (Ideone)
quelle
That's
ist eine Kontraktion fürthat is
wohingegenthats
nicht wirklich ein Wort ist.Rubin,
9492102 BytesIch muss schnell gehen (FGITW-Antwort). Gibt das Wort in Großbuchstaben zurück oder
nil
wenn es kein häufigstes Wort gibt.Jetzt auf neue Spezifikationen aktualisiert, denke ich. Ich habe es jedoch geschafft, ein wenig weniger zu spielen, damit die Byteanzahl gleich ist!
quelle
Gotta go fast
?Pyth, 32 Bytes
Testsuite.
quelle
JavaScript (ES6), 99 Byte
quelle
SQL Server 2008, 250 Bytes
Probieren Sie es online!
SQL Server 2016, 174 Byte
Daten wie in diesem Beispiel können nicht verarbeitet werden (zählen als 3 Wörter):
quelle
GROUP BY, LEFT JOIN, or PARTITION BY
Funktionen hinzufügen müssen. Trotzdem hat SQL Server die SPLIT-Funktion eingebaut. Ungolfed Demo zögern Sie nicht, es so kurz wie möglich zu machen.PostgreSQL,
246, 245 BytesAusgabe:
Geben Sie bei Interesse Folgendes ein:
Normalerweise würde ich verwenden
MODE() WITHIN GROUP(...)
und es wird viel kürzer sein, aber es wird verstoßen:BEARBEITEN:
Handhabung
'
:SqlFiddleDemo
Ausgabe:
quelle
R, 115 Bytes
Dies ist eine Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt, wenn ein einzelnes Wort häufiger vorkommt als andere und
NULL
. Um es aufzurufen, weisen Sie es einer Variablen zu.Ungolfed:
quelle
Retina, 97 Bytes
Die Regeln ändern sich ständig ...
Probieren Sie es online!
Testsuite.
quelle
a
, dass es dort das häufigste Wort ist)Python, 132 Bytes
Der obige Code setzt voraus, dass die Eingabe mindestens zwei Wörter enthält.
quelle
\w
enthält Unterstriche.PHP, 223 Bytes
quelle
Python 2, 218 Bytes
Nimmt mehr als 2 Wörter an. Die Zeichensetzung loszuwerden hat mich zerstört ...
quelle
',-
etc?sorted
to a tuple rather than having to index into the array manually?Matlab (225)
.
Toolbox is necessary to run this.
How does this work, one of the nicest privileges of regex replace in matlab this it field-executes tokens by calling external-environmental functions parameterized by the tokens caught in the inner environment, so any sequence of
"Word_A Word_B .."
is replaced by integers"A0 A1 A2 B0 B1 B2 ..."
where the first integer is the numerica ascii signature of the word, the second is the starting index, the third is the ending index, these last two integers dont reduplicate in the whole sequence so i took this advantage to transpose it to an array, then mode it then search the result in that array, so the starting/ending indices will consequently follow.Edit: after changing some details, the program is called function by a string parameter.
20 bytes saved thanks to @StewieGriffin, 30 bytes added reproaches to common-agreed loopholes.
quelle
05AB1E,
222120 bytesExplanation:
Note: If you're fine with trailing newlines in the output for when you're not supposed to output anything, remove the
?
at the end to save a byte.Note #2: The program will not work with a single word, but I doubt this would be a problem. If you want to fix this, replace
#
withð¡
for an extra byte.05AB1E uses CP-1252 as the charset, not UTF-8.
Try it online!
quelle
Perl,
60565554 bytesIncludes +3 for
-p
If a word cannot be just a number you can also drop the
a
for a score of 53.quelle
-anE
not count? It does on the other answer (+2 bytes for-p
flag)...E
do not count. The other answer would normally only have to do +1 bytes for-p
, but his solution has'
so it cannot be seen as an extension of-e
or-E
. So he should in fact count +3 (not +2) since he should count the space and the hyphen (but every extra option would only be +1).[\pL\d-]
looks like it could be shrunken down to[\w-]
(unless we care about underscores) but either version will reportthat
instead ofthat's
orthats
for test 4. Otherwise, you need to add 4 bytes to insert\x27
in that character class (unless you have a better way of adding an apostrophe).PowerShell (v4), 117 bytes
The first part is easy enough:
$input
is ~= stdinGroup
by frequency (~= Python's collections.Counter),Sort
to put most frequent words at the end.Handling if there isn't a most frequent word:
Use the bool-as-array-index fake-ternary-operator golf
(0,1)[truthyvalue]
, nested, to choose "", $z or $y as output, then take .Name.quelle
Lua,
232199175 bytesquelle
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
flag) = 86 bytesUsing:
quelle
-p
flag should invoke a penalty of 3 bytes. The rules are roughly: Each commandline flag is +1 byte since that is how many extra bytes you need to extend your free-e'code'
style commandline. So normally-p
is only +1 byte. But here your code has'
so it cannot be run simply from the commandline without escaping. So no combining with-e
and the-
and the space before thep
are extra and must be counted too-p
flag) if you invoke it on the command line asperl -pe'…'
(made available by removing the'
as noted in the first comments)Python, 158 bytes
Takes its input like this:
Should match all the requirements, although it does fail on empty strings, is it necessary to check for those? Sorry for the delay.
Advice / feedback / black magic tips for saving bytes are always welcome
quelle
That
as occurrences of the wordthat
since the former begins with an uppercaseT
and the latter begins with a lowercaset
. Also, this does NOT remove all other forms of punctuation except hyphens (-
) and, optionally, apostrophes ('
) and as a result, this would NOT work for the fourth test case given in the question.This sentence has no most frequent word.
) as an example, your function outputs[('This', 1)]
, when it should instead be outputting nothing. I could go on and on about more issues, so I would recommend fixing them as soon as you can.\w
includes underscores.Tcl 8.6, 196 bytes
(Alas, I can't figure out how to get it any smaller than that...)
Explanation
It uses several obscure Tcl idioms to do stuff.
[join [read stdin] " "]
— input string→list of whitespace-separated wordslmap ...
— iterate over every element of that list. (Shorter thanforeach
and effectually identical since the result is discarded.)[regsub ... [string tolower ...]]
— Convert the string to lowercase and strip all characters except for word characters and the hyphen.[dict incr d ...]
— Create/modify a dictionary/word→count histogram.set y ...
— Sort the dictionary values, take the largest one, and return all (key,value) pairs corresponding to it.if...
— There must be exactly two elements: a single (key,value) pair, else there is nothing to print.puts...
— Print the key in the key value pair, if any. (No word has spaces.)You can play with it using CodeChef.
quelle
Rexx,
109128122 bytesPretty printed...
quelle
bash,
153146131154149137bytesOperation:
declare an associative array F of integers (declare -iA F)
f is a function that, given a word parameter $1, increments frequency count for this word (T=++F[$1]) and compares to max count so far (M).
If equal, the we have a tie so we will not consider this word to be most frequent (I=)
If greater than max count so far (M), then set max count so far to frequency count of this word so far (M=$T) and remember this word (I=$1)
End function f
Read a line (read L) Make lowercase (L=${L,,}) Remove any character except a-z, 0-9, dash(-) and space (L=${L//[^- a-z0-9]}) Make a sequence of bash statements that calls f for each word (printf -vA "f %s;" $L). This is saved to variable A. eval A and print result (eval $a;echo$I)
Output:
Bug: FIXED I have a bug that is not revealed in these test cases. If input is
then my code should output nothing.
I have a fix but I seem to have hit a bash bug... I get very odd behaviour is M is not declared an integer: ++F[$1]==M (after a few repeated words) increments both F[$1] and M!!- my mistake.quelle
Python 3,
7698100 bytesTry it online
Outputs the most common word as lowercase. Does not include apostrophes because "apostrophes are not required to be included."
statistics.mode
requires Python 3.4Unfortunately, no output to
stderr
is allowed, or it'd be much shorter.quelle
STDERR
, unless this program doesn't produce any error output?i- test i-
R, 96 bytes
19 bytes shorter than the existing R answer, with a somewhat different approach.
Reads from stdin, so the input is automatically separated by spaces. We convert to lowercase and use
gsub
to remove all non-alphanumerics (plus-
and'
). We count the instances of each word withtable
and save the result tot
. Next, we check if there is more than 1 maximum int
(by seeing if there is more than one element which is equal tomax(t)
. If so, we return the empty string''
. If not, we return the word corresponding to the maximum int
.quelle