Kurze und süße Beschreibung der Herausforderung:
Basierend auf ETAOIN SHRDLU besteht Ihre Herausforderung darin, das kürzeste Programm oder die kürzeste Funktion in einer beliebigen Sprache zu schreiben, die die 26 Buchstaben des englischen Alphabets basierend auf ihrer Häufigkeit in der Eingabe ausgibt.
Wirklich lange, trockene und gründliche Spezifikation:
- Ihr Programm / Ihre Funktion erhält als Eingabe eine Textzeichenfolge, die einen oder mehrere Groß- und / oder Kleinbuchstaben sowie Satzzeichen, Ziffern, Symbole und andere nicht alphabetische Zeichen enthält.
- Das Programm / die Funktion darf nur die 26 GROSSBUCHSTABEN des englischen Alphabets ausgeben , einschließlich derjenigen, die nicht in der Eingabe enthalten sind, geordnet nach der Häufigkeit, mit der sie in der Eingabe vorkommen.
- Bearbeiten: Die Frequenz wird unabhängig von Groß- und Kleinschreibung berechnet, die Ausgabe muss jedoch in Großbuchstaben erfolgen.
- Wenn zwei oder mehr Buchstaben dieselbe Häufigkeit haben, können sie in beliebiger Reihenfolge sein.
Andere Ausgaben wie Leerzeichen sind nicht zulässig.- Edit 01.07.2014: Aufgrund von Rückmeldungen ändere ich diese Regel. Die einzige andere Ausgabe, die zulässig ist, ist ein optionales führendes und / oder nachfolgendes Leerzeichen, z. B. ein nachfolgender Zeilenumbruch. Keine andere Ausgabe ist zulässig.
- Undefiniertes Verhalten ist für Eingaben zulässig, die keine Buchstaben enthalten.
Der Gewinner wird in 7 Tagen ermittelt, also lassen Sie die Finger tippen!
Beispiel Eingabe:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vitae erat velit. Mauris gravida euismod libero ut tincidunt. Phasellus elit dui, consectetur et egestas in, aliquam vitae diam. Donec eget varius ante. Vestibulum cursus diam aliquet, egestas orci quis, placerat dolor. Proin vel nisi lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam erat volutpat. Etiam libero tortor, ornare id dui eget, posuere dignissim libero. Pellentesque commodo consequat volutpat. Integer hendrerit sapien libero, vel viverra augue facilisis sit amet. Quisque consectetur eget nisl quis dignissim. Ut lacinia pretium quam a placerat.
Morbi sed interdum risus, nec pretium lectus. Morbi imperdiet est id accumsan molestie. Duis sed fermentum nisl. Nunc vitae augue mattis, dictum lectus vel, accumsan nisl. Sed ultricies adipiscing rhoncus. Vivamus eu lacus a enim venenatis eleifend. Praesent consectetur tortor non eleifend ultricies. Mauris et odio posuere, auctor erat at, fringilla est. Proin in vestibulum erat. Maecenas congue commodo ante vel varius. Sed tempus mi ut metus gravida, nec dictum libero dapibus. Morbi quis viverra elit. Ut pharetra neque eget lacus tincidunt dictum. Fusce scelerisque viverra tellus et pretium.
Fusce varius adipiscing odio. Nulla imperdiet faucibus sem, at rhoncus ipsum adipiscing vitae. Phasellus imperdiet congue lacus et mollis. Nullam egestas mauris magna, et mollis lectus varius ut. Sed sollicitudin adipiscing dolor, vel elementum elit laoreet molestie. Aliquam nec nulla vel sem ultrices ullamcorper. Nullam nec felis magna. Duis sodales orci non justo aliquam tempus. Integer mi diam, tempor sed vulputate et, varius et nunc. Vestibulum sodales ipsum id mi pharetra, ut convallis mi accumsan. Sed dictum volutpat vestibulum.
Quisque ac dolor sagittis, aliquam libero at, euismod enim. Nulla ullamcorper posuere nulla vitae varius. Nam at dolor non libero elementum pellentesque in in lorem. Fusce porttitor turpis in quam placerat varius. Donec lorem orci, condimentum eu sapien sit amet, aliquet commodo magna. Quisque sed lectus sit amet arcu euismod accumsan et non nunc. Phasellus placerat congue metus, feugiat posuere leo dictum quis. Sed ultricies feugiat eros dignissim bibendum.
Mauris scelerisque consectetur libero eget varius. Aenean neque nunc, ullamcorper vitae orci in, auctor ornare sapien. Nam lacinia molestie imperdiet. Nam vitae mattis nibh. Vestibulum consequat tellus ac nisi sagittis pulvinar. Nullam mollis ornare quam, et venenatis leo porttitor sit amet. Nulla urna neque, dignissim non orci ut, volutpat ultrices erat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque vestibulum tellus nec eros faucibus porta.
Beispielausgabe:
EITUSALNROMCDPVGQBFHJKWXYZ
Hinweis: KWXYZ
Für diesen Eingang besteht eine 5-Wege-Verbindung .
Bearbeiten:
Der Wettbewerb ist vorbei! Vielen Dank an alle, die teilgenommen haben. Und jetzt zu den Gewinnern: Sowohl Dennis 'CJam- als auch isaacgs Pyth- Antworten kamen mit satten 19 Zeichen. (Tut mir leid, aber ich werde keine der Antworten akzeptieren, da ich denke, dass es für die anderen unfair wäre.) Bearbeiten: Ich nehme Dennis 'Rat an und markiere seine Antwort als akzeptiert, weil er die erste war erreichen 19 Zeichen. Lobende Erwähnungen gehen an Ilmari Karonens drittplatzierte Golfscript-Antwort mit 22 Zeichen sowie an die 75- Zeichen -Python-Antwort von undergroundmonorail mit den meisten positiven Stimmen. Nochmals vielen Dank an alle, die teilgenommen haben!
Antworten:
CJam,
2119 BytesProbieren Sie es online aus.
Beispiel
(kein Zeilenumbruch)
Wie es funktioniert
Mehr Vorkommen bedeuten, dass mehr Zeichen entfernt werden, sodass die häufigsten Zeichen am Anfang des Arrays angezeigt werden.
quelle
Python 2 oder 3 -
7775 BytesIch hatte zuvor eine Antwort, die ich von STDIN erhalten hatte, aber mir wurde klar, dass dies technisch ungültig war. Ich habe verwendet,
input()
dass nur eine einzelne Zeile erhalten wird, aber die Beispieleingabe der Frage impliziert, dass mehrere Zeilen gleichzeitig behandelt werden sollen. Um die Spezifikation zu erfüllen, habe ich meine Antwort in eine Funktion umgewandelt, die ein String-Argument akzeptiert. Zu meiner Überraschung war es zwei Bytes kleiner! Mir ist das nicht eingefallenprint(...)
undinput()
waren länger alsf=lambda s:
unds
.Dies macht die Antwort auch mit Python 2 und Python 3 kompatibel. Ursprünglich war es nur Python 3, weil es verwendet wurde
input()
(wasraw_input()
in 2 aufgerufen wurde). Jetzt, da es eine Funktion ist, funktioniert es in beiden.Erklärt
quelle
count
ist keine Variable oder irgendetwas, es ist eine Literalfunktion . So cool , wie es wäre in der Lage zu sein , eine Funktion Rückgabewert zu multiplizieren , indem-1
durch ein Festhalten-
vor, dass ein Feature Python nicht das hat.Bash, 65 Bytes
Beispiel
Wie es funktioniert
quelle
{A..Z}
. Alle LC_COLLATE-Locales funktionieren, da OpenBSD nur LC_COLLATE = C hat.Pyth 1.0.2 , 19
20Versuchen Sie es hier: http://ideone.com/fork/YlWpEJ
Weitere Informationen zu Pyth finden Sie hier: http://esolangs.org/wiki/Pyth
Beispiel:
Gibt:
Erläuterung:
=ZUw
: Eingabe in Großbuchstaben konvertieren und in Z speichern.sV
: Gibt die Summe der Umkehrung von ausm;d
: Die letzten Einträge vonS
: Sortiert nach dem ersten Eintrag in aufsteigender Reihenfolgem[cZkk)
: Die Listen [Anzahl von k in Z, k]UG
: Für k in Großbuchstaben.Grobes Python-Äquivalent:
Dies ist kein Eintrag, ich dachte nur, die Leute würden ihn gerne sehen. In Pyth 1.0.4 ist das folgende Programm eine Lösung mit 10 Zeichen:
Erläuterung:
JUw
: Eingabe in Großbuchstaben konvertieren und in J speicherno
: (Drucken) Sortieren nach_cJN
: -1 * (Anzahl von N in J)UG
: Über N in Großbuchstaben.Es ist keine legale Lösung, da einige der Änderungen von Pyth 1.0.2 auf 1.0.4, einschließlich des Hinzufügens der
o
Funktion "Sortieren nach", auf dieses Problem reagiert haben.quelle
Z
, um später erneut darauf zuzugreifen? Würde nur das Setzen des AusdrucksZ
an seine Stelle dazu führen, dass die Eingabe mehrmals gelesen würde?Javascript ( ES6 )
119117Bearbeiten: (-2) Die
toUpperCase
Verwendung von RegEx, bei demsplit
die Groß- und Kleinschreibung nicht berücksichtigt werden muss , wurde entfernt.Alternative (gleiche Länge): Die Sortierung und die Anzahl der Zeichen wurden zu einer einzigen Funktion zusammengefasst.
Als Funktion:
105104Bearbeiten: (-1) Die Sortierung und die Anzahl der Zeichen wurden zu einer einzigen Funktion zusammengefasst.
quelle
GolfScript, 22 Zeichen
Probieren Sie es online aus.
Erläuterung:
:?
Weist die Eingabezeichenfolge dem Symbol zu?
. (Ich verwende ein Interpunktionssymbol, damit die folgende Zahl91
nicht als Teil des Symbolnamens analysiert wird.)91,
erstellt eine Liste der Zahlen von 0 bis 90 (ASCII-Code vonZ
).+
Hängt diese Liste an die Eingabezeichenfolge an und konvertiert sie dadurch von einem Array von ASCII-Codes in eine Zeichenfolge (und entfernt die Eingabezeichenfolge bequemerweise auch vom Stapel).-26>
Nimmt die letzten 26 Zeichen dieser Zeichenfolge und erzeugt eine Zeichenfolge, die die ASCII-Großbuchstaben vonA
bis enthältZ
.{ }$
wendet den Codeblock auf alle Zeichen in der Eingabezeichenfolge an und sortiert diese Zeichen gemäß dem Ergebnis..
Dupliziert das Zeichen im Codeblock und32+
konvertiert die Kopie von Groß- in Kleinbuchstaben. Der]
sammelt diese beiden Zeichen in einem Array,?\-
nimmt die in gespeicherte Eingabezeichenfolge?
und entfernt alle Vorkommen der Zeichen im Array daraus und,
zählt die Länge der verbleibenden Zeichenfolge, die der Sortierschlüssel sein wird. Die Zeichen werden mit diesem Schlüssel in aufsteigender Reihenfolge und damit in absteigender Reihenfolge nach Anzahl der Vorkommen sortiert.quelle
91,+-26>
.22
, anstatt25
:)Haskell, 110 Bytes
Anwendungsbeispiel:
quelle
(/=c)
und loswerden0-
?Ruby 2.0, 53 Zeichen
BEARBEITEN : Behoben, dass es mit mehrzeiligen Strings korrekt funktioniert, danke @ durron597!
Erstellt eine aufgerufene Funktion,
f
die wie folgt verwendet werden kann:Druckt nach STDOUT:
quelle
EITASUROLNCMPDVQGBHFKJWXYZ
für das Beispiel in der Fragegets
eine Zeile zurückgegeben. Es kann repariert werden, indem man zu wechseltgets
,gets$n
aber es in eine Funktion umwandelt, die 1 Zeichen kürzer ist.Perl,
5446 BytesUPDATE: nach weiteren Optimierungen konnte es auf 46 Bytes komprimiert werden: (thx dennis for
-n
/{}
hack; chinese perl goth for<=>
->-
hack)Es ist zu laufen mit laufen mit
perl -nE
Originallösung (benötigt keine speziellen Perl-Optionen):
Verifiziert in Perl 5.8.3, 5.14.2
Wenn Sie eine Warnung erhalten, getrennt
eg
undfor
mit einem Raum (1 Zeichen), wenn Sie nichts dagegenBeispielverwendung:
ERKLÄRUNG: Wenden Sie auf jedes Zeichen (
.
) jeder Eingabezeile (for<>
) ein Substitutionsmuster an, das in der Tat als Ausdruck (e
Flag dess///
) gewertet wird und ein hochgestelltes (uc
) Zeichen inkrementiert (.
/$&
ist kürzer als offensichtlich(.)
/$1
) im (nicht initialisierten) Hash (%h
) zählen. Der Buchstabenhäufigkeits-Hash wird dann in einer Sortiervergleichsfunktion verwendet, um Großbuchstaben in der richtigen Reihenfolge auszudrucken.quelle
perl -ne 's/./$h{uc$&}++/eg}{print sort{$h{$b}<=>$h{$a}}A..Z'
-n
undEND{}
, aber sie waren immer länger ..-n
umbrochenwhile(<>){...}
. Ich vermeide es, den Code anderer Benutzer zu bearbeiten. Zu einfach, um einen Fehler zu machen, funktionieren einige Dinge nur auf einigen Computern usw.}{
"Injektion" gesprochen, nicht nur über die bekannte-n
Option. Man könnte nicht erwarten , dass das Code - String tatsächlich technisch wird durch den while - Schleife - Code - String vor der Ausführung gewickelt, nicht nur gerade , dass es funktioniert irgendwie wie als wenn es wurde eingewickelt ..$h{$b}<=>$h{$a}
durch$h{$b}-$h{$a}
R, 123 Bytes
Der Code wird dank der Vorschläge von @RichieCotton verbessert.
Ausgabe:
quelle
C ++,
185183179177 BytesNatürlich wird kein Sieg erwartet (kann C ++ jemals gewinnen?), Aber dennoch eine unterhaltsame Übung.
Erläuterung:
quelle
VBScript
181109Aktualisiert, um einen völlig anderen Algorithmus zu verwenden. Schlägt JavaScript!
Ziemlich:
Golf gespielt:
quelle
J
4135 BytesDemo:
Erläuterung:
Der Schlüssel ist, das linke Array anzuhängen, so dass alle Buchstaben verfügbar und bereits in Ordnung sind. Eine lustige Konsequenz der Verwendung eines Substantivs als dritter Spruch für die Gabel ist, dass es sowohl als Verb als auch als Phrase funktioniert.
quelle
Groovy -
1301231151129892Nach @ cfricks Rat (zweimal!):
Ein kleiner Test (schamlos von @jpjacobs gestohlen):
Und der vorgeschlagene Test ist auch erfolgreich
quelle
f={('A'..'Z').collectEntries{c->[c,it.toUpperCase().findAll(c).size()]}.sort{-it.value}.keySet().join()}
für 104it.grep(~/(?i)$c/)
stattit.toUpperCase().grep(c)
toUpperCase
störte mich verdammt noch mal.SAS - 217 (glaube ich)
Die Eingabe sollte in der Zeile nach der Anweisung cards4 oder auf den entsprechenden Lochkarten für Ihr System erfolgen. Ich denke, dieser Ansatz spart ein paar Zeichen gegenüber dem Versuch, die Eingabe zu zitieren.
Mir ist bewusst, dass dies nicht die vollständige Spezifikation erfüllt, da nur Zeichen zurückgegeben werden, die in der Eingabezeichenfolge enthalten sind. Ich muss das vielleicht ein bisschen überdenken.
quelle
AppleScript, 278
Mir ist aufgefallen, dass
"a" = "A"
dies in AppleScript zutrifft. Ich kann dies in Code Golf verwenden, aber der Rest des Skripts ist zu wortreich. Ich habe AppleScript 1.8.3 verwendet.Dies definiert eine Funktion
f
. Wenn Sief("a string")
am unteren Rand des Skripts hinzufügen und es im Skript-Editor ausführen, wird das Ergebnis angezeigt.Formatiert und kommentiert:
quelle
VBScript
157156 BytesBearbeiten: msgbox (p) in msgbox p geändert
Besser lesbar:
Golf: (155 Zeichen + 1 Wagenrücklauf)
Ich hatte es bei 171 vorhin mit Code, den ich interessanter fand, aber die Sortiermethode von comfortablydrei ist kürzer und erfordert len (s), was ein "for" kürzer macht als das "while" für die erste Schleife. (gähnen)
quelle
for t=0
sollte seinfor t=1
, sonst druckst du immer das ganze Alphabet.J -
3835 charEine Funktion, die die Eingabe rechts als Zeichenfolge aufnimmt. Kein Gewinner, aber es hat Spaß gemacht zu schreiben.
Erklärt:
toupper
ist ein Verb in der Standardbibliothek, das eine Zeichenfolge in den Vordergrund stellt. Das wird dann das rechte Argument des Verbs, während das linke Argument das Alphabet ist: ASCII-Codepunkte 65 bis 90.[
und,e.~#])
wählt (#
) die Buchstaben im rechten arg (]
) aus, die Elemente dese.~
linken arg ( ) sind , und stellt dann (,
) das linke arg ([
) voran . Wir behalten also nur die Großbuchstaben bei und fügen am Ende eine einzige Kopie des Alphabets hinzu, um sicherzustellen, dass alle gefunden werden.#/.~@
gibt dann die Frequenzen der einzelnen Zeichen an. Es kommt also vor, dass dies in alphabetischer Reihenfolge angegeben wird, so dass wir gleich danach\:
das Alphabet (das linke Argument[
) heruntersortieren können .Ein schnelles faules Beispiel unten. Probieren Sie es einfach auf tryj.tk aus .
quelle
T-SQL 178
Grundsätzlich ist dies meine VBScript-Lösung, die jedoch in SQL implementiert ist.
Dies ist ein Missbrauch der XML-Ausgabe, um eine Spalte zu verketten. In der Praxis kann es mit einer äußeren Tabelle verknüpft werden, um
GROUP_CONCAT
Funktionen in MySQL und anderen zu emulieren .Deklaration der
@
Variablen:Code:
quelle
Perl, 78 Bytes
Ergebnis für das Beispiel in der Frage:
Ungolfed:
quelle
echo -e 'x\ny\n\nz\n'
Ausgabe, die zurückgeben sollteXYZABCDEFGHIJKLMNOPQRSTUVW
, sondern ergibtXYABCDEFGHIJKLMNOPQRSTUVWZ
stattdessen.PHP - 105 Bytes
Hier ist ein Hexdump, wegen der Sonderzeichen:
Und eine etwas weniger golfene Version:
Beispiel:
quelle
preg_filter()
?echo join(array_keys($f));
kann ein Byte speichernC # in LINQPad - 203 Bytes
Ich habe eine andere Herangehensweise an die Antwort von Logan Dam gewählt. Ich habe zuerst sichergestellt, dass jedes Zeichen in der Eingabezeichenfolge nach seinem Aussehen sortiert ist und nur einmal in der Ausgabezeichenfolge vorhanden ist. Danach habe ich jedes fehlende Zeichen aus dem Alphabet in die Ausgabezeichenfolge eingefügt.
Leider würde es die Antwort von Logan Dam nicht übertreffen, wenn ich das in Visual Studio gemacht hätte.
Mehr lesbare Version:
quelle
C # (und LINQ)
255226210 BytesNach dem Rat von Patrick Huizinga ist die Abfragesyntax jetzt kürzer:
Erläuterung:
Äquivalente Methodensyntax (217):
Ursprünglicher Beitrag:
quelle
P
anstelle vonProgram
undstring[]a
anstelle vonstring[] args
undc=>...
anstelle von benennen(c)=>...
.using
Anweisungen können Sie Ihre Klasse auch in denSystem.Linq
Namespace einfügen und beide mithilfe von Anweisungen entfernen. Dann können Sie einige Zeichen speichern und es wird immer noch gut funktionieren.namespace
es länger ist alsusing
und die zwei zusätzlichen{}
s mich mehr kosten.namespace System.Linq{}
ist deutlich kürzer alsusing System;using System.Linq;
nur beim Betrachten. Die Idee ist, beidesusing
komplett wegzulassen .C ++
701322232 BytesErste Version 701 Bytes (idiomatische AWL-Verwendung)
Erweiterte saubere Version:
Die Idee ist, ein "richtiges" C ++ - Programm ohne irgendwelche Hacks zu demonstrieren. Ignorieren Sie das Boilerplate und die Tatsache, dass dies nur unter VC ++ kompiliert wird
Erklärung:
Wir füllen eine Zeichenfolge mit iota () von A bis Z. Dies stellt sicher, dass jedes Zeichen angezeigt wird, wenn wir die Vorkommen zählen, auch wenn es nicht in der Eingabe enthalten ist.
transform () kopiert Zeichen für Zeichen aus der Standardeingabe und setzt es nach dem Aufruf von toupper () an das Ende von s
Die Anzahl der einzelnen Zeichen wird in der Karte verringert (durch Beibehalten negativer Zählwerte kann die Sortierung ohne zusätzlichen Code absteigend sein).
Die Einträge der Zählungszuordnung werden in eine Reihe von Paaren kopiert, wobei (char, count) zu (count, char) getauscht wird. Da die Sets geordnet sind, werden sie nach abnehmender Häufigkeit sortiert
Schließlich kopieren wir den Inhalt der Gruppe mit transform und select2nd () , um nur das zweite Mitglied des Paares auszuwählen.
Der Code ist ziemlich gut lesbar. Eine C ++ 11-Lösung würde viel schöner aussehen, da wir Lambdas verwenden können
C ++ 11-Version - keine Lambdas erforderlich, aber Auto- und Range-basiert macht die Dinge sehr sauber.
Erweiterte Version:
Nächste Iteration (warum von stdin lesen, wenn wir argv haben):
Erweiterte Version:
quelle
Gelee , 9 Bytes (nicht konkurrierend)
Erläuterung
Dies lautet wie folgt: "Sortieren Sie das Alphabet in Großbuchstaben nach der Anzahl der Vorkommen in der Eingabe in Großbuchstaben, in umgekehrter Reihenfolge", was eine ziemlich wörtliche Übersetzung der Herausforderung ist: P
Probieren Sie es online!
Diese Herausforderung stand im Zusammenhang mit Jelly HyperTraining, bei dem wir die Herausforderung gelöst haben. Ich gab dieses bekannt, weil ich das erste war, zum 10 Bytes zu erreichen.
-1 Byte dank Erik the Outgolfer (JHT Lehrer)
quelle
ØAŒuċ¥@ÞU
C ++ 377
Implementiert qsort unter Verwendung der Buchstabenanzahl in Array n, um das Alphabet in Array A zu sortieren. Führen Sie Folgendes über die Befehlszeile aus:
golf.exe < in.txt
quelle
C 117 (119) Bytes
95
mit223
1 zusätzlichen Byte.char c;
zu nurc;
und++c
zuc=c+1%255
.quelle
PowerShell - 139 Zeichen
Erstens bin ich kein PowerShell-Experte. Ich bin mir ziemlich sicher, dass es kürzere gibt. War aber zufrieden damit und entschloss sich zu teilen.
Wie es funktioniert:
quelle
Ceylon , 98 Bytes
quelle
APL,
2620 Zeichen⎕a[⍒+/⎕a∘.=('\w'⎕r'\u0')⍞]
⎕a[⍒+/⎕a∘.=1(819⌶)⍞]
-6 danke an Adam.
quelle
('\w'⎕r'\u0')
→1(819⌶)