지방 화살표 기능을 단축하는 방법이 있습니까?


15

필자가 PPCG에서 여기에서 보았던 것에서 팻 화살표 기능과 관련된 대부분의 JavaScript 항목은 두 가지 캠프 중 하나 인 경향이 있습니다.

  1. 단일 문장으로 실행하고 대답을 반환 할 수있는 간단한 문장은 박쥐와 똑바로 x=(a,b)=>a*a+b

  2. 루프를 사용하기 때문에 일반적으로 중괄호가있는 더 복잡한 것이므로 결과적으로 return명령문을 사용해야 합니다.p=b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}

중괄호 개념을 개념 증명으로 사용하여 카테고리 2에서 위의 예를 가져옵니다 ... 중괄호와 return? JS 골퍼의 코드에서 8 바이트를 제거 할 수 있기 때문에 잠재적으로 (이것은 항상 일어날 것이라고 말하지 않고) 이것을 묻고 있습니다. 이 경우 사용할 수있는 기술이 있습니까? 나는 재귀를 시도했지만 그 m=b진술은 흔들리지 않는 것처럼 약간의 버그가있는 것으로 판명되었습니다.

위의 코드에서 골프를 더 return짧게하든 아니든 상관없이 그 진술 을 없애기 위해 골프를 어떻게 더 할 수 있을까요?

답변:


18

재귀 사용

재귀가 (거의) 항상 eval+ 보다 짧다는 것을 알았습니다 for. for에서 eval로 변환하는 일반적인 방법은 다음과 같습니다.

for(a=n;b;c);d
(f=a=>b?f(c):d)(n)

예제를 보자.

b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}

먼저 다음과 같이 단순화 할 수 있습니다.

for(m=b,a=1;~-m;--m,a*=m*m)a%b;

우리는 여기서 무엇을 했습니까? 우리는 모든 것을 for성명서 안에 옮겼습니다 . 이것은 세미콜론의 양을 줄이는 데 도움이되며 직접적으로 더 좋지는 않지만 거의 항상 골프로 연결됩니다.


이것을 평가판에 넣고 재귀 버전과 비교해 봅시다.

b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}
b=>eval('for(m=b,a=1;~-m;--m,a*=m*m)a%b')
b=>(f=a=>~-m?(--m,f(a*=m*m)):a%b)(1,m=b)

for 루프 ( a=n) 의 첫 번째 부분은 해당 변수를 인수로 전달하여 시작할 수 있습니다. 조건은 간단 합니다. 반환 값은 b?(c,f(a)):d어디에 있습니까 d? 일반적으로 c수정 a되어 병합 될 수 있습니다. 그래서 우리는 내가 언급 한 것을 사용하여 훨씬 더 골프를 질 수 있습니다.

b=>(f=a=>~-m?(--m,f(a*=m*m)):a%b)(1,m=b)
b=>(f=a=>~-m?f(a*=--m*m):a%b)(1,m=b) // --m moved into a*=
b=>(f=a=>--m?f(a*=m*m):a%b)(1,m=b) // --m moved to condition

@Niel이 지적한 것처럼 알고리즘을 단순화하고 있습니다. 한 언어의 알고리즘 골프는 다른 언어에서는 골프가 아닐 수 있으므로 다른 알고리즘을 시도하고 비교하십시오.


1
원래 코드를 단순화 할 때 크게 절약 한 것을 놓쳤습니다. ~-m이다 m-1루프가 될 수 있도록 for(m=b,a=1;--m;a*=m*m)a%b;(안된)과 재귀 버전이 될 수b=>(f=a=>--m?f(a*=m*m):a%b)(1,m=b)
피터 테일러

1
때로는 다른 알고리즘을 사용해야하지만이 경우 내가 할 수있는 최선의 방법은 @PeterTaylor의 답변과 같은 길이입니다.b=>b>1&(f=a=>--a<2||b%a&&f(a))(b)
Neil

11

학대 평가.

간단 해. 대신에:

f=n=>{for(i=c=0;i<n;i++)c+=n;return c}

사용하다

f=n=>eval("for(i=c=0;i<n;i++)c+=n;c")

평가는 마지막으로 평가 된 진술을 반환합니다. 이 경우, 마지막으로 평가 된 명령문은 이므로 2 바이트를 절약 c+=n할 수 있습니다 c.

f=n=>eval("for(i=c=0;i<n;i++)c+=n")

일반적으로 :

f=n=>eval("code;x")

바이트보다 짧습니다.

f=n=>{code;return x}

참고로, 그 레이블을 사용하여 바이트를 절약하기 위해 eval을 호출하는 것은 작동하지 않습니다.

eval`string`

에 해당

["string"]

난독 처리에 도움이됩니다! 코드 골프에는 그다지 중요하지 않습니다.


2
foo`string`항상와 같습니다. foo(["string"])많은 함수가 배열을 원하는 문자열로 다시 캐스팅하는 것입니다.
Neil

@Neil 오, 얼마나 흥미 롭습니다!
Conor O'Brien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.