JavaScript yang Dilindungi

41

Pada ECMAScript 2015, JavaScript memiliki 33 kata kunci yang dipesan , seperti break, constdan new, serta 10 kata kunci yang disimpan di masa mendatang , seperti letdan await.

Tugas Anda adalah untuk menyatukan jumlah terbesar dari 1 kata kunci khusus 2 berturut-turut yang berbeda saat menulis kode JavaScript fungsional 3 .

  1. Kata kunci yang dipesan secara berurutan - kata kunci yang dipesan hanya dipisahkan oleh spasi putih dan / atau tanda kurung dan / atau kurung kurawal.
  2. Kata kunci yang dicadangkan - kata kunci yang dicadangkan atau dicadangkan di masa mendatang pada ECMAScript 2015 . Kata kunci yang dilindungi undang-undang dari standar yang lebih lama dikecualikan, daftar lengkap kata kunci yang diizinkan diberikan di bawah ini.
  3. Kode fungsional - kode Anda harus dijalankan (nyatakan runtime Anda, jika perlu), akhirnya berhenti, dan tidak menimbulkan kesalahan runtime.

Jika kode Anda memerlukan runtime tertentu, kata kunci yang digunakan tidak boleh kosong di lingkungan yang diberikan.

Daftar kata kunci yang dipesan

Penilaian & contoh

Skor Anda akan sama dengan jumlah terbesar kata kunci khusus yang dipesan berturut-turut.
Dalam kasus skor yang sama, kode sumber terpendek dalam byte menang. Bagian dan string yang dikomentari tidak diperhitungkan dalam kata kunci yang dipesan, tetapi dihitung terhadap jumlah 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;

Celah standar berlaku.

Nit
sumber
Diskusi sandbox , bagi yang berminat.
Nit
Saya merasa ini mungkin lebih menarik jika Anda tidak mengizinkan tanda kurung di antara kata kunci.
Wheat Wizard
Apakah baris baru diizinkan?
l4m2
@ l4m2 Ya, ini ruang kosong.
Nit
1
@ l4m2 Solusi 43-point yang sama dimungkinkan tanpa baris baru jadi mungkin saya tidak mengerti poin yang Anda coba buat?
Nit

Jawaban:

53

43 kata, 603 byte

Uhm, apakah ini celah? Saya tidak tahu bagaimana ini JS legal, tetapi berfungsi dan menggunakan setiap kata kunci.

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
sumber
3
Tidak begitu familiar dengan JS, tapi ... apakah ini sebenarnya kata kunci ketika digunakan dalam konteks ini, atau hanya string yang memiliki struktur leksikal yang sama dengan kata kunci dan menggunakan gula untuk menghindari tanda kutip?
Leushenko
1
@Leushenko Mungkin yang kedua (meskipun saya juga tidak terlalu akrab dengan JS sama sekali), karena mereka terlihat seperti nama fungsi dalam cara mereka digunakan. Meski begitu, biasanya tidak mungkin menggunakan kata kunci ini sebagai fungsi atau nama kelas, tetapi Siguza masih melakukannya, sambil tetap mematuhi aturan tantangan hanya menggunakan tanda kurung dan tanda kurung. Temuan yang bagus untuk menyelesaikan tantangan ini dengan semua kata yang saya ucapkan, meskipun sebagian besar jawaban lain terlihat lebih mengesankan untuk benar-benar menggunakan kata kunci AS kata kunci . Masih memberi +1 dari saya, sepertinya kami memiliki pemenang.
Kevin Cruijssen
6
@ user202729 Mengapa? Mengapa membuatnya terlihat terlalu rumit ketika bisa dilakukan dengan begitu sederhana? Code-golfing biasanya melakukan sesuatu sesingkat mungkin, tetapi saya pribadi masih lebih suka menjaga keterbacaan dan kesederhanaan sampai batas tertentu (saya tahu, saya tahu, ini bukan tantangan code-golfing). Beberapa contoh: Saya lebih suka menggunakan -1, i+1, i-1di atas ~0, -~i, ~-iketika saya bisa, hanya karena itu lebih jelas untuk membaca bagi mereka yang tidak terlalu akrab dengan kode-golf dan ~belum. Meskipun saya tentu saja akan selalu menggunakan i+~jdan i-~juntuk golf yang byte tunggal i-j-1dan i+j+1. ;)
Kevin Cruijssen
2
Ya, saya bisa menumbuknya lebih jauh, dan mencoba untuk menghitung byte mundur ... permulaan seperti if(this)return void typeof function(){} else debuggertidak sulit untuk dibuat, tapi setelah itu semakin cepat jelek. Dan ya, ini benar-benar mengubah kata kunci menjadi pengidentifikasi - tetapi bagi sebagian dari mereka Anda harus menggunakannya untuk dapat menggunakannya (misalnya enum). Saya hanya membawanya ke ekstrem, tetapi bukankah itu tentang golf code? : P
Siguza
1
@Magic Tidak, menyediakan nama metode-kelas hanyalah konteks gramatikal di mana token literal diperlakukan sebagai nama properti, bahkan jika itu adalah kata-kata yang dicadangkan. Ini pada dasarnya sama, semantik, seperti melakukan obj["break"] = function (){}dll.
apsillers
53

37 kata

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

Kata kunci tidak digunakan:

  • case membutuhkan :
  • const membutuhkan =
  • export membutuhkan mode ketat
  • import membutuhkan mode ketat
  • super membutuhkan constructor
tsh
sumber
7
Saya akui saya tertawa
nicael
48
Sepertinya kode Java boilerplate biasa, misalnya untuk menghitung 1 + 2.
Eric Duminil
2
@EricDuminil Ini adalah alasan sebenarnya yang disebut _Java_ Script.
wizzwizz4
5
@EricDuminil Itu tidak sesederhana itu 1 + 2. Nilai lengkap dari kode ini adalah jawaban untuk pertanyaan utama tentang kehidupan, alam semesta dan segalanya. Itu rumit . :)
tsh
2
Ini luar biasa.
Pedro A
30

43 kata, 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:}
l4m2
sumber
Teoritis lowerbound 277 (masing-masing dua kata dipisahkan oleh satu byte)
l4m2
Kerja bagus, saat ini Anda hanya hilang enum.
Nit
10

21 24 26 kata, 185 byte

+1 1 kata berkat Arnauld, dan +1 hingga 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{}:{}}

Dengan asumsi saya mengerti tantangannya, skor ini 24 kata. Kata-kata tanpa tanda kurung, tanda kurung, dan spasi putih:

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

Tanpa "benar" dan "salah", yang tampaknya bukan kata kunci sesuai dengan pertanyaan.

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

Kata-kata:

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
sumber
(Saya tidak sengaja menghapus komentar saya alih-alih mengeditnya, isinya adalah: "Anda dapat menggunakan delete {} sebagai ganti true / false, think (dan tidak mengembalikan apa-apa")
12Me21
Ah iya. Saya tidak terlalu memperhatikan aturan itu.
Arnauld
Anda dapat menempatkan case ... :atau default:di bagian akhir (karena :tidak diizinkan di antara kata kunci)
12Me21
Atau Anda dapat mengakhiri dengan for(let _;0;);+2 kata (tetapi Anda tidak dapat menggunakan caselagi).
Arnauld
switch({}){case{}:{}}=> switch({}){case{}:;}? Tidak tahu jika ;kadang-kadang diperlukan
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
 }:
}

kata-kata dari "super" ke "const"

Versi golf:

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
sumber
Apakah sekarang waktunya bermain golf?
l4m2
Saya mengerti Uncaught SyntaxError: Unexpected token deleteketika saya mencoba menjalankan jawaban Anda di konsol Javascript saya di Google Chrome, Bagaimana saya bisa menguji apakah solusi Anda valid?
Ferrybig
@ Frankbig Saya menggunakan Firefox dan berfungsi dengan baik. Saya tidak dapat menginstal Chrome versi baru karena sistem
l4m2
Saya mendapatkan kesalahan ini di FirefoxSyntaxError: yield expression is only valid in generators
TheChetan
Saya menggunakan ff 52.7.2
l4m2
4

21 kata

(tidak yakin tentang letdan 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
sumber
, =dan ;tidak diizinkan sebagai pemisah.
user202729
2
Mereka tidak dihitung
soktinpk
3

43 kata, 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}}

Lebih mudah dibaca:

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

Saya harus menggunakan "kata yang dicadangkan sebagai nama metode" untuk menangani

  • case(Karena saya sudah menggunakan defaultdengan saya swtich),
  • exportdan import(karena modul-mode selalu ketat, yang mendiskualifikasi with)
  • super(karena itu harus diikuti oleh akses properti atau ditempatkan dalam suatu constructorfungsi), dan
  • enum (yang tidak pernah bisa digunakan sama sekali, menjadi kata yang dilindungi tanpa penggunaan tata bahasa yang valid)
apsillers
sumber
Solusi 39 show saya superdapat muncul di awal tanpa nama, tapi terlalu mahal
l4m2
3

14 15 16 Kata tanpa tanda kurung atau baris baru

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

Terima kasih Bergi untuk +1

l4m2
sumber
Bisakah Anda menjadikannya fungsi generator dan melempar yield?
Bergi
Saya mencoba mencari tahu apa yang dilakukannya, tetapi kepala saya mulai berputar. Bisakah Anda memposting penjelasan?
Philipp
Saya mendapatkan Uncaught SyntaxError: Unexpected token newketika saya tempel di dalam konsol javascript saya
Ferrybig
1
@Ferrybig, ganti functiondengan function*, sehingga akan dikenali sebagai generator.
tamu-418
2

28 Kata tanpa tanda kurung, 234 Bytes

Menempatkan nama pengenal sebagai nama definisi metode terlalu jelas ( bagi saya setidaknya ), jadi saya mencari urutan berbeda terpanjang berturut-turut dari kata-kata yang disediakan dan spasi putih dalam potongan kode.

Saya harap kode mati setelah a returntidak dihitung sebagai celah, tetapi kode tersebut masih dapat dijalankan jika pengidentifikasi yang digunakan dinyatakan.

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

Ini mengeksploitasi fakta bahwa beberapa kata kunci cadangan masa depan hanya dianggap tidak valid dalam mode ketat ES5.1 (tampaknya karena mesin tidak repot-repot untuk memblokir semua kata-kata ES3 masa depan yang dilindungi sehingga ada terlalu banyak kode menggunakan mereka di luar sana di web ).

Demikian pula, token asyncdan yang awaitdiperkenalkan di ES8 hanya dianggap sebagai kata kunci dalam mode ketat.

Bergi
sumber
Bisakah breakdan continueada di sana?
l4m2
Ketika saya memanggil fungsi, saya mengerti Uncaught SyntaxError: Undefined label 'implements', apakah jawaban Anda memerlukan runtime tertentu?
Nit
@Nit Ups, saya tidak benar-benar menyebutnya, saya hanya memeriksa apakah secara sintaksis diizinkan (dan kemudian dioptimalkan prosaisisme: D).
Bergi
@ l4m2 Oh, Anda benar, mereka tidak bisa tetapi itu adalah kesalahan runtime jadi saya tidak melihat :-( Diperlukan sedikit pemesanan ulang sewenang-wenang untuk bekerja (dan satu blok dengan label).
Bergi
@Bergi Di Firefox itu kesalahan sintaksis pada tio nodejs itu runtime
l4m2