Ein Pangram ist ein Satz oder ein Auszug, der alle sechsundzwanzig Buchstaben des Alphabets enthält, wie in dieser Code-Golf-Challenge gezeigt wird . Ein pangrammatisches Fenster ist jedoch ein Pangram in Form eines Textsegments, das in der Mitte eines Wortes enden oder beginnen kann und sich irgendwo in einem größeren Werk befindet. Diese kommen natürlich überall vor und sind richtige Untergruppen von echten Pangrams. Es wäre also schon langweilig, zu überprüfen, ob etwas ein pangrammatisches Fenster enthält, und das war auch schon früher der Fall.
Wir sind also daran interessiert, die kleinste zu finden, die es in einem bestimmten Textstück gibt, basierend auf seiner Buchstabenlänge! In kürzester Zeit Code in Bytes natürlich passend zum Thema.
Regeln und Richtlinien
- Empfangen Sie eine Zeichenfolge als Eingabe und geben Sie die Zeichenfolge des kleinsten pangrammatischen Fensters in der Eingabe zurück, falls vorhanden. Ist dies nicht der Fall, geben Sie entweder einen Booleschen Wert oder eine leere Zeichenfolge zurück.
- Ob eine Zeichenfolge ein pangrammatisches Fenster ist oder nicht, ist unabhängig von der Groß- und Kleinschreibung und hängt nur von den 26 Buchstaben ab, nicht von Satzzeichen oder Zahlen oder anderen ungeraden Symbolen.
- In ähnlicher Weise ist die Buchstabenlänge eines pangrammatischen Fensters die Gesamtzahl der Buchstaben, die allein darin vorkommen, und nicht einfach die Anzahl aller Zeichen. Der zurückgegebene Wert muss basierend auf dieser Anzahl am kleinsten sein. Wir sind schließlich Linguisten, keine Programmierer.
- Die Ausgabe eines pangrammatischen Fensters muss jedoch eine exakte Teilzeichenfolge der Eingabe sein, die die gleiche Groß- und Kleinschreibung und Interpunktion usw. enthält.
- Wenn mehrere kürzeste pangrammatische Fenster mit derselben Buchstabenlänge vorhanden sind, geben Sie eines davon zurück.
Testfälle
'This isn't a pangram.'
==> False
'Everyone knows about that infamous Quick-Brown-Fox (the one who jumped over some lazy ignoramus of a dog so many years ago).'
==> 'Quick-Brown-Fox (the one who jumped over some lazy ig'
'"The five boxing wizards jump quickly." stated Johnny, before beginning to recite the alphabet with a bunch of semicolons in the middle. "ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ!" he shouted to the heavens.'
==> 'ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ'
The five boxing wizards jump quickly
zurückgegeben?Q
? Es erhöht die Anzahl der Buchstaben nicht.Antworten:
Pyth,
201614 BytesErläuterung:
Probieren Sie es hier aus!
Wenn es keine richtige Lösung gibt, wird das Programm mit einem Fehler ohne Ausgabe an stdout beendet.
quelle
!-GrT0
kürzer für den Filterzustand, glaube ich. Ich denke auch, dass Sie das brauchenl
, damit die Sortierung richtig funktioniert.l
, und ohne sie erhalten Sie unterschiedliche Ergebnisse . Ich glaube, das Problem sind wiederholte Briefe, aber ich bin nicht 100% sicher.Pyth - 22 Bytes
\ o / FGITW!
Test Suite .
quelle
Ruby, 100 Bytes
Gibt nil zurück, wenn kein Fenster gefunden wird.
quelle
JavaScript (ES6),
139138136 Bytes2 Bytes gespart dank @Neil!
Eingerückt
quelle
[r=l="",...s].map((_,b,a)=>
?map
Funktion.PowerShell v2 +, 218 Byte
Ja, Teilstring-Manipulation (es gibt keine integrierten Funktionen) ist also nicht wirklich die Stärke von PowerShell ...
Wir nehmen Eingaben
param($a)
und setzen eine neue leere Hashtabelle$z
. Dies ist unser Speicher für pangrammatische Teilstrings.Unter Verwendung einer geringfügigen Änderung meines Codes aus Exploded Substrings konstruieren wir alle Teilzeichenfolgen der Eingabe. Ja, sogar Teilzeichenfolgen, die nur aus einem Zeichen bestehen. Dies ist Code-Golf , nicht der schnellste Code . ;-)
Alle diese Teilzeichenfolgen werden in Parens eingekapselt und in eine andere Schleife mit geleitet
|%{...}
. Wir setzen vorübergehend$y
unseren aktuellen Teilstring, setzen einen Hilfszähler$j
und starten eine weitere Schleife65..90|%{...}
, bequem über die ASCII-Zeichencodes für Großbuchstaben. Jede innere Schleife, die wir nehmen$y
, wird in Großbuchstaben geschrieben und das.IndexOf
jeweilige Zeichen herausgezogen. Da dies zurückgibt,-1
wenn es nicht gefunden wird, berechnen wir+1
das Ergebnis, bevor wir es multiplizieren$j
. Dies stellt sicher, dass wenn eines der Zeichen nicht gefunden wird,$j
es gleich Null ist.Welches ist genau das, worum es
if
geht. Wenn$j
ungleich Null ist, bedeutet dies, dass jeder Buchstabe mindestens einmal in der Teilzeichenfolge gefunden$y
wurde. Daher müssen wir diesen zu unserem Kandidatenpool hinzufügen. Wir tun dies , indem sie$y
und-replace
ing jeden nicht-Brief mit nichts, was uns die Brief-Länge dieser Teilzeichen bekommt. Wir verwenden das als Index für die Hash-Tabelle$z
und speichern es$y
an diesem Index. Dies hat den Nachteil, dass Teilzeichenfolgen mit der gleichen Buchstabenlänge überschrieben werden, die in der ursprünglichen Zeichenfolge "am weitesten" vorkommt. Dies ist jedoch nach den Regeln zulässig, da es nur um die Buchstabenlänge geht.Schließlich müssen wir
$z
die kleinsten sortieren und herausziehen. Wir haben die verwenden.GetEnumerator
Anruf , um auf den zu sortieren Inneren Objekte$z
, dannsort
die aufName
(dh die Länge Index von oben), die Auswahl[0]
ten (dh die kürzeste), und zum Ausgeben von dessen.Value
(dh die Teilzeichen ). Wenn keine solche Teilzeichenfolge passt, wird ein error (Cannot index into a null array
)$z
ausgegeben, wenn versucht wird, einen Index zu erstellen, und es wird nichts ausgegeben, was in PowerShell falsch ist. (Der dritte Testfall hat eine explizite Besetzung[bool]
, um dies zu zeigen.)Testfälle
quelle
Haskell, 180 Bytes
Das war schwer, aber sehr lustig ohne Importe.
Viel weniger Golf gespielt:
Überraschung, Überraschung: Es ist sehr langsam.
quelle
Oracle SQL 11.2, 461 Byte
Nicht golfen
Die
s
Ansicht teilt die Eingabe in Zeichen auf und gibt auch die Position jedes Zeichens zurück.Die rekursive Ansicht
v
gibt jede Teilzeichenfolge der Eingabe zurück.S ist die Teilzeichenfolge
der Position des ersten Zeichens der Teilzeichenfolge
l die Position des letzten Zeichens, das der aktuellen Teilzeichenfolge hinzugefügt wurde
Die
c
Ansicht gibt das Alphabet nacheinander ausDie
a
Ansicht gibt das als einzelne Zeichenfolge verkettete Alphabet zurückSELECT s,f,SUM(SIGN(INSTR(LOWER(s),c))
Gibt für jeden Teilstring die Anzahl der darin enthaltenen unterschiedlichen Buchstaben
INSTR
zurück. Gibt die Position eines Buchstabens im Teilstring zurück, 0, wenn nicht vorhanden,SIGN
1, wenn pos> 0, 0, wenn pos = 0WHERE x=26
Filtert die Teilzeichenfolge, die das gesamte Alphabet enthält
TRANSLATE(LOWER(s),' '||a,' ')
Löscht jeden Buchstaben aus der Teilzeichenfolge
LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')
Länge in Buchstaben ist die Länge des Teilstrings minus der Länge des Teilstrings ohne Buchstaben
SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')),0))
Behält nur den Teilstring mit der kleineren Buchstabenanzahl bei.
Wenn es mehr als eine gibt, wird die erste, in aufsteigender Reihenfolge sortiert, beibehalten
quelle
Python 3,
171, 167, 163, 157, 149 Bytes.4 Bytes gespart dank DSM.
8 Bytes dank RootTwo gespart.
Nach der Anzahl der Buchstaben sortieren zu müssen, bringt mich um.
Testfälle:
quelle
.upper()
die Schlüsselfunktion benötigt wird.PowerShell (v4),
198 bis156 ByteTestfälle
Ungolfed Erklärung des Originals
Es ist eine verschachtelte Brute-Force-Schleife, die Schiebefenster aller Größen ermöglicht:
Für jedes Fenster wird nur nach Buchstaben gefiltert (standardmäßig wird zwischen Groß- und Kleinschreibung unterschieden), die verbleibenden Zeichen werden durch einen eindeutigen Filter geleitet und es wird geprüft, ob der Pangram-Test 26 eindeutige Zeichen enthält.
Alle Fenster mit Pangrams werden in Dreiergruppen von (Anzahl der Buchstaben einschließlich Dupes, Startindex, Fensterlänge einschließlich Interpunktion) umgewandelt , die sortiert werden, um die kürzeste nach der Gesamtzahl der Zeichen zu finden, die erste wird ausgewählt und die Ausgabezeichenfolge daraus erstellt .
Es gibt eine Menge Indizierungen außerhalb der Grenzen des Strings, für die PowerShell sinnvollerweise $ null zurückgibt, anstatt Ausnahmen auszulösen.
NB. Der neue 156-Byte-One-Ansatz ist derselbe, wurde jedoch umgeschrieben, um die Pipeline wesentlich stärker zu nutzen.
NB. Ich bin mir nicht sicher, ob die ungolfed Version funktioniert, weil ich sie nicht geschrieben habe, sondern nur zur Erläuterung.
quelle
Haskell, 123 Bytes
Definiert eine Funktion
h
, die die leere Liste zurückgibt, wenn kein pangrammatisches Fenster oder eine Liste mit einem Element mit dem minimalen Fenster vorhanden ist. Anwendungsbeispiel:Wie es funktioniert:
quelle