JavaScript riservato


41

A partire da ECMAScript 2015, JavaScript ha 33 parole chiave riservate , come break, conste new, nonché 10 parole chiave riservate future , come lete await.

Il tuo compito è quello di concatenare il maggior numero di consecutive 1 distinti parole chiave riservate 2 durante la scrittura di codice funzionale JavaScript 3 .

  1. Parole chiave riservate consecutive: parole chiave riservate separate solo da spazi bianchi e / o parentesi e / o parentesi graffe.
  2. Parole chiave riservate - tutte le parole chiave riservate o future riservate a partire da ECMAScript 2015 . Le parole chiave riservate da standard precedenti sono escluse, di seguito è riportato un elenco completo delle parole chiave consentite.
  3. Codice funzionale: il codice deve essere eseguito (indicare il runtime, se necessario), eventualmente arrestarsi e non generare errori di runtime.

Se il codice richiede un runtime specifico, le parole chiave riservate utilizzate non devono essere vietate in un determinato ambiente.

Elenco di parole chiave riservate

Punteggio ed esempi

Il tuo punteggio sarà uguale al maggior numero di parole chiave riservate distinte consecutive.
Nel caso di punteggi uguali, vince il codice sorgente più breve in byte. Le sezioni e le stringhe commentate non contano per le parole chiave riservate, ma contano per il conteggio dei byte.

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

Si applicano scappatoie standard .


Discussione su sandbox , per coloro che sono interessati.
Nit

Penso che questo potrebbe essere più interessante se non si consentissero le parentesi tra le parole chiave.
Wheat Wizard

Newline è consentito?
l4m2

@ l4m2 Sì, è spazio bianco.
Nit

1
@ l4m2 La stessa soluzione a 43 punti è possibile anche senza newline, quindi forse semplicemente non capisco il punto che stai cercando di fare?
Nit

Risposte:


53

43 parole, 603 byte

Uhm, è una scappatoia? Non ho idea di come diavolo sia legale JS, ma funziona e usa ogni singola parola chiave.

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
Non hai familiarità con JS, ma ... queste sono in realtà parole chiave se usate in questo contesto, o solo stringhe che hanno la stessa struttura lessicale delle parole chiave e usano lo zucchero per evitare le virgolette?
Leushenko,

1
@Leushenko Probabilmente il secondo (anche se non ho affatto familiarità con JS), in quanto sembrano nomi di funzioni nel modo in cui vengono utilizzati. Tuttavia, normalmente non dovrebbe essere possibile usare queste parole chiave come funzioni o nomi di classi, ma Siguza lo ha ancora fatto, pur rispettando le regole di sfida di usare solo parentesi e parentesi. Un bello trovare per completare questa sfida con tutte le parole direi, anche se la maggior parte delle altre risposte aspetto più impressionante per la realtà utilizzando le parole chiave AS parole chiave . Ancora +1 da parte mia, sembra che abbiamo un vincitore.
Kevin Cruijssen,

6
@ user202729 Perché però? Perché renderlo eccessivamente complesso quando può essere fatto così semplice? Il code-golf di solito sta facendo qualcosa il più breve possibile, ma personalmente preferisco ancora mantenere la leggibilità e la semplicità in qualche misura (lo so, lo so, questa non è una sfida di code-golf). Alcuni esempi: io preferisco usare -1, i+1, i-1sopra ~0, -~i, ~-iquando posso, solo perché è più chiaro da leggere per coloro che non sono troppo familiarità con il codice-golf e ~ancora. Anche se ovviamente userò sempre i+~je i-~jgolf quel singolo byte di i-j-1e i+j+1. ;)
Kevin Cruijssen il

2
Sì, potrei schiacciarlo ulteriormente e provare a ridurre il conto in byte ... un inizio come if(this)return void typeof function(){} else debuggernon è difficile da inventare, ma dopo diventa brutto in fretta. E sì, questo trasforma totalmente le parole chiave in identificatori, ma per alcuni di essi è necessario per poterle utilizzare (ad es enum.). L'ho portato all'estremo, ma non è questo il golf del codice? : P
Siguza,

1
@Magic No, fornire il nome di un metodo di classe è semplicemente un contesto grammaticale in cui i token letterali vengono trattati come nomi di proprietà, anche se sono parole riservate. Questo è fondamentalmente lo stesso, semanticamente, come fare obj["break"] = function (){}ecc.
apsillers

53

37 parole

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

Parole chiave non utilizzate:

  • case richiede :
  • const richiede =
  • export richiede una modalità rigorosa
  • import richiede una modalità rigorosa
  • super richiede constructor

7
Ammetto di aver riso
nicael il

48
Sembra il tipico codice del boilerplate Java, ad esempio per calcolare 1 + 2.
Eric Duminil,

2
@EricDuminil Questa è la vera ragione per cui si chiama _Java_ Script.
wizzwizz4,

5
@EricDuminil Non è abbastanza semplice 1 + 2. Il valore completo di questo codice è la risposta all'ultima domanda della vita, dell'universo e di tutto. È complesso . :)
TSH

2
Questo è semplicemente meraviglioso.
Pedro A

30

43 parole, 302 299 byte

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

Teorico in basso 277 (ogni due parole separate da un byte)
l4m2

Bel lavoro, al momento ti manca solo enum.
Nit

10

21 24 26 parole, 185 byte

+ 1 2 parole grazie ad Arnauld e da +1 a 12 Me21!

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

Supponendo di aver compreso la sfida, questo segna 24 parole. Le parole senza parentesi, parentesi e spazi bianchi:

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 parole, 177 byte

Senza "vero" e "falso", che apparentemente non sono parole chiave secondo la domanda.

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

Parole:

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

(Ho eliminato per errore il mio commento invece di modificarlo, il contenuto era: "puoi usare delete {} al posto di vero / falso, pensa (e non restituisci nulla")
Mee

Ah sì. Non ho prestato molta attenzione a quella regola.
Arnauld

puoi inserire case ... :o default:alla fine (poiché :non è consentito tra le parole chiave)
12Me21

Puoi terminare con for(let _;0;);+2 parole (ma non puoi casepiù usarle ).
Arnauld

switch({}){case{}:{}}=> switch({}){case{}:;}? Non so se a ;volte è necessario
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
 }:
}

parole da "super" a "const"

Versione golfizzata:

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

Ora è tempo di giocare a golf?
l4m2

Ricevo Uncaught SyntaxError: Unexpected token deletequando provo ad eseguire la tua risposta nella mia console Javascript su Google Chrome, come posso verificare se la tua soluzione è valida?
Ferrybig

@Ferrybig Uso Firefox e funziona benissimo. Impossibile installare la nuova versione di Chrome a causa del sistema
l4m2

Ottengo questo errore in FirefoxSyntaxError: yield expression is only valid in generators
TheChetan

Uso ff 52.7.2
l4m2

4

21 parole

(non sono sicuro di lete 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;
}

, =e ;non sono ammessi come separatori.
user202729

2
Non vengono conteggiati
soktinpk,

3

43 parole, 300 byte

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

Più facilmente:

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

Ho dovuto usare la "parola riservata come nome del metodo" per gestire

  • case(dal momento che avevo già usato defaultcon il mio swtich),
  • exporte import(poiché la modalità modulo è sempre rigorosa, il che squalifica with)
  • super(poiché deve essere seguito da un accesso alla proprietà o inserito in una constructorfunzione), e
  • enum (che non può mai essere usato affatto, essendo una parola riservata senza un uso grammaticalmente valido)

I miei 39 spettacoli di soluzioni superpossono apparire all'inizio senza essere un nome, ma troppo costosi
l4m2

3

14 15 16 Parole senza parentesi o nuova riga

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

Grazie a Bergi per +1


Puoi renderlo una funzione generatore e lanciare un yield?
Bergi,

Ho provato a capire cosa fa, ma la mia testa ha iniziato a girare. Potresti pubblicare una spiegazione?
Philipp

Ricevo Uncaught SyntaxError: Unexpected token newquando incollo nella mia console javascript
Ferrybig

1
@Ferrybig, sostituiscilo functioncon function*, quindi verrà riconosciuto come generatore.
ospite-418

2

28 parole senza parentesi, 234 byte

Inserire nomi identificativi come nomi di definizione del metodo era troppo ovvio ( almeno per me ), quindi stavo cercando la sequenza distinta consecutiva più lunga di parole riservate e spazi bianchi in uno snippet di codice.

Spero che il codice morto dopo a returnnon valga come una scappatoia, ma il codice è ancora eseguibile se vengono dichiarati gli identificativi utilizzati.

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

Questo sfrutta il fatto che alcune delle future parole chiave riservate sono considerate non valide solo nella modalità rigorosa di ES5.1 (apparentemente perché i motori non si sono preoccupati di bloccare tutte le future parole riservate di ES3, quindi c'era troppo codice che le usava là fuori sul web ).

Allo stesso modo, i token asynce awaitintrodotti in ES8 sono considerati parole chiave solo in modalità rigorosa.


Può breaked continueessere lì?
l4m2

Quando chiamo la funzione, ricevo Uncaught SyntaxError: Undefined label 'implements', la tua risposta richiede un tempo di esecuzione specifico?
Nit

@Nit Oops, in realtà non l'ho chiamato, ho solo verificato se è sintatticamente consentito (e quindi ottimizzato il prosaicismo: D).
Bergi,

@ l4m2 Oh, hai ragione, non possono ma è un errore di runtime quindi non me ne sono accorto :-( Per funzionare (e un blocco con l'etichetta) avevo bisogno di un po 'di riordino arbitrario.
Bergi

@Bergi Su Firefox è errore di sintassi su tio nodejs è runtime
l4m2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.