Wskazówki dotyczące gry w golfa w Retina

10

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.

Cyfrowa trauma
źródło
2
Powiązane: Wskazówki dotyczące regex golfa
Sp3000
Hmmm, wstrzymywałem się z publikowaniem tego, ponieważ Retina jest wciąż w fazie rozwoju i bałem się, że większość odpowiedzi może być zwykłymi wskazówkami golfowymi, które nie są specyficzne dla Retiny. Ale równie dobrze możemy spróbować… :)
Martin Ender,
@ MartinBüttner Ty i inni daliście mi wiele dobrych wskazówek i wskazówek, odkąd zacząłem patrzeć na Retinę, więc myślę, że nadszedł czas na to. Dodałem wyjaśnienie, że ogólne wskazówki wyrażenia regularnego powinny przejść do powiązanego pytania.
Cyfrowa trauma
1
@ MartinBüttner Tu jest tak dobre miejsce, jak każde inne - zastanawiałem się przez chwilę - z ciekawości, co jest inspiracją dla nazwy „Retina”? Zakładam, że część „Re” dotyczy wyrażenia regularnego, ale co z „tina”?
Cyfrowa trauma
3
@DigitalTrauma Próbowałem wymyślić miłe słowo, które działałoby jako akronim, ale się nie udało. Słowo „siatkówka” było dość bliskie niektórym próbom i bardzo mi się podobało. Jednak nigdy nie udało mi się przekształcić go w akronim i od tego czasu zrezygnowałem z tego. Więc tak, „re” to rodzaj „wyrażeń regularnych” i może „n” dla „.NET”, ale ostatecznie to tylko słowo, które brzmiało ładnie.
Martin Ender,

Odpowiedzi:

3

Połącz pętle, jeśli to możliwe

W nietrywialnych obliczeniach często używasz kilku pętli do przetwarzania danych:

+`stage1
+`stage2
+`stage3

To działa, stage1dopóki dane wyjściowe nie będą zbieżne, a następnie stage2dopó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ę:

{`stage1
stage2
}`stage3

Jeśli stage1jest 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 .

Martin Ender
źródło
2

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:

.{n}
$&¶

To 8 bajtów (lub nieco mniej, jeśli n = 2lub n = 3dlatego, ż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:

S_`(.{n})

_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. Za n = 3to 8 bajtów i za n = 27 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:

M!`.{1,n}

Jest to również 9 bajtów, a także nie będzie zawierało końca linii. n = 3Robi się to również przez 8 bajtów ..?.?. Pamiętaj jednak, że zmniejsza się do 6 bajtów, n = 2ponieważ 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:

M!`.{n}

To 7 bajtów lub mniej za n = 2, n = 3. Ponownie zauważ, że możesz pominąć, Mjeś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 Mma &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:

M!&`.{n}
Martin Ender
źródło
Czy w jakiś sposób możliwe jest podzielenie łańcucha dokładnie na pół o zmiennej długości? Więc 123456staje się 123\n456i 1234567890staje 12345\n67890?
Kevin Cruijssen
1
@KevinCruijssen Nie sądzę, żebym dodał do tego jakąś konkretną funkcję. Prawdopodobnie będziesz musiał użyć grup równoważących: tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//… Jeśli nie przeszkadza ci końcowe podawanie linii, możesz pominąć ?=.
Martin Ender
Udało mi się ukończyć wyzwanie tam, gdzie myślałem, że potrzebuję go inaczej, ale grupy równoważące są rzeczywiście bardzo przydatne! Wiedziałem, że to musi być coś podobnego, ale moje umiejętności wyrażania regularnego / Retina nie są wystarczająco dobre. Dzięki za odpowiedź! :)
Kevin Cruijssen