Röda 는 fergusq가 만든 스트림 기반 스크립팅 언어입니다 .
로다 골프에 대한 일반적인 팁은 무엇입니까? 코드 골프 문제에 적용 할 수 있고 적어도 Röda에 특정한 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다).
답변 당 하나의 팁을 게시하십시오.
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]
if[_ in y]
대신 할 수 있습니까 ?
입력이 요소 목록 인 경우 값을 배열로 가져 오는 대신 스트림에서 값을 가져 오는 것이 좋습니다.
대부분의 경우 배열 요소는 스트림으로 푸시 한 다음 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)]
[a()|atan2 _,_]
허용됩니다.
``
문자열 사용에서 ""
문자열, 당신이 그들을 사용하기 위해 특정 문자를 이스케이프해야합니다. 예를 들어 백 슬래시를 인쇄하려면과 같은 문자열이 있어야합니다 "\\"
. 백 슬래시를 이스케이프 처리하기 위해 추가 된 바이트가 하나 있습니다. 그러나을 사용 ``
하면 이 문자를 이스케이프 할 필요가 없으며 1 바이트를 절약 할 수 있습니다.
print"\\" /* 9 bytes */
print`\` /* 8 bytes */
아니 그냥, 당신은 변수와 내부 표현 인코딩 할 수 있습니다 ``
사용하여 문자열을 $variableName
하거나 ${expression}
,에 존재하지 않는 기능 ""
문자열을.
이 예제에서 "a"
변수 값과 연결된 문자열을 b
후행 줄 바꿈 으로 출력합니다 .
["a",b," /* 11
"] bytes */
[`a$b /* 8
`] bytes; encodes b in the string using $b */