Pour des raisons principalement historiques, bash est un méli-mélo de paradigmes de syntaxe et de programmation - cela peut le rendre gênant et parfois frustrant pour le golf. Cependant, il a quelques astuces dans sa manche qui peuvent souvent le rendre compétitif avec d'autres scripts traditionnels. langues. L'un d'eux est l' expansion des orthèses .
Il existe deux types de base d'extension d'expansion:
- Les accolades de liste peuvent contenir des listes de chaînes arbitraires séparées par des virgules (y compris les doublons et la chaîne vide). Par exemple
{a,b,c,,pp,cg,pp,}
, développeraa b c pp cg pp
(notez les espaces autour des chaînes vides). - Les accolades de séquence peuvent contenir des points de terminaison de séquence séparés par
..
. Facultativement, un autre..
peut suivre, suivi d'une taille de pas. Les points de terminaison de séquence peuvent être des nombres entiers ou des caractères. La séquence monte ou descend automatiquement en fonction du point final le plus élevé. Par exemple:{0..15}
va s'étendre à0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
va s'étendre à-10 -9 -8 -7 -6 -5
{3..-6..2}
va s'étendre à3 1 -1 -3 -5
{a..f}
va s'étendre àa b c d e f
{Z..P..3}
va s'étendre àZ W T Q
Au-delà, des accolades de séquence et de liste peuvent exister avec des accolades de liste:
{a,b,{f..k},p}
va s'étendre àa b f g h i j k p
{a,{b,c}}
va s'étendre àa b c
Les accolades se développent avec des chaînes non blanches de chaque côté. Par exemple:
c{a,o,ha,}t
va s'étendre àcat cot chat ct
Cela fonctionne également pour plusieurs accolades concaténées ensemble:
{ab,fg}{1..3}
va s'étendre àab1 ab2 ab3 fg1 fg2 fg3
Cela peut devenir assez complexe. Par exemple:
{A..C}{x,{ab,fg}{1..3},y,}
va s'étendre àAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
Cependant, s'il y a un espace entre les extensions, elles se développent simplement en tant qu'extensions distinctes. Par exemple:
{a..c} {1..5}
va s'étendre àa b c 1 2 3 4 5
Notez comment l'ordre est toujours préservé.
Les entrées pour ce défi développeront les extensions d'accolade bash comme décrit ci-dessus. En particulier:
- eval by
bash
(ou d'autres shells qui effectuent une expansion similaire) n'est pas autorisé - les accolades de séquence seront toujours numérotées, minuscules à minuscules ou majuscules à majuscules sans mélange. Les nombres seront des entiers dans la plage signée 32 bits. Si elle est donnée, la taille de pas facultative sera toujours un entier positif. (Notez que bash se développera
{A..z}
également, mais cela peut être ignoré pour ce défi) - les éléments individuels entre accolades de liste seront toujours composés uniquement de caractères alphanumériques en majuscules et minuscules (chaîne vide incluse)
- les accolades de liste peuvent contenir des imbrications arbitraires d'autres extensions d'accolade
- les accolades peuvent être concaténées un nombre arbitraire de fois. Ceci sera limité par la mémoire de votre langue, donc on s'attend à ce que vous puissiez théoriquement faire un nombre arbitraire de concaténations mais si / quand vous manquez de mémoire cela ne comptera pas contre vous.
Les exemples dans le texte ci-dessus servent de cas de test. Résumées, chaque ligne d'entrée correspondant à la même ligne de sortie, elles sont:
Contribution
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
Production
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r
Réponses:
Ruby,
405403401400 octetsUn homme sage (Jamie Zawinski) a dit un jour: "Certaines personnes, confrontées à un problème, pensent" je sais, je vais utiliser des expressions régulières ". Maintenant, ils ont deux problèmes."
Je ne pense pas avoir pleinement apprécié cette citation jusqu'à ce que j'essaie de résoudre ce problème avec l'expression régulière récursive. Initialement, les cas d'expression régulière semblaient simples, jusqu'à ce que je doive m'occuper des cas marginaux impliquant des lettres adjacentes à des crochets, puis je savais que j'étais en enfer.
Quoi qu'il en soit, exécutez-le en ligne ici avec des cas de test
Non golfé:
la source
Python 2.7,
752728 octetsWow, c'est comme un tas de golfs de code dans un défi!
Merci à @Neil d'avoir raccourci une lambda
Explication
b
: calcule la portée en fonction des spécifications.e
: retourne la position du premier croisillon le plus à l'extérieur. Itératif.m
: divise les éléments les plus à l'extérieur par des virgules. Récursif.n
: combine des tableaux tout en vérifiant les vides.Je ne pouvais pas allerand/or
travailler.p
: Où la plupart du travail est effectué. Vérifie tous les cas (plage, liste juste, doit être combinée). Récursif.o
: Qu'est-ce qui devrait prendre une entrée. Formate les entrées / sorties dansp
.Je sens que je peux m'améliorer dans certains endroits, alors j'essaierai de jouer davantage au golf. Je devrais également mettre plus en détail dans l'explication.
la source
[c+d for c in a for d in b] or a or b
à travailler.JavaScript (Firefox 30-57),
465427425 octetsLa version ES6
f
pèse 10 octets supplémentaires:Explication: Commence par changer les espaces en virgules et en encapsulant la chaîne entière
{}
pour plus de cohérence (merci à @Blue pour l'idée). Recherche ensuite toutes les{..}
constructions et les développe en{,}
constructions. La récursivité suivante utilise pour développer à plusieurs reprises toutes les{,}
constructions de l'intérieur vers l'extérieur. Remplace enfin toutes les virgules par des espaces.la source