Zakończ zakładki kontra wojna kosmiczna
Dyskutowano więc o tym, czy do wcięcia / formatowania kodu należy używać tabulatorów lub spacji. Czy możesz pomóc uniwersytetowi rozwiązać spór, przechodząc do niezwykle szalonej, unikalnej metody formatowania.
Twoim zadaniem jest napisanie pełnego programu lub funkcji, która rozłoży wszystkie tabulatory na cztery spacje. A następnie zamienia ciąg n wiodących spacji na „/ (n - dwie gwiazdki tutaj) /”. Otrzymasz dane wejściowe w wielu wierszach w dowolnym rozsądnym formacie (tablica pojedynczych ciągów dla każdej nowej linii. Tablica kolumnowa itp.)
Przykładowe dane bezwstydnie skradzione . Zwróć uwagę, że ponieważ tabulatory są automatycznie rozszerzane do czterech spacji w SE, reprezentuję je jako znak „^”, ale musisz również obsługiwać tabulatory (punkt kodowy 0x09). Wszystkie znaki „^” reprezentują tabelę.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Próbka wyjściowa
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Ponieważ uniwersytet potrzebuje miejsca do pobrania zarówno Vima, jak i Emacsa, masz bardzo mało miejsca na swój kod. Dlatego jest to golf golfowy i wygrywa najkrótszy kod. Możesz założyć, że dane wejściowe są dobrze uformowane, a linie z mniej niż czterema spacjami (po zastąpieniu tabulatorami) mogą powodować niezdefiniowane zachowanie.
Zrzeczenie się
Ta „doskonała” strategia formatowania powstała dzięki uprzejmości Geobits i została odtworzona za jego zgodą. Podczas tworzenia tego wyzwania żaden programista nie został poszkodowany.
źródło
/*
, czy też można to uznać za „dobrze sformułowany wkład”? Plik źródłowy C ++ byłby lepszym testem, ponieważ jego komentarz wielowierszowy/* */
prawdopodobnie złamałby niektóre odpowiedzi, które zamieniają pierwsze i ostatnie z wiodących spacji na/
, a następnie kontynuują wypełnianie spacjami*
./* */
kod C ++, ale tym razem na początku wiersza. Zgodnie ze specyfikacją należy go pozostawić bez zmian. Tutaj pułapka jest, i już zauważyła błędne odpowiedzi, że wyrażenie regularne, takie jak powiedzmy/\** /
użyte do wypełnienia tych spacji między // gwiazdkami, zamieniłoby linię/***/
. Widziałem także tę konwersję/*//*/
. Zakładam, że oba są nieprawidłowe.Odpowiedzi:
V ,
21, 20 bajtówWypróbuj online!
To dosłownie tylko bezpośredni port mojej odpowiedzi vima. Znaczące różnice:
Í
Komendy (Global substytut) automatycznie wypełnia/g
flagą, co pozwala zaoszczędzić dwa bajtyô
jest identyczny z\t
Î
Jest mnemonikiem dla:%norm
, a także wypełnia niezbędną przestrzeń pomiędzy:%norm
i zestawem klawiszy.Końcowy powrót karetki na końcu jest domyślnie dodawany.
źródło
Vim,
37, 34, 33,32 bajtyWypróbuj online!
Zauważ, że wymaga to powrotu karetki (enter) w vimie, chociaż nie w tłumaczu online.
Używa interpretera V, ponieważ jest kompatybilny wstecz. Bardzo proste rozwiązanie.
Oto gif, który pozwala zobaczyć rozwiązanie w czasie rzeczywistym. Używa to nieco starszej wersji i dodałem kilka dodatkowych naciśnięć klawiszy, aby działał wolniej, dzięki czemu można zobaczyć, co się dzieje:
A oto wyjaśnienie, jak to działa:
źródło
g
ale potem edytowałeś, by nie używać g: / +1 w każdym razie: D:g
ponieważ nadużywa mniej znanej funkcji:norm
polecenie zostanie anulowane, jeśli się^F<space>
nie powiedzie. Tak:%norm ^F<space>foo
jest w zasadzie to samo, co:g/^ /norm foo
ciekawego Vima hacki. : Dnorm
?^F
, nie<C-f>
notacja klucza Silly Vim. W takim przypadku^
przeskocz do pierwszego nie-białego znaku, iF<space>
Który znajduje pierwszą spację za kursorem.Perl, 41 bajtów
Uruchom z
-p
flagą, tak:Zastąp
␉
tabulatorem (w Bash spróbuj wpisać Control-V Tab).źródło
perl
zastąpiłem to odniesienie na miejscu, chciałbym, żebysed
to też było.Cheddar ,
605756 bajtówZaoszczędź 3 bajty dzięki @Conor O'Brien
Chciałbym, żeby Cheddar miał lepsze formatowanie napisów.
Wypróbuj online!
Wyjaśnienie
To jest funkcja.
@
to reprezentuje funkcjonalizowaną właściwość (np. ruby&:
) pozwalającą ci robić rzeczy takie jak: `ar.map (@. head (-1))Jeśli nie znasz regex:
to w zasadzie dopasowało jedną lub więcej (
+
) spacji () na początku (
^
) każdej (g
) linii (m
).źródło
/^ +/
wystarcza również jako wyrażenie regularne, ponieważ możemy założyć, że spacje wiodące będą miały co najmniej 4 długości.Mathematica, 97 bajtów
Funkcja anonimowa. Pobiera ciąg jako dane wejściowe i zwraca ciąg jako dane wyjściowe.
źródło
Python 3, 124 bajty
Używa dobrego wyrażenia regularnego.
Ideone to!
źródło
Java
210207 bajtówJest to rozwiązanie referencyjne, które implementuje je naiwnie.
źródło
for(int j=0;++j<i-1;)
. Możesz także usunąćint
poprzednij
i umieścić go po już istniejącym int:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 bajtów
Zamień
\t
na literalną kartę w kodzie.źródło
Java,
185184167152 bajtówBiorąc pod uwagę bardzo luźną definicję tablicy ciągów podaną w początkowym poście, użyłem jej,
Stream<String>
co pozwala na pewne konsekwentne oszczędności bajtów.Użyłem innych technik niż RI, aby osiągnąć ten sam cel. Sam algorytm jest raczej taki sam.
Testowanie i niestosowanie :
źródło
Siatkówka , 25 bajtów
\t
Należy zastąpić rzeczywistej znak tabulatora (0x09).Wypróbuj online!
Wyjaśnienie
Zastąp każdą kartę czterema spacjami.
Przekształcanie każdej linii oddzielnie (
%
) dopasowując2+N
przestrzenie na początku linii, a zastąpienie go/.../
w którym...
toN
kopie*
.źródło
Python,
125111 bajtówhttps://repl.it/DGyh/2
źródło
SED (56 + 1 dla -r) 57
Gdzie
⇥
jest karta1. zastępuje karty spacjami.
2. zastępuje pierwszą i ostatnią wiodącą spację
/
.3. zastępuje pierwsze spację po
/
i 0+*
s,*
dopóki nie będzie dopasowania.źródło
-f
. Wszelkie dodatkowe flagi, takie jak n lub r, powinny być liczone jako jeden bajt. W ten sposób oszczędzasz 2 bajty.;
po t także nie jest konieczne. Jeśli chodzi o sam kod, potrzebujesz ^ na początku trzeciegos
polecenia, w przeciwnym razie dane takie jak „3/5” zamieniane są na „3 / * 5”. W pierwszyms
poleceniu faktycznie masz tam kartę, ale nie jest ona poprawnie wyświetlana i wprowadza w błąd, więc użyj \ t lub określ po tym, że znak był kartą.Uniwersytet powinien rozważyć umożliwienie nieco więcej miejsca na programy w Emacs Lisp (lub domyślnie
tabify
iuntabify
samodzielnie), ponieważ stają się one bardziej gadatliwe niż Java. Powinien także zwracać szczególną uwagę na uczniów (lub nauczycieli), których rozmiar identyfikacyjny jest mniejszy niż czterech lub którzy akurat kodują w języku innym niż C.Poniższe rozwiązanie ma 206 bajtów
Zakładając, że
tab-width
nie trzeba tego wyraźnie ustawiać, możemy zapisać 20 z nich.Wersja bez golfa wyglądałaby tak
Najpierw
untabify
region, zanim przejdziemy do jego początku. Następnie, gdy widzimy białe znaki na początku wiersza, zastępujemy je komentarzem, który jest tak długi jak wspomniane białe znaki. Mówiąc ściślej, komentarz do wstawienia jest konstruowany przezktóry sam zajmuje 97 bajtów. Bardzo cenione jest krótsze rozwiązanie do skopiowania niektórych ciągów n razy.
źródło
Rubin,
5247 + 1 (flaga p) = 48 bajtówEdycja : zapisano całe 5 bajtów dzięki funkcji Value Ink
źródło
p
flagi, aby skorzystać z faktu, że (g) sub modyfikuje,$_
a tym samym zmienia drukowaną wartość?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
Bang nie może$_
tutaj zmodyfikować .GNU sed,
6664 + 1 (flaga r) = 65 bajtówEdycja: 1 bajt mniej dzięki sugestii Riley .
Uruchom: sed -rf formatter.sed plik_wejściowy
Powodem oddzielenia się
\n
wiodącymi spacjami od reszty tekstu w tym wierszu jest to, że w przeciwnym razie wiersz C ++ rozpoczynający się od takiego komentarza/* */
zostałby przekształcony w/*****/
prostszą linię 4 podobnąs,^(/\**) ,\1*,
lub nawets,^(/\**) ( */),\1*\2,
. Ponieważ sed wykonuje skrypt dla każdej linii wejściowej,\n
podczas odczytu nie jest wprowadzane żadne miejsce w obszarze wzorców.źródło
/
dopóki nie zastąpisz\n
. Dzięki temu nie musisz dopasowywać go w linii 4.\t
znakiem tabulacji.