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 = 2
lub n = 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:
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 = 3
to 8 bajtów i za n = 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:
M!`.{1,n}
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:
M!`.{n}
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:
M!&`.{n}