Зарезервированный 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;

Применяются стандартные лазейки .


Обсуждение песочницы , для тех, кому интересно.
Нить

Я чувствую, что это может быть более интересно, если вы не разрешите скобки между ключевыми словами.
Wheat Wizard

Разрешен ли перевод строки?
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
@Leushenko Вероятно, второй (хотя я также не слишком знаком с JS), так как они выглядят как имена функций по способу их использования. Тем не менее, обычно не должно быть возможности использовать эти ключевые слова в качестве имен функций или классов, но Сигуза все еще делал это, при этом выполняя правила вызова , заключающиеся только в использовании скобок и скобок. Хорошая находка , чтобы завершить эту проблему со всеми словами , я бы сказал , что, хотя большинство других ответов выглядит более впечатляюще для фактически используя ключевые слова 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 (){}и т. Д.
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.
Эрик Думинил,

2
@EricDuminil Это настоящая причина, по которой он называется _Java_ Script.
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 1 слово благодаря Арно и +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 байтов

Без "true" и "false", которые, по-видимому, не являются ключевыми словами в соответствии с вопросом.

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 {} вместо true / false, думать (и просто ничего не возвращать»)
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
 }:
}

слова из "супер" в "конст"

Гольф версия:

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могут появиться в начале, не будучи
названным

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когда я
вставляю в

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быть там?
4

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

@Nit Ой, я на самом деле не назвал это, я только проверил, разрешено ли это синтаксически (и затем оптимизировал прозаизм: D).
Берги

@ l4m2 О, вы правы, они не могут, но это ошибка времени выполнения, поэтому я не заметил :-( Требовалось немного произвольного переупорядочения для работы (и блок с меткой).
Берги

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