Зарезервований JavaScript


41

Станом на ECMAScript 2015, у JavaScript є 33 зарезервовані ключові слова , наприклад break, constта new, а також 10 майбутніх зарезервованих ключових слів , таких як letі await.

Ваше завдання - зв'язати між собою найбільшу кількість послідовних 1 різних зарезервованих ключових слів 2 під час написання функціонального коду JavaScript 3 .

  1. Послідовні зарезервовані ключові слова - зарезервовані ключові слова, які розділені лише пробілами та / або дужками та / або фігурними дужками.
  2. Зарезервовані ключові слова - будь-які зарезервовані або майбутні зарезервовані ключові слова станом на ECMAScript 2015 . Застережені ключові слова зі старих стандартів виключаються, повний перелік дозволених ключових слів наведено нижче.
  3. Функціональний код - ваш код повинен працювати (вказати час виконання, якщо потрібно), врешті-решт зупинитись, а не викидати помилки виконання.

Якщо вашому коду потрібен певний час виконання, використовувані зарезервовані ключові слова не повинні мати опору в даному середовищі.

Список зарезервованих ключових слів

Оцінка та приклади

Ваш результат буде дорівнює найбільшій кількості послідовно відокремлених ключових слів.
У випадку рівних балів виграє найкоротший вихідний код у байтах. Коментовані розділи та рядки не зараховуються до зарезервованих ключових слів, а зараховуються до кількості байтів.

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

Застосовуються стандартні лазівки .


Дискусія в пісочниці для тих, хто цікавиться.
Ніт

Я думаю, що це може бути цікавіше, якби ви не дозволили дужки між ключовими словами.
Пшеничний майстер

Чи дозволений новий рядок?
l4m2

@ l4m2 Так, це пробіл.
Ніт

1
@ l4m2 Таке ж 43-бальне рішення можливе і без нових рядків, так що, можливо, я просто не розумію точку, яку ви намагаєтеся зробити?
Ніт

Відповіді:


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, але ... це насправді ключові слова, коли вони використовуються в цьому контексті, чи просто рядки, які мають таку ж лексичну структуру, що й ключові слова та використовують цукор, щоб уникнути цитат?
Левшенко

1
@ Левшенко Напевно, другий (хоча я теж зовсім не дуже знайомий з JS), оскільки вони виглядають як імена функцій у тому, як вони використовуються. Тим не менш, зазвичай не можна використовувати ці ключові слова як функції або назви класів, але Siguza все-таки це робив, дотримуючись правил виклику лише за допомогою дужок і дужок. Хороша знахідка , щоб завершити цю проблему з усіма словами , я б сказав , що, хоча більшість інших відповідей виглядає більш вражаюче для фактично використовуючи ключові слова AS ключових слів . Все ще +1 від мене, здається, у нас є переможець.
Кевін Кройсейсен

6
@ user202729 Чому все-таки? Навіщо робити так надто складно виглядати, коли це можна зробити так просто? Код-гольф, як правило, робить щось якомога коротше, але я все ще вважаю за краще зберігати читабельність та простоту на деякий розсуд (я знаю, я знаю, це не проблема кольфінгу). Деякі приклади: Я вважаю за краще використовувати -1, i+1, i-1вище ~0, -~i, ~-iколи я можу, тільки тому , що зрозуміліше читати для тих , хто не дуже добре знайомі з кодовою гольфом і ~ще. Хоча я, звичайно, завжди буду використовувати i+~jі i-~jдля гольфу той єдиний байт i-j-1і i+j+1. ;)
Кевін Крейссен

2
Так, я міг би перетерти його далі, і спробувати збити кількість байтів ... початок, як if(this)return void typeof function(){} else debuggerне важко придумати, але після цього він стає некрасивим швидко. І так, це повністю перетворює ключові слова в ідентифікатори - але для деяких з них вам доведеться їх використовувати (наприклад enum). Я просто сприйняв це до крайності, але хіба це не те, про що йдеться в гольфі? : P
Сігуза

1
@Magic Ні, надання імені класового методу - це просто граматичний контекст, де буквальні лексеми трактуються як імена властивостей, навіть якщо вони є зарезервованими словами. Це в основному те саме, семантично, як obj["break"] = function (){}і т. Д.
апсилери

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


48
Це схоже на типовий код котла Java, наприклад для обчислення 1 + 2.
Ерік Думініл

2
@EricDuminil Це справжня причина, яку називають сценарієм _Java_.
wizzwizz4

5
@EricDuminil Це не зовсім просто 1 + 2. Повна цінність цього коду - це відповідь на остаточне питання життя, Всесвіту і всього. Це складно . :)
tsh

2
Це просто чудово.
Педро А

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.
Ніт

10

21 24 26 слів, 185 байт

+ 1 2 слова завдяки Арнольду та +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

(Я випадково видалив свій коментар, замість того, щоб редагувати його, вміст був таким: "ви можете використовувати delete {} замість істинного / неправдивого, подумайте (і просто нічого не повертайте")
12Me21

Ага, так. Я не приділяв великої уваги цьому правилу.
Арнольд

ви можете поставити case ... :або default:в кінці (оскільки :це не дозволено між ключовими словами)
12Me21

От ви можете закінчити for(let _;0;);на +2 слова (але ви більше не можете використовувати case).
Арнольд

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

слова від "супер" до "const"

Версія для гольфу:

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 Я використовую 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;
}

, =і ;не допускаються як роздільники.
користувач202729

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

Дякую Бергі за +1


Чи можете ви зробити це функцією генератора і кинути в yield?
Бергі

Я спробував розібратися, що це робить, але голова почала крутитися. Чи можете ви опублікувати пояснення?
Філіпп

Я отримую, Uncaught SyntaxError: Unexpected token newколи я вставляю всередину моєї консолі javascript
Ferrybig

1
@Ferrybig, замініть functionна function*, тому він буде визнаний генератором.
гість-418

2

28 Слова без дужок, 234 байт

Встановлення імен ідентифікаторів як імен визначення методу було занадто очевидним ( для мене, принаймні , для мене ), тому я шукав найдовшу послідовну чітку послідовність зарезервованих слів і пробілів у фрагменті коду.

Я сподіваюся, що мертвий код після 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бути там?
l4м2

Коли я телефоную функції, я отримую Uncaught SyntaxError: Undefined label 'implements', чи потрібна ваша відповідь певного часу виконання?
Ніт

@Nit На жаль, я насправді не називав це, я лише перевіряв, чи дозволено це синтаксично (а потім оптимізував прозаїзм: D).
Бергі

@ l4m2 О, ти маєш рацію, вони не можуть, але це помилка під час виконання, тому я не помітив :-( Потрібно трохи довільного переупорядкування для роботи (і блоку з етикеткою).
Бергі,

@Bergi On Firefox - це синтаксична помилка в tio nodejs, це час виконання
l4m2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.