予約済みのJavaScript


41

ECMAScriptの2015年の時点では、JavaScriptが持っている33個の予約キーワード、などbreakconstnewだけでなく、10将来の予約語などを、letawait

あなたの仕事は、機能的なJavaScriptコードを記述しながら、最大数の連続した1個の個別の予約キーワード2を連結することです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;

標準の抜け穴が適用されます。


興味のある人のためのサンドボックスディスカッション
NIT

キーワード間の括弧を許可しなかった場合、これはより興味深いかもしれません。
小麦ウィザード

改行は許可されますか?
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に精通し、しかし...これらは実際にはそのキーワードこの文脈で使用する場合、またはキーワードと同じ字句構造を有し、引用符を避けるために砂糖を使用している文字列だけ?
ルーシェンコ

1
@Leushenkoおそらく2番目(おそらく私もJSにあまり精通していませんが)、使用方法が関数名のように見えるためです。それでも、通常、これらのキーワードを関数またはクラス名として使用することはできませんが、Siguzaはそれを実行しましたが、括弧と括弧のみを使用するというチャレンジルールに準拠しています。他の回答のほとんどは、実際にキーワードAS keywordを使用することでより印象的に見えますが、私が言うすべての単語でこの課題を完了するための素晴らしい発見です。まだ私から+1、勝者がいるようです。
ケビンクルーッセン

6
@ user202729なんで?なぜそれがとても簡単にできるのに、過度に複雑に見えるようにするのですか?通常、コードゴルフはできる限り短いことをしていますが、個人的にはある程度読みやすさとシンプルさを保つことを好みます(これはコードゴルフの挑戦ではありません)。いくつかの例は:私が使用することを好む-1i+1i-1上記~0-~i~-i私は、それが明確だという理由だけで、コード・ゴルフ、とあまり慣れていない人のために読み取ることができたときに~はまだ。私はもちろん、常に使用しますがi+~ji-~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
これは素晴らしいです。
ペドロ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(1つのバイトで区切られた各二つの単語)
l4m2

いい仕事です、現在あなたは行方不明になっていenumます。
NIT

10

21 24 26ワード、185バイト

+ Arnauldのおかげで1 2ワード、12Me21に+1!

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

(コメントを編集する代わりに誤って削除したため、内容は「true / falseの代わりに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
 }:
}

「スーパー」から「コンスト」への言葉

ゴルフバージョン:

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、私はGoogle Chromeの上で私のJavaScriptコンソールであなたの答えを実行しようとすると、どのように私はあなたのソリューションが有効であるかどうかをテストすることができ、?
フェリービッグ

@Ferrybig私はFirefoxを使用していますが、正常に動作します。システムのために新しいバージョンのChromeを
インストールできない-l4m2

Firefoxでこのエラーが発生するSyntaxError: 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)}

+1をありがとう


あなたはそれをジェネレーター関数にして、スローすることができますyieldか?
ベルギ

私はこれが何をするかを理解しようとしましたが、私の頭が回転し始めました。説明を投稿できますか?
フィリップ

Uncaught SyntaxError: Unexpected token newjavascriptコンソールに貼り付けると取得
できます-Ferrybig

1
@Ferrybig、に置き換えfunctionfunction*、ジェネレーターとして認識されるようにします。
guest-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の将来の予約語をすべてブロックすることを気にせず、Web上でそれらを使用するコードが多すぎたためです) )。

同様に、ES8で導入​​されたasyncand awaitトークンは、厳密モードでのみキーワードと見なされます。


ことが可能breakcontinueがありますか?
l4m2

関数を呼び出すUncaught SyntaxError: Undefined label 'implements'と、特定のランタイムが必要ですか?
NIT

@Nit Oops、私は実際にそれを呼び出しませんでした。構文的に許可されているかどうかをチェックしました(そして最適化されたプロサシズム:D)。
ベルギ

@ l4m2ああ、そうです、彼らはできませんが、それはランタイムエラーですので、私は気づきませんでした:-((ラベル付きのブロック)が動作するために少しの任意の並べ替えが必要でした。
Bergi

@Bergi Firefoxではtio nodejsで構文エラーが発生し、ランタイムになります
l4m2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.