Colchete à direita é um estilo de colchete de código no qual colchetes e ponto e vírgula estão todos alinhados a um único ponto no lado direito de um arquivo.
Geralmente, isso é considerado uma má prática, por várias razões.
O desafio
Pegue uma sequência de várias linhas através de qualquer método e converta o estilo da chave para Chave à direita.
Para esse desafio, você só precisa trabalhar com código Java; no entanto, teoricamente, ele deve funcionar com qualquer código que use chaves e ponto e vírgula.
Você deve pegar todos os {};
caracteres em uma linha, com qualquer quantidade de espaço em branco entre eles. POR EXEMPLO. }}
, ; }
}\n\t\t}
E alinhá-los no lado direito do arquivo através do uso de espaço em branco.
por exemplo:
a {
b;
{c
Deve se tornar
a {
b ;{
c
Ou, de maneira mais abstrata, empurre todo e qualquer espaço em branco da esquerda de todos os {};
caracteres para a direita.
O recuo das linhas deve ser preservado. As linhas que contêm apenas espaço em branco após o movimento dos {};
caracteres podem opcionalmente ser removidas.
Por exemplo:
a{
b{
c;
}
}
d;
Pode tornar-se
a {
b {
c;}}
d ;
ou
a {
b {
c;}}
d ;
Empurrado para a direita refere-se a todos os {};
caracteres sendo alinhados a um ponto não menor que a linha mais longa. Qualquer quantidade de espaço depois disso é aceitável.
Portanto, todos os itens abaixo são aceitáveis:
a {
bc;
a {
bc ;
a {
bc ;
etc ...
Linhas em qualquer código podem conter {};
caracteres entre outros caracteres que não sejam espaços em branco, o tratamento deste caso não é necessário, embora se você quiser, deixe-os no lugar. As linhas também podem não conter {};
caracteres, e isso deve ser tratado corretamente. Como é mostrado abaixo.
a {
b ;
c
d }
Como não queremos que a Revisão de código veja as coisas horríveis que estamos fazendo, você precisa tornar seu código o menor possível.
Exemplos / casos de teste
Java genérico
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
torna-se...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
A própria imagem
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;
}
}
torna-se...
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 não tão perfeitamente genérico
Para contraste
def Main():
print("Hello, World!");
Main();
torna-se...
def Main():
print("Hello, World!") ;
Main() ;
Notas
- Aplicam-se brechas padrão
- IO padrão se aplica
- Isso é código-golfe , e o programa mais curto em bytes vence!
- Não sou responsável por danos relacionados à programação no estilo Right Hand Brace
- Diverta-se!
Editar notas
Eu reformulei os detalhes do desafio. Espero não ter quebrado a visão de ninguém sobre as regras, garanto que não foi intencional. Essa deve ser uma especificação muito mais clara e menos conflitante.
fonte
int a=0;System.out.println(a);
;{}
caracteres sejam reunidos se estiverem em linhas separadas (isso é claro apenas no exemplo, não nas regras, e, de fato, se uma linha consiste em\t}
preservar o recuo, isso significa não avançar}
até o fim da linha anterior)Respostas:
Utilitários V + Bash,
6462616062 bytes1 byte salvo graças a @DJMcMayhem por colocar os comandos ex juntos
^R
é o caractere literal para<C-r>
(0x12
) e<84>
é0x84
e<94>
é0x94
.wc -L
funciona na maioria dos sistemas baseados em * nix, mas não no macOS. Para o macOS, você precisa fazer issogwc -L
depois de obter o coreutils usando o brew, se ainda não o fez.Experimente online! (Java)
Experimente online! (Python)
Experimente online! (Java novamente)
Isso preserva todas as linhas em branco e não manipula guias, apenas espaços.
Hexdump:
Explicação
Primeiro, precisamos poder mover o cursor em qualquer lugar do buffer, então usamos
e encadeamos isso com outro comando ex usando
|
Precisamos obter o comprimento da linha mais longa na entrada. Isso pode ser feito com o comando shell
wc -L
.Isso substitui o buffer atual (contendo a entrada) pelo resultado de
wc -L
. Dá uma saída de algo como:e o cursor pousa
4
na entrada42
. Em seguida, copiamos esse número usandoy$
: arrancar o texto da posição do cursor até o final da linha. Isso armazena convenientemente esse número no registro0
. Mas mais sobre isso mais tarde. A entrada é substituída por esse número; portanto, para reverter, precisamosu
.Agora, digamos que a entrada tenha a seguinte aparência:
precisamos mover as chaves
}
do final do buffer para logo após aprintln
declaração.Se a regex não puder ser encontrada, ocorrerá um erro de quebra e interromperá a recursão causada por
ò
.Agora vem a parte principal deste programa, mova todas as chaves e ponto-e-vírgula e alinhe-as conforme indicado na pergunta.
Novamente, essa recursão será interrompida por um erro de quebra causado quando o regex não pôde ser encontrado no buffer.
Edições
D
vez ded$
(nem sei por que perdi isso em primeiro lugar)[^
(no regex) para<84>
\zs
(comprimindo-a<93>
) e removendo o$
em$xk$pò
fonte
:se ve=all|%!wc -L
Ruby,
100114108 bytesLê o nome do arquivo como argumento da linha de comando. Se nenhum nome de arquivo for fornecido, ele será lido em STDIN. Não manipula guias.
Experimente online!
fonte
catch
declaração recuada e B. um ponto-e-vírgula recuado demais, na linha mais longa do código. Acho que sei exatamente o que preciso para consertar, me dê um segundo. (Além disso, eu atualizei a especificação de mencionar que não pode lidar com abas, e seu arquivo tem guias.)Perl , 90 bytes
88 bytes de código +
-p0
sinalizadores.Experimente online!
Explicações breves:
\@a[y///c]for/.*/g;
conta o comprimento da linha mais longa: para cada linha, define o elemento no índicey///c
(ou seja, o tamanho da linha) da matriz@a
. No final, o índice máximo de@a
(ou seja, o tamanho de@a
) é o tamanho da linha mais longa.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
coloca os{};
caracteres no final das linhas.1while s/ *\n *([{};]+)$/$1/m
faz faz com que as chaves nas linhas vazias sigam a linha acima.Graças ao @primo, de quem "roubei" parcialmente o início do meu código daqui para contar o comprimento da linha mais longa.
fonte
Python 2: 228 bytes
fonte
;{}
necessário ir no final das linhas anteriores.empilhados , 133 bytes
Experimente online! Eu poderia estar pensando demais nisso ... mas o que quer. Vou olhar novamente amanhã. Algumas dicas legais:
"!
geralmente pode ser usado no lugar demap
, salvando um byte ou dois, dependendo se o próximo token começar com uma palavra. No entanto, ele só pode ser usado quando cada átomo da matriz deseja ser mapeado. É semelhante a um mapa profundo.$MAXmap
é equivalente a$MAX map
, que por sua vez é equivalente a[MAX] map
. (Mapeia cada matriz para seu elemento máximo.)fonte
JavaScript (Proposta da ES),
139121 bytesRequer o Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 para
padEnd
. Editar: salvou 18 bytes graças a @ValueInk.fonte
s.replace(r,`$1`)
ao calcular o comprimento da linha? Qualquer quantidade razoável de preenchimento correto deve ser suficiente; portanto, a contagem do comprimento da linha com ponto e vírgula e colchetes deve ser boa.PHP,
201194185172167 bytesrecebe entrada do arquivo f; assume quebras de linha de byte único e sem guias; preserva linhas em branco.
+1
ao segundostr_pad
parâmetro.0
:remova
""<
e substitua""==
por!
.demolir
fonte
{}
aparelho no regex?Java 8,
312305 bytesExplicação:
Experimente aqui.
fonte