Jakie masz ogólne wskazówki na temat gry w golfa w Retina ? Szukam pomysłów, które można by zastosować do ogólnych problemów z golfem, które są przynajmniej nieco specyficzne dla Retiny (np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.
Dla porównania, kompilator online jest tutaj .
@ Sp3000 wskazał, że istnieją również Wskazówki dotyczące Regex Golf . Odpowiedzi tutaj powinny koncentrować się w szczególności na funkcjach Retina, a nie na ogólnych wskazówkach golfa.
Odpowiedzi:
Połącz pętle, jeśli to możliwe
W nietrywialnych obliczeniach często używasz kilku pętli do przetwarzania danych:
To działa,
stage1
dopóki dane wyjściowe nie będą zbieżne, a następniestage2
dopóki dane wyjściowe nie będą zbieżnestage3
dopóki dane wyjściowe nie będą zbieżne.Jednak zawsze warto szczegółowo przeanalizować poszczególne etapy. Czasami można uruchomić pętlę w sposób przeplatany,
stage1, stage2, stage3, stage1, stage2, stage3, ...
zamiast tego (zależy to w dużej mierze od tego, co faktycznie robią etapy, ale czasami wprowadzają całkowicie ortogonalne zmiany lub działają dobrze jako potok). W takim przypadku możesz zapisać bajty, zawijając je w jedną pętlę:Jeśli
stage1
jest to pierwszy etap lubstage3
ostatni etap programu, możesz nawet pominąć również te nawiasy (co oznacza, że można już zapisać bajty dla pętli dwóch etapów).Ostatnie użycie tej techniki można zobaczyć w tej odpowiedzi .
źródło
Dzielenie strun na kawałki o równej długości
n
Jak w większości „normalnych” języków TMTOWTDI (istnieje więcej niż jeden sposób, aby to zrobić). Zakładam tutaj, że dane wejściowe nie zawierają kanałów i że „dzielenie” oznacza dzielenie go na linie. Ale są dwa zupełnie różne cele: jeśli długość łańcucha nie jest wielokrotnością długości fragmentu, czy chcesz zachować niepełny fragment końcowy, czy chcesz go odrzucić?
Utrzymywanie niekompletnego końcowego fragmentu
Ogólnie rzecz biorąc, istnieją trzy sposoby rozwiązania podziału w siatkówce. Przedstawiam tutaj wszystkie trzy podejścia, ponieważ mogą one mieć większy wpływ, gdy spróbujesz je dostosować do powiązanego problemu. Możesz użyć zamiennika i dołączyć linię do każdego dopasowania:
To 8 bajtów (lub nieco mniej, jeśli
n = 2
lubn = 3
dlatego, że możesz użyć odpowiednio..
lub...
). Ma to jednak jeden problem: dołącza dodatkowy kanał, jeśli długość łańcucha wynosi wielokrotnością długości porcji.Możesz także użyć etapu podziału i skorzystać z faktu, że przechwytywania są zachowywane w podziale:
_
Opcja usuwa puste linie, które w przeciwnym razie wynikać z obejmujących cały łańcuch z meczów. Jest to 9 bajtów, ale nie dodaje końcowego przesuwu linii. Zan = 3
to 8 bajtów i zan = 2
7 bajtów. Zauważ, że możesz zapisać jeden bajt ogółem, jeśli puste linie nie mają znaczenia (np. Ponieważ będziesz przetwarzał tylko niepuste linie i pozbywałeś się później linii): wtedy możesz usunąć_
.Trzecią opcją jest użycie dopasowania. Dzięki
!
opcji możemy wydrukować wszystkie dopasowania. Aby jednak uwzględnić fragment końcowy, musimy zezwolić na zmienną długość dopasowania:Jest to również 9 bajtów, a także nie będzie zawierało końca linii.
n = 3
Robi się to również przez 8 bajtów..?.?
. Pamiętaj jednak, że zmniejsza się do 6 bajtów,n = 2
ponieważ teraz potrzebujemy tylko..?
. Należy również pamiętać, żeM
można go usunąć, jeśli jest to ostatni etap programu, oszczędzając w każdym razie jeden bajt.Odrzucanie niekompletnego końcowego fragmentu
Trwa to naprawdę długo, jeśli spróbujesz to zrobić z zamiennikiem, ponieważ musisz zastąpić końcową porcję niczym (jeśli istnieje), a także z podziałem. Możemy więc bezpiecznie je zignorować. Co ciekawe, w przypadku podejścia meczowego jest odwrotnie: robi się krótszy:
To 7 bajtów lub mniej za
n = 2
,n = 3
. Ponownie zauważ, że możesz pominąć,M
jeśli jest to ostatni etap kodu.Jeśli chcesz tutaj podać końcowy wiersz, możesz go uzyskać, dołączając
|$
do wyrażenia regularnego.Bonus: nakładające się części
Pamiętaj, że
M
ma&
opcję, która zwraca nakładające się dopasowania (co zwykle nie jest możliwe w przypadku wyrażenia regularnego). Pozwala to uzyskać wszystkie nakładające się fragmenty (podciągi) ciągu o danej długości:źródło
123456
staje się123\n456
i1234567890
staje12345\n67890
??=
.