로다에서의 골프 팁


12

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

로다 골프에 대한 일반적인 팁은 무엇입니까? 코드 골프 문제에 적용 할 수 있고 적어도 Röda에 특정한 아이디어를 찾고 있습니다 (예 : "댓글 제거"는 답이 아닙니다).

답변 당 하나의 팁을 게시하십시오.


골프에서 나를 이길 팁을 얻으려고 노력하고 있습니까? : P (Python 페이지의 팁을보아야합니다)
HyperNeutrino

와우, PCG.SE의 질문으로 핫 네트워크 질문에 들어갔고 프로그래밍 퍼즐 / 도전이 아닙니다! :)
Pedro A

1
@HyperNeutrino Shhh .... :)
user41805

답변:


7

밑줄 사용

아마도 가장 중요한 팁일 것입니다. 거의 모든 골프 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] */

3

일부 세미콜론 / 줄 바꾸기는 선택 사항입니다.

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

1

접미사 제어 구조 사용

그것은 거의 없다 결코 당신이 사용할 수있는 최적되지 접미사 문을 사용하는 {...}대신에 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]대신 할 수 있습니까 ?
user41805

@KritixiLithos 아니요, 조건이 AND가 아닌 OR이기를 원하기 때문입니다. 현재이 검사가있는 경우 적어도 하나 개 의 값 x즉도 있습니다 y만, 경우에 당신의 상태는 확인 할 모든 의 값 x도에 있습니다 y. (이 예제는 여기 에서 복사 되었습니다 ).
fergusq

1

입력을 위해 스트림 사용

입력이 요소 목록 인 경우 값을 배열로 가져 오는 대신 스트림에서 값을 가져 오는 것이 좋습니다.

대부분의 경우 배열 요소는 스트림으로 푸시 한 다음 for루프 (또는 밑줄)를 사용하여 반복하여 반복됩니다 . 어쨌든 스트림에서 요소가 반복 되므로 처음부터 거기에 있어야한다고 정의 하지 않겠습니까?

예를 들어 입력 된 숫자의 제곱의 합을 계산하려면 다음을 수행하십시오.

{|a|a|[_^2]|sum} /* Removing a redundant argument */
{[_^2]|sum}      /* saves 5 bytes */

1

명령문 컨텍스트에서 괄호는 선택 사항입니다. 인수가 연산자로 시작하더라도 적용됩니다. 예를 들어 [a()|sqrt-_]보다 짧습니다 [a()|sqrt(-_)]. 이후의 괄호 는 명령문 컨텍스트가 아닌 표현식 컨텍스트에서 a와 같이 필수 a입니다.

그러나 쓰기 [a()|sqrt(_+1)*2]는 불가능하며 구문 분석기를 돕기 위해 추가 괄호가 필요합니다 [a()|sqrt((_+1)*2)]. 종종 괄호로 시작하지 않도록 이러한 표현식을 다시 작성할 수 있습니다.[a()|sqrt 2*(_+1)]


괄호없이 여러 매개 변수를 함수에 전달할 수도 있습니까?
user41805

@KritixiLithos 예. 예 : [a()|atan2 _,_]허용됩니다.
fergusq

1

in / statement ,대신 사용..[]push

관련 : 대신 사용,and

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

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

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

그냥 단축 될 수 있습니다

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

1 바이트 절약.


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

1

``문자열 사용

에서 ""문자열, 당신이 그들을 사용하기 위해 특정 문자를 이스케이프해야합니다. 예를 들어 백 슬래시를 인쇄하려면과 같은 문자열이 있어야합니다 "\\". 백 슬래시를 이스케이프 처리하기 위해 추가 된 바이트가 하나 있습니다. 그러나을 사용 ``하면 이 문자를 이스케이프 할 필요가 없으며 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 */

1

,대신에 사용and

Röda의 조건은 스트림이며 여러 값으로 구성 될 수 있습니다. 이 값은로 하나의 부울 값으로 줄어 듭니다 and.

당신이 대체 할 수있는이 수단 and,스트림에 여러 값을 밀어 조건 :

x if[a and b]
x if[a,b]

빈 상태는 진실하다

값이없는 조건을 갖는 것도 가능합니다.

x while true
x while[]

1

대체 목록 작성 양식 *"...;..."/";"

replace함수는 일반적으로 문자열 목록을 인수로 사용합니다. 그러나 목록이 매우 길면 정규식 / 교체 쌍을 문자열에 저장 한 다음 문자열을 분할하고 별 연산자를 사용하는 것이 좋습니다.

replace"a","b","c","d"
replace*"a;b;c;d"/";"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.