Truyền các chức năng mũi tên ES6 này!


8

Tiêu chuẩn ECMAScript 6 đã thêm nhiều tính năng mới vào ngôn ngữ JavaScript, bao gồm ký hiệu chức năng mũi tên mới .

Nhiệm vụ của bạn là viết một bộ chuyển đổi ES6-ES5 cơ bản. Chỉ cung cấp một chức năng mũi tên ES6 làm đầu vào, đầu ra đối tác tương thích ES5 của nó.

Đó là ! Có thể chương trình ngắn nhất trong byte giành chiến thắng!


Những thứ cơ bản

Một hàm mũi tên trông như thế này:

(a, b, c) => { return a + b - c }

Và biểu thức hàm ES5 tương đương của nó trông như thế này:

function(a, b, c) { return a + b - c }

Nói chung, bạn có thể sao chép phần thân của hàm (mọi thứ giữa các dấu ngoặc nhọn) nguyên văn.


Tuyên bố hoàn trả ngầm

Thay vì một cơ thể với niềng răng xoăn, một biểu thức duy nhất có thể được sử dụng; kết quả của biểu thức này sau đó được trả về.

(a, b, c) => a + b - c

function(a, b, c) { return a + b - c }

Một vi dụ khac:

(a, b, c) => (a + 1, b - 2 * c / 3)

function(a, b, c) { return (a + 1, b - 2 * c / 3) }

Một lần nữa, bạn có thể chỉ cần sao chép nguyên văn biểu thức - NHƯNG hãy cẩn thận rằng bạn không xuất ra ngắt dòng giữa nó và returntừ khóa để tránh tự động chèn dấu chấm phẩy!


Một lý lẽ

Dấu ngoặc là tùy chọn nếu một đối số được cung cấp.

foo => { return foo + 'bar' }

function(foo) { return foo + 'bar' }

Khoảng trắng

Cuối cùng, bạn phải có thể tính toán bất kỳ số lượng ký tự khoảng trắng (dấu cách, tab, dòng mới) trước hoặc sau dấu ngoặc đơn, biến, dấu phẩy, dấu ngoặc nhọn và mũi tên *.

 ( o   ,  O
     , _    )=>{

    return                                     "Please don't write code like this."
}

Việc bạn có chọn duy trì khoảng trắng trong đầu ra hay không là tùy thuộc vào bạn. Giữ chúng, xóa chúng hoặc thêm của riêng bạn - chỉ cần đảm bảo đó là mã hợp lệ!

* Về mặt kỹ thuật, việc một mũi tên xuất hiện ngay sau khi ngắt dòng là bất hợp pháp, nhưng tôi nghi ngờ thực tế này sẽ giúp bạn. :)


Một cách nhanh chóng để xác nhận đầu ra của bạn:

Nhập var foo = <your output>; foo()vào bảng điều khiển trình duyệt của bạn. Nếu nó không phàn nàn, có lẽ bạn đang đi đúng hướng.


Thêm quy tắc cho các pháp sư:

  • Đầu vào là một hàm mũi tên ES6 hợp lệ về mặt cú pháp.
  • Giả sử các cơ quan chức năng là ES5 tương thích (và không tham khảo this, super, arguments, vv). Điều này cũng có nghĩa là hàm sẽ không bao giờ chứa hàm mũi tên khác (nhưng bạn có thể không cho rằng "=>" sẽ không bao giờ xảy ra trong cơ thể).
  • Tên biến sẽ chỉ bao gồm các chữ cái Latinh cơ bản, $_.
  • Bạn không cần phiên dịch các tính năng ES6 không được liệt kê ở trên (tham số mặc định, toán tử nghỉ, hủy bỏ, v.v.).
  • Các không gian sau một returntuyên bố là không bắt buộc nếu tiếp theo (, [hoặc {.
  • Không nhất thiết phải khớp chính xác các trường hợp thử nghiệm của tôi - bạn có thể sửa đổi mã nhiều như bạn cần nếu điều đó sẽ giúp giảm số byte của bạn. Thực sự, miễn là bạn tạo ra một biểu thức hàm ES5 có giá trị về mặt cú pháp, thì bạn là vàng!

Chúng ta có thể giả sử đầu vào là một hàm mũi tên hợp lệ và không có gì khác?
Sản xuất ETH

Một trường hợp cạnh sẽ là a =>\na, nơi function(a){ return\na }thực sự sẽ trở lại undefinedbất kể giá trị của alà gì. Chúng ta có cần phải xử lý việc này không?
Sản phẩm ETH

@ETHproductions Đừng chỉ yêu những dấu chấm phẩy tự động đó!
Neil

Chúng ta sẽ có các hàm ES6 lồng nhau chứ?
dùng41805

Chúng ta có thể giả định rằng đầu vào sẽ chỉ chứa một =>?
nghiện toán học

Câu trả lời:


5

JavaScript (ES6), 123 110 100 97 byte

Đã lưu 3 byte nhờ @Neil

s=>s.replace(/\(?(.*?)\)?\s*=>\s*([^]*)/,(_,a,b)=>`function(${a})${b[0]=='{'?b:`{return ${b}}`}`)

Giả sử đầu vào là một hàm mũi tên hợp lệ và không có gì khác. Xử lý chính xác trường hợp a =>\na, mặc dù không xử lý không ngắn hơn như tôi có thể nói.

Đầu ra khi mã được chạy qua chính nó:

function(s){return s.replace(/\(?(.*?)\)?\s*=>\s*([^]*)/,(_,a,b)=>`function(${a})${b[0]=='{'?b:`{return ${b}}`}`)}

Tôi có thể lưu 9 byte với định dạng có thể không hợp lệ:

s=>s.replace(/\(?(.*?)\)?\s*=>\s*({?)([^]*?)}?$/,(_,a,z,b)=>Function(a,z?b:'return '+b))

Đầu ra cho chính nó:

function anonymous(s) {
return s.replace(/\(?([^=)]*)\)?\s*=>\s*({?)([^]*?)}?$/,(_,a,z,b)=>Function(a,z?b:'return '+b))
}

(Cụ thể, đó function anonymouslà điều tôi lo lắng.)


Thật xấu hổ vì chính chức năng của bạn chứa một hàm mũi tên tiếp theo để khi chạy qua chính nó, nó không thực sự được dịch hoàn toàn.
Neil

Tôi nghĩ rằng \(?(.*?)\)?\s*=>có thể giúp bạn tiết kiệm 3 byte.
Neil

2

Võng mạc, 86 80 79 byte

^ ([^ (] *?) =
($ 1) =
s (`\ s * $

> \ s * (. * [^}]) $
> {trả lại $ 1}
) `(. *?) => (. *)
chức năng $ 1 $ 2

Hãy thử trực tuyến!

Đã lưu một byte nhờ Neil

Đã lưu 6 byte với sự trợ giúp từ ETHproductions

Chỉnh sửa: Đã sửa lỗi cho khả năng của dòng mới trong thân hàm.

Giải pháp 75 byte giả sử đầu vào sẽ không chứa §: Hãy thử trực tuyến!


1
Bạn có thể sử dụng một pilcrow thay vì \nđể lưu một byte.
Neil

1
Điều này dường như để loại bỏ ngắt dòng trong cơ thể chức năng, có thể thay đổi chức năng.
darrylyeo

Tôi nghĩ \sbao gồm , vì vậy dòng ba có thể \s*$để lưu 4 byte.
Sản phẩm ETH

@ETHproductions Dường như \schỉ khớp khi stùy chọn cấu hình được thêm vào. Tuy nhiên, nó đã tiết kiệm cho tôi một số byte
nghiện toán học

0

PHP, 112 byte

preg_match("#\(??(.*)\)?=>(\{?)(.*$)#U",$argn,$m);echo"function($m[1])",trim($b=$m[3])[0]=="{"?$b:"{return $b}";

lấy đầu vào từ STDIN; chạy với-R

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.