Udane zgłoszenia do gry w golfa są z natury pełne szalonych symboli w każdym miejscu. Aby ułatwić ich złożenie, wielu golfistów decyduje się na wyjaśnienie swojego kodu. W ich wyjaśnieniu linia kodu jest przekształcana w schemat rozłożony pionowo.
Na przykład, gdyby to był mój kod:
1_'[3:~2@+]`
Jeden z wielu możliwych diagramów, które mógłbym stworzyć, mógłby wyglądać następująco:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
Cel
W tym wyzwaniu napiszesz narzędzie do automatycznego formatowania objaśnień, które pobiera wiersz kodu i tworzy diagram, do którego można łatwo dodać tekst objaśniający.
Aby uczynić to bardziej użytecznym wyzwaniem, użytkownik będzie mógł określić zawartość każdego wiersza, podając ciąg formatujący. Łańcuch formatujący będzie drugim wierszem zawierającym tylko litery A-Za-z
o tej samej długości co program. Litery pokazują kolejność, w jakiej znaki programu powinny być drukowane w objaśnieniu.
Oto przykład operacji we / wy bez formatowania przypominającego nawiasy :
123423
AabcBC
1
2
3
2
3
4
Wsporniki
Jeśli więcej niż jeden znak w programie ma ten sam poziom priorytetu, wówczas ten zestaw znaków działa jak pojedynczy blok kodu (jeśli tworzą grupę) lub zestaw nawiasów (jeśli zawierają inne znaki pomiędzy nimi). Ogólne zasady są proste:
Znaki nie pojawiają się w linii na schemacie, dopóki wszystkie inne znaki o wyższym priorytecie nie pojawią się już w liniach nad nim na schemacie.
Znaki o równym priorytecie są zawsze drukowane w tych samych wierszach. Jeśli określony znak pojawia się w linii, wszystkie inne znaki o równym priorytecie pojawiają się w linii.
Zestaw znaków o jednakowym priorytecie nadal pojawia się w każdej linii, dopóki wszystkie inne znaki w nim zawarte nie pojawią się przynajmniej raz. Pozwala to na konstrukcje „podobne do wsporników”. Jeśli
bceab
są to priorytety, tob
postacie pojawią się w drugiej linii (są drugim najwyższym priorytetem) i będą się pojawiać, dopóki nie pojawią się wszystkiecea
postacie. Jeśli ciąg priorytetowy jestabcadeafga
, to wszystkiebcdefg
są uważane za zawarte w nim, wszystkie 4a
s będą pojawiać się, dopóki nie pojawig
się.
Więcej wymagań dotyczących formatowania
Wszystkie linie wyjściowe powinny być tej samej długości (długości linii wejściowych), w razie potrzeby wypełnione spacjami. Wiersz programu wejściowego może zawierać spacje, chociaż spacje te również otrzymają literę priorytetową. Końcowe znaki nowej linii na wyjściu / wejściu są opcjonalne.
Punktacja
To jest kod golfowy, wygrywa najmniej bajtów.
Przykłady
Oto skomentowany przykład fragmentu kodu o bardziej złożonym formatowaniu.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Przykład w Perlu:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Oto kilka przykładów w CJam, dzięki uprzejmości Martina Büttnera:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Oto szalony przykład, aby z tobą zadzierać:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Oto bardziej wyraźny przykład tego, co się dzieje, gdy nawiasy się pokrywają abab
. (Zwykle nie jest to sposób, w jaki zdecydowałbyś się sformatować wyjaśnienie).
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
źródło
oNo
można zastąpićn
w TIO .CJam, 48 bajtów
Wyjaśnienie
źródło
IDL 8.4,
316318304 bajtówNowa wersja, wciąż za długa, ale krótsza! I, w prawdziwym duchu IDL, całkowicie wektoryzowany, co oznacza (ponieważ nie ma pętli for), że mogę teraz zrobić to jako jedną linię i uruchomić go na sobie, gdy tylko moja wersja zostanie całkowicie zaktualizowana do wersji 8.4. To będzie edytowane później.
Wersja jednoliniowa:
Z podziałem wierszy (ta sama liczba bajtów, napisy \ n vs i) i komentowany:
Oto podział algorytmiczny dla linii 9:
... i 10:
Wiersze 9 i 10 wykonują prawdziwą pracę, reszta ustawia zmienne potrzebne do końca. Wydaje mi się, że jest to tak gra w golfa, jak to możliwe, nie mogę znaleźć nigdzie indziej, aby zrobić to lepiej.
Stara wersja (wszystko poniżej jest nieaktualne):
Nie jest to wystarczająco krótkie, aby wygrać, ponieważ jest to okropny język golfa, ale nikt nigdy nie odpowiada w IDL, więc po prostu pójdę po niego.
Nie jestem pewien, czy jest jakiś sposób, żeby to jeszcze bardziej zmniejszyć ... Mógłbym wywołać strmid na obu A i B w tym samym czasie, ale potem spędzam więcej bajtów na indeksowaniu D i to działa tak samo. Nadal będę nad tym pracować! (A jutro będę edytować wyjaśnienie algorytmu.)
źródło