로다에서의 골프 팁 언어입니다 . 로다 골프에 대한 일반적인 팁은

Rödafergusq가 만든 스트림 기반 스크립팅 언어입니다 .

로다 골프에 대한 일반적인 팁은 무엇입니까? 코드 골프 문제에 적용 할 수 있고 적어도 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

관련 : 대신 사용,and

push기능 (물론 print함수)의 인수의 수를 가지고, 어떤 구분자로 각각 출력 할 수있다.

그래서 이것은 이런 것을 의미합니다

["a"..b]        /*8 bytes (string "a" concatenated with variable b)*/

그냥 단축 될 수 있습니다

["a",b]         /*7 bytes*/

1 바이트 절약.


답변

[]/ push>print

print진술을 사용하지 마십시오 . []푸시 문은 항상 골퍼입니다. 차이 printpush이전 출력 후단 개행 후자는하지 않지만이다. 그러나이를 피할 수 있습니다.

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 */
`]