Reserviertes JavaScript


41

Ab ECMAScript 2015 ist Javascript 33 reservierte Schlüsselwörter , wie break, constund new, sowie 10 Zukunft reservierte Schlüsselwörter , wie letund await.

Ihre Aufgabe ist es, die größte Anzahl von aufeinanderfolgenden 1 verschiedenen reservierten Schlüsselwörtern 2 zu verketten, während Sie funktionalen JavaScript-Code 3 schreiben .

  1. Aufeinanderfolgende reservierte Schlüsselwörter - reservierte Schlüsselwörter, die nur durch Leerzeichen und / oder Klammern und / oder geschweifte Klammern getrennt sind.
  2. Reservierte Schlüsselwörter - alle reservierten oder zukünftigen reservierten Schlüsselwörter ab ECMAScript 2015 . Reservierte Schlüsselwörter aus älteren Standards sind ausgeschlossen. Eine vollständige Liste der zulässigen Schlüsselwörter finden Sie weiter unten.
  3. Funktionscode - Ihr Code sollte ausgeführt werden (geben Sie ggf. Ihre Laufzeit an), möglicherweise angehalten werden und keine Laufzeitfehler verursachen.

Wenn Ihr Code eine bestimmte Laufzeit benötigt, dürfen die verwendeten reservierten Schlüsselwörter in der angegebenen Umgebung keine No-Ops sein.

Liste der reservierten Schlüsselwörter

Wertung & Beispiele

Ihre Punktzahl entspricht der größten Anzahl aufeinanderfolgender reservierter Keywords.
Bei gleicher Punktzahl gewinnt der kürzeste Quellcode in Bytes. Kommentierte Abschnitte und Zeichenfolgen werden nicht für reservierte Schlüsselwörter, sondern für die Bytezahl gezählt.

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

Es gelten Standardlücken .


Sandbox-Diskussion für Interessierte.
Nit

Ich halte das für interessanter, wenn Sie keine Klammern zwischen den Schlüsselwörtern zulassen.
Weizen-Assistent

Ist Newline erlaubt?
14 m²,

@ l4m2 Ja, es ist Leerzeichen.
Nit

1
@ l4m2 Die gleiche 43-Punkte-Lösung ist auch ohne Zeilenumbruch möglich. Vielleicht verstehe ich den Punkt, den Sie ansprechen wollen, einfach nicht?
Nit

Antworten:


53

43 Wörter, 603 Bytes

Ähm, ist das eine Lücke? Ich habe keine Ahnung, wie zum Teufel das legal ist JS, aber es funktioniert und es verwendet jedes einzelne Keyword.

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
Nicht so vertraut mit JS, aber ... sind dies tatsächlich Schlüsselwörter, wenn sie in diesem Zusammenhang verwendet werden, oder nur Zeichenfolgen, die dieselbe lexikalische Struktur wie Schlüsselwörter haben und Zucker verwenden, um Anführungszeichen zu vermeiden?
Leushenko

1
@Leushenko Wahrscheinlich die zweite (obwohl ich mit JS auch nicht allzu vertraut bin), da sie in der Art und Weise, wie sie verwendet werden, wie Funktionsnamen aussehen. Normalerweise sollte es dennoch nicht möglich sein, diese Schlüsselwörter als Funktionen oder Klassennamen zu verwenden, aber Siguza tat es trotzdem, während er die Herausforderungsregeln einhielt , nur Klammern und Klammern zu verwenden. Ein netter Fund, um diese Herausforderung mit allen Wörtern abzuschließen, die ich sagen würde, obwohl die meisten anderen Antworten beeindruckender aussehen, wenn sie tatsächlich die Schlüsselwörter AS- Schlüsselwörter verwenden . Immer noch +1 von mir, es scheint, wir haben einen Gewinner.
Kevin Cruijssen

6
@ user202729 Warum aber? Warum zu komplex aussehen, wenn es auch so einfach geht? Code-Golf macht normalerweise etwas so kurz wie möglich, aber ich persönlich bevorzuge es immer noch, die Lesbarkeit und Einfachheit in gewissem Maße beizubehalten (ich weiß, ich weiß, das ist keine Code-Golf-Herausforderung). Einige Beispiele: Ich ziehe es zu verwenden -1, i+1, i-1oben ~0, -~i, ~-iwenn ich kann, nur weil es klarer ist für diejenigen zu lesen , die mit Code-Golf nicht allzu vertraut sind und ~noch. Obwohl ich natürlich immer i+~jund i-~jzum Golfen dieses einzelnen Bytes von i-j-1und verwenden werde i+j+1. ;)
Kevin Cruijssen

2
Ja, ich könnte es weiter pürieren und versuchen, den Byte-Countdown zu erhöhen ... ein Anfang wie if(this)return void typeof function(){} else debuggerist nicht schwer zu finden, aber danach wird es schnell hässlich. Und ja, das macht Schlüsselwörter zu Identifikatoren - aber für einige von ihnen muss man sie verwenden , um sie verwenden zu können (z enum. B. ). Ich habe es nur bis zum Äußersten genommen, aber ist das nicht alles, worum es beim Code-Golfen geht? : P
Siguza

1
@Magic Nein, die Angabe des Namens einer Klassenmethode ist einfach ein grammatikalischer Kontext, in dem Literal-Token als Eigenschaftsnamen behandelt werden, auch wenn es sich um reservierte Wörter handelt. Dies ist im Grunde genommen semantisch dasselbe wie bei obj["break"] = function (){}usw.
apsillers

53

37 Wörter

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

Nicht verwendete Schlüsselwörter:

  • case erfordert :
  • const erfordert =
  • export erfordert strengen Modus
  • import erfordert strengen Modus
  • super erfordert constructor

7
Ich gebe zu, ich habe gelacht
nicael

48
Es sieht aus wie typischer Java Boilerplate Code, zB zur Berechnung 1 + 2.
Eric Duminil

2
@EricDuminil Dies ist der wahre Grund, warum es _Java_ Script heißt.
wizzwizz4

5
@EricDuminil Das ist so nicht ganz einfach 1 + 2. Der vollständige Wert dieses Codes ist die Antwort auf die ultimative Frage des Lebens, des Universums und alles. Das ist komplex . :)
tsh

2
Das ist einfach wunderbar.
Pedro A

30

43 Wörter, 302 299 Bytes

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

Theoretische Untergrenze 277 (jeweils zwei durch ein Byte getrennte Wörter)
l4m2

Gute Arbeit, zur Zeit fehlt dir nur enum.
Nit

10

21 24 26 Wörter, 185 Bytes

+ 1 2 Wörter danke an Arnauld und +1 bis 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{}:{}}

Vorausgesetzt, ich habe die Herausforderung verstanden, ergibt dies 24 Wörter. Die Wörter ohne Klammern, Klammern und Leerzeichen:

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 Wörter, 177 Bytes

Ohne "wahr" und "falsch", die laut Fragestellung anscheinend keine Schlagworte sind.

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

Wörter:

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

(Ich habe meinen Kommentar versehentlich gelöscht, anstatt ihn zu bearbeiten. Der Inhalt
lautete

Ah ja. Ich habe dieser Regel nicht viel Aufmerksamkeit geschenkt.
Arnauld

Sie können case ... :oder default:am Ende setzen (da :zwischen Schlüsselwörtern nicht erlaubt ist)
12Me21

Dann können Sie mit for(let _;0;);für +2 Wörter enden (aber Sie können nicht casemehr verwenden).
Arnauld

switch({}){case{}:{}}=> switch({}){case{}:;}? Ich weiß nicht, ob ;es manchmal notwendig ist
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
 }:
}

Wörter von "super" bis "const"

Golf Version:

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

Ist es jetzt Zeit zum Golfen?
14 m²,

Ich erhalte , Uncaught SyntaxError: Unexpected token deletewenn ich versuche , deine Antwort in meiner Javascript - Konsole auf Google Chrome zu laufen, Wie kann ich testen , ob Ihre Lösung gültig ist?
Ferrybig

@Ferrybig Ich benutze Firefox und es funktioniert gut. Ich kann die neue Version von Chrome wegen des Systems nicht installieren
l4m2

Ich erhalte diesen Fehler in FirefoxSyntaxError: yield expression is only valid in generators
TheChetan

Ich benutze ff 52.7.2
l4m2

4

21 Wörter

(nicht sicher über letund 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;
}

, =und ;sind nicht als Trennzeichen zulässig.
user202729

2
Sie werden nicht gezählt
soktinpk

3

43 Wörter, 300 Bytes

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

Besser lesbar:

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

Ich musste das "reservierte Wort als Methodenname" verwenden, um damit umzugehen

  • case(da ich defaultmit meinem schon benutzt hatte swtich),
  • exportund import(da der Modulmodus immer streng ist, was disqualifiziert with)
  • super(da es von einem Eigenschaftszugriff gefolgt oder in eine constructorFunktion eingefügt werden muss) und
  • enum (was niemals verwendet werden kann, da es sich um ein reserviertes Wort ohne grammatikalisch gültige Verwendung handelt)

Meine 39 Lösungsshows superkönnen am Anfang ohne Namen erscheinen, aber zu teuer
l4m2

3

14 15 16 Wörter ohne Klammern oder Zeilenvorschub

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

Danke Bergi für +1


Kannst du daraus eine Generatorfunktion machen und eine einwerfen yield?
Bergi

Ich versuchte herauszufinden, was das bewirkt, aber mein Kopf begann sich zu drehen. Könnten Sie eine Erklärung abgeben?
Philipp

Ich bekomme, Uncaught SyntaxError: Unexpected token newwenn ich in meine Javascript-Konsole
einfügen

1
@Ferrybig, ersetzen functionmit function*, so wird er als Generator erkannt werden.
Gast-418

2

28 Wörter ohne Klammern, 234 Bytes

Das Eingeben von Bezeichnernamen als Methodendefinitionsnamen war zu offensichtlich ( zumindest für mich ), daher suchte ich nach der längsten fortlaufenden eindeutigen Folge von reservierten Wörtern und Leerzeichen in einem Code-Snippet.

Ich hoffe, dass toter Code nach a returnnicht als Schlupfloch zählt, aber der Code ist noch lauffähig, wenn die verwendeten Bezeichner deklariert werden.

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

Dies nutzt die Tatsache aus, dass einige der zukünftigen reservierten Schlüsselwörter nur im strikten Modus von ES5.1 als ungültig angesehen werden (anscheinend, weil die Suchmaschinen nicht alle zukünftigen reservierten Wörter von ES3 blockierten, sodass es im Web zu viel Code gab, der sie verwendet ).

Ebenso werden die in ES8 eingeführten Token asyncund awaitnur im strikten Modus als Schlüsselwörter betrachtet.


Kann breakund continueda sein?
14 m²,

Wenn ich die Funktion aufrufe Uncaught SyntaxError: Undefined label 'implements', erhalte ich , erfordert Ihre Antwort eine bestimmte Laufzeit?
Nit

@Nit Hoppla, ich habe es eigentlich nicht genannt, sondern nur überprüft, ob es syntaktisch zulässig ist (und dann den Prosaizismus optimiert: D).
Bergi

@ l4m2 Oh, du hast recht, sie können es nicht, aber es ist ein Laufzeitfehler, also habe ich es nicht bemerkt :-( Benötigte ein bisschen willkürliche Neuordnung, um zu funktionieren (und einen Block mit dem Label).
Bergi

@Bergi Auf Firefox ist es ein Syntaxfehler auf tio nodejs es ist Laufzeit
l4m2
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.