Les soumissions réussies de golf de code sont, par nature, remplies de symboles fous partout. Pour rendre leur soumission plus facile à comprendre, de nombreux golfeurs de code choisissent d'inclure une explication de leur code. Dans leur explication, la ligne de code est transformée en un diagramme éclaté verticalement.
Par exemple, si c'était mon code:
1_'[3:~2@+]`
L'un des nombreux diagrammes possibles que je pourrais créer ressemblerait à ceci:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
Le but
Dans ce défi, vous allez écrire un outil de mise en forme automatique d'explication qui prend une ligne de code et crée un diagramme auquel du texte explicatif peut être facilement ajouté.
Afin d'en faire un défi plus utile , l'utilisateur pourra spécifier le contenu de chaque ligne, en fournissant une chaîne de formatage. La chaîne de formatage sera une deuxième ligne, contenant uniquement des lettres A-Za-z
, de la même longueur que le programme. Les lettres indiquent l'ordre dans lequel les caractères du programme doivent être imprimés dans l'explication.
Voici un exemple d'E / S sans formatage de type crochet :
123423
AabcBC
1
2
3
2
3
4
Supports
Si plusieurs caractères dans le programme ont le même niveau de priorité, alors cet ensemble de caractères agit comme un seul bloc de code (s'ils forment un groupe) ou un ensemble de crochets (s'ils contiennent d'autres caractères entre les deux). Les règles générales sont simples:
Les caractères n'apparaissent sur une ligne du diagramme que lorsque tous les autres caractères de priorité supérieure sont déjà apparus sur les lignes au-dessus du diagramme.
Les caractères de priorité égale sont toujours imprimés sur les mêmes lignes. Si un certain caractère apparaît sur une ligne, tous les autres caractères de priorité égale apparaissent sur la ligne.
Un ensemble de caractères de priorité égale continue d'apparaître sur chaque ligne jusqu'à ce que tous les autres caractères qu'il contient soient apparus au moins une fois. Cela permet des constructions de type "support". Si ce
bceab
sont les priorités, lesb
caractères apparaîtront sur la deuxième ligne (ils sont la deuxième priorité) et continueront à apparaître jusqu'à ce que tous lescea
caractères soient apparus. Si la chaîne prioritaire estabcadeafga
, alors tousbcdefg
sont considérés comme contenus dans celle-ci, un all 4a
s continuera à apparaître jusqu'à ce que leg
soit apparu.
Plus d'exigences de formatage
Toutes les lignes de sortie doivent avoir la même longueur (la longueur des lignes d'entrée), avec des espaces si nécessaire. La ligne de programme d'entrée peut contenir des espaces, bien que ces espaces reçoivent également une lettre de priorité. Les retours à la ligne en fin de sortie / entrée sont facultatifs.
Notation
C'est le golf de code, le moins d'octets gagne.
Exemples
Voici un exemple commenté d'un morceau de code avec une mise en forme plus complexe.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Un exemple en Perl:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Voici quelques exemples dans CJam, gracieuseté de Martin Büttner:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Voici un exemple fou juste pour jouer avec vous:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Voici un exemple plus explicite de ce qui se passe lorsque les crochets se chevauchent comme abab
. (Normalement, ce n'est pas la façon dont vous choisissez de formater votre explication.)
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
la source
oNo
peut être remplacé parn
dans TIO .CJam, 48 octets
Explication
la source
IDL 8.4,
316318304 octetsNouvelle version, encore trop longue, mais plus courte! Et, dans le véritable esprit d'IDL, complètement vectorisé, ce qui signifie (puisqu'il n'y a pas de boucle) que je peux maintenant le faire en une seule ligne et l'exécuter sur lui-même, une fois que ma version est complètement mise à niveau vers 8.4. Cela sera édité plus tard.
Version une ligne:
Avec des sauts de ligne (même nombre d'octets, sous-traitance \ n vs &), et commenté:
Voici une ventilation algorithmique pour la ligne 9:
... et 10:
Les lignes 9 et 10 font le vrai travail, le reste définit les variables dont vous avez besoin pour la fin. Je pense que c'est à peu près aussi golfé que ça va devenir, je ne peux pas trouver d'autre endroit pour le faire mieux.
Ancienne version (tout ce qui suit ici est obsolète):
C'est loin d'être assez court pour gagner, car c'est un langage de golf terrible, mais personne ne répond jamais en IDL, donc je vais juste y aller.
Je ne sais pas s'il y a un moyen de le réduire davantage ... Je pourrais appeler strmid à la fois sur a et b en même temps, mais je passe plus d'octets à indexer d et cela fonctionne de la même manière. Mais je continuerai à y travailler! (Et demain je vais éditer une explication de l'algorithme.)
la source