Nawiasy klamrowe to styl nawiasowania kodu, w którym nawiasy klamrowe i średniki są wyrównane do jednego punktu po prawej stronie pliku.
Z wielu powodów uważa się to za złą praktykę.
Wyzwanie
Weź ciąg multilinii dowolną metodą i przekonwertuj jego styl nawiasów klamrowych na prawą nawias klamrowy.
W przypadku tego wyzwania potrzebujesz go tylko do pracy z kodem Java, jednak teoretycznie powinien on działać z każdym kodem, który używa nawiasów klamrowych i średników.
Musisz złapać wszystkie {};
postacie z rzędu, z dowolną spacją między nimi. NA PRZYKŁAD. }}
, ; }
}\n\t\t}
i wyrównaj je po prawej stronie pliku za pomocą białych znaków.
na przykład:
a {
b;
{c
powinno stać się
a {
b ;{
c
Lub, bardziej abstrakcyjnie, przesuń dowolną spację od lewej strony wszystkich {};
znaków w prawo.
Wcięcie linii powinno być w inny sposób zachowane. Linie zawierające tylko białe znaki po ruchu {};
znaków mogą być opcjonalnie usunięte.
Na przykład:
a{
b{
c;
}
}
d;
Może stać się albo
a {
b {
c;}}
d ;
lub
a {
b {
c;}}
d ;
Przesunięcie w prawo oznacza {};
wyrównanie wszystkich znaków do punktu nie krótszego niż najdłuższa linia. Każda ilość miejsca po tym jest akceptowalna.
Tak więc wszystkie poniższe elementy są dopuszczalne:
a {
bc;
a {
bc ;
a {
bc ;
itp...
Linie w dowolnym kodzie mogą zawierać {};
znaki między innymi znakami spacjami, obsługa tego przypadku nie jest konieczna, chociaż jeśli masz skłonność, powinieneś pozostawić je na miejscu. Linie mogą także w ogóle nie zawierać żadnych {};
znaków i należy z tym poprawnie postępować. Jak pokazano poniżej.
a {
b ;
c
d }
Ponieważ nie chcemy, aby Code Review widział straszne rzeczy, które robimy, musisz zminimalizować swój kod.
Przykłady / przypadki testowe
Ogólna Java
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
staje się...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
Sam obraz
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;
}
}
staje się...
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 ;}}
Nie tak idealnie ogólny Python
Dla kontrastu
def Main():
print("Hello, World!");
Main();
staje się...
def Main():
print("Hello, World!") ;
Main() ;
Uwagi
- Standardowe Luki zastosowanie
- Obowiązuje standardowe IO
- To jest golf golfowy , więc wygrywa najkrótszy program w bajtach!
- Nie jestem odpowiedzialny za szkody związane z programowaniem w stylu prawej ręki
- Baw się dobrze!
Edytuj notatki
Przeredagowałem szczegóły wyzwania. Mam nadzieję, że nie złamałem niczyjego spojrzenia na zasady, zapewniam cię, że było to niezamierzone. To powinno być znacznie bardziej jasne i mniej sprzeczne ze specyfikacją.
źródło
int a=0;System.out.println(a);
;{}
wyjaśnić , że chcesz zebrać postacie, jeśli znajdują się w osobnych wierszach (wynika to tylko z przykładu, a nie z reguł, a w rzeczywistości, jeśli linia polega na\t}
zachowaniu wcięcia, oznacza to, że nie przesunie}
się do końca poprzedniej linii)Odpowiedzi:
Narzędzia V + Bash,
6462616062 bajtów1 bajt zapisany dzięki @DJMcMayhem za połączenie poleceń ex razem
^R
jest literałowym znakiem dla<C-r>
(0x12
) oraz<84>
jest0x84
i<94>
jest0x94
.wc -L
działa na większości systemów opartych na * nix, ale nie na macOS. W przypadku systemu macOS musisz zrobićgwc -L
po uzyskaniu coreutils za pomocą naparu, jeśli jeszcze tego nie zrobiłeś.Wypróbuj online! (Jawa)
Wypróbuj online! (Pyton)
Wypróbuj online! (Znowu Java)
To zachowuje wszystkie puste linie i nie obsługuje tabulatorów, tylko spacje.
Hexdump:
Wyjaśnienie
Najpierw musimy umieć przesuwać kursor w dowolne miejsce w buforze, więc używamy
i łączymy to za pomocą innego polecenia ex przy użyciu
|
Musimy uzyskać długość najdłuższej linii na wejściu. Można to zrobić za pomocą polecenia powłoki
wc -L
.To zastępuje bieżący bufor (zawierający dane wejściowe) wynikiem
wc -L
. Daje to wynik czegoś takiego jak:a kursor ląduje na
4
IN42
. Następnie kopiujemy ten numer, używający$
: szarpnij tekst od pozycji kursora do końca linii. To wygodnie przechowuje ten numer w rejestrze0
. Ale o tym później. Dane wejściowe są zastępowane tą liczbą, więc aby wrócić, nieu
musimy.Powiedzmy teraz, że dane wejściowe wyglądały mniej więcej tak:
musimy przenieść nawiasy klamrowe
}
z końca bufora do tuż poprintln
instrukcji.Jeśli nie można znaleźć wyrażenia regularnego, pojawia się błąd przełamania i wypływa on z rekurencji spowodowanej przez
ò
.Teraz pojawia się główna część tego programu, przesuń wszystkie nawiasy klamrowe i średniki i wyrównaj je, jak podano w pytaniu.
Ponownie rekursja zostanie zatrzymana przez błąd zerwania spowodowany, gdy nie można znaleźć wyrażenia regularnego w buforze.
Edycje
D
zamiastd$
(nawet nie wiem, dlaczego mi tego brakowało)[^
(w wyrażeniu regularnym) do<84>
\zs
(prasowanie jej<93>
) i usuwając$
in$xk$pò
źródło
:se ve=all|%!wc -L
Rubinowy,
100114108 bajtówOdczytuje nazwę pliku jako argument wiersza poleceń. Jeśli nazwa pliku nie zostanie podana, zostanie odczytany ze STDIN. Nie obsługuje kart.
Wypróbuj online!
źródło
catch
, a B. średnik, który został wcięty zdecydowanie za dużo, w najdłuższym wierszu kodu. Myślę, że wiem, co muszę naprawić, daj mi chwilę. (Również zaktualizowałem specyfikację, aby wspomnieć, że nie obsługuje kart, a twój plik ma karty.)Perl , 90 bajtów
88 bajtów kodu +
-p0
flagi.Wypróbuj online!
Krótkie wyjaśnienia:
\@a[y///c]for/.*/g;
zlicza długość najdłuższej linii: dla każdej linii definiuje element na indeksiey///c
(tj. Rozmiar linii) tablicy@a
. Na koniec maksymalny indeks@a
(tj. Rozmiar@a
) to rozmiar najdłuższej linii.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
umieszcza{};
znaki na końcu linii.1while s/ *\n *([{};]+)$/$1/m
sprawia, że nawiasy klamrowe na pustych liniach przechodzą na linię powyżej.Dzięki @primo, od którego częściowo „ukradłem” początek mojego kodu , aby policzyć długość najdłuższej linii.
źródło
Python 2: 228 bajtów
źródło
;{}
muszą iść na koniec poprzednich linii.ułożone , 133 bajty
Wypróbuj online! Mógłbym mocno to przemyśleć ... ale co. Spojrzę na to jutro. Kilka fajnych wskazówek:
"!
może być często używany zamiastmap
, oszczędzając bajt lub dwa, w zależności od tego, czy następny token zaczyna się od słowa. Można go jednak użyć tylko wtedy, gdy każdy atom tablicy chce zostać zamapowany. Jest podobny do głębokiej mapy.$MAXmap
jest równoważna z$MAX map
, co z kolei jest równoważne z[MAX] map
. (Mapuje każdą tablicę do jej maksymalnego elementu.)źródło
JavaScript (propozycja ES),
139121 bajtówWymaga przeglądarki Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 dla
padEnd
. Edycja: Zapisano 18 bajtów dzięki @ValueInk.źródło
s.replace(r,`$1`)
podczas obliczania długości linii? Każda wystarczająca ilość prawego dopełnienia powinna wystarczyć, więc liczenie długości linii za pomocą średników i nawiasów powinno być w porządku.PHP,
201194185172167 bajtówpobiera dane wejściowe z pliku f; zakłada podział bajtów na jeden bajt i brak tabulatorów; zachowuje puste linie.
+1
do drugiegostr_pad
parametru.0
:Usunąć
""<
i wymienić""==
z!
.awaria
źródło
{}
nawiasów klamrowych w wyrażeniu regularnym?Java 8,
312305 bajtówWyjaśnienie:
Wypróbuj tutaj.
źródło