Les gens sur ce site aiment vraiment embellir leurs titres de poste ...
Stewie's sequence: + * - / + * - /
Cependant, lorsque ce titre doit être inclus dans l'URL de la page, il est simplifié:
stewies-sequence
Le défi
Votre tâche consiste à créer un programme ou une fonction qui, étant donné une chaîne représentant un titre de publication, génère / renvoie sa conversion "URL-Friendly".
L'algorithme est:
- Convertir en minuscules (le cas échéant)
- Remplacez chaque espace (
), point (
.
), virgule (,
) ou barre oblique (/
) par un tiret (-
) - Supprimez tous les caractères non alphanumériques, à l'exception des tirets.
- Réduisez les groupes de tirets adjacents (
a---b -> a-b
), supprimez ceux qui mènent / suivent.
Veuillez noter que cet algorithme est une simplification et peut ne pas toujours produire les mêmes résultats que la méthode réelle du site.
Règles
- Vous pouvez supposer que l'entrée:
- Ne sera pas vide.
- Contiendra au moins un caractère alphanumérique.
- Ne contiendra que des caractères dans la plage ASCII 32-126 (imprimable)
- Les programmes ou fonctions complets sont autorisés.
- Un builtin qui fait la spécification de tâche exacte n'est pas autorisé.
- Il s'agit de code-golf , donc la solution la plus courte (en octets) l'emporte!
Cas de test
La plupart des messages sur ce site serviront de tests, mais voici une liste pratique:
Loading... Forever -> loading-forever
N(e(s(t))) a string -> nest-a-string
"Hello, World!" -> hello-world
URL-Friendly titles -> url-friendly-titles
C.U.S.R.S -> c-u-s-r-s
1+2+3+4+...+n = -1/12? -> 1234-n-1-12
How can I use cmp(a,b) -> how-can-i-use-cmpa-b
Certains plus longs ...
Export The $PATH Variable, Line-By-Line -> export-the-path-variable-line-by-line
Do n and n^3 have the same set of digits? -> do-n-and-n3-have-the-same-set-of-digits
Quine Anagrams! (Cops' Thread) -> quine-anagrams-cops-thread
The Golfer Adventure - Chapter 1 -> the-golfer-adventure-chapter-1
Bootloader golf: Brainf*** -> bootloader-golf-brainf
Et quelques échantillons de vérification de bord (n'hésitez pas à suggérer plus):
0123 -> 0123
a a1 -> a-a1
2-1=1 -> 2-11
-
? Devront-ils être supprimés? Par exemple dansasdf-
, le dernier-
devra-t-il être supprimé?if(isalphanum(ch))...
_
soulignements? Mon code fonctionne sauf lorsqu'il y a des traits de soulignement.Réponses:
Rétine,
3331 octets(Le programme a une nouvelle ligne de fin)
Je ne suis pas sûr de pouvoir en tirer davantage. Cela devrait couvrir tout. Entré similaire à Mama Fun Roll's. Une autre version de 33 octets utilisant des expressions rationnelles récursives
Essayez-le en ligne!
Explication
Cette ligne est simple, elle se transforme en minuscule par T ransliterating
A-Z
(L
) ena-z
(l
, minuscule).Cette étape est simple, elle se débarrasse essentiellement de tous les personnages inutiles pour nous éviter beaucoup de problèmes plus tard
[^a-z ,-9]
Correspond à tout caractère qui n'est PAS:a-z
: alphabet minuscule (rappelez-vous que la chaîne entière est en minuscule à cause de l'élément précédent): espace chacacter
,-9
il s'agit de la plage de codes de caractères,
à9
laquelle il se trouve,-./0123456789
, exactement les caractères dont nous avons besoinEnsuite, nous convertissons tous les caractères non alphanumériques en tirets (ce qui est maintenant juste
et
,./-
.Cela ne correspondra pas (pas) à
_
ce qui est inclus dans\w
(négation de\W
) car il a été supprimé à l'étape précédentela source
a = b
.a = b
:(JavaScript (ES6),
90827975 octetsIl s'agit d'une tentative de faire le travail avec un seul
replace()
. Ce code extrait uniquement les caractères qui nous intéressent et ignore tout le reste. Il y a une logique supplémentaire pour traiter les tirets.Cas de test
Afficher l'extrait de code
la source
,a^a,
, ce code donne-aa-
(il y a des tirets de tête / de fin)V ,
41, 40, 37, 36 octetsEssayez-le en ligne! ou Vérifiez tous les cas de test à la fois!
Comme d'habitude, ici cela contient un tas de caractères non imprimables et non ASCII, voici donc un hexdump:
Ce sont des défis comme ceux-ci où le système "Compression regex" de V est utile.
Explication
Tout d'abord, nous allons tout convertir en minuscules. Heureusement, il existe un moyen très pratique de le faire en deux octets. J'ai écrit un conseil à ce sujet ici . Donc on fait
Après cela, nous faisons un tas de commandes de substitution compressées. Un bon aperçu du fonctionnement des expressions rationnelles compressées de V peut être ici , mais l'idée de base est que nous pouvons définir le bit haut pour éviter d'avoir à échapper à certains caractères. Une autre commodité est que les plages (comme
:%
) et les drapeaux (comme/g
) sont remplis automatiquement. Mais au final, tout cela se traduit par des commandes de substitution vim. En fait, nous pourrions même traduire directement le reste du programme en vim. Cela nous donnerait ceci:Si vous parlez vim-regex, il devrait être plus clair ce que fait le reste du programme maintenant. Voici donc le reste du programme:
la source
JavaScript (ES6) 91
961 octet enregistré thx @ETHproductions
Tester
la source
*
dans la dernière expression régulière, bien que je puisse me tromperPython 3,
1031009695 octets5 octets enregistrés grâce à Flp.Tkc
la source
Rétine, 34 octets
Essayez-le en ligne!
Notez la nouvelle ligne de fin. Essentiellement la mise en œuvre du PO.
la source
T`L`l
pour passer en minuscules avec moins d'octetsa..
snd similaire[\W]
est juste\W
MATL , 38 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Rubis ,
6160616453 octets(52 octets de code plus un octet pour le
-p
)Essayez-le en ligne!
Mise à jour 1: l'
utilisationgets
au lieu du mode d'édition de flux de Ruby permet d'économiser un octet.Revenu selon la suggestion de ValueInk .
Mise à jour 2: (+3 octets au total)
..--hi, $/
(→hi
) (+10 octets) - avec l'aimable autorisation de l'utilisateur ValueInk-p
(+1 octet)squeeze
et utilisé à lagsub
place (+2 octets) , ce qui m'a permis de:strip
pour gérer les tirets de début et de fin (-10 octets) .Mise à jour 3: Hattrick par ValueInk. Nous économisons 11 octets en tirant parti
String#split
de l'habitude de compression automatique des séquences du même séparateur, ce qui nous permet d'abandonner la chaînestrip
/ finale complètegsub
et de la remplacer par un combosplit
/join
. (-11 octets)la source
-p
drapeau, mais ce ne sera certainement pas le cas.-p
indicateur ajoute implicitement 1 octet à votre code (car il change l'exécution de votre code deruby -e 'your code'
àruby -pe 'your code'
). J'ai également trouvé un cas de bord où il donne-hi-
une entrée comme..--hi, $/
lorsque vous devriez supprimer tous les tirets de tête / de fin et donc revenirhi
.gsub(/[^\w ]/){}
entr('^a-z ','')
, puis se terminent par.split*?-
au lieu de.strip.gsub...
car il gère automatiquement les doublons et les extrémités de la chaîne, tout d'un coup!JavaScript (ES6),
7469 octetsEdit: sauvé 5 octets en réalisant que j'avais déjà supprimé tous les caractères sauf
-/,. 0-9a-z
pour que je puisse utiliser\w
pour faire correspondre les mots restants.la source
[a-z\d]
pourrait être[^\W_]
?PHP, 87 octets
L'idée des expressions régulières vient des réponses existantes.
Cela nécessite que vous ayez un serveur exécutant PHP et un accès via HTTP.
Le titre doit être sur la clé
T
et le résultat sera imprimé à l'écran.Exemple:
http://localhost/title.php?T=<my shiny title>
la source
outils bash / Unix, 56 octets
Remplacez les majuscules par des lettres minuscules et les caractères spéciaux requis par des tirets.
Supprimez (option -d à tr) des caractères autres que des lettres, des chiffres et des tirets, puis serrez (option -s à tr) plusieurs tirets d'affilée dans un seul tiret.
Supprimez les tirets au début, puis à la fin.
la source
Powershell, 85 octets
faire en minuscule, puis 3 remplace regex dans une rangée, et découpez tous les traînants
-
s »la source
$input
vous faire économiser 2 octets?JavaScript,
90989493919091 octets1 octet enregistré grâce à @ edc65!
1 octet économisé grâce à @IsmaelMiguel pour avoir repéré un point-virgule de tête!
1 octet gagné après avoir échoué
,a-^-a,
Ce que j'aime le plus dans cette présentation, ce sont les plages. Dans le premier
replace
, on enlève tout ce qui est non alphanumérique et non un,
,-
,.
,/
et non un espace. Nous utilisonsa-z
pour détecter les lettres, et nous utilisons,-9
pour détecter ces caractères spéciaux et ces chiffres puisque les codes de caractères de ces littéraux ASCII sont tous alignés!Afficher l'extrait de code
la source
f=
donc votre nombre d'octets est de 96 en ce moment. Et pas besoin de \ dans une plage dans l'expression rationnelle, il pourrait donc être 95. Mais ... ne fonctionne toujours pas: essayez...title
f=
et;
du final. Précisez simplement qu'il s'agit d'une fonction anonyme. Avec cela, votre réponse devrait être longue de 90 octets.Lua, 91 octets
Où
a
est la chaîne URL.Explication:
a:lower()
renvoie la fonction minuscule:gsub
trouve la correspondance du modèle et le remplace par la chaîne.'[ .,/]'
: Les crochets signifient "ou", donc cela correspond à l'espace, à la période, à la virgule et à la barre oblique. Pas besoin d'être gourmand car:gsub
fait toutes les occurrences.'[^%w-]'
:^
signifie "non" quand entre parenthèses,%w
signifie n'importe quoi alphanumérique. Correspond donc à'[^%w-]
tout ce qui n'est pas alphanumérique ou un tiret.'%-+'
: Faites correspondre autant de tirets que possible et remplacez-les par un seul tiret.match'%-?(.*)%-?'
: Dans Lua, si une chaîne est le seul argument de la fonction, aucune parenthèse n'est nécessaire. Il suffit de vérifier un tiret au début et à la fin car les tirets ont déjà été minimisés. Pas besoin de personnages d'ancrage car.*
correspond à tout, gourmand.la source
C, 194 octets
Appeler avec:
la source
SAS, 108
L'une des réponses les moins compétitives ici en raison de la syntaxe verbeuse de SAS - la pénalité de 9 caractères par expression régulière fait vraiment mal - mais c'était un bon exercice d'apprentissage de l'expression rationnelle:
la source
Pyth, 35 octets
Explication
la source
Perl 6, 75
la source
GNU Sed, 65 octets
Une série de substitutions d'expression régulière. Utilise non portable
\L
de GNU sed pour mettre en minuscule l'entrée. Exécutez à partir d'un fichier à l'aide desed -f
.la source