Un pangram est une phrase ou un extrait qui contient les vingt-six lettres de l'alphabet, comme le démontre ce défi de golf de code . Cependant, une fenêtre pangrammatique est un pangram sous la forme d'un segment de texte, qui peut se terminer ou commencer à mi-chemin d'un mot, trouvé quelque part dans une œuvre plus grande. Celles-ci se produisent naturellement partout, étant des sous-ensembles appropriés de vrais pangrammes, donc vérifier simplement si quelque chose contient une fenêtre pangrammatique serait ennuyeux et cela a déjà été fait auparavant.
Donc, nous sommes intéressés à trouver le plus petit dans un morceau de texte donné en fonction de sa longueur de lettre! Dans le code le plus court possible en octets, bien sûr, pour s'adapter au thème.
Règles et directives
- Recevez une chaîne en entrée et renvoyez la chaîne de la plus petite fenêtre pangrammatique dans l'entrée s'il y en a une. Si ce n'est pas le cas, renvoyez un booléen faux ou une chaîne vide.
- Qu'une chaîne soit ou non une fenêtre pangrammatique est insensible à la casse et ne dépend que des 26 lettres, pas de la ponctuation ou des nombres ou d'autres symboles impairs.
- De même, la longueur des lettres d' une fenêtre pangrammatique est le nombre total d'apparitions de lettres qui s'y trouvent seules, et pas simplement le nombre de chaque caractère. La valeur retournée doit être la plus petite en fonction de ce nombre. Nous sommes des linguistes, après tout, pas des programmeurs.
- Une sortie d'une fenêtre pangrammatique doit cependant être une sous-chaîne exacte de l'entrée, contenant les mêmes majuscules et ponctuation, etc.
- S'il existe plusieurs fenêtres pangrammatiques les plus courtes de la même longueur de lettre, renvoyez l'une d'entre elles.
Cas de test
'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
retourné?Q
? Cela n'ajoute rien au nombre de lettres.Réponses:
Pyth,
201614 octetsExplication:
Essayez-le ici!
Lorsqu'il n'y a pas de solution correcte, le programme se termine avec une erreur sans sortie vers stdout.
la source
!-GrT0
plus court pour l'état du filtre, je crois. Je pense aussi que vous avez besoin dul
pour que le tri fonctionne correctement.l
, et sans lui, vous obtenez des résultats différents . Je crois que le problème vient des lettres répétées, mais je ne suis pas sûr à 100%.Pyth - 22 octets
\ o / FGITW!
Suite de tests .
la source
Ruby, 100 octets
Renvoie nil si aucune fenêtre n'est trouvée.
la source
JavaScript (ES6),
139138136 octetsSauvegardé 2 octets grâce à @Neil!
Dentelé
la source
[r=l="",...s].map((_,b,a)=>
?map
fonction.PowerShell v2 +, 218 octets
Oui, donc la manipulation de la sous-chaîne (il n'y a pas de fonction intégrée) n'est pas vraiment le point fort de PowerShell ...
Nous prenons des informations
param($a)
et définissons une nouvelle table de hachage vide$z
. Ce sera notre stockage de sous-chaînes pangrammatiques candidates.En utilisant une légère modification de mon code des sous- chaînes explosées , nous construisons toutes les sous-chaînes de l'entrée. Oui, même les sous-chaînes de ponctuation à un seul caractère. C'est du code-golf , pas du code le plus rapide . ;-)
Toutes ces sous-chaînes sont encapsulées dans des parens et canalisées dans une autre boucle avec
|%{...}
. Nous définissons temporairement$y
notre sous-chaîne actuelle, définissons un compteur d'assistance$j
et commençons une autre boucle65..90|%{...}
, commodément sur les codes de caractères ASCII pour les lettres majuscules. Chaque boucle intérieure, nous la prenons, la rendons$y
tout en majuscules et retirons.IndexOf
ce caractère particulier. Puisque cela reviendra-1
s'il n'est pas trouvé, nous obtenons+1
le résultat avant de le multiplier$j
. Cela garantit que si aucun caractère n'est trouvé,$j
sera égal à zéro.C'est exactement de cela qu'il
if
s'agit. Si$j
est différent de zéro, cela signifie que chaque lettre a été trouvée au moins une fois dans la sous-chaîne$y
, nous devons donc l'ajouter à notre pool de candidats. Nous le faisons en prenant$y
et en-replace
ingérant chaque non-lettre avec rien, ce qui nous donne la longueur de lettre de cette sous-chaîne. Nous l'utilisons comme index dans une table de hachage$z
et stockons$y
à cet index. Cela a la particularité d'écraser des sous-chaînes de la même longueur de lettre avec celle qui se trouve "la plus éloignée" dans la chaîne d'origine, mais cela est autorisé par les règles, car nous ne nous préoccupons que de la longueur de la lettre.Enfin, nous devons trier
$z
et retirer le plus petit. Nous devons utiliser l'.GetEnumerator
appel afin de trier les objets à l'intérieur$z
, puissort
ceux surName
(c'est-à-dire l'indice de longueur par le haut), en sélectionnant le[0]
e (c'est-à-dire le plus court) et en sortant son.Value
(c'est-à-dire la sous-chaîne). Si aucune telle sous-chaîne ne convient, cela lancera une erreur (Cannot index into a null array
) lorsqu'elle essaiera de$z
s'indexer et de ne rien produire, ce qui est falsey dans PowerShell. (le troisième cas de test ci-dessous a une distribution explicite[bool]
pour le montrer)Cas de test
la source
Haskell, 180 octets
C'était dur, mais vraiment amusant sans importations.
Beaucoup moins golfé:
Surprise, surprise: c'est vraiment lent.
la source
Oracle SQL 11.2, 461 octets
Non golfé
La
s
vue divise l'entrée en caractères et renvoie également la position de chaque caractère.La vue récursive
v
renvoie chaque sous-chaîne de l'entrées est la sous-chaîne
f la position du premier caractère de la sous-chaîne
l la position du dernier caractère ajouté à la sous-chaîne courante
La
c
vue renvoie l'alphabet, une lettre à la foisLa
a
vue renvoie l'alphabet concaténé en une seule chaîneSELECT s,f,SUM(SIGN(INSTR(LOWER(s),c))
Renvoie pour chaque sous-chaîne le nombre de lettres distinctes présentes dans celle-ci
INSTR
renvoie la pos d'une lettre dans la sous-chaîne, 0 si non présentSIGN
renvoie 1 si pos> 0, 0 si pos = 0WHERE x=26
Filtre la sous-chaîne contenant tout l'alphabet
TRANSLATE(LOWER(s),' '||a,' ')
Supprime chaque lettre de la sous-chaîne
LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')
La longueur en lettres est la longueur de la sous-chaîne moins la longueur de la sous-chaîne sans lettres
SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')),0))
Conserve uniquement la sous-chaîne avec le plus petit nombre de lettres.
S'il y en a plus d'un, le premier, trié par ordre croissant, est conservé
la source
Python 3,
171, 167, 163, 157, 149 octets.4 octets enregistrés grâce à DSM.
8 octets enregistrés grâce à RootTwo.
Devoir trier en fonction du nombre de lettres me tue.
Cas de test:
la source
.upper()
c'est nécessaire dans la fonction clé.PowerShell (v4),
198156 octetsCas de test
Explication non golfée de l'original
C'est une boucle imbriquée par force brute qui crée des fenêtres coulissantes de toutes tailles:
Pour chaque fenêtre, il filtre uniquement les lettres (correspondance regex insensible à la casse par défaut), exécute les caractères restants via un filtre unique, vérifie s'il y a 26 caractères uniques comme test pangram.
Toutes les fenêtres avec des pangrammes sont transformées en triplets de (nombre de lettres, y compris les dupes, index de début, longueur de la fenêtre, y compris la ponctuation) , qui sont triés pour trouver le plus court par nombre total de caractères, le premier est choisi et la chaîne de sortie construite à partir de cela .
Il y a beaucoup d'indexation en dehors des limites de la chaîne, pour laquelle PowerShell renvoie utilement $ null, au lieu de lever des exceptions.
NB. le nouveau 156 octets est la même approche, mais réécrit pour utiliser le pipeline beaucoup plus.
NB. Je ne suis pas sûr que la version non golfée fonctionne, parce que je n'ai pas écrit ça puis je l'ai joué au golf, c'est juste pour une exposition.
la source
Haskell, 123 octets
Définit une fonction
h
, qui renvoie la liste vide s'il n'y a pas de fenêtre pangrammatique ou une liste d'un élément avec la fenêtre minimale. Exemple d'utilisation:Comment ça fonctionne:
la source