จาวาสคริปต์ที่สงวนไว้


41

ในฐานะของ ECMAScript 2015 JavaScript มี33 คำหลักที่สงวนไว้เช่นbreak, constและnewเช่นเดียวกับ10 คำหลักที่สงวนไว้ในอนาคตเช่นและletawait

งานของคุณคือการเข้าด้วยกันจำนวนมากที่สุดของติดต่อกัน1คำหลักที่สงวนไว้แตกต่างกัน2ในขณะที่เขียนโค้ด JavaScript ทำงาน3

  1. คำหลักที่สงวนไว้อย่างต่อเนื่อง - คำหลักที่สงวนไว้ซึ่งคั่นด้วยช่องว่างและ / หรือวงเล็บและ / หรือเครื่องหมายปีกกาเท่านั้น
  2. คำหลักสงวน - ใด ๆลิขสิทธิ์หรือสงวนไว้ในอนาคตเป็นคำหลักของ ECMAScript 2015 ไม่รวมคำหลักที่สงวนไว้จากมาตรฐานที่เก่ากว่ารายการคำหลักที่อนุญาตทั้งหมดได้รับด้านล่าง
  3. รหัสการทำงาน - รหัสของคุณควรทำงาน (ระบุเวลาทำงานของคุณหากจำเป็น) ในที่สุดก็หยุดและไม่ทิ้งข้อผิดพลาด runtime ใด ๆ

หากรหัสของคุณต้องการรันไทม์เฉพาะคำหลักที่สงวนไว้จะต้องไม่เป็นแบบไม่มีตัวเลือกในสภาพแวดล้อมที่กำหนด

รายการคำหลักที่สงวนไว้

การให้คะแนน & ตัวอย่าง

คะแนนของคุณจะเท่ากับจำนวนคำหลักที่สงวนไว้อย่างชัดเจนติดต่อกันมากที่สุด
ในกรณีที่มีคะแนนเท่ากันซอร์สโค้ดที่สั้นที่สุดในหน่วยไบต์จะเป็นผู้ชนะ ความคิดเห็นในส่วนและสตริงจะไม่นับรวมกับคำหลักที่สงวนไว้ แต่นับรวมเป็นจำนวนไบต์

// 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;

ช่องโหว่มาตรฐานใช้


การสนทนา Sandboxสำหรับผู้ที่สนใจ
นิตย์

ฉันรู้สึกว่านี่น่าสนใจกว่าถ้าคุณไม่อนุญาตให้ใส่วงเล็บระหว่างคำหลัก
ข้าวสาลีตัวช่วยสร้าง

ขึ้นบรรทัดใหม่ได้หรือไม่
l4m2

@ l4m2 ใช่มันเป็นช่องว่าง
Nit

1
@ l4m2 โซลูชัน 43 จุดเดียวกันนั้นเป็นไปได้โดยไม่ต้องขึ้นบรรทัดใหม่ด้วยดังนั้นบางทีฉันก็ไม่เข้าใจประเด็นที่คุณพยายามจะทำ?
Nit

คำตอบ:


53

43 คำ, 603 ไบต์

เอ่อนี่เป็นช่องโหว่หรือเปล่า ฉันไม่รู้ว่านรกนี้เป็นกฎหมาย JS แต่ใช้งานได้และใช้คำหลักทุกคำ

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
ไม่คุ้นเคยกับ JS แต่ ... จริง ๆ แล้วคำหลักเหล่านี้เมื่อใช้ในบริบทนี้หรือเพียงแค่สตริงที่มีโครงสร้างคำศัพท์เดียวกันกับคำหลักและใช้น้ำตาลเพื่อหลีกเลี่ยงคำพูด?
Leushenko

1
@Lushushenko อาจเป็นครั้งที่สอง (แม้ว่าฉันจะไม่คุ้นเคยกับ JS เลย) เนื่องจากพวกเขาดูเหมือนชื่อฟังก์ชันในวิธีการใช้งาน อย่างไรก็ตามโดยทั่วไปแล้วไม่ควรใช้คำหลักเหล่านี้เป็นฟังก์ชั่นหรือชื่อคลาส แต่Siguzaยังคงทำเช่นนั้นในขณะที่ยังคงปฏิบัติตามกฎการท้าทายโดยใช้วงเล็บและวงเล็บเท่านั้น ค้นหาความสุขที่จะเสร็จสมบูรณ์ความท้าทายนี้ด้วยคำพูดทั้งหมดผมว่าถึงแม้ว่าส่วนใหญ่ของคำตอบอื่น ๆ ดูน่าประทับใจมากขึ้นสำหรับการใช้จริงคำหลักคำหลัก ยัง +1 จากฉันดูเหมือนว่าเรามีผู้ชนะ
Kevin Cruijssen

6
@ user202729 ทำไมถึงเป็นเช่นนั้น เหตุใดจึงทำให้ดูซับซ้อนเกินไปเมื่อสามารถทำได้ง่าย ๆ การเล่นรหัสมักจะทำอะไรที่สั้นที่สุด แต่โดยส่วนตัวแล้วฉันยังคงต้องการความสามารถในการอ่านและความเรียบง่ายในการขยาย (ฉันรู้ฉันรู้ว่านี่ไม่ใช่ความท้าทายของการเล่นรหัส) ตัวอย่างบางส่วน: ฉันชอบที่จะใช้-1, i+1, i-1เหนือ~0, -~i, ~-iเมื่อฉันสามารถเพียงเพราะมันเป็นที่ชัดเจนในการอ่านสำหรับผู้ที่ไม่คุ้นเคยกับรหัสการเล่นกอล์ฟและ~ยัง ถึงแม้ว่าผมจะแน่นอนจะใช้i+~jและi-~jการกอล์ฟที่ไบต์เดียวและi-j-1 i+j+1;)
Kevin Cruijssen

2
ใช่ฉันสามารถบดมันต่อไปและพยายามทำให้จำนวนไบต์นับถอยหลัง ... การเริ่มต้นอย่างif(this)return void typeof function(){} else debuggerไม่ยากที่จะเกิดขึ้น แต่หลังจากนั้นมันก็เร็วขึ้นอย่างน่าเกลียด และใช่สิ่งนี้จะเปลี่ยนคำหลักทั้งหมดเป็นตัวระบุ - แต่สำหรับบางคำคุณต้องใช้เพื่อให้สามารถใช้คำหลักนั้นได้ (เช่นenum) ฉันเพิ่งนำมันไปสุดขีด แต่นั่นไม่ใช่สิ่งที่เกี่ยวกับการเล่นกอล์ฟรหัส? : P
Siguza

1
@Magic ไม่ใช่การจัดหาชื่อของ class-method เป็นเพียงบริบททางไวยากรณ์ที่โทเค็นตัวอักษรถือว่าเป็นชื่อคุณสมบัติแม้ว่าจะเป็นคำที่สงวนไว้ โดยทั่วไปแล้วจะมีความหมายเหมือนกันทำสิ่งobj["break"] = function (){}อื่น ๆ
apsillers

53

37 คำ

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 }
}

คำหลักที่ไม่ได้ใช้:

  • case ต้องมี :
  • const ต้องมี =
  • export ต้องใช้โหมดเข้มงวด
  • import ต้องใช้โหมดเข้มงวด
  • super ต้องมี constructor

7
ฉันยอมรับว่าฉันหัวเราะ
nicael

48
ดูเหมือนทั่วไปรหัสสำเร็จรูป Java 1 + 2เช่นการคำนวณ
Eric Duminil

2
@EricDuminil นี่คือเหตุผลจริงที่เรียกว่า _Java_ สคริปต์
wizzwizz4

5
@EricDuminil 1 + 2นั่นไม่ได้ค่อนข้างง่ายเหมือน คุณค่าที่สมบูรณ์ของรหัสนี้คือคำตอบสำหรับคำถามสุดท้ายของชีวิตจักรวาลและทุกสิ่ง นั่นเป็นที่ซับซ้อน :)
tsh

2
มันยอดเยี่ยมมาก
Pedro A

30

43 คำ, 302 299 ไบต์

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:}

ส่วนล่างทางทฤษฎี 277 (แต่ละคำสองคำคั่นด้วยหนึ่งไบต์)
l4m2

enumการทำงานที่ดีในขณะที่คุณกำลังเดียวที่ขาดหาย
Nit

10

21 24 26 คำ, 185 ไบต์

+ 1 2 คำขอบคุณ Arnauld และ +1 ถึง 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{}:{}}

สมมติว่าฉันเข้าใจความท้าทายนี้จะได้คะแนน 24 คำ คำที่ไม่มีวงเล็บวงเล็บและช่องว่าง:

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 คำ, 177 ไบต์

ไม่มี "จริง" และ "เท็จ" ซึ่งดูเหมือนจะไม่ใช่คำหลักตามคำถาม

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

คำ:

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

(ฉันลบความคิดเห็นของฉันโดยไม่ได้ตั้งใจแทนที่จะแก้ไขมันเนื้อหาคือ: "คุณสามารถใช้การลบ {} แทนความจริง / เท็จคิด (และเพียงแค่คืนค่าอะไร")
12Me21

อ่าใช่ ฉันไม่ได้ใส่ใจกับกฎนั้นมากนัก
Arnauld

คุณสามารถวางcase ... :หรือdefault:สิ้นสุด (เนื่องจาก:ไม่ได้รับอนุญาตระหว่างคำหลัก)
12Me21

Ot คุณสามารถลงท้ายด้วยfor(let _;0;);คำ +2 (แต่คุณไม่สามารถใช้caseอีกต่อไป)
Arnauld

switch({}){case{}:{}}=> switch({}){case{}:;}? ไม่ทราบว่า;บางครั้งมีความจำเป็น
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
 }:
}

คำจาก "super" ถึง "const"

รุ่น Golfed:

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}:}

ตอนนี้เป็นเวลาเล่นกอล์ฟหรือไม่?
l4m2

ฉันได้รับUncaught SyntaxError: Unexpected token deleteเมื่อฉันพยายามเรียกใช้คำตอบของคุณในคอนโซล Javascript บน Google Chrome ฉันจะทดสอบได้อย่างไรว่าโซลูชันของคุณถูกต้อง
Ferrybig

@Ferrybig ฉันใช้ Firefox และใช้งานได้ดี ฉันไม่สามารถติดตั้ง Chrome เวอร์ชันใหม่เนื่องจากระบบ
l4m2

ฉันได้รับข้อผิดพลาดนี้ใน FirefoxSyntaxError: yield expression is only valid in generators
TheChetan

ฉันใช้ ff 52.7.2
l4m2

4

21 คำ

(ไม่แน่ใจเกี่ยวกับletและawait)

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;
}

, =และ;ไม่อนุญาตให้ใช้เป็นตัวคั่น
user202729

2
พวกเขาจะไม่ถูกนับ
soktinpk

3

43 คำ, 300 ไบต์

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}}

อ่านง่ายขึ้น:

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
        }
    }

ฉันต้องใช้ "คำสงวนเป็นชื่อวิธี" เพื่อจัดการกับ

  • case(ตั้งแต่ฉันได้ใช้อยู่แล้วdefaultกับฉันswtich)
  • exportและimport(เนื่องจากโมดูลโหมดมีความเข้มงวดเสมอซึ่งตัดสิทธิ์with)
  • super(เพราะมันจะต้องตามด้วยการเข้าถึงคุณสมบัติหรือวางไว้ในconstructorฟังก์ชั่น) และ
  • enum (ซึ่งไม่สามารถใช้งานได้เลยเป็นคำสงวนที่ไม่มีการใช้ไวยากรณ์ที่ถูกต้อง)

โซลูชัน 39 รายการของฉันsuperสามารถปรากฏในตอนเริ่มต้นโดยไม่มีชื่อ แต่แพงเกินไป
l4m2

3

14 15 16 คำที่ไม่มีวงเล็บหรือขึ้นบรรทัดใหม่

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

ขอบคุณ Bergi สำหรับ +1


คุณสามารถทำให้มันเป็นฟังก์ชั่นเครื่องกำเนิดไฟฟ้าและโยนในyield?
Bergi

ฉันพยายามคิดว่ามันทำอะไร แต่หัวของฉันเริ่มหมุน คุณช่วยโพสต์คำอธิบายได้ไหม?
ฟิลิปป์

ฉันได้รับUncaught SyntaxError: Unexpected token newเมื่อฉันวางในคอนโซล JavaScript ของฉัน
Ferrybig

1
@Ferrybig แทนที่functionด้วยfunction*ดังนั้นมันจะได้รับการยอมรับว่าเป็นเครื่องกำเนิดไฟฟ้า
guest-418

2

28 คำที่ไม่มีวงเล็บ 234 ไบต์

การใส่ชื่อตัวระบุเป็นชื่อคำจำกัดความของวิธีการนั้นชัดเจนเกินไป ( สำหรับฉันอย่างน้อย ) ดังนั้นฉันจึงค้นหาลำดับที่ยาวที่สุดที่ต่อเนื่องกันของคำที่สงวนไว้และช่องว่างในโค้ดขนาดสั้น

ฉันหวังว่ารหัสที่ตายแล้วหลังจาก a returnไม่นับเป็นช่องโหว่ แต่โค้ดยังคงสามารถเรียกใช้งานได้หากมีการประกาศตัวระบุที่ใช้แล้ว

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)}}

การใช้ประโยชน์จากความจริงที่ว่าคำหลักที่สงวนไว้ในอนาคตบางคำจะถือว่าไม่ถูกต้องในโหมดเข้มงวดของ ES5.1 เท่านั้น (เห็นได้ชัดว่าเนื่องจากเอ็นจิ้นไม่ต้องการปิดกั้นคำที่สงวนไว้ในอนาคตของ ES3 ทั้งหมดดังนั้นจึงมีรหัสมากเกินไป )

ในทำนองเดียวกันasyncและawaitโทเค็นที่นำมาใช้ใน ES8 จะถือว่าเป็นคำหลักในโหมดเข้มงวดเท่านั้น


สามารถbreakและcontinueจะมี
l4m2

เมื่อฉันเรียกใช้ฟังก์ชันฉันจะได้Uncaught SyntaxError: Undefined label 'implements'รับคำตอบของคุณต้องการรันไทม์เฉพาะหรือไม่
นิตย์

@ ไม่เป็นไรฉันไม่ได้เรียกจริง ๆ ฉันแค่ตรวจสอบว่าได้รับอนุญาตจากวากยสัมพันธ์หรือไม่
Bergi

@ l4m2 โอ้คุณพูดถูก แต่พวกเขาทำไม่ได้ แต่เป็นข้อผิดพลาดรันไทม์ดังนั้นฉันจึงไม่ได้สังเกตเห็น :-( จำเป็นต้องสั่งการทำงานใหม่แบบสุ่ม (และบล็อกที่มีป้ายกำกับ)
Bergi

@Bergi บน Firefox ข้อผิดพลาดทางไวยากรณ์ของ tio nodejs เป็น runtime
l4m2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.