Röda 는 fergusq가 만든 스트림 기반 스크립팅 언어입니다 .
로다 골프에 대한 일반적인 팁은 무엇입니까? 코드 골프 문제에 적용 할 수 있고 적어도 Röda에 특정한 아이디어를 찾고 있습니다 (예 : “댓글 제거”는 답이 아닙니다).
답변 당 하나의 팁을 게시하십시오.
답변
밑줄 사용
아마도 가장 중요한 팁일 것입니다. 거의 모든 골프 Röda 프로그램은 밑줄을 사용합니다.
밑줄 구문은 구문에 대한 구문 설탕입니다 for
. 다음 코드 줄은 동일합니다.
ls""|fileLength x for x|sort|pull
ls""|fileLength _|sort|pull
각 밑줄 for
은 명령문 주위의 보이지 않는 루프에 새 변수를 추가합니다 . 루프는 각 변수 / 밑줄에 대해 스트림에서 하나의 값을 가져온 다음 값이 남지 않을 때까지 반복합니다.
밑줄은 문장의 어느 곳에서나 사용할 수 있습니다.
a[x:y+1]=[1]*(1+y-x) /* Sets range x..y (inclusive) */
seq x,y|a[_]=1 /* 6 bytes less */
동일한 밑줄 값을 두 번 이상 참조하거나 값을 역순으로 사용해야하는 경우 밑줄 뒤에 숫자를 넣을 수 있습니다.
a|[_^_1] /* maps x to x^x */
a|[_2-_1] /* maps each pair (x,y) to y-x, eg. [1,2,4,8] -> [1, 4] */
답변
일부 세미콜론 / 줄 바꾸기는 선택 사항입니다.
Röda 코드를 작성할 때 일반적으로 개행 또는 세미콜론을 사용하여 모든 문장을 분리하는 것이 좋습니다. 그러나 골프를 치는 경우, 모든 세미콜론이 실제로 필요한 것은 아닙니다.
다음은 세미콜론 / 줄 바꾸기가 선택 사항 인 장소의 불완전한 목록입니다 . 다음 문 연산자 (시작 때 그들 대부분은 적용되지 않습니다 (
, [
, +
, 등).
- 과제 후
- 함수 호출 후, 때 적어도 하나 개의 인자 (예. 거기에
f x
) 또는 괄호를 사용하는 (예.f()
) - 모든 곳, 다음 줄 / 문으로 시작한다면
|
,)
,]
또는}
다음 문은 운영자, 세미콜론 / 개행 IS로 시작하면 선택 하는 경우
- 명령문은 함수 호출이며 괄호가 사용됩니다 (예 :
{f(x)[y]}
와 동일){f(x);[y]}
. 이것은 함수 호출이 표현식이 아닌 명령문 컨텍스트에서만 작동합니다. - 이 문장은 대입이며 괄호가 사용됩니다 (예 :
x=(y)[z]
와 같지x=(y);[z]
않음x=((y)[z])
).
그리고 불행히도 줄 바꿈이 필요한 곳은 다음과 같습니다.
- 후
++
및--
. - 후
[...]
.
할당을 재구성하여 바이트를 절약 할 수있는 경우가 종종 있습니다. 예를 들면 다음과 같습니다.
a=0;b=""c=[""]
b=""c=[b]a=0
x=f()y=i;z=a[0]
x=f()z=a[0]y=i
답변
접미사 제어 구조 사용
그것은 거의 없다 결코 당신이 사용할 수있는 최적되지 접미사 문을 사용하는 {...}
대신에 do...end
.
몇 가지 예 :
x|unless[not(_ in y)]do[0]else[1]done
x|[0]unless[not(_ in y)]else[1]
if[p<0]do c+=p;a-=p done
{c+=p;a-=p}if[p<0]
답변
입력을 위해 스트림 사용
입력이 요소 목록 인 경우 값을 배열로 가져 오는 대신 스트림에서 값을 가져 오는 것이 좋습니다.
대부분의 경우 배열 요소는 스트림으로 푸시 한 다음 for
루프 (또는 밑줄)를 사용하여 반복하여 반복됩니다 . 어쨌든 스트림에서 요소가 반복 되므로 처음부터 거기에 있어야한다고 정의 하지 않겠습니까?
예를 들어 입력 된 숫자의 제곱의 합을 계산하려면 다음을 수행하십시오.
{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum} /* saves 5 bytes */
답변
명령문 컨텍스트에서 괄호는 선택 사항입니다. 인수가 연산자로 시작하더라도 적용됩니다. 예를 들어 [a()|sqrt-_]
보다 짧습니다 [a()|sqrt(-_)]
. 이후의 괄호 는 명령문 컨텍스트가 아닌 표현식 컨텍스트에서 a
와 같이 필수 a
입니다.
그러나 쓰기 [a()|sqrt(_+1)*2]
는 불가능하며 구문 분석기를 돕기 위해 추가 괄호가 필요합니다 [a()|sqrt((_+1)*2)]
. 종종 괄호로 시작하지 않도록 이러한 표현식을 다시 작성할 수 있습니다.[a()|sqrt 2*(_+1)]
답변
in / statement ,
대신 사용..
[]
push
push
기능 (물론 print
함수)의 인수의 수를 가지고, 어떤 구분자로 각각 출력 할 수있다.
그래서 이것은 이런 것을 의미합니다
["a"..b] /*8 bytes (string "a" concatenated with variable b)*/
그냥 단축 될 수 있습니다
["a",b] /*7 bytes*/
1 바이트 절약.
답변
[]
/ push
>print
print
진술을 사용하지 마십시오 . []
푸시 문은 항상 골퍼입니다. 차이 print
및 push
이전 출력 후단 개행 후자는하지 않지만이다. 그러나이를 피할 수 있습니다.
print"a" /* 8 bytes */
["a /* 6 bytes; uses a literal newline */
"]
print"a",b /* 10 bytes */
[`a$b /* 8 bytes; uses a literal newline and `` strings */
`]