Zarezerwowany JavaScript

41

Począwszy od 2015 ECMAScript, JavaScript posiada 33 zarezerwowanych słów kluczowych , takich jak break, consti new, jak również 10 przyszłych zastrzeżone słowa kluczowe , jak leti await.

Twoim zadaniem jest zebranie największej liczby następujących po sobie 1 odrębnych zastrzeżonych słów kluczowych 2 podczas pisania funkcjonalnego kodu JavaScript 3 .

  1. Kolejne zastrzeżone słowa kluczowe - zastrzeżone słowa kluczowe, które są oddzielone tylko białymi spacjami i / lub nawiasami i / lub nawiasami klamrowymi.
  2. Zastrzeżone słowa kluczowe - wszelkie zastrzeżone lub przyszłe zastrzeżone słowa kluczowe według ECMAScript 2015 . Zastrzeżone słowa kluczowe ze starszych standardów są wykluczone, pełna lista dozwolonych słów kluczowych znajduje się poniżej.
  3. Kod funkcjonalny - twój kod powinien się uruchomić (w razie potrzeby podaj swój środowisko uruchomieniowe), ostatecznie się zatrzymaj i nie generuj żadnych błędów środowiska uruchomieniowego.

Jeśli kod wymaga określonego środowiska wykonawczego, użyte zastrzeżone słowa kluczowe nie mogą być blokadami w danym środowisku.

Lista zastrzeżonych słów kluczowych

Punktacja i przykłady

Twój wynik będzie równy największej liczbie kolejnych odrębnych zarezerwowanych słów kluczowych.
W przypadku równych wyników wygrywa najkrótszy kod źródłowy w bajtach. Komentowane sekcje i ciągi znaków nie liczą się do zarezerwowanych słów kluczowych, ale liczą się do liczby bajtów.

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

Obowiązują standardowe luki .

Gnida
źródło
Dyskusja w piaskownicy dla zainteresowanych.
Nit
Wydaje mi się, że może to być bardziej interesujące, jeśli nie zezwolisz na nawiasy między słowami kluczowymi.
Kreator pszenicy,
Czy nowa linia jest dozwolona?
l4m2
@ l4m2 Tak, to białe znaki.
Nit
1
@ l4m2 To samo 43-punktowe rozwiązanie jest również możliwe bez nowej linii, więc może po prostu nie rozumiem punktu, który próbujesz zrobić?
Nit

Odpowiedzi:

53

43 słowa, 603 bajty

Uhm, czy to jest luka? Nie mam pojęcia, jak, u diabła, jest to legalne JS, ale działa i używa każdego słowa kluczowego.

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
źródło
3
Nie tak dobrze zaznajomiony z JS, ale ... czy w rzeczywistości są to słowa kluczowe użyte w tym kontekście, czy tylko ciągi, które mają taką samą strukturę leksykalną jak słowa kluczowe i używają cukru, aby uniknąć cudzysłowów?
Leushenko
1
@Leushenko Prawdopodobnie drugi (chociaż ja też nie jestem zbyt zaznajomiony z JS), ponieważ wyglądają jak nazwy funkcji w sposobie, w jaki są używane. Nadal normalnie nie powinno być możliwe użycie tych słów kluczowych jako nazw funkcji lub klas, ale Siguza nadal to robiła, wciąż przestrzegając reguł wyzwania, używając tylko nawiasów i nawiasów. Przyjemne znalezisko, aby ukończyć to wyzwanie wszystkimi słowami, które powiedziałbym, mimo że większość innych odpowiedzi wygląda bardziej imponująco na faktyczne użycie słów kluczowych jako słów kluczowych . Nadal +1 ode mnie, wygląda na to, że mamy zwycięzcę.
Kevin Cruijssen
6
@ user202729 Dlaczego jednak? Po co sprawić, by wyglądał zbyt skomplikowanie, skoro można to zrobić tak prosto? Gra w golfa kodowego zazwyczaj robi coś tak krótkiego, jak to możliwe, ale osobiście nadal wolę zachować czytelność i prostotę do pewnego stopnia (wiem, wiem, to nie jest wyzwanie do gry w golfa kodowego). Kilka przykładów: Wolę używać -1, i+1, i-1powyżej ~0, -~i, ~-ikiedy mogę, po prostu dlatego, że jest bardziej przejrzyste czytelne dla tych, którzy nie są zbyt zaznajomieni z kodem-golfa i ~jeszcze. Chociaż oczywiście zawsze będę używał i+~ji i-~jgrał w ten pojedynczy bajt i-j-1i i+j+1. ;)
Kevin Cruijssen
2
Tak, mógłbym to zacielić dalej i spróbować odliczyć bajt ... taki początek if(this)return void typeof function(){} else debuggernie jest trudny do wymyślenia, ale potem robi się brzydko szybko. I tak, to całkowicie zamienia słowa kluczowe w identyfikatory - ale w przypadku niektórych z nich musisz to zrobić, aby móc z nich korzystać (np enum.). Po prostu doszedłem do skrajności, ale czy nie o to chodzi w golfie? : P
Siguza,
1
@Magic Nie, podanie nazwy metody klasy jest po prostu gramatycznym kontekstem, w którym dosłowne tokeny są traktowane jak nazwy właściwości, nawet jeśli są słowami zastrzeżonymi. Jest to zasadniczo to samo, semantycznie, jak robienie obj["break"] = function (){}itp.
apsillers
53

37 słów

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

Nieużywane słowa kluczowe:

  • case wymaga :
  • const wymaga =
  • export wymaga trybu ścisłego
  • import wymaga trybu ścisłego
  • super wymaga constructor
tsh
źródło
7
Przyznaję, że się roześmiałem
nik.
48
Wygląda jak typowy kod Javy, np. Do obliczeń 1 + 2.
Eric Duminil,
2
@EricDuminil To jest prawdziwy powód, dla którego nazywa się _Java_ Script.
wizzwizz4,
5
@EricDuminil Nie jest to takie proste jak 1 + 2. Pełna wartość tego kodu jest odpowiedzią na ostateczne pytanie dotyczące życia, wszechświata i wszystkiego. To skomplikowane . :)
tsh
2
To jest po prostu cudowne.
Pedro A
30

43 słowa, 302 299 bajtów

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
źródło
Teoretyczne dolne ograniczenie 277 (każde dwa słowa oddzielone jednym bajtem)
l4m2
Dobra robota, obecnie brakuje enum.
Nit
10

21 24 26 słów, 185 bajtów

+ 1 2 słowa dzięki Arnauldowi i +1 do 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{}:{}}

Zakładając, że zrozumiałem wyzwanie, otrzymuję 24 słowa. Słowa bez nawiasów, nawiasów i białych znaków:

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 słowa, 177 bajtów

Bez „prawda” i „fałsz”, które według pytania nie są słowami kluczowymi.

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

Słowa:

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
źródło
(Przypadkowo usunąłem mój komentarz zamiast go edytować, treść
brzmiała
O tak. Nie zwracałem uwagi na tę zasadę.
Arnauld
możesz umieścić case ... :lub default:na końcu (ponieważ :nie jest dozwolone między słowami kluczowymi)
maja 21
Ot możesz kończyć for(let _;0;);+2 słowami (ale nie możesz casejuż ich używać ).
Arnauld
switch({}){case{}:{}}=> switch({}){case{}:;}? Nie wiem, czy ;czasem jest to konieczne
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
 }:
}

słowa od „super” do „const”

Wersja golfowa:

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
źródło
Czy teraz czas na golfa?
l4m2
Dostaję się, Uncaught SyntaxError: Unexpected token deletegdy próbuję uruchomić twoją odpowiedź w mojej konsoli Javascript w Google Chrome. Jak mogę sprawdzić, czy twoje rozwiązanie jest prawidłowe?
Ferrybig,
@ Ferrybig Używam Firefox i działa dobrze. Nie mogę zainstalować nowej wersji Chrome z powodu systemu
l4m2
Ten błąd SyntaxError: yield expression is only valid in generators
pojawia się
Używam ff 52.7.2
l4m2
4

21 słów

(nie jestem pewien leti 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
źródło
, =i ;nie są dozwolone jako separatory.
user202729,
2
Nie są liczone
soktinpk
3

43 słowa, 300 bajtów

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

Bardziej czytelnie:

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

Musiałem użyć „słowa zarezerwowanego jako nazwy metody”, aby sobie z tym poradzić

  • case(ponieważ już użyłem defaultz moim swtich),
  • exportoraz import(ponieważ tryb modułu jest zawsze ścisły, co dyskwalifikuje with)
  • super(ponieważ musi nastąpić dostęp do właściwości lub umieszczenie w constructorfunkcji), oraz
  • enum (który nigdy nie może być użyty, ponieważ jest słowem zastrzeżonym bez użycia poprawnego gramatycznie)
apsillery
źródło
Moje 39 pokazów rozwiązań supermoże pojawić się na początku, nie będąc nazwiskiem, ale zbyt drogo
l4m2
3

14 15 16 Słowa bez nawiasów ani nowej linii

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

Dziękujemy Bergi za +1

l4m2
źródło
Czy potrafisz ustawić funkcję generatora i wrzucić yield?
Bergi,
Próbowałem dowiedzieć się, co to robi, ale moja głowa zaczęła się kręcić. Czy możesz opublikować wyjaśnienie?
Philipp
Dostaję się, Uncaught SyntaxError: Unexpected token newgdy
wklejam do
1
@Ferrybig wymienić functionz function*, więc zostanie ona rozpoznana jako generator.
guest-418,
2

28 słów bez nawiasów, 234 bajtów

Umieszczenie nazw identyfikatorów jako nazw definicji metod było zbyt oczywiste ( przynajmniej dla mnie ), więc szukałem najdłuższej z kolei wyraźnej sekwencji zarezerwowanych słów i białych znaków we fragmencie kodu.

Mam nadzieję, że martwy kod po a returnnie liczy się jako luka, ale kod nadal jest uruchamialny, jeśli użyte identyfikatory zostaną zadeklarowane.

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

Wykorzystuje to fakt, że niektóre przyszłe zastrzeżone słowa kluczowe są uważane za niepoprawne tylko w trybie ścisłym ES5.1 (najwyraźniej dlatego, że silniki nie zadały sobie trudu, aby zablokować wszystkie przyszłe zastrzeżone słowa ES3, więc za dużo kodu używało ich tam w Internecie ).

Podobnie tokeny asynci awaitwprowadzone w ES8 są uważane za słowa kluczowe tylko w trybie ścisłym.

Bergi
źródło
Czy breaki continuemoże tam być?
l4m2
Kiedy wywołuję funkcję, rozumiem Uncaught SyntaxError: Undefined label 'implements', czy twoja odpowiedź wymaga określonego czasu działania?
Nit
@Nit Oops, właściwie go nie nazwałem, sprawdziłem tylko, czy jest to dozwolone składniowo (a potem zoptymalizowany prozaizm: D).
Bergi,
@ l4m2 Och, masz rację, nie mogą, ale to błąd w czasie wykonywania, więc nie zauważyłem :-( Potrzebowałem trochę arbitralnej zmiany kolejności do pracy (i bloku z etykietą).
Bergi
@Bergi W przeglądarce Firefox występuje błąd składniowy w tio nodejs to czas działania
l4m2