JavaScript dành riêng


41

Kể từ ECMAScript 2015, JavaScript có 33 từ khóa dành riêng , chẳng hạn như break, constnew, cũng như 10 từ khóa dành riêng trong tương lai , chẳng hạn như letawait.

Nhiệm vụ của bạn là xâu chuỗi số lượng lớn nhất của 1 từ khóa dành riêng 2 liên tiếp trong khi viết mã JavaScript chức năng 3 .

  1. Các từ khóa dành riêng liên tiếp - các từ khóa dành riêng chỉ được phân tách bằng khoảng trắng và / hoặc dấu ngoặc đơn và / hoặc dấu ngoặc nhọn.
  2. Từ khóa dành riêng - bất kỳ từ khóa dành riêng hoặc tương lai dành riêng trong ECMAScript 2015 . Các từ khóa dành riêng từ các tiêu chuẩn cũ hơn được loại trừ, một danh sách đầy đủ các từ khóa được phép được đưa ra dưới đây.
  3. Mã chức năng - mã của bạn sẽ chạy (nêu thời gian chạy của bạn, nếu cần), cuối cùng tạm dừng và không ném bất kỳ lỗi thời gian chạy nào.

Nếu mã của bạn cần một thời gian chạy cụ thể, các từ khóa dành riêng được sử dụng không được là không có trong môi trường cụ thể.

Danh sách các từ khóa dành riêng

Ghi điểm & ví dụ

Điểm của bạn sẽ bằng với số lượng lớn nhất các từ khóa dành riêng liên tiếp.
Trong trường hợp điểm số bằng nhau, mã nguồn ngắn nhất tính bằng byte sẽ thắng. Các phần và chuỗi được nhận xét không được tính vào các từ khóa dành riêng, nhưng được tính vào số byte.

// score: 3
if (true) 0; else throw function() {}
             ^------------------^
// score: 2
let foo = typeof typeof void typeof void 0;
                             ^---------^
// score: 0
/* typeof default debugger */

// score: 0, doesn't halt or debugger is no-op, depending on the environment
debugger;

Tiêu chuẩn áp dụng.


Thảo luận về hộp cát , cho những ai quan tâm.
Nit

Tôi cảm thấy như điều này có thể thú vị hơn nếu bạn không cho phép dấu ngoặc đơn giữa các từ khóa.
Thuật sĩ lúa mì

Là dòng mới được phép?
l4m2

@ l4m2 Vâng, đó là khoảng trắng.
Nit

1
@ l4m2 Giải pháp 43 điểm tương tự cũng có thể không có dòng mới, vì vậy có lẽ tôi chỉ đơn giản là không hiểu điểm bạn đang cố gắng thực hiện?
Nit

Câu trả lời:


53

43 từ, 603 byte

Uhm, đây có phải là một lỗ hổng? Tôi không biết cái quái này là hợp pháp như thế nào, nhưng nó hoạt động và nó sử dụng mọi từ khóa.

new (class await
{
    break(){}
    case(){}
    catch(){}
    const(){}
    continue(){}
    debugger(){}
    default(){}
    delete(){}
    do(){}
    else(){}
    enum(){}
    export(){}
    extends(){}
    finally(){}
    for(){}
    function(){}
    if(){}
    implements(){}
    import(){}
    in(){}
    instanceof(){}
    interface(){}
    let(){}
    package(){}
    private(){}
    protected(){}
    public(){}
    return(){}
    static(){}
    super(){}
    switch(){}
    this(){}
    throw(){}
    try(){}
    typeof(){}
    var(){}
    void(){}
    while(){}
    with(){}
    yield(){}
})

3
Không quen thuộc với JS, nhưng ... đây có phải là những từ khóa thực sự khi được sử dụng trong ngữ cảnh này hay chỉ là những chuỗi có cấu trúc từ vựng giống như từ khóa và đang sử dụng đường để tránh trích dẫn?
Leushenko

1
@Leushenko Có lẽ là cái thứ hai (mặc dù tôi cũng không quá quen thuộc với JS), vì chúng trông giống như tên hàm theo cách chúng được sử dụng. Tuy nhiên, thông thường không nên sử dụng các từ khóa này làm hàm hoặc tên lớp, nhưng Siguza vẫn làm điều đó, trong khi vẫn tuân thủ các quy tắc thách thức chỉ sử dụng dấu ngoặc đơn và dấu ngoặc. Một kết quả tuyệt vời để hoàn thành thử thách này với tất cả các từ tôi muốn nói, mặc dù hầu hết các câu trả lời khác trông ấn tượng hơn khi thực sự sử dụng từ khóa NHƯ từ khóa . Vẫn +1 từ tôi, dường như chúng ta có một người chiến thắng.
Kevin Cruijssen

6
@ user202729 Tại sao mặc dù? Tại sao làm cho nó quá phức tạp tìm kiếm khi nó có thể được thực hiện đơn giản như vậy? Chơi gôn mã thường làm một việc gì đó càng ngắn càng tốt, nhưng cá nhân tôi vẫn thích giữ sự dễ đọc và đơn giản cho một số phần mở rộng (tôi biết, tôi biết, đây không phải là một thử thách chơi gôn). Một số ví dụ: Tôi thích sử dụng -1, i+1, i-1trên ~0, -~i, ~-ikhi tôi có thể, chỉ vì nó rõ ràng hơn để đọc cho những người không quá quen thuộc với mã-chơi golf và ~được nêu ra. Mặc dù tôi tất nhiên sẽ luôn luôn sử dụng i+~ji-~jđể chơi một byte i-j-1i+j+1. ;)
Kevin Cruijssen

2
Vâng, tôi có thể nghiền nát nó hơn nữa và cố gắng đếm ngược byte ... một khởi đầu như if(this)return void typeof function(){} else debuggerkhông khó để đưa ra, nhưng sau đó nó trở nên xấu đi nhanh chóng. Và vâng, điều này hoàn toàn biến từ khóa thành định danh - nhưng đối với một số trong số chúng, bạn phải có thể sử dụng chúng (ví dụ enum). Tôi chỉ đưa nó đến mức cực đoan, nhưng đó không phải là tất cả về môn golf? : P
Siguza

1
@Magic Không, việc cung cấp tên của một phương thức lớp chỉ đơn giản là một bối cảnh ngữ pháp nơi các mã thông báo theo nghĩa đen được coi là tên thuộc tính, ngay cả khi chúng là các từ dành riêng. Điều này về cơ bản là giống nhau, về mặt ngữ nghĩa, như đang làm, obj["break"] = function (){}v.v.
apsillers

53

37 từ

if (void this) {
  do {
    with (protected)
      for (public in private)
        typeof static instanceof new (function implements() {
          var let
          try {
            throw (class extends {} {})
          } catch (package) {
            yield
          } finally {
            debugger
          }
          return
        })()
    continue
    break
  } while (interface)
} else {
  switch (delete await) { default : 42 }
}

Từ khóa không được sử dụng:

  • case đòi hỏi :
  • const đòi hỏi =
  • export yêu cầu chế độ nghiêm ngặt
  • import yêu cầu chế độ nghiêm ngặt
  • super đòi hỏi constructor

7
Tôi thừa nhận tôi đã cười
nicael

48
Nó trông giống như mã soạn sẵn Java điển hình, ví dụ để tính toán 1 + 2.
Eric Duminil

2
@EricDuminil Đây là lý do thực sự có tên là _Java_ Script.
wizzwizz4

5
@EricDuminil Điều đó không đơn giản như 1 + 2. Giá trị hoàn chỉnh của mã này là câu trả lời cho câu hỏi cuối cùng về sự sống, vũ trụ và mọi thứ. Điều đó thật phức tạp . :)
tsh

2
Điều này thật tuyệt vời.
Pedro A

30

43 từ, 302 299 byte

switch(void function(){for(const interface in public)do with(package)try{break}catch(private){if(typeof
this)throw yield static instanceof new class extends await{case(){return}super(){debugger}import(){}export(){}enum(){}}
else continue}finally{delete let}while(protected)var implements}){default:}

Lý thuyết hạ thấp 277 (mỗi hai từ cách nhau một byte)
l4m2

Làm tốt lắm, hiện tại bạn chỉ còn thiếu enum.
Nit

10

21 24 26 từ, 185 byte

+ 1 2 từ nhờ Arnauld và +1 đến 12Me21!

void(function(){do{with({})if(typeof true in this)throw{}instanceof new(class extends{}{})
else return delete{}
try{break}finally{yield}
continue
}while(false)})()
switch({}){case{}:{}}

Giả sử tôi hiểu thử thách, điều này ghi được 24 từ. Các từ không có dấu ngoặc đơn, ngoặc và khoảng trắng:

void function do with if typeof true in this throw instanceof new class extends else return delete try break finally yield continue while false switch case

24 từ, 177 byte

Không có "đúng" và "sai", rõ ràng không phải là từ khóa theo câu hỏi.

void(function(){do{with({})if(typeof{}in this)throw{}instanceof new(class extends{}{})
else return{}
try{break}finally{yield}
continue
}while(delete{})})()
switch({}){case{}:{}}

Từ ngữ:

void function do with if typeof in this throw instanceof new class extends else return try break finally yield continue while delete switch case

(Tôi đã vô tình xóa bình luận của mình thay vì chỉnh sửa nó, nội dung là: "bạn có thể sử dụng xóa {} thay cho đúng / sai, nghĩ (và không trả lại gì cả")
12Me21

À, vâng. Tôi đã không chú ý đến quy tắc đó.
Arnauld

bạn có thể đặt case ... :hoặc default:ở cuối (vì :không được phép giữa các từ khóa)
12Me21

Bạn có thể kết thúc bằng for(let _;0;);+2 từ (nhưng bạn không thể sử dụng casenữa).
Arnauld

switch({}){case{}:{}}=> switch({}){case{}:;}? Không biết ;đôi khi có cần thiết không
l4m2

6

38 39

class await {}
class g extends await {
 constructor() {
  super()
 }
}
switch ({}) {
 case function(){
  for (let in public)
  do with(package){
   try{break}catch(private){
   if(typeof this)
    throw static instanceof new (class extends await {})
   else{continue}}finally{debugger}
  }while(void protected)
  var implements
  return 
  yield delete interface
  const a=0
 }:
}

từ "siêu" đến "const"

Phiên bản chơi gôn:

class e{}class g extends e{constructor(){super()}}switch({}){case
function(){for(let in public)do with(package)try{break}catch(private){if(typeof
this)throw static instanceof new(class extends await{})
else{continue}}finally{debugger}while(void protected)
var implements
return 
yield delete interface
const a=0}:}

Bây giờ là giờ chơi golf?
l4m2

Tôi nhận được Uncaught SyntaxError: Unexpected token deletekhi tôi cố chạy câu trả lời của bạn trong bảng điều khiển Javascript của mình trên Google Chrome, Làm cách nào để kiểm tra xem giải pháp của bạn có hợp lệ không?
Ferrybig

@Ferrybig Tôi sử dụng Firefox và nó hoạt động tốt. Tôi không thể cài đặt Chrome phiên bản mới vì hệ thống
l4m2

Tôi gặp lỗi này trong FirefoxSyntaxError: yield expression is only valid in generators
TheChetan

Tôi sử dụng ff 52.7.2
l4m2

4

21 từ

(không chắc chắn về letawait)

var await=String, let=String;
switch (await) {
    case void typeof new await instanceof let in (function()
{do{try{return this
if((class extends{}{})){}else{break}}finally{(delete {})}}while(false)})():break;
}

, =;không được phép làm dấu phân cách.
dùng202729

2
Họ không được tính
soktinpk

3

43 từ, 300 byte

with(this)try{let protected}catch(package){if(delete yield)for(const interface in typeof public)do{throw implements instanceof private}while(static)else debugger}finally{switch(void new class extends function(){return}{export(){var await}import(){break}super(){continue}enum(){}case(){}}){default:0}}

Dễ đọc hơn:

with(this)
    try {
        let protected
    } catch(package){
        if(delete yield)
            for(const interface in typeof public)
                do {
                    throw implements instanceof private
                } while(static)
        else
            debugger
    } finally {
        switch(
          void new class extends function(){return} {
              export(){var await}
              import(){break}
              super(){continue}
              enum(){}
              case(){}
          }
        ){
            default:0
        }
    }

Tôi đã phải sử dụng "từ dành riêng làm tên phương thức" để đối phó

  • case(vì tôi đã sử dụng defaultvới swtich),
  • exportimport(vì chế độ mô-đun luôn nghiêm ngặt, không đủ tiêu chuẩn with)
  • super(vì nó phải được theo sau bởi quyền truy cập thuộc tính hoặc được đặt trong constructorhàm) và
  • enum (không bao giờ có thể được sử dụng, là một từ dành riêng không có sử dụng hợp lệ về mặt ngữ pháp)

39 chương trình giải pháp của tôi supercó thể xuất hiện ngay từ đầu mà không có tên, nhưng quá đắt
l4m2

3

14 15 16 Từ không có dấu ngoặc hoặc dòng mới

!function(){if(0);else do throw yield new public in void typeof this instanceof class await extends function async(){}{};while(0)}

Cảm ơn Bergi vì +1


Bạn có thể làm cho nó một chức năng máy phát điện và ném vào yield?
Bergi

Tôi đã cố gắng để tìm ra những gì nó làm, nhưng đầu tôi bắt đầu quay cuồng. Bạn có thể gửi một lời giải thích?
Philipp

Tôi nhận được Uncaught SyntaxError: Unexpected token newkhi tôi dán vào bảng điều khiển javascript của mình
Ferrybig

1
@Ferrybig, thay thế functionbằng function*, vì vậy nó sẽ được công nhận là máy phát điện.
khách-418

2

28 từ không có dấu ngoặc, 234 byte

Đặt tên định danh làm tên định nghĩa phương thức là quá rõ ràng ( ít nhất là đối với tôi ), vì vậy tôi đang tìm kiếm chuỗi từ riêng biệt và khoảng trắng riêng biệt dài nhất trong một đoạn mã.

Tôi hy vọng mã chết sau khi returnkhông được coi là lỗ hổng, nhưng mã vẫn có thể chạy được nếu các mã định danh được sử dụng được khai báo.

function*_(){implements:{
let private
var public
return yield typeof static
delete protected
throw new interface in package
break implements
debugger
void this instanceof class await extends function async(){}{}
do
continue
while(0)}}

Điều này khai thác thực tế là một số từ khóa dành riêng trong tương lai chỉ bị coi là không hợp lệ trong chế độ nghiêm ngặt của ES5.1 (rõ ràng vì các công cụ không bận tâm chặn tất cả các từ dành riêng trong tương lai của ES3 nên có quá nhiều mã sử dụng chúng trên web ).

Tương tự, mã thông báo asyncawaitmã thông báo được giới thiệu trong ES8 chỉ được coi là từ khóa ở chế độ nghiêm ngặt.


Có thể breakcontinueở đó?
l4m2

Khi tôi gọi hàm, tôi nhận được Uncaught SyntaxError: Undefined label 'implements', câu trả lời của bạn có yêu cầu thời gian chạy cụ thể không?
Nit

@Nit Rất tiếc, tôi không thực sự gọi nó, tôi chỉ kiểm tra xem liệu nó có được phép về mặt cú pháp hay không (và sau đó tối ưu hóa chủ nghĩa bình thường: D).
Bergi

@ l4m2 Ồ, bạn nói đúng, họ không thể nhưng đó là lỗi thời gian chạy nên tôi không nhận thấy :-( Cần một chút sắp xếp tùy ý để làm việc (và một khối có nhãn).
Bergi

@Bergi Trên Firefox, lỗi cú pháp trên tio nodejs là thời gian chạy
l4m2
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.