레티 나 골프 팁


10

레티 나 골프에 대한 일반적인 팁은 무엇입니까 ? 레티 나에 특정한 코드 골프 문제에 적용 할 수있는 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다). 답변 당 하나의 팁을 게시하십시오.

참고로 온라인 컴파일러는 여기에 있습니다 .

@ Sp3000은 Regex Golf에 대한 팁 도 있다고 지적했다 . 여기에 대한 답변은 일반적인 정규식 골프 팁이 아니라 Retina 기능에 중점을 두어야합니다.



흠, 나는 Retina가 아직 개발 중이기 때문에 이것을 게시하지 않았으며 대부분의 답변이 Retina에 그리 구체적이지 않은 일반 정규식 골프 팁이 될 것을 두려워했습니다. 그러나 우리는 또한 그것을 갈 수 있습니다, 나는 추측합니다 ... :)
Martin Ender

@ MartinBüttner Retina를 살펴보기 시작한 이래로 여러분과 다른 사람들이 저에게 유용한 팁과 힌트를 많이주었습니다. 일반 정규식 팁이 연결된 질문으로 이동해야한다는 설명을 추가했습니다.
Digital Trauma

1
@ MartinBüttner 여기에 물어봐야 할만 큼 좋은 곳이 있습니다. "호기심"에서 "Retina"라는 이름에 대한 영감이 무엇인지 궁금합니다. "Re"부분은 정규 표현식에 해당한다고 가정하지만 "tina"는 어떻습니까?
Digital Trauma

3
@DigitalTrauma 나는 약어로 작동하지만 실패한 좋은 단어를 생각해 내려고 노력했습니다. "레티 나"라는 단어는 일부 시도와 매우 유사했으며 나는 그 단어를 좋아했습니다. 나는 그것을 약어로 다시 생각하지 않았으며 그 이후로 포기했습니다. 그렇습니다. "re"는 "정규 표현식"과 ".NET"에 대한 "n"의 일종이지만 궁극적으로 좋은 단어 일뿐입니다.
Martin Ender 2019

답변:


3

가능하면 루프 결합

사소한 계산에서는 종종 여러 루프를 사용하여 데이터를 처리합니다.

+`stage1
+`stage2
+`stage3

따라서 이것은 stage1출력이 수렴 stage2될 때까지 , 그 다음에 출력이 수렴 할 때까지 그리고 출력이 수렴 할 때까지 실행됩니다 stage3.

그러나 항상 단계를 자세히 조사 할 가치가 있습니다. 때때로 인터리브 방식으로 루프를 stage1, stage2, stage3, stage1, stage2, stage3, ...대신 실행하는 것이 가능합니다 (이 단계는 실제로 수행하는 작업에 따라 달라 지지만 때로는 완전히 직교 변경을하거나 파이프 라인으로 잘 작동합니다). 이 경우 단일 루프로 래핑하여 바이트를 절약 할 수 있습니다.

{`stage1
stage2
}`stage3

경우 stage1첫 번째 단계 또는 stage3(이 수 이미 두 단계의 루프 바이트 저장 의미)를 사용하면 다음도뿐만 아니라 그 괄호에 생략 할 수있는 프로그램의 마지막 단계입니다.

이 기술의 최근 사용은 이 답변에서 볼 수 있습니다 .


2

문자열을 같은 길이의 덩어리로 나누기 n

대부분의 "일반"언어와 마찬가지로 TMTOWTDI (두 가지 방법이 있습니다). 여기에는 입력에 줄 바꿈이 포함되어 있지 않으며 "분할"은 입력을 줄로 나누는 것을 의미합니다. 그러나 문자열의 길이가 청크 길이의 배수가 아닌 경우 불완전한 후행 청크를 유지 하시겠습니까? 아니면 버리고 싶습니까?

불완전한 후행 청크 유지

일반적으로 레티 나에서 분리하는 방법에는 세 가지가 있습니다. 여기서는 세 가지 접근 방식을 모두 제시합니다. 관련 접근 방식에 적응하려고 할 때 더 큰 차이를 만들 수 있기 때문입니다. 교체를 사용하고 각 일치 항목에 줄 바꿈을 추가 할 수 있습니다.

.{n}
$&¶

즉, (만약 조금 작거나 8 바이트의 n = 2또는 n = 3당신이 사용할 수 있기 때문에 ..또는 ...각각). 문자열 길이 청크 길이의 배수 인 경우 추가 줄 바꿈을 추가합니다 .

분할 단계를 사용하고 분할에서 캡처가 유지된다는 사실을 활용할 수도 있습니다.

S_`(.{n})

_옵션을 사용하면 전체 문자열을 일치시킬 때 빈 줄이 제거됩니다. 이것은 9 바이트이지만 후행 줄 바꿈을 추가하지 않습니다. 대한 n = 3그것의 8 바이트를위한 n = 2그것의 7 바이트. 빈 줄이 중요하지 않은 경우 전체적으로 1 바이트를 절약 할 수 있습니다 (예 : 비어 있지 않은 줄만 처리하고 나중에 줄 바꿈을 제거하기 때문에) :을 제거 할 수 있습니다 _.

세 번째 옵션은 일치를 사용하는 것입니다. !옵션을 사용하면 모든 일치 항목을 인쇄 할 수 있습니다. 그러나 후행 청크를 포함하려면 가변 일치 길이를 허용해야합니다.

M!`.{1,n}

이것은 또한 9 바이트이며 후행 줄 바꿈도 포함하지 않습니다. 이 n = 3작업을 수행 하면 8 바이트가 됩니다 ..?.?. 그러나 이제는 필요 하기 때문에 6 바이트로 줄어 듭니다 . 또한 프로그램의 마지막 단계 인 경우에는 1 바이트를 절약 할 수 있습니다.n = 2..?M

불완전한 후행 청크 폐기

후행 청크를 아무 것도 (존재하는 경우) 교체하고 스플릿으로 교체해야하기 때문에 교체로 시도하면 실제로 시간이 오래 걸립니다. 그래서 우리는 그것들을 안전하게 무시할 수 있습니다. 흥미롭게도, 매치 접근법의 경우 반대입니다. 짧아집니다.

M!`.{n}

즉, 7 바이트, 또는 덜있어 n = 2, n = 3. 다시 말하지만, M이것이 코드의 마지막 단계 인 경우 생략 할 수 있습니다 .

여기서 줄 바꿈을 원하면 |$정규식 에 추가 하여 얻을 수 있습니다 .

보너스 : 겹치는 덩어리

그 기억 M있다 &(정규식 정상적으로 할 수 없습니다) 중복 일치를 반환 옵션을 선택합니다. 이를 통해 주어진 길이의 문자열의 모든 겹치는 청크 (하위 문자열)를 얻을 수 있습니다.

M!&`.{n}

가변 길이로 문자열을 정확히 절반으로 분할 할 수 있습니까? 그래서 123456하게 123\n456하고 1234567890이된다 12345\n67890?
Kevin Cruijssen

1
@KevinCruijssen 나는 그것에 대한 특정 기능을 추가했다고 생각하지 않습니다. 당신은 아마 균형 그룹을 사용해야합니다 : tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//...는 당신이 뒤에 줄 바꿈 괜찮다면, 당신은 생략 할 수 있습니다 ?=.
Martin Ender

나는 다르게 필요하다고 생각했던 도전을 완수 할 수 있었지만, 밸런싱 그룹은 실제로 매우 유용합니다! 나는 그것이 그 선을 따라 뭔가 있어야한다는 것을 알았지 만 내 정규식 / 레티 나 기술은 거의 충분하지 않습니다. 대답 해줘서 고마워! :)
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.