Kürzlich gab es eine Frage zu Stack Overflow, bei der das OP versuchte, eine Funktion zu schreiben, um das Wort in einer Zeichenfolge mit den am häufigsten wiederholten Buchstaben zu finden. Es ist natürlich nicht schwer, einen in Sekunden zu schreiben, und ich habe einen zum Spaß so kurz wie möglich in Javascript geschrieben . Aber ich bin kein Experte für Code-Golf, also frage ich mich, wie viel kürzer dieses einfache Programm sein kann!
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Wortfolge aufnimmt, und geben Sie das Wort mit den sich am häufigsten wiederholenden Einzelbuchstaben zurück oder drucken Sie es aus.
Regeln:
Wählen Sie das Wort mit der größten Anzahl an Wiederholungs einzelne Buchstaben (siehe Beispiele unten)
Wenn kein Wort sich wiederholende Buchstaben enthält, geben Sie -1 zurück.
Wenn zwei Wörter die gleiche maximale Anzahl sich wiederholender Buchstaben haben, wählen Sie das Wort, das näher am Anfang der Zeichenfolge liegt.
Die kürzeste Übermittlung in Bytes gewinnt.
Eingang
Nehmen Sie als Eingabe eine Zeichenfolge, die aus einem oder mehreren durch Leerzeichen getrennten Wörtern besteht. Die Eingabe kann über STDIN (oder die nächstgelegene Alternative), Befehlszeilenparameter oder Funktionsargumente erfolgen.
Ausgabe
Drucken Sie die Ausgabe an STDOUT, um sie zurückzugeben.
Beispiele
Betrachten Sie die Zeichenfolge aaabbb cccc
. Dies enthält zwei Wörter: aaabbb
und cccc
. Das Wort aaabbb
hat 3 a
und 3 b
und cccc
hat 4 c
. Die maximale Anzahl wiederholter Buchstaben in aaabbb
ist also 3 und die maximale Anzahl in cccc
4. Wir möchten das Wort mit der maximalen Anzahl wiederholter Einzelbuchstaben auswählen, daher sollte die Ausgabe für aaabbb cccc
sein cccc
.
Andere Testfälle:
Today, is the greatest day ever! --> greatest
This is a great day --> -1
aaabbb cccc --> cccc
ever
aabb
hat 2 wiederholte Buchstaben. Es wirdaaaabb
davon ausgegangen, dass 4 wiederholte Buchstaben (2., 3., 4.a
, 2.b
) oder 2 wiederholte Buchstaben (a
undb
) vorhanden sind.Antworten:
C - GCC -
159145135 BytesWird aktualisiert, wenn ich es etwas abschneiden kann
So kompilieren Sie: gcc -w cg.c.
So führen Sie aus: ./a.out word1 word2 aass ddaaa ssdddd
Ausgabe: ssdddd
No-Output / No-Match: -1
Zuerst habe ich ein bisschen geschummelt, indem ich die Wörter als Programmargumente aufgenommen habe, aber GCC dazu zu bringen, die Wörter zu analysieren und mir eine kostenlose Wortzählung zu geben, war zu viel Belohnung, um darauf zu verzichten.
Wie funktioniert es?
Wir haben 3 verschachtelte Schleifen. Das erste Inkrementieren durch jedes Wort, die nächsten beiden ahmen eine Blasensortierung nach, um Werte zu vergleichen. Der erste Buchstabe wird niemals mit sich selbst verglichen, und jeder nachfolgende Buchstabe wird mit jedem vorherigen Buchstaben verglichen. Immer wenn ein Wort mehr gleiche Buchstaben als ein vorheriges Wort hat, wird das Wort in x gespeichert und die Anzahl der gleichen Buchstaben wird ebenfalls gespeichert.
GCC-Missbrauch
Wir verwenden implizite globale Auto-Int-Delkarationen für unsere ganzen Zahlen. Wir erlauben, dass argv ein int anstelle eines Zeichens ist (derzeit ein Zeichen, dies ist ein TODO). Wir verwenden Standardfunktionen wie Puts und Getchar. Wir verwenden auch den Kommaoperator, um unseren trinären (bedingten) Operator zu überlasten.
Willst du 2 weniger Bytes?
Ersetzen Sie "-1" durch * z und benennen Sie die Datei -1
Programm unverhüllt und ungetestet:
quelle
Pyth, 14 Bytes
Demonstration. Kabelbaum prüfen.
quelle
l
Vorher zu setzen.-
scheint es zu tun.K, 35 Bytes (fehlende -1-Anforderung, gerade bemerkt, aber Zeit zum Schlafen)
wie es funktioniert:
Ich nehme
der Wörter indiziert durch
die Indizes in aufsteigender Reihenfolge
das Maximum
zählen wo
string = char
für jedes Zeichen in Wort
für jedes Wort, wo
w
(Wörter) sindDie Zeichenfolge wird durch Leerzeichen geteilt
Offensichtlich habe ich in der englischen Erklärung ein wenig Präzision für Ausdruckskraft und Lesbarkeit geopfert. Ich hoffe es war interessant.
quelle
,-1
am Ende der Funktion hinzufügen .#:&:
da sie aus dem Kontext heraus als ihre monadischen Formen analysiert werden sollten. Sie können auch@
anstelle von Klammern indizieren und statt (*
) zuerst ( )1#
.Haskell, 100 Bytes
Anwendungsbeispiel:
f "Today, is the greatest day ever!"
->"greatest"
Wie es funktioniert:
Haskell,
7977 Bytes (ungetestet)Dies wird
sortOn
abData.List
Version 4.8.0.0 verwendet, die ich nicht installiert habe, sodass ich sie nicht testen kann.quelle
CJam, 25 Bytes
Probieren Sie es online aus
Erläuterung:
quelle
Python 2,
9777 BytesZiemlich einfache Lösung: Ordnen Sie die Eingabe (umgeben von Anführungszeichen) einfach einem Tupel zu, das das Wort und die Anzahl der wiederholten Zeichen enthält. Ruft das Maximum ab und druckt das Wort aus, wenn der am häufigsten wiederholte Buchstabe überhaupt wiederholt wird, andernfalls wird -1 ausgegeben.
Ich habe 20 (!) Bytes gespart, indem ich die Reihenfolge der Eingabe neu geordnet habe, sodass ich keinen Schlüssel zum Ermitteln der max.
quelle
SWI-Prolog,
158154149 BytesBeispiel:
a("Today, is the greatest day ever!",R).
AusgängeR = "greatest" .
.quelle
JavaScript,
86111108 BytesAuf jeden Fall golffähig, fügte das Ganze -1 etwa 20 Bytes hinzu.
quelle
R, 107 Bytes
Dies liest von STDIN und druckt zu STDOUT.
Ungolfed + Erklärung:
quelle
C # 166 Bytes
Einfache Codierung. Hier gibt es nichts Besonderes.
C # saugt für Code-Golf: - /
quelle
JavaScript ( ES7? ), 99
Unter Verwendung des Array-Verständnisses ist dies in Firefox implementiert, jedoch nicht mehr in EcmaScript 6 enthalten.
Testen Sie mit dem folgenden Snippet (nur Firefox)
Ungolfed und kompatibler
quelle
Python, 58
quelle
C (167)
VERSUCH ES
WIE FUNKTIONIERT DAS?
quelle
Q (44 Bytes)
ungolfed
quelle
Haskell 96 Bytes
`` `
r
ist eine Funktion, die ein Wort nimmt und ein Tupel zurückgibt,(n,w)
wobein
die Anzahl der Vorkommen des am häufigsten vorkommenden Zeichens im Wort istw
. Zum Beispielx="norep", y="dnredundant"
dann lassenr x=(1,norep), r y=(3,ndredundant)
w
ist eine Funktion, die eine Zeichenfolge verwendet, die mehrere durch Leerzeichen getrennte Wörter enthält und:Teilen Sie die Liste auf Leerzeichen
words p
Für jedes Wort erstellen Sie eine Liste von
(n,w)
nimm das Tupel mit dem größten
n
(Vorkommenszähler)Wenn n gleich 1 ist, geben Sie einfach die Zeichenfolge zurück
-1
, andernfalls das Wort selbst (in der zweiten Komponente des Tupels gespeichert).Zum Beispiel nehmen
p="Today, is the greatest day ever!"
produziert
["Today,","is","the","greatest","day","ever!"]
[(1,"Today,"),(1,"is"),(1,"the"),(2,"greatest"),(1,"day"),(2,"ever!")]
(2, "am größten")
2! = 1 dann
greatest
ist die Lösung!quelle
Pure Bash (keine externen Befehle) 129 Bytes
Dies ist ziemlich lang, aber im Vergleich zu einigen anderen längeren Einträgen immer noch günstig.
Ich bin mit einigen Konstrukten nicht ganz zufrieden, es ist ärgerlich, diese innere for-Schleife verwenden zu müssen. Irgendwelche Vorschläge?
quelle