JavaScript réservé

41

Depuis ECMAScript 2015, JavaScript contient 33 mots clés réservés , tels que break, constetnew , ainsi que 10 futurs mots clés réservés , tels que letet await.

Votre tâche consiste à enchaîner le plus grand nombre de mots-clés réservés 1 distincts et consécutifs 2 lors de l'écriture du code JavaScript fonctionnel 3 .

  1. Mots clés réservés consécutifs - mots clés réservés qui ne sont séparés que par des espaces et / ou des parenthèses et / ou des accolades.
  2. Mots-clés réservés - tous les mots-clés réservés ou futurs réservés à partir de ECMAScript 2015 . Les mots clés réservés de normes plus anciennes sont exclus, une liste complète des mots clés autorisés est donnée ci-dessous.
  3. Code fonctionnel - votre code doit être exécuté (indiquez votre runtime, si nécessaire), éventuellement interrompu et ne pas générer d'erreurs d'exécution.

Si votre code nécessite une exécution spécifique, les mots-clés réservés utilisés ne doivent pas être no-ops dans l'environnement donné.

Liste des mots-clés réservés

Scoring & exemples

Votre score sera égal au plus grand nombre de mots-clés réservés distincts et consécutifs.
Dans le cas de scores égaux, le code source le plus court en octets gagne. Les sections et les chaînes commentées ne comptent pas pour les mots clés réservés, mais pour le nombre d'octets.

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

Les failles standard s'appliquent.

Lente
la source
Discussion Sandbox , pour ceux qui sont intéressés.
Nit
Je pense que cela pourrait être plus intéressant si vous n'autorisiez pas les parenthèses entre les mots-clés.
Wheat Wizard
La nouvelle ligne est-elle autorisée?
l4m2
@ l4m2 Oui, c'est un espace.
Nit
1
@ 14m2 La même solution en 43 points est possible sans newlines aussi, alors peut-être que je ne comprends pas ce que vous essayez de dire?
Nit

Réponses:

53

43 mots, 603 octets

Uhm, est-ce une faille? Je ne sais pas du tout comment c'est légal JS, mais ça marche et ça utilise tous les mots-clés.

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(){}
})
Siguza
la source
3
Ce n'est pas si familier avec JS, mais ... s'agit-il réellement de mots - clés lorsqu'ils sont utilisés dans ce contexte, ou simplement de chaînes qui ont la même structure lexicale que les mots-clés et qui utilisent du sucre pour éviter les guillemets?
Leushenko
1
@ Leushenko Probablement le deuxième (même si je ne connais pas trop JS), car ils ressemblent à des noms de fonctions dans leur utilisation. Néanmoins, normalement, il ne devrait pas être possible d’utiliser ces mots-clés en tant que fonctions ou noms de classe, mais Siguza l’a quand même fait, tout en respectant les règles de défi qui consistent à n’utiliser que des parenthèses et des crochets. Une trouvaille de bien pour compléter ce défi avec tous les mots , je dirais, même si la plupart des autres réponses regarder plus impressionnant pour utiliser les mots - clés réellement AS mots - clés . Encore +1 de moi, il semble que nous ayons un gagnant.
Kevin Cruijssen
6
@ user202729 Pourquoi si? Pourquoi rendre la recherche trop complexe quand cela peut être fait si simplement? Le code-golf fait généralement quelque chose d'aussi court que possible, mais personnellement, je préfère tout de même garder la lisibilité et la simplicité dans une certaine mesure (je sais, je sais, ce n'est pas un défi du code-golf). Quelques exemples: Je préfère utiliser -1, i+1, i-1ci - dessus ~0, -~i, ~-iquand je peux, juste parce qu'il est plus clair à lire pour ceux qui ne sont pas familiers avec le code-golf et ~encore. Bien que je vais bien sûr toujours utiliser i+~jet i-~jjouer au golf cet octet unique de i-j-1et i+j+1. ;)
Kevin Cruijssen
2
Oui, je pourrais le réduire davantage et essayer d’obtenir le compte d’octets décompté… un début comme celui-ci if(this)return void typeof function(){} else debuggern’est pas difficile à établir, mais après cela, il devient très vite moche. Et oui, cela transforme totalement les mots-clés en identifiants - mais pour certains d'entre eux, vous devez le faire pour pouvoir les utiliser (par exemple enum). Je viens de le prendre à l'extrême, mais n'est-ce pas ce qu'est le code golf? : P
Siguza
1
@Magic Non, la fourniture du nom d'une méthode de classe est simplement un contexte grammatical dans lequel les jetons littéraux sont traités comme des noms de propriétés, même s'il s'agit de mots réservés. C'est fondamentalement la même chose, sémantiquement, que faire obj["break"] = function (){}etc.
apsillers
53

37 mots

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

Mots-clés non utilisés:

  • case a besoin :
  • const a besoin =
  • export nécessite un mode strict
  • import nécessite un mode strict
  • super a besoin constructor
tsh
la source
7
J'avoue que j'ai ri
nicael
48
Cela ressemble au code standard Java standard, par exemple, pour calculer 1 + 2.
Eric Duminil
2
@EricDuminil C'est la vraie raison pour laquelle il s'appelle _Java_ Script.
wizzwizz4
5
@EricDuminil Ce n'est pas aussi simple que ça 1 + 2. La valeur complète de ce code est la réponse à la question ultime de la vie, de l'univers et de tout. C'est complexe . :)
tsh
2
C'est juste merveilleux.
Pedro le
30

43 mots, 302 299 octets

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:}
l4m2
la source
Descente théorique 277 (deux mots séparés par un octet)
l4m2
Beau travail, actuellement il ne vous manque que enum.
Nit
10

21 24 26 mots, 185 octets

+ 1 2 mots grâce à Arnauld et +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{}:{}}

En supposant que j'ai compris le défi, cela compte pour 24 mots. Les mots sans parenthèses, crochets et espaces:

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 mots, 177 octets

Sans "true" et "false", qui ne sont apparemment pas des mots clés selon la question.

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

Mots:

void function do with if typeof in this throw instanceof new class extends else return try break finally yield continue while delete switch case
Conor O'Brien
la source
(J'ai accidentellement supprimé mon commentaire au lieu de le modifier, le contenu était le suivant: "vous pouvez utiliser delete {} à la place de true / false, pensez (et ne renvoyez rien")
12Me21
Ah oui. Je n'ai pas fait très attention à cette règle.
Arnauld
vous pouvez mettre case ... :ou default:à la fin (car ce :n'est pas permis entre les mots-clés)
12Me21
Tu peux finir avec for(let _;0;);+2 mots (mais tu ne peux caseplus en utiliser ).
Arnauld
switch({}){case{}:{}}=> switch({}){case{}:;}? ;
Je
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
 }:
}

les mots de "super" à "const"

Version golfée:

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
la source
Est-ce le moment de jouer au golf?
l4m2
Je reçois Uncaught SyntaxError: Unexpected token deletelorsque j'essaie d'exécuter votre réponse dans ma console Javascript sur Google Chrome. Comment puis-je tester si votre solution est valide?
Ferrybig
@Ferrybig J'utilise Firefox et cela fonctionne bien. Je ne peux pas installer la nouvelle version de Chrome à cause du système
l4m2
Je reçois cette erreur dans FirefoxSyntaxError: yield expression is only valid in generators
TheChetan
J'utilise ff 52.7.2
l4m2
4

21 mots

(pas sûr de letet 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;
}
soktinpk
la source
, =et ;ne sont pas autorisés en tant que séparateurs.
user202729
2
Ils ne sont pas comptés
soktinpk
3

43 mots, 300 octets

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

Plus lisiblement:

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

Je devais utiliser le "mot réservé comme nom de méthode" pour traiter

  • case(depuis que j'avais déjà utilisé defaultavec monswtich ),
  • exportet import(puisque le mode de module est toujours strict, ce qui disqualifiewith )
  • super (puisqu'il doit être suivi d'un accès à la propriété ou placé dans un constructor fonction), et
  • enum (qui ne peut jamais être utilisé du tout, étant un mot réservé sans utilisation grammaticalement valide)
apsillers
la source
Mes 39 shows de solutions superpeuvent apparaître au début sans être
nommés
3

14 15 16 Mots sans crochets ni nouvelle ligne

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

Merci Bergi pour +1

l4m2
la source
Pouvez-vous en faire une fonction génératrice et ajouter un yield?
Bergi
J'ai essayé de comprendre ce que cela faisait, mais ma tête a commencé à tourner. Pourriez-vous poster une explication?
Philipp
Je reçois Uncaught SyntaxError: Unexpected token newquand je colle dans ma console javascript
Ferrybig
1
@Ferrybig, remplace functionpar function*, il sera donc reconnu comme générateur.
guest-418
2

28 mots sans crochets, 234 octets

Mettre les noms d’identifiant comme noms de définition de méthode était trop évident ( pour moi du moins ), alors je cherchais la séquence la plus longue et distincte et consécutive de mots réservés et d'espaces dans un extrait de code.

J'espère que le code mort après un returnne compte pas comme une échappatoire, mais le code est toujours exécutable si les identifiants utilisés sont déclarés.

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

Cela exploite le fait que certains des futurs mots clés réservés ne sont considérés comme invalides qu'en mode strict de ES5.1 (apparemment, les moteurs ne se souciant pas de bloquer tous les mots réservés futurs de ES3, il y avait donc trop de code qui les utilisait sur le Web. )

De même, les jetons asyncet les awaitclés introduits dans ES8 ne sont considérés comme des mots-clés qu'en mode strict.

Bergi
la source
breakEt peut continueêtre là?
l4m2
Quand j'appelle la fonction, je comprends Uncaught SyntaxError: Undefined label 'implements', votre réponse nécessite-t-elle un runtime spécifique?
Nit
@Nit Oups, je ne l'ai pas vraiment appelé, j'ai seulement vérifié si c'était syntaxiquement autorisé (puis optimisé pour le prosaïcisme: D).
Bergi
@ l4m2 Oh, tu as raison, ils ne peuvent pas, mais c'est une erreur d'exécution, donc je n'ai pas remarqué :-( Besoin d'un peu de réorganisation arbitraire pour fonctionner (et d'un bloc portant l'étiquette).
Bergi
@ Bergi Sur Firefox, l'erreur de syntaxe est présente sur le
nœud de son nœud,