La llave de la derecha es un estilo de horquillado de código en el que las llaves y los puntos y comas están todos alineados en un solo punto en el lado derecho de un archivo.
En general, esto se considera una mala práctica, por varias razones.
El reto
Tome una cadena multilínea a través de cualquier método y convierta su estilo de llave en Brace derecho.
Para este desafío, solo necesita que funcione en código Java, sin embargo, en teoría debería funcionar en cualquier código que use llaves y puntos y comas.
Debe tomar todos los {};
caracteres en una fila, con cualquier cantidad de espacio en blanco entre ellos. P.EJ. }}
, ; }
}\n\t\t}
y alinearlos en el lado derecho del archivo mediante el uso de espacios en blanco.
por ejemplo:
a {
b;
{c
debe convertirse
a {
b ;{
c
O, de manera más abstracta, empuje todos los espacios en blanco desde la izquierda de todos los {};
caracteres, hacia la derecha.
La sangría de las líneas debe conservarse de otra manera. Las líneas que solo contienen espacios en blanco después del movimiento de los {};
caracteres pueden eliminarse opcionalmente.
Por ejemplo:
a{
b{
c;
}
}
d;
Puede convertirse en cualquiera
a {
b {
c;}}
d ;
o
a {
b {
c;}}
d ;
Empujado a la derecha se refiere a todos los {};
caracteres que se alinean a un punto no más corto que la línea más larga. Cualquier cantidad de espacio después de eso es aceptable.
Entonces todo lo siguiente es aceptable:
a {
bc;
a {
bc ;
a {
bc ;
etc ...
Las líneas en cualquier código pueden contener {};
caracteres entre otros caracteres que no sean espacios en blanco, el manejo de este caso no es necesario, aunque si está inclinado, debe dejarlos en su lugar. Las líneas también pueden no contener ningún {};
carácter, y esto debe manejarse correctamente. Como se muestra a continuación.
a {
b ;
c
d }
Debido a que no queremos que Code Review vea las cosas horribles que estamos haciendo, debe hacer que su código sea lo más pequeño posible.
Ejemplos / Casos de prueba
Java genérico
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
se convierte en ...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
La imagen en sí
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;
}
}
se convierte en ...
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 ;}}
Python no tan perfectamente genérico
Por contraste
def Main():
print("Hello, World!");
Main();
se convierte en ...
def Main():
print("Hello, World!") ;
Main() ;
Notas
- Se aplican lagunas estándar
- Se aplica el estándar IO
- Este es el código de golf , por lo que gana el programa más corto en bytes.
- No soy responsable de los daños relacionados con la programación en el estilo de llave de mano derecha
- ¡Que te diviertas!
Editar notas
Reescribí los detalles del desafío. Espero no haber roto la visión de las reglas de nadie, les aseguro que no fue intencional. Esta debería ser una especificación mucho más clara y menos conflictiva.
fuente
int a=0;System.out.println(a);
;{}
caracteres se reúnan si están en líneas separadas (solo está claro en el ejemplo, no en las reglas, y de hecho si una línea consiste en\t}
preservar la sangría significaría no moverse}
hasta el final de la línea anterior)Respuestas:
Utilidades V + Bash,
6462616062 bytes1 byte guardado gracias a @DJMcMayhem por juntar los comandos ex
^R
es el carácter literal de<C-r>
(0x12
) y<84>
es0x84
y<94>
es0x94
.wc -L
funciona en la mayoría de los sistemas basados en * nix, pero no en macOS. Para macOS, debe hacerlogwc -L
después de obtener coreutils usando brew, si aún no lo ha hecho.Pruébalo en línea! (Java)
Pruébalo en línea! (Pitón)
Pruébalo en línea! (Java de nuevo)
Esto conserva todas las líneas en blanco y no maneja pestañas, solo espacios.
Hexdump:
Explicación
Primero necesitamos poder mover el cursor a cualquier parte del búfer, así que usamos
y encadenamos esto con otro comando ex usando
|
Necesitamos obtener la longitud de la línea más larga en la entrada. Esto se puede hacer con el comando de shell
wc -L
.Esto sobrescribe el búfer actual (que contiene la entrada) con el resultado de
wc -L
. Da una salida de algo como:y el cursor se posa en el
4
en42
. Luego copiamos este número usandoy$
: tirar el texto desde la posición del cursor hasta el final de la línea. Esto almacena convenientemente este número en el registro0
. Pero más sobre eso más tarde. La entrada se reemplaza con este número, así que para volver atrás, hacemosu
.Ahora digamos que la entrada se parecía a esto:
necesitamos mover las llaves
}
desde el final del búfer hasta justo después de laprintln
declaración.Si no se puede encontrar la expresión regular, se produce un error de ruptura y se libera de la recursión causada por
ò
.Ahora viene la parte principal de este programa, mueva todas las llaves y punto y coma y alinéelos como se indica en la pregunta.
Nuevamente, esta recursión se detendrá por un error de ruptura causado cuando no se pudo encontrar la expresión regular en el búfer.
Ediciones
D
lugar ded$
(ni siquiera sé por qué me perdí eso en primer lugar)[^
(en la expresión regular) a<84>
\zs
(comprimirlo<93>
) y al eliminar el$
in$xk$pò
fuente
:se ve=all|%!wc -L
Ruby,
100114108 bytesLee el nombre del archivo como argumento de línea de comando. Si no se proporciona ningún nombre de archivo, se leerá desde STDIN. No maneja pestañas.
Pruébalo en línea!
fuente
catch
declaración con sangría y B. un punto y coma que estaba demasiado sangrado, en la línea más larga del código. Creo que sé exactamente lo que necesito para solucionarlo, dame un segundo. (Además, actualicé la especificación para mencionar que no puede manejar pestañas, y su archivo tiene pestañas.)Perl , 90 bytes
88 bytes de código +
-p0
banderas.Pruébalo en línea!
Explicaciones breves:
\@a[y///c]for/.*/g;
cuenta la longitud de la línea más larga: para cada línea, define el elemento en el índicey///c
(es decir, el tamaño de la línea) de la matriz@a
. Al final, el índice máximo de@a
(es decir, el tamaño de@a
) es el tamaño de la línea más larga.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
coloca los{};
caracteres al final de las líneas.1while s/ *\n *([{};]+)$/$1/m
makes hace que las llaves en las líneas vacías vayan en la línea de arribaGracias a @primo de quien parcialmente "robé" el comienzo de mi código desde aquí para contar la longitud de la línea más larga.
fuente
Python 2: 228 bytes
fuente
;{}
necesario ir solo al final de las líneas anteriores.apilado , 133 bytes
Pruébalo en línea! Podría estar pensando demasiado en esto ... pero lo que sea. Lo miraré de nuevo mañana. Algunos buenos consejos:
"!
a menudo se puede usar en lugar demap
guardar un byte o dos, dependiendo de si el próximo token comienza con una palabra. Sin embargo, solo se puede usar cuando cada átomo de la matriz desea mapearse. Es similar a un mapa profundo.$MAXmap
es equivalente a$MAX map
, que a su vez es equivalente a[MAX] map
. (Asigna cada matriz a su elemento máximo).fuente
JavaScript (Propuesta ES),
139121 bytesRequiere Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 para
padEnd
. Editar: guardado 18 bytes gracias a @ValueInk.fuente
s.replace(r,`$1`)
al calcular la longitud de la línea? Cualquier cantidad de relleno derecho razonable debería ser suficiente, por lo que contar la longitud de la línea con punto y coma y corchetes debería estar bien.PHP,
201194185172167 bytestoma la entrada del archivo f; asume saltos de línea de un solo byte y sin pestañas; conserva líneas en blanco.
+1
al segundostr_pad
parámetro.0
:eliminar
""<
y reemplazar""==
con!
.Descompostura
fuente
{}
llaves en la expresión regular?Java 8,
312305 bytesExplicación:
Pruébalo aquí
fuente