Z tego, co widziałem przez cały czas tutaj na PPCG, większość wpisów JavaScript dotyczących funkcji grubych strzałek jest zwykle jednym z dwóch obozów:
Proste, które mogą działać jako pojedyncze zdanie i zwracać odpowiedź od razu, jak nietoperz
x=(a,b)=>a*a+b
Bardziej złożone, które zwykle mają nawiasy klamrowe z powodu użycia pętli, w związku z czym wymagają użycia
return
instrukcji.p=b=>{m=b;for(a=1;~-m;)--m,a*=m*m;return a%b}
Biorąc powyższy przykład z kategorii 2 z koncepcją nawiasów klamrowych jako proof-of-concept ... Czy istnieje sposób na ponowne golfowanie tego kodu (lub podobnego) w taki sposób, aby wyeliminować nawiasy klamrowe, a także return
? Pytam tylko o to, ponieważ może to potencjalnie (nie powiedzieć, że tak się stanie przez cały czas) wyeliminować 8 bajtów z kodu golfisty JS. Czy są jakieś techniki, które można zastosować w tym przypadku? Próbowałem rekurencji, ale to m=b
stwierdzenie okazało się trochę mylące, ponieważ nie mogę tego potrząsnąć.
W przypadku powyższego kodu, w jaki sposób jeden golf mógłby to dodatkowo wyeliminować return
, niezależnie od tego, czy gra w golfa krócej, czy nie?
źródło
~-m
jestm-1
, więc pętla może być,for(m=b,a=1;--m;a*=m*m)a%b;
a wersja rekurencyjna może być (niesprawdzona)b=>(f=a=>--m?f(a*=m*m):a%b)(1,m=b)
b=>b>1&(f=a=>--a<2||b%a&&f(a))(b)
Ewolucja nadużyć.
To proste. Zamiast:
Posługiwać się
Eval zwraca ostatnią ocenianą instrukcję. W tym przypadku, ponieważ ostatnia oceniana instrukcja byłaby
c+=n
, zostalibyśmy z tymc
, oszczędzając dwa bajty.Ogólnie:
jest krótszy niż bajt:
Uwaga: używanie grobów do wywołania eval w celu zapisania bajtów nie działa, ponieważ:
jest równa
Pomocny w zaciemnieniu! Nie tyle w golfa kodu.
źródło
foo`string`
jest zawsze równoważnefoo(["string"])
, tyle że wiele funkcji rzutuje tablicę z powrotem na pożądany ciąg.