Voici quelques exemples d'entrée, donc je peux expliquer quel est le problème:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Considérez cette ligne de texte comme une carte topographique de certaines montagnes. Chaque jeu de parenthèses illustre une unité d'altitude.
Si nous «voyons» cela de côté, pour voir les montagnes verticalement, nous verrons:
4 5 cherries woohoo
1 2 3 moo lik e
i
Étant donné l'une de ces cartes topographiques, sortez la carte, mais à une échelle verticale, comme la sortie ci-dessus. Séparez les différents éléments de la carte avec le nombre de caractères de l'élément suivant. Par exemple, il y a 4 espaces dans la sortie entre moo
et i
. De même, il y a 4 caractères dans l'entrée entre moo
et i
.
Le code qui fait cela dans le moins de caractères gagne.
code-golf
string
balanced-string
beary605
la source
la source
((1 2))))))))))3
doit être invalide si les hauteurs négatives sont interdites.Réponses:
J,
87797270675756 caractèresPrend l'entrée du clavier. Exemple:
Explication:
Cette explication est basée sur la première version de mon programme:
x=.1!:1[1
prendre l'entrée du clavier et la mettrex
pour plus tard(('('&([:+/=)-')'&([:+/=))\,.i.@#)
crée une liste de tous les indéces dans la chaîne (i.@#
) et la coud (,.
) avec le résultat du(('('&([:+/=)-')'&([:+/=))\
verbe.(('('&([:+/=)-')'&([:+/=))\
ce verbe est appliqué à tous les préfixes de la chaîne (donc sur l' entréehello
s'appliquerait àh
,he
,hel
,hell
ethello
. Il est une fourchette , qui compte le nombre de supports ouverts('('&([:+/=)
et soustrait alors le nombre de crochets proches')'&([:+/=)
. Cela me donne la liste d'indéces dans la chaîne et le niveau auquel le caractère à cet index doit être dans la sortie. Sur une entrée simple, cela me donne ce qui suit:((' '$~{.@]),[{~{:@])"1
c'est un verbe qui prend la liste que je viens de générer et aussi la sortie de('( ) 'charsub x)
(qui fait juste un remplacement de chaîne pour remplacer tous les crochets par des espacesx
). Il prend la queue de chaque élément de la liste{:@]
et l'utilise comme index dans la chaîne pour obtenir le caractère[{~{:@]
. Il le préfixe ensuite,
avec le nombre d'espaces indiqué par le titre de chaque élément de la liste(' '$~{.@])
. Dans l'exemple précédent, cela me donne:Je transpose ensuite le tableau
|:
et l'inverse|.
pour obtenir la sortie souhaitée.la source
GolfScript
69Démo en ligne ici .
Explication:
la source
APL (59)
J'ai supposé que la «base» devait également être utilisable. (c'est-à
(a(b))c(d)
- dire est valide). Si cela n'est pas nécessaire, deux caractères peuvent être enregistrés.Explication:
T←⍞
: stocker une ligne d'entrée dans T'()'∘=¨T
: pour chaque caractère en T, voyez s'il s'agit d'une parenthèse ouvrante ou fermante. Cela donne une liste de listes de booléens.1 ¯1∘ר
: multipliez le deuxième élément de chacune de ces listes par -1 (donc une parenthèse ouvrante vaut 1, une parenthèse fermante vaut -1 et tout autre caractère vaut 0).+/¨
: prendre la somme de chaque liste intérieure. Nous avons maintenant la valeur ∆y pour chaque caractère.P←
: magasin en P.R←1++\P
: prendre un total cumulé de P, donnant la hauteur de chaque personnage. Ajoutez un à chaque caractère afin que les caractères en dehors des parenthèses soient sur la première ligne.(⍴T)∘⍴¨⍳⌈/R
: pour chaque valeur y possible, faites une liste aussi longue que T, composée uniquement de cette valeur. (c.-à-d. 1111 ..., 2222 ...., etc.)R∘=¨
: pour chaque élément de cette liste, voyez s'il est égal à R. (Pour chaque niveau, nous avons maintenant une liste de zéros et de uns correspondant à la présence ou non d'un personnage sur ce niveau).⍵×P=0
: pour chacune de ces listes, mettez-la à zéro si P n'est pas nul à cet endroit. Cela supprime les caractères avec un delta-y non nul, ce qui supprime les parenthèses.⊃,/T\¨⍨
: pour chaque profondeur, sélectionnez parmi T les caractères qui doivent apparaître.⊖↑
: créez une matrice et placez-la à l'endroit.la source
Tcl, 50
Sorte de tricherie, mais bon ..
J'utilise des séquences d'échappement ascii pour obtenir la différence de ligne,
^[[A
signifie déplacer la ligne du curseur 1 vers le haut,^[[B
c'est déplacer la ligne du curseur 1 vers le bas.la source
APL, 41 caractères / octets *
Testé sur Dyalog, avec un environnement
⎕IO←1
et⎕ML←3
. C'est une fonction qui prend l'entrée requise et renvoie la sortie. Étant donné le libellé de la question, je pense que c'est acceptable. Dans le cas contraire, voici une version qui lit depuis stdin et écrit dans stdout, pour 4 caractères de plus:Explication :
Exemples:
*: APL peut être enregistré dans une variété de jeux de caractères hérités à un octet qui mappent les symboles APL aux 128 octets supérieurs. Par conséquent, dans le but de jouer au golf, un programme qui utilise uniquement des caractères ASCII et des symboles APL peut être noté comme chars = octets.
la source
⍨
symbole. Cela ressemble à une combinaison des caractères¨
et~
?~
et¨
, bien que ce soit un caractère différent des deux. C'est un opérateur appelé Commute . Dans sa forme dyadique il renverse les arguments de la fonction dyadique il est appliqué à:(5-2)=(2-⍨5)
. En tant que l' opérateur monadique il transforme une fonction dyadique en monadique, dupliquer l'argument droit:(2*2)=(*⍨2)
. Il est principalement utilisé pour écrire un flux ininterrompu de fonctions de droite à gauche, sans avoir à mettre de parenthèses autour de grandes expressions et à sauter les yeux autour d'elles. Au golf, c'est utile parce qu'il3*⍨1-2
y a un caractère de moins que(1-2)*3
:-)~
dans J alors.J, 56 caractères
Une autre solution J 56 caractères ... je compte la profondeur en traduisant
(
en ⁻1,)
en 1 et tous les autres personnages dans 0, puis en prenant la somme en cours d' exécution de celle - ci:[: +/\ 1 _1 0 {~ '()'&i.
. Le reste est largement similaire à la solution de @ Gareth.la source
Python, 161 caractères
la source
Python, 130
la source
Rubis 1,9 (129)
Lit à partir de stdin.
la source
//
à ce''
qui maintient le nombre de caractères identiques et évite le bug dans le surligneur.C, 132 caractères
La description ne précisait pas la quantité de données que la soumission devait accepter pour être acceptée, j'ai donc choisi des limites qui correspondaient le mieux à mes besoins en golf (tout en travaillant avec la seule entrée donnée en exemple). Permettez-moi de saisir cette occasion pour rappeler aux gens que c'est souvent une bonne idée de spécifier des maximums minimum dans vos descriptions de défis.
Il y a deux boucles principales dans le code. La première boucle regroupe tous les caractères non parenthèses sur la ligne de sortie appropriée et la deuxième boucle imprime chaque ligne.
la source
C, 149 caractères
exécuter avec arg cité, egaout "((1 2) (3 (4 5) moo)) (i (lik (cerises) e (woohoo)))"
la source
Octave, 128
Très similaire à ma dernière réponse ...
Tester
Contribution:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Sortie:
la source
C #, 229 octets
S'il n'y a aucune restriction sur l'espace vertical de tête, vous pouvez l'utiliser (en retrait pour plus de clarté). Il initialisera le curseur d'une ligne pour chaque élément
(
trouvé avant l'impression, puis déplacera le curseur de haut en bas pendant la lecture des crochets.la source
PowerShell ,
120119 octetsEssayez-le en ligne!
Effets secondaires: Caractère
&
et'
change la hauteur au fur(
et à mesure)
, mais s'affiche. Comparez les résultats pour:Moins golfé:
la source
VB.net (pour S&G)
Pas le plus joli du code.
la source