L'accolade à droite est un style de bracketing de code dans lequel les accolades et les points-virgules sont tous alignés sur un seul point sur le côté droit d'un fichier.
En règle générale, cela est considéré comme une mauvaise pratique, pour plusieurs raisons.
Le défi
Prenez une chaîne multiligne par n'importe quelle méthode et convertissez son style d'accolade en accolade à droite.
Pour ce défi, vous n'en avez besoin que pour travailler sur du code Java, cependant, il devrait théoriquement fonctionner sur n'importe quel code qui utilise des accolades et des points-virgules.
Vous devez saisir tous les {};
caractères dans une rangée, avec n'importe quelle quantité d'espace entre eux. PAR EXEMPLE. }}
,, ; }
}\n\t\t}
et alignez-les sur le côté droit du fichier en utilisant des espaces.
par exemple:
a {
b;
{c
devrait devenir
a {
b ;{
c
Ou, plus abstraitement, poussez tous les espaces blancs de la gauche de tous les {};
caractères vers la droite.
L'indentation des lignes doit être conservée autrement. Les lignes contenant uniquement des espaces après le mouvement des {};
personnages peuvent éventuellement être supprimées.
Par exemple:
a{
b{
c;
}
}
d;
Peut devenir soit
a {
b {
c;}}
d ;
ou
a {
b {
c;}}
d ;
Poussé vers la droite fait référence à tous les {};
caractères alignés sur un point pas plus court que la ligne la plus longue. Toute quantité d'espace après cela est acceptable.
Donc, tout ce qui suit est acceptable:
a {
bc;
a {
bc ;
a {
bc ;
etc...
Les lignes de n'importe quel code peuvent contenir des {};
caractères entre d'autres caractères non blancs, la gestion de ce cas n'est pas nécessaire, bien que si vous êtes incliné, vous devez les laisser en place. Les lignes peuvent également ne contenir aucun {};
caractère, et cela doit être géré correctement. Comme indiqué ci-dessous.
a {
b ;
c
d }
Parce que nous ne voulons pas que la révision de code voit les choses horribles que nous faisons, vous devez rendre votre code aussi petit que possible.
Exemples / cas de test
Java générique
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
devient...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
L'image elle-même
public class Permuter{
private static void permute(int n, char[] a){
if (n == 0){
System.out.println(String.valueOf(a));
}else{
for (int i=0; i<= n; i++){
permute(n-1, a);
swap(a, n % 2 == 0 ? i : 0, n);
}
}
}
private static void swap(char[] a, int i, int j){
char saved = a[i];
a[i] = a[j];
a[j] = saved;
}
}
devient...
public class Permuter {
private static void permute(int n, char[] a) {
if (n == 0) {
System.out.println(String.valueOf(a)) ;}
else {
for (int i=0; i<= n; i++) {
permute(n-1, a) ;
swap(a, n % 2 == 0 ? i : 0, n) ;}}}
private static void swap(char[] a, int i, int j) {
char saved = a[i] ;
a[i] = a[j] ;
a[j] = saved ;}}
Pas si parfaitement générique Python
Pour le contraste
def Main():
print("Hello, World!");
Main();
devient...
def Main():
print("Hello, World!") ;
Main() ;
Remarques
- Les échappatoires standard s'appliquent
- IO standard s'applique
- C'est le golf de code , donc le programme le plus court en octets gagne!
- Je ne suis pas responsable des dommages liés à la programmation dans le style de l'accolade à droite
- S'amuser!
Modifier les notes
J'ai reformulé les détails du défi, j'espère que je n'ai brisé la vision de personne sur les règles, je vous assure que ce n'était pas intentionnel. Cela devrait être une spécification beaucoup plus claire et moins conflictuelle.
int a=0;System.out.println(a);
;{}
caractères soient rassemblés s'ils sont sur des lignes distinctes (cela ne ressort que de l'exemple, pas des règles, et en fait, si une ligne consiste à\t}
conserver l'indentation, cela signifierait de ne pas remonter}
jusqu'à la fin de la ligne précédente)Réponses:
Utilitaires V + Bash,
6462616062 octets1 octet enregistré grâce à @DJMcMayhem pour avoir assemblé les commandes ex
^R
est le caractère littéral de<C-r>
(0x12
) et<84>
est0x84
et<94>
est0x94
.wc -L
fonctionne sur la plupart des systèmes basés sur * nix, mais pas sur macOS. Pour macOS, vous devez le fairegwc -L
après avoir obtenu des coreutils en utilisant brew, si vous ne l'avez pas déjà fait.Essayez-le en ligne! (Java)
Essayez-le en ligne! (Python)
Essayez-le en ligne! (Java à nouveau)
Cela préserve toutes les lignes vides et ne gère pas les tabulations, seulement les espaces.
Hexdump:
Explication
Nous devons d'abord pouvoir déplacer le curseur n'importe où dans le tampon, nous utilisons donc
et nous enchaînons cela avec une autre commande ex en utilisant
|
Nous devons obtenir la longueur de la plus longue ligne en entrée. Cela peut être fait avec la commande shell
wc -L
.Cela écrase le tampon actuel (contenant l'entrée) avec le résultat de
wc -L
. Il donne une sortie de quelque chose comme:et le curseur atterrit sur l'
4
entrée42
. Ensuite, nous copions ce nombre en utilisanty$
: le texte de la position du curseur jusqu'à la fin de la ligne. Cela stocke commodément ce numéro dans le registre0
. Mais plus là-dessus plus tard. L'entrée est remplacée par ce numéro, donc pour revenir en arrière, nousu
ndo.Supposons maintenant que l'entrée ressemble un peu à ceci:
nous devons déplacer les accolades
}
de la fin du tampon juste après l'println
instruction.Si l'expression régulière ne peut pas être trouvée, une erreur de rupture se produit et éclate de la récursivité causée par
ò
.Vient maintenant la partie principale de ce programme, déplacez tous les accolades et les points-virgules et alignez-les comme indiqué dans la question.
Encore une fois, cette récursivité sera arrêtée par une erreur de rupture provoquée lorsque l'expression régulière n'a pas pu être trouvée dans le tampon.
Modifications
D
au lieu ded$
(je ne sais même pas pourquoi j'ai raté ça en premier lieu)[^
(dans l'expression régulière)<84>
\zs
(compression dans<93>
) et en retirant le$
en$xk$pò
la source
:se ve=all|%!wc -L
Ruby,
100114108 octetsLit le nom du fichier comme argument de ligne de commande. Si aucun nom de fichier n'est fourni, il lira à partir de STDIN. Ne gère pas les onglets.
Essayez-le en ligne!
la source
catch
instruction en retrait et B. un point-virgule trop en retrait, sur la plus longue ligne du code. Je pense que je sais juste la chose dont j'ai besoin pour le réparer, donnez-moi une seconde. (De plus, j'ai mis à jour les spécifications pour mentionner qu'il ne peut pas gérer les onglets et que votre fichier a des onglets.)Perl , 90 octets
88 octets de code +
-p0
drapeaux.Essayez-le en ligne!
Explications courtes:
\@a[y///c]for/.*/g;
compte la longueur de la ligne la plus longue: pour chaque ligne, il définit l'élément à indexy///c
(ie la taille de la ligne) du tableau@a
. À la fin, l'indice maximum de@a
(c'est-à-dire la taille de@a
) est la taille de la ligne la plus longue.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
place les{};
caractères à la fin des lignes.1while s/ *\n *([{};]+)$/$1/m
fait met les accolades sur les lignes vides sur la ligne ci-dessus.Merci à @primo à qui j'ai "volé" partiellement le début de mon code d' ici pour compter la longueur de la plus longue ligne.
la source
Python 2: 228 octets
la source
;{}
repartir de zéro lorsque je me suis rendu compte que seul devait continuer à la fin des lignes précédentes.empilé , 133 octets
Essayez-le en ligne! Je pourrais être en train de trop réfléchir à cela ... mais quoi. Je le reverrai demain. Quelques bons conseils:
"!
peut souvent être utilisé à la place demap
, en enregistrant un octet ou deux, selon que le prochain jeton commence par un mot. Cependant, il ne peut être utilisé que lorsque chaque atome du tableau souhaite être mappé. C'est semblable à une carte profonde.$MAXmap
est donc équivalent à$MAX map
, qui à son tour est équivalent à[MAX] map
. (Mappe chaque tableau à son élément maximal.)la source
JavaScript (proposition ES),
139121 octetsNécessite Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 pour
padEnd
. Edit: 18 octets enregistrés grâce à @ValueInk.la source
s.replace(r,`$1`)
lors du calcul de la longueur de ligne? N'importe quelle quantité de remplissage droit devrait être suffisante, donc compter la longueur de la ligne avec les points-virgules et les crochets devrait être bien.PHP,
201194185172 172167 octetsprend l'entrée du fichier f; suppose des sauts de ligne à un octet et aucun onglet; conserve les lignes vides.
+1
au deuxièmestr_pad
paramètre.0
:supprimez
""<
et remplacez""==
par!
.panne
la source
{}
accolades dans l'expression régulière?Java 8,
312305 octetsExplication:
Essayez-le ici.
la source