Contexte
(Basé sur une histoire vraie et déchirante)
À mon époque, j'ai souvent joué avec le lisp et des langues similaires. J'ai écrit avec eux, les ai exécutés, les ai interprétés, les ai conçus et j'ai fait écrire des machines avec eux ... Et s'il y a une chose qui me dérange, c'est de voir Lisp qui ne correspond pas à mon style de formatage spécifique.
Malheureusement, certains éditeurs de texte ( cough XCode cough ) ont tendance à dépouiller mes beaux onglets et espaces chaque fois que le code est copié et collé ... Prenez cette syntaxe de type Lisp magnifiquement espacée:
(A
(B
(C)
(D))
(E))
(Où ABCDE
sont les fonctions arbitraires)
CERTAINS éditeurs de texte massacrent ce joli code à la fin suivante:
(A
(B
(C)
(D))
(E))
Quel bordel! Ce n'est pas lisible!
Aidez-moi, ici?
Le défi
Votre objectif dans ce défi est de prendre une série de fonctions séparées par des sauts de ligne dans un format décrit ci-dessous et de retourner un arrangement plus beau qui met en valeur la lisibilité et l'élégance.
L'entrée
Nous définissons une fonction F
d' N
arguments d' arité comme une construction similaire à la suivante:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
où G1, G2, ..., GN
sont toutes les fonctions en soi. Une 0
fonction d' arité A
est simplement (A)
, tandis qu'une 2
fonction d' arité B
est de la forme(B (...) (...))
Votre code doit prendre la saisie comme une série de fonctions avec une seule nouvelle ligne avant la parenthèse principale de chaque fonction (sauf pour la première fonction). L'exemple ci-dessus est une entrée valide.
Vous pouvez supposer:
- Les parenthèses sont équilibrées.
- Une fonction ne devra jamais être mise en retrait plus de 250 fois.
- CHAQUE fonction est entourée de parenthèses:
()
- Le nom d'une fonction ne contiendra que des caractères ASCII imprimables.
- Le nom d'une fonction ne contiendra jamais de parenthèses ou d'espaces.
- Il y a un retour à la ligne de fin facultatif en entrée.
Le résultat
Votre code doit générer le même ensemble de fonctions, où les seules modifications apportées sont les ajouts d'espaces ou de tabulations avant les parenthèses de début des fonctions. La sortie doit respecter les règles suivantes:
- La première fonction (et les fonctions de niveau supérieur ultérieures) fournies ne doit pas avoir d'espaces précédents
- Un argument à l'emplacement horizontal d'une fonction est exactement un onglet à droite de l'emplacement horizontal de cette fonction.
- Un onglet est défini par l'implémentation, mais doit comporter au moins 3 espaces.
- Vous pouvez éventuellement imprimer un maximum de deux espaces après chaque ligne.
Règles
- C'est le code-golf: le code le plus court gagne!
- Les échappatoires standard ne sont pas autorisées.
Exemples
Contribution:
(A
(B
(C)
(D))
(E))
Sortie:
(A
(B
(C)
(D))
(E))
Contribution:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Sortie:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Contribution:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Sortie:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
la source
()
?Réponses:
Pyth,
24201918 octetsIncrémente un compteur pour chaque ligne, compte le nombre total de parenthèses fermantes rencontrées jusqu'à présent et le soustrait du compteur. Ensuite, nous mettons en retrait par
counter
tabulations.la source
*4
c'est une préférence codée en dur et redondante.FN.z+*ZC9N~Z-1/N\)
vous permet d'utiliser la largeur de retrait de votre éditeur et enregistre un octet.\<tab>
ouC9
.Lisp commun -
486414 octets (version Rube Goldberg)Approche
Au lieu de faire comme tout le monde et de compter les parenthèses à la main, invoquons le lecteur Lisp et faisons- le de la bonne façon :-)
(
,)
ou un espace sous forme de chaînes.read
fonction standard pour créer des listes réelles.p
chacune de ces listes, qui les écrivez récursivement sur la sortie standard avec le format demandé. En particulier, les chaînes sont imprimées sans guillemets.En conséquence de cette approche:
Exemple
Lecture à partir d'un fichier, en utilisant ce wrapper:
Voici le résultat:
(il semble que les tabulations soient converties en espaces ici)
Joli imprimé (version golf)
Contrairement à la version originale plus sûre, nous nous attendons à ce que l'entrée soit valide.
la source
Rétine ,
8983 octetsOù
<tab>
représente un caractère de tabulation réel (0x09) et<empty>
représente une ligne vide. Après avoir effectué ces remplacements, vous pouvez exécuter le code ci-dessus avec l'-s
indicateur. Cependant, je ne compte pas cet indicateur, car vous pouvez également mettre chaque ligne dans son propre fichier source, auquel cas les 7 sauts de ligne seraient remplacés par 7 octets de pénalité pour les fichiers source supplémentaires.Il s'agit d'un programme complet, prenant des données sur STDIN et imprimant le résultat sur STDOUT.
Explication
Chaque paire de lignes définit une substitution d'expression régulière. L'idée de base est d'utiliser les groupes d'équilibrage de .NET pour compter la profondeur actuelle jusqu'à une valeur donnée
(
, puis insérer autant d'onglets avant cela(
.Tout d'abord, nous préparons l'entrée. Nous ne pouvons pas vraiment réécrire un nombre conditionnel d'onglets, si nous ne pouvons pas les trouver quelque part dans la chaîne d'entrée pour les capturer. Nous commençons donc par dupliquer la totalité de l'entrée, séparés par un onglet. Notez que le
s`
juste active le modificateur d'une seule ligne (ou "tout point"), ce qui garantit que le.
correspond également aux sauts de ligne.Maintenant, nous transformons chaque caractère après cet onglet en onglet également. Cela nous donne un nombre suffisant d'onglets à la fin de la chaîne, sans modifier la chaîne d'origine jusqu'à présent.
C'est la viande de la solution. Le
m
ets
activer le mode multi-ligne ( de sorte que^
correspond à des débuts de lignes) et le mode à ligne unique. Le+
dit à Retina de continuer à répéter cette substitution jusqu'à ce que la sortie cesse de changer (dans ce cas, cela signifie que le motif ne correspond plus à la chaîne).Le modèle lui-même correspond à un préfixe de l'entrée jusqu'à un non traité
(
(c'est-à-dire un(
qui n'a aucun onglet avant, mais devrait). En même temps, il détermine la profondeur du préfixe avec les groupes d'équilibrage, de sorte que la hauteur de la pile2
correspondra à la profondeur actuelle, et donc au nombre d'onglets que nous devons ajouter. C'est cette partie:Il correspond soit à un
(
, le poussant sur la2
pile, soit il correspond à un)
, faisant sauter la dernière capture de la2
pile, soit il correspond à autre chose et laisse la pile intacte. Étant donné que les parenthèses sont garanties équilibrées, nous n'avons pas à nous soucier d'essayer de sortir d'une pile vide.Après avoir parcouru la chaîne comme ceci et trouvé un non
(
traité pour s'arrêter, la tête de lecture passe ensuite à la fin de la chaîne et capture les onglets en groupe3
tout en sautant de la2
pile jusqu'à ce qu'elle soit vide:En utilisant un
+
dedans, nous nous assurons que le motif ne correspond à rien si au moins un onglet doit être inséré dans la correspondance - cela évite une boucle infinie lorsqu'il existe plusieurs fonctions de niveau racine.Enfin, nous nous débarrassons simplement de ces onglets d'aide à la fin de la chaîne pour nettoyer le résultat.
la source
C:
9594 caractèresCe n'est pas encore très golfé, et à la question, je ne sais pas si les onglets sont acceptables, c'est ce que j'utilise ici.
Non golfé:
Edit: fait en sorte qu'il se ferme sur EOF.
la source
if(c<11)
place deif(c==10)
?Julia,
10399979488 octetsCela définit une fonction sans nom qui accepte une chaîne et affiche la version en retrait. Pour l'appeler, donnez-lui un nom, par exemple
f=p->...
. Notez que l'entrée doit être une chaîne Julia valide, donc les signes dollar ($
) doivent être échappés.Non golfé + explication:
Exemple, prétendre que chaque ensemble de quatre espaces est un onglet:
Toutes les suggestions sont plus que bienvenues!
la source
Haskell,
8381une solution très gratuite de points.
la source
h=
.Perl, 41
40
caractères+1
pour-p
.Courir avec:
la source
Python 2 -
8878 octetsSolution assez simple (et pas très courte):
la source
'\t'
au lieu de' '
et enregistrer un octet; 2) pas besoin d'assignerinput.split()
à une variable, car elle n'est utilisée qu'une seule fois (la même chose pourc
, ainsi qued
--just déplacer l'print
instruction); 3) la priorité de l'opérateur signifie que les parenthèses autourl*c
ne sont pas nécessaires. En outre, il ne semblef
pas être utilisé pour quoi que ce soit - est-ce une relique d'une version précédente?raw_input
place deinput
(et n'oubliez pas les parenthèses après!).CJam, 20 octets
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça marche
la source