Considérons une chaîne non vide de parenthèses correctement équilibrées:
(()(()())()((())))(())
On peut imaginer que chaque paire de parenthèses représente un anneau dans une construction télescopique effondrée . Alors étendons le télescope:
( )( )
()( )()( ) ()
()() ( )
()
Une autre façon de voir les choses est que les parenthèses à la profondeur n sont déplacées vers la ligne n , tout en conservant leur position horizontale.
Votre tâche consiste à prendre une telle chaîne de parenthèses équilibrées et à produire la version étendue.
Vous pouvez écrire un programme ou une fonction en prenant une entrée via STDIN (ou son équivalent le plus proche), un argument de ligne de commande ou un paramètre de fonction et en produisant une sortie via un paramètre STDOUT (ou son équivalent le plus proche), une valeur de retour ou une fonction (out).
Vous pouvez supposer que la chaîne d'entrée est valide, c'est-à-dire qu'elle ne comprend que des parenthèses correctement balancées.
Vous pouvez imprimer des espaces en fin de ligne sur chaque ligne, mais pas plus que nécessaire. Au total, les lignes ne doivent pas dépasser deux fois la longueur de la chaîne d'entrée. Vous pouvez éventuellement imprimer une nouvelle ligne de fin.
Exemples
En plus de l'exemple ci-dessus, voici quelques tests supplémentaires (les entrées et les sorties sont séparées par une ligne vide).
()
()
(((())))
( )
( )
( )
()
()(())((()))(())()
()( )( )( )()
() ( ) ()
()
((()())()(()(())()))
( )
( )()( )
()() ()( )()
()
Défis associés:
- Topographic Strings , qui vous demande de produire ce qui est essentiellement le complément de la sortie dans ce défi.
- Code Explanation Formatter , une large généralisation des idées de ce défi, publié récemment par PhiNotPi. (En fait, la description originale de son idée par PhiNotPi était ce qui a inspiré ce défi.)
Classements
Euh, cela a eu beaucoup de participation, alors voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Réponses:
CJam,
171615 octetsCe qui précède est un vidage xxd réversible, car le code source contient les caractères non imprimables VT (0x0b) et CSI (0x9b).
Comme cette réponse , il utilise des séquences d'échappement ANSI , mais il utilise également des tabulations verticales et imprime directement les caractères de contrôle pour éviter l'utilisation de printf .
Cela nécessite un terminal vidéo texte compatible, qui inclut la plupart des émulateurs de terminal non Windows.
Essai
Nous devons définir la variable shell LANG et le codage de l'émulateur de terminal sur ISO 8859-1. Le premier est réalisé en exécutant
De plus, avant d'exécuter le code actuel, nous allons désactiver l'invite et effacer l'écran.
Cela garantit que la sortie est affichée correctement.
Pour restaurer LANG et l'invite, exécutez ceci:
Comment ça fonctionne
Nous insérons une tabulation verticale après chaque ( pour déplacer le curseur vers le bas et la séquence d'octets 9b 41 (
"\x9bA"
) avant chacun ) pour déplacer le curseur vers le haut.la source
code machine x86,
3934333029 octetsAssemblage x86 pour DOS, avec quelques astuces:
Limitations :
cls
avant d' exécuter est presque obligatoire;bh=0
et l'indicateur de direction est dégagé au début, tous deux non documentés; OTOHbx
est explicitement mis à zéro dans toutes les variantes DOS que j'ai vues (DosBox, MS-DOS 2, FreeDOS), et partout où j'ai testé les indicateurs étaient déjà OK.la source
cld
?add
/sub
.lop
pourloop
?nasm
distinction entreloop
une étiquette et uneloop
instruction d'assemblage, aussi j'écrislop
comme tout le monde.J,
3228 octetsC'était amusant.
Explication
Voici comment cette solution fonctionne, y compris une explication de la manière dont elle a été jouée au golf.
la source
:')
C, 150 octets
C'était fou amusant de golf. Je ne suis toujours pas convaincu d'en avoir fini.
Nous définissons une fonction unique
f
, qui prend la chaîne en tant qu'entrée et les sorties sur stdout.Passons en revue le code, ligne par ligne:
Je répondrai à toutes vos questions!
Essayez un programme de test en ligne !
la source
f
,m
il ne serait pas réinitialisé à 0. Cela équivaut à "casser votre environnement", interdit ici .Retina + Bash, 27 octets (14 + 10 + 3 = 27)
Cela utilise ANSI Escapes:
Équivalent à
sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g"
. Le\e[B
code d'échappement signifie déplacer le curseur d'une rangée vers le bas et les\e[A
moyens de déplacer le curseur d'une rangée vers le haut. Cette solution insère donc simplement ces codes avant et après le début et la fin de chaque paire de parenthèses imbriquées. L'entrée est passée à travers STDIN.Vous devrez l'appeler
printf $(Retina ...)
pour voir la sortie correctement.Sortie
la source
printf
ce serait formidable. Sinon, je pense qu'il serait juste d'ajouter| printf
au nombre d'octets.printf $()
ouprintf $(Retina )
.\e
plusprintf
? Vous pouvez simplement mettre les caractères de contrôle dans le modèle de remplacement.TI-BASIC,
69 60 5655 octetsCeci s’applique à la famille de calculatrices TI-83 + / 84 +, bien qu’elle ait été écrite sur une édition Silver 84+ C.
Le programme apparaît plus grand sur calcul en raison de la TVA et des informations de taille incluses. En outre, il y a plus de 56 caractères ici; 56 octets s'expliquent par le fait que toutes les commandes comportant plusieurs caractères sont compressées en jetons d'une taille égale à un ou deux octets.
Rasé un autre octet grâce à thomas-kwa ! (aussi de lui était le saut de 60 à 56.)
la source
cos(piAns
astuce pour enregistrer un autre octet.Python 2, 115 octets
Appelez comme
f("((()())()(()(())()))")
, et la sortie est sur STDOUT.Explication
Nous commençons avec
n = 0
. Pour chaque caractère dans la ligne de saisie:(
, nous ajoutons desn
espaces puis des incrémentsn
)
, on décrémenten
puis on ajoute desn
espacesLe résultat est ensuite compressé et imprimé. Notez que les
zip
zip de Python correspondent à la longueur de l' élément le plus court , par exempleHabituellement, on utilisera
itertools.zip_longest
(izip_longest
) s’ils veulentzip
patiner à la longueur du plus long élément.Mais dans Python 2, ce comportement peut être simulé en mappant
None
:Python 3, 115 octets
Pas Zipping, juste rembourrage appropriée avec
ljust
. Celui-ci semble avoir un potentiel de golf.la source
R,
151127 caractèresAvec les retraits et les nouvelles lignes:
Usage:
Il lit la chaîne en tant que stdin, le divise en un vecteur de caractères simples, calcule la somme cumulée de
(
et)
, soustrait le premier avec le dernier (avec un décalage), calculant ainsi le "niveau" de chaque parenthèse. Il imprime ensuite sur stdout, pour chaque niveau, les parenthèses correspondantes ou un espace.Merci à @MickyT de m'avoir aidé à le réduire considérablement!
la source
for(i in n)cat(ifelse(D[i]-j," ",S[i]));cat("\n")
parX=S;X[which(D!=j)]=' ';cat(X,sep='',fill=T)
. Alors cen
n’est pas vraiment nécessaire, mais vous auriez besoin de changer un peu la partie Cumsum.D=c(C(S=="("),0)-c(0,C(S==")"));
le ramenant à 135.which
n’est pas vraiment nécessaire ici (D!=j
étant déjà un vecteur de booléens permettant l’indexation). Je ne savais pas l' argumentfill
pourcat
, c'est une bonne astuce! Merci de m'avoir fait raccourcir de 24 caractères!C,
58 53 52 5149 octetsUtilise les séquences d'échappement ANSI pour déplacer la position du curseur.
Si vous n'utilisez pas gcc ou un autre compilateur qui le supporte,
\e
vous pouvez le remplacer par\x1B
2 octets supplémentaires.\e[A
déplace le curseur d'une ligne vers le haut et\e[B
déplace le curseur d'une ligne vers le bas. Il n'est pas nécessaire d'utiliser\e[B
pour descendre d'une ligne car il est plus court de deux octets pour utiliser le caractère de tabulation verticale ASCII0xB
ou\v
.À partir de la question, la chaîne de saisie est supposée être composée uniquement de parenthèses (équilibrées). Par conséquent, vérifier la parité du caractère avec
&1
, suffit pour distinguer entre(
et)
.la source
Pip, 53 octets
Pépin est un langage de code-golf de mon invention. La première version a été publiée samedi, donc je peux officiellement la faire tourner! La solution ci-dessous n’est pas très compétitive en ce qui concerne les langues de golf, mais c’est en partie parce que je n’ai pas encore implémenté de fonctionnalités telles que zip et max.
Attend la chaîne de parenthèses en tant qu'argument de ligne de commande.
Version "non-golfée":
Explication:
Contrairement à la plupart des langages de golf, Pip est impératif avec les opérateurs infixes. La syntaxe est donc un peu plus proche de C et de ses dérivés. Il emprunte également des idées à la programmation fonctionnelle et basée sur les tableaux. Voir le référentiel pour plus de documentation.
Le programme génère d’abord une liste de profondeurs (en la stockant dans
z
) en mappant une fonction à la chaîne en entréea
. La variable globalev
suit le niveau actuel. (Les variablesa-g
dans Pip sont des variables de fonction locale, maish-z
globales.v
Est pratique car elle est préinitialisée à -1.)Ensuite, nous utilisons une
W
boucle hile pour générer et imprimer chaque ligne, jusqu'à ce que la ligne générée soit composée de tous les espaces.v
est maintenant utilisé pour les colonnes eti
pour les lignes. La{z@++v=i?as}
fonction, mappée de manière répétée sur la chaîne d'entrée d'origine, teste si la ligne actuellei
correspond à la ligne sur laquelle la parenthèse actuelle est supposée être activée (telle que stockée dans laz
liste). Si c'est le cas, utilisez la parenthèse (a
); sinon, utilisezs
(préinitialisé dans l'espace). Le résultat final est qu'à chaque itération,o
une liste de caractères équivalente à la ligne suivante de la sortie est attribuée.Pour vérifier si nous devons continuer à boucler, nous vérifions si,
o
avec tous les espacesRM
, d est vide. Sinon, imprimez-le (par défaut, tout concatène comme dans CJam), réinitialisez le numéro de colonne sur -1 et incrémentez le numéro de ligne.(Anecdote: au début, j'avais une solution de 51 octets ... qui n'a pas fonctionné, car un bug est apparu dans l'interpréteur.)
la source
Pyth, 31 octets
Essayez-le en ligne.
-/<zk\(/<zhk\)
: Trouve le niveau approprié pour la position actuelle du personnage.?YqN-/<zk\(/<zhk\)d
: Un espace si le niveau approprié n'est pas le niveau actuel, le caractère actuel sinon.Js.e?YqN-/<zk\(/<zhk\)dz
: Générez la chaîne, enregistrez-la dansJ
.I-JdJ
: Si ceJ
n'est pas tous les espaces, imprimez-le.Vz
:z
Temps de boucle .la source
GNU Bash + coreutils + indent, 135
Entrée / sortie via STDIN / STDOUT:
indent
fait la plupart des tâches lourdes, mais doit travailler avec des attelles plutôt que des parens. Le reste est modification de cette réponse pour transposer la sortie deindent
.la source
Python 2, 92
Imprime ligne par ligne. Pour un numéro de ligne donné
i
(en fait, sa négation), parcourt la chaîne d'entrées
et crée une nouvelle chaînez
contenant uniquement les caractèress
at deepi
. Ceci est fait en incrémentant ou décrémentanti
pour suivre la profondeur actuelle, en ajoutant les caractères actuels lorsquei
est0
ajusté pour le type de paren et en ajoutant un espace.Ensuite, imprime et revient à la suivante
i
sauf si la ligne en cours était composée d' espaces. Notez que, puisque les parens sont équilibrés, lai
boucle après est identique à celle du début.Python 3 serait identique sauf pour un personnage
print(z)
.la source
La triche :(
Retina + TeX, N octetstricherie :(Cela ne fonctionne que si vous restituez (?) La sortie en utilisant MathJax ou un autre TeX, actuellement désactivé pour ce SE :(
Chaque ligne doit être dans un fichier différent, mais vous pouvez le tester en utilisant
Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{("
(ou la commande sed équivalentesed -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"
). L'entrée est passée à travers STDIN.Cela fonctionne en entourant les contenus de chaque paire de parenthèses entre accolades, puis en indiquant tous les éléments qui les composent.
Sortie
la source
In total the lines must not be longer than twice the length of the input string
. Changer la ligne 2 en(\,{
et la ligne 4 en}\,)
signifie que la sortie convient à cela (bien que la profondeur verticale soit toujours fausse: ()Java,
232226224222 octetsVersion golfée:
Version longue:
La chaîne d'entrée est analysée en premier lieu, en recherchant "(" et ")" pour ajouter / soustraire un compteur et stocker sa valeur en déterminant la distance qui devrait séparer les parenthèses d'un tableau tout en gardant une trace de la profondeur du plus profond. Ensuite, le tableau est analysé. les parenthèses avec les valeurs les plus faibles sont imprimées en premier et continueront d’être imprimées ligne par ligne jusqu’à atteindre le maximum.
Je trouverai probablement des moyens de jouer au golf plus tard.
la source
Javascript / ES6, 97 caractères
Usage
Explication
la source
n<m?console.log(o):0
, vous pouvez utilisern<m&&console.log(o)
ce qui enregistre 1 octet.CJam,
43 4136 octetsPas trop golfé (je pense), mais voici ma première tentative:
Comment ça fonctionne
J'utilise le fait très pratique que,
)
et(
dans CJam, incrément et décrément signifient respectivement. Ainsi, j’évalue simplement les crochets pour obtenir la profondeur.Essayez-le en ligne ici
la source
Octave, 85 caractères
C'est une optimisation de l'approche naïve, ce qui est plutôt naturel pour Matlab et Octave:
Il se
t
peut même que le tableau n'existe pas encore, et que nous puissions tout de suite attribuer un élément à un autre, et qu'il reprenne la dimension la plus petite requise pour que cet élément existe, ce qui est très pratique.la source
Perl,
918988848079 octetsla source
Haskell, 154 octets
Même idée que l’autre solution Haskell, mais un peu plus courte. - utilisation:
la source
J, 46
Pas aussi bien que les autres 'langues de golf', mais pour ma défense: J est terrible avec des cordes.
Prend la chaîne en tant qu'entrée pour une fonction. Il y a aussi probablement une meilleure façon de le faire dans J.
Usage:
la source
Ruby,
119115114Explication:
la source
Java,
233214 octetsDentelé:
Je suppose que la dernière boucle pourrait être raccourcie, mais je la laisserai comme un exercice au lecteur. ;-)
Vieux, 233 octets répondent:
Dentelé:
la source
for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);
àfor(x=0;x<l*l;)System.out.print((x%l==0?"\n":"")+m[x++]);
pour -1 octet. En outre, vous pouvez enregistrer 2 octets supplémentaires en supprimantp=x=0
et en utilisant simplement l'int p=0,x=0,
initialisation des champs. Au total, il devient 211 octets .C #, 195 octets
Essayez d'abord de jouer au golf - criez si j'ai fait quelque chose de mal.
Version alternative C # utilisant SetCursorPosition et travaillant de gauche à droite en prenant l’entrée comme argument en ligne de commande.
Je pensais que ce serait amusant d’ajuster la position d’écriture en fonction du paren d’ouverture / fermeture et non de lignes complètes. Close paren déplace la position vers le haut avant d'écrire; open paren le baisse après avoir écrit. L'action SetCursorPosition enregistre cinq octets. Déplacer le curseur sur la ligne suivante après la sortie prendrait un peu plus.
la source
Lot,
356335 octetsJe sais qu'il existe déjà une solution Batch pour ce défi, mais celui-ci est beaucoup plus joué au golf et semble adopter une approche différente. Plus important encore, l’autre solution contient au moins une commande powershell; cette solution ne le fait pas.
Il y a un caractère de retour arrière (
U+0008
) à l'avant-dernière ligne après le point (ligne 12, colonne 57). Ce n'est pas visible dans le code affiché ici, mais est inclus dans le nombre d'octets.la source
Lot, 424 octets
Non-golfé:
Exemple:
la source
C,
118117 octetsUne autre réponse en C, mais la mienne est plus courte.
Version non-golfée:
Et il fonctionne!
la source
putchar(c-d?32:*p)
est un caractère plus court queputchar(c==d?*p:32)
.Haskell, 227 octets
la source
n#[]
au lieu dem n []
.Perl, 76 octets
Non
use strict
ici :)la source
Lex, 94 octets
Dépend des codes de la console Linux. Avec gcc, vous pouvez supprimer quatre octets en remplaçant les deux instances
\33
par un caractère d'échappement réel.Pour compiler et exécuter:
la source