Der Code sollte einen Text enthalten (nicht obligatorisch können alle Dateien, Stdins, Strings für JavaScript usw. sein):
This is a text and a number: 31.
Die Ausgabe sollte die Wörter mit der Anzahl ihrer Vorkommen enthalten, sortiert nach der Anzahl der Vorkommen in absteigender Reihenfolge:
a:2
and:1
is:1
number:1
This:1
text:1
31:1
Beachten Sie, dass 31 ein Wort ist, ein Wort also eine alphanumerische Zahl ist. Zahlen fungieren nicht als Trennzeichen, sodass sie beispielsweise 0xAF
als Wort qualifiziert sind. Trennzeichen sind alles, was nicht alphanumerisch ist, einschließlich .
(Punkt) und -
(Bindestrich), i.e.
oder pick-me-up
führen zu 2 bzw. 3 Wörtern. Sollte zwischen Groß- und Kleinschreibung unterschieden werden This
und this
zwei verschiedene Wörter sein, '
würde dies auch ein Trennzeichen sein wouldn
und t
2 verschiedene Wörter aus sein wouldn't
.
Schreiben Sie den kürzesten Code in der Sprache Ihrer Wahl.
Kürzeste richtige Antwort bisher:
This
derselbe wiethis
undtHIs
)?wouldn't
2 Wörter (wouldn
undt
)?This
undthis
in der Tat zwei verschiedene Wörter sein, dasselbewouldn
undt
.i.e.
ein Wort, aber wenn wir alle die Punkte an der der Punkt lassen Das Ende der Sätze wird mit Anführungszeichen oder einfachen Anführungszeichen usw. angegeben.Antworten:
grep und coreutils
4442Prüfung:
Ergebnisse in:
Aktualisieren
quelle
head
am Ende enthält.grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
Java 8: 289
Das ist ziemlich gut, da Java eine sehr nicht golfende Sprache ist.
Ungolfed:
Führen Sie von der Befehlszeile aus:
quelle
"[^\\W_]"
String.split(String regex)
Methode ein Muster, das mit dem Trennzeichen übereinstimmt , auf das aufgeteilt werden soll. So"aababba".split("b")
würde zum Beispiel das Array ergeben{"aa", "a", "", "a"}
. Mein regulärer Ausdruck[^\\w\\d]
bedeutet "ein Zeichen weder in der Wortzeichen- noch in der Ziffernzeichenklasse".[^\\W_]
ist stattdessen 'ein Zeichen, das weder ein Unterstrich ist noch in der Klasse der Nicht-Wortzeichen enthalten ist' und würde mit jedem Wortzeichen außer dem Unterstrich übereinstimmen.\w
enthält\d
,\d
ist also überflüssig.\w
enthält einen Unterstrich, der je nach Fragestellung als Trennzeichen zu betrachten ist. Also sollte der richtige reguläre Ausdruck für das Teilen sein"[\\W_]+"
.APL (57)
z.B
Erläuterung:
⎕D,⎕A,⎕UCS 96+⍳26
: Zahlen, Großbuchstaben, Kleinbuchstaben(I←⍞)∊
: Eingabe lesen, speichern inI
, welche alphanumerisch sindZ←I⊂⍨
:I
in alphanumerische Zeichengruppen aufgeteilt, speichern inZ
+⌿∘.≡⍨Z
: für jedes Element inZ
Sehen Sie , wie oft es auftrittZ,⍪
: stimmen mit jedem Element in übereinZ
paarweise der Häufigkeit zu, mit der es auftrittG←⊃∪↓
: Wählen Sie nur die eindeutigen Paare aus, in denen gespeichert werden sollG
⍒,1↓⍉G
: Erhalte sortierte Indizes für die VorkommenG[
...;]
: ordne die ZeilenG
nach den angegebenen Indizesquelle
⎕s
( help.dyalog.com/latest/Content/Language/System%20Functions/… ) und dem neuen Key Operator ( help.dyalog.com/latest/Content/Language/Primitive%20Operators/… ):g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
C #:
153c144c142c111c115c118c114c113c(über LINQPad im Modus "C # -Anweisungen", ohne Eingabezeichenfolge)
Version 1: 142c
Ungolfed:
Ergebnisse:
Version 2: 114c
(
[\w]
beinhaltet_
, was falsch ist !;[A-z]
beinhaltet[ \ ] ^ _ `
; sich niederlassen auf[^_\W]+
)Ungolfed:
Ergebnisse: (als Version 1)
quelle
@"[^_\W]"
R, 58 char
Verwendung:
quelle
sort(table(gsub("[[:punct:]]","",scan(,""))),d=T)
. Leider funktionieren beide Lösungen für nicht richtigwouldn't
.perl6: 49 zeichen
Durchkämmen Sie die Eingabe, um die Übereinstimmungen zu ermitteln
\w+
, fügen Sie die Ergebnisliste der Wörter in ein einBag
, fragen Sie nach deren Paaren und sortieren Sie sie nach negativen Werten. (Das*
ist ein Was auch immer Stern, es ist hier keine Multiplikation)Ausgabe:
quelle
.words
.comb(/\w+/)
.words
das:
oder nicht.
wie erforderlich von der Eingabe :(_
sollte nicht in einem Wort unter der Problemstellung enthalten sein.Python
10197Funktioniert jetzt mit newline:
quelle
PHP - 84 Bytes
Eingabe wird als Kommandozeilenargument akzeptiert, zB:
Ausgabe für die Beispielzeichenfolge:
quelle
$argv[1]
_
sollte nicht in einem Wort enthalten sein.PowerShell (40)
$ s ist eine Variable, die die Eingabezeichenfolge enthält.
quelle
[\W]
ist nicht gut genug - es stimmt mit einem Leerzeichen in meinem Test überein. Und es ist nicht nach absteigender Anzahl geordnet ...$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}
bringt dich näher (natürlich$s -split"\W+"|group -ca |sort count -des
-split"\W+"
stimmt mit einer leeren Zeichenfolge zwischen dem letzten.
und dem Ende der Zeichenfolge überein; auch\W+
Spiele,_
die technisch nicht erlaubt istPerl 69
Empfehlungen von @primo und @protist hinzugefügt
quelle
ge
und kein Leerzeichen erforderlichfor
. Auch der<=>
Operator kann durch ersetzt werden-
.-
statt<=>
ist genial, nicht sicher, ob das auf den Golftipps für Perl-Thread steht. Ich werde dies später aktualisieren, danke!\w
enthält auch Zahlen (perl -e 'print for"a 1 2 3 4 b"=~/\w/g'
Druckea1234b
), aber Ihr Mechanismus zum Wiederholen der Wörter speichert ein anderes Zeichen, sodass ich es aktualisiere. Vielen Dank!Powershell:
5755536257(ohne Eingabezeichenfolge)
kehrt zurück:
(mit Requisiten an @microbian für Gruppe -ca)
quelle
EcmaScript 6
Version 1 (108 Zeichen)
Version 2 (102 Zeichen)
Version 3 (105 Zeichen)
Version 4 (94 Zeichen)
Version 5 (ohne Alarm; 87 Zeichen)
Version 6 (100 Zeichen)
Ausgabe:
quelle
_[a]
und_[b]
zu_.a
und ändern_.b
. Wenn Sie auch auf ändern/\w+/g,_={}
,_=/\w+/g
wird das gleiche Ergebnis erzielt._[a]
,_.a
da versucht wird, auf die Eigenschaft"a"
von_
und nicht auf die Eigenschaft zuzugreifena
.Object.keys
ein globaler in ES6? Ihre Antwort scheint dies anzunehmen, aber ich kann mich nicht erinnern, dass dies für ES6 geplant war.Groovy
7782geändert regulärer Ausdruck
[^\w]+
zu ,[^\d\p{L}]+
um Problem mit Unterstrich zu lösenohne erste Zeile 82 Zeichen
Ausgabe:
quelle
nu_ber
ist nicht alphanumerisch. Dies sollten 2 Wörter seinnu_ber
statt verwendennumber
?GNU awk + coreutils:
7169Obwohl
gawk asort
mit assoziativen Arrays gearbeitet wird, werden die Indexwerte anscheinend nicht beibehalten, sodass das Externe erforderlich istsort
GNU awk 4.x:
10093Eine etwas größere, aber reine Gawk-Lösung, mit
PROCINFO
der die Standardsortierreihenfolge für das assoziative Array festgelegt wird (erfordert anscheinend ein relativ neues Gawk -> 4.x?)quelle
_
sollte nicht in einem Wort enthalten sein.Javascript -
132126 Zeichen!(Kürzester JS-Code)
Der reguläre Ausdruck und einige Änderungen wurden verbessert.
Ungolfed
Alt -
156143141140132 ZeichenGab einen ersten Versuch beim Golfen. Feedback erwünscht.
quelle
EcmaScript 6,
11510087 (ohne Aufforderung und Warnung)Vielen Dank an @eithedog:
Mit Aufforderung und Alarm (100):
Führen Sie es in Firefox aus.
quelle
var
. Sie können sich aucha={}
inprompt
- bewegenprompt(a={})
. Drop Sie können auchObject.
und ändernw=>a[w]=a[w]+1||1
zuw=>a[w]=-~a[w]
a
toothbrush: Wenn Sie die Deklaration von prompt auf regexp verschieben, sparen Sie zwei weitere Zeichen._
sollte nicht in einem Wort enthalten sein.Ruby
588265Testlauf:
Edit 58-> 80: Ok, ich war weit weg. Ich habe vergessen, die Wörter nach Vorkommen zu sortieren. Außerdem
Array#uniq
ist es kein Enumerator, sondern verwendet einen bestimmten Block, um Elemente zu vergleichen, sodass bei der Übergabeputs
an diesen Block keine Duplikate herausgefiltert wurden (nicht, dass darin angegeben ist, dass wir dies tun sollen).quelle
split(/\W+/)
stattscan
(ungetestet)?\W
schließt_
damit aus, dass behoben werden musste, aber es wurden trotzdem 2 Zeichen gespeichert (dann habe ich 20 hinzugefügt, um die Sortierung zu korrigieren, die ich vernachlässigt hatte).reverse
(a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
reverse
ist viel zu wortreich;) Übrigens ist es nicht fair, die Frage zu ändern.F # - 169
Entgolfet:
Ausgabe bei Aufruf von fsi:
Update: Einige Erklärungen wie in den Kommentaren angefordert.
Verwendet Set-Funktionen, um ein Array nicht-alphanumerischer Zeichen in der Eingabe zu generieren, die an String.Split übergeben werden sollen. Anschließend werden mit Sequenzfunktionen leere Zeichenfolgen herausgefiltert, Wortzahlen generiert und das Ergebnis gedruckt.
Einige Golf-Tricks: Fügt dem Funktionsargument s eine leere Zeichenfolge hinzu, um die Typinferenz des Arguments als Zeichenfolge zu erzwingen, anstatt den Typ explizit zu deklarieren. Verwendet Seq.where anstelle von Seq.filter, um einige Zeichen zu speichern (sie sind Synonyme). Mischt Forward Pipe und normale Funktionsanwendung, um Zeichen zu minimieren. Verwendet currying und (op) -Syntax, um <> ~ - und <|| zu behandeln Operatoren als reguläre Funktionen, um zu vermeiden, dass Lambdas deklariert werden, um leere Zeichenfolgen zu filtern, nach absteigender Anzahl zu sortieren und Tupel zu drucken.
quelle
Python - 95 (jetzt 87 dank @primo)
Beispieleingabe:
Beispielausgabe:
Verbesserungsvorschläge sind willkommen
quelle
\w
Streichhölzer[a-zA-Z0-9_]
. Ihre gesamte Regex kann durch ersetzt werdenr'\w+'
. Außerdem wird diex
Variable nicht benötigt, sondern nurraw_input()
als zweiter Parameter verwendetfindall
.print
Anweisung (dhprint map(...
) enthalten, da es sonst kein vollständiges Programm ist.JavaScript
160144 (Bearbeitet: um Anforderungen zu erfüllen)Nicht abgeschlossen:
Protokolliert jedes Wort der Reihe nach in der Konsole und übergibt die folgende Zeichenfolge:
s="This is sam}}ple text 31to test the effectiveness of this code, you can clearly see that this is working-as-intended, but you didn't doubt it did you?.";
Ausgänge:
Ich habe nicht das Herz zu gebrauchen
alert()
.quelle
you
sollte so zuerst sein._
sollte nicht in einem Wort enthalten sein.++o[a]||1
=>-~o[a]
k [71 Zeichen]
Alle anderen Zeichen außer alphanumerischen Zeichen werden als Trennzeichen betrachtet.
Beispiel
Beispiel
quelle
Javascript (135)
Nicht abgeschlossen:
Durchläuft jede mögliche Anzahl von Übereinstimmungen in absteigender Reihenfolge und gibt Wörter mit dieser Anzahl von Vorkommen aus. Nur um schrecklich zu sein.
Anmerkungen: Alarm hätte die Länge etwas reduziert. Genau genommen sollte alphanumerisch sein
[^\W_]
quelle
Haskell (153 = 104 Code + 49 Import)
Ziemlich unkomplizierte, komplett komponierte Funktion ... kein Argument nötig! Dies ist mein erstes Golfspiel. :)
Ausgabe:
quelle
q (50)
edit: korrigiert versehentlich übereinstimmende ascii 58-64 und 91-96
quelle
q
aber ist der Regex[0-z]
ASCII-basiert? Wenn ja, würde es nicht auch ASCII-Zeichen 58-64 enthalten? Weil das so ist: ; < = > ? @
.[A-z]
, das ASCII 91-96 zusammenbringt, die `[\] ^ _` `sind[^_\W]+
für mich entdeckt , dass "Nicht-Wort-Zeichen und Unterstrich ausschließen" sein sollte , wenn Ihre Syntax die\W
Klasse unterstützt ...Pure Bash (keine externen Programme), 164
Das ist länger als ich gehofft hatte, aber ich wollte sehen, ob das notwendige Zählen und Sortieren (in die richtige Richtung) nur mit
bash
Arrays (assoziativ und nicht assoziativ) durchgeführt werden kann:Als Skriptdatei speichern
chmod +x
und ausführen:quelle
AWK
Erledigt den Job ohne kitschige Erweiterungen:
Wenn stattdessen "count: word" ausgegeben wird, ist dies etwas kürzer, aber ich wollte die angegebene Beispielausgabe nachahmen ...
quelle
Tcl , 99 Bytes
Probieren Sie es online!
quelle
Python 2.X (108 - Zeichen)
Python 3.X (106 - Zeichen)
quelle
Separators will be anything that is not alpha-numeric
- Sie teilen sich nur Leerzeichen.Haskell - 137
quelle
Python 3 - 76
Das Erfordernis der Aufteilung auf nicht alphanumerische Zeichen erweitert den Code leider um 19 Zeichen. Die Ausgabe des Folgenden wird korrekt angezeigt. Wenn Sie sich nicht sicher sind, fügen Sie
.most_common()
nach dem ein hinzu.Counter(...)
.Ein / Ausgabe
Angesichts der Eingabe von
This is a text and a number: 31.
Sie folgende Ausgabe:Ich habe es mit anderen Werten wie versucht
um sicherzustellen, dass die Ausgabereihenfolge nicht vom Wert / Hash des Schlüssels abhängt. Dieses Beispiel erzeugt:
Aber wie gesagt,
print(i('collections').Counter(i('re').findall('\w+',input())).most_common())
würde das Ergebnis als eine definitiv geordnete Tupelliste zurückliefern .Python 3 - 57 (wenn ein Leerzeichen zum Teilen ausreichen würde: P)
quelle
_
sollte nicht in einem Wort enthalten sein.