Ayrılmış JavaScript


41

ECMAScript'e 2015 tarihi itibariyle JavaScript vardır 33 ayrılmış anahtar gibi break, constve newyanı sıra 10 gelecekteki ayrılmış anahtar kelimeleri gibi, letve await.

Göreviniz, işlevsel JavaScript kodunu 3 yazarken art arda en fazla 1 farklı ayrılmış anahtar kelime 2'yi bir araya getirmektir .

  1. Ardışık ayrılmış anahtar kelimeler - yalnızca boşluk ve / veya parantezler ve / veya küme parantezleri ile ayrılan ayrılmış anahtar kelimeler.
  2. Ayrılmış anahtar kelimeler - ECMAScript 2015'ten itibaren ayrılmış veya gelecekteki ayrılmış anahtar kelimeler . Eski standartlardan ayrılmış anahtar kelimeler hariç tutulur, izin verilen anahtar kelimelerin tam listesi aşağıda verilmiştir.
  3. İşlevsel kod - kodunuz çalışmalı (gerekirse çalışma zamanınızı belirtmeli), sonunda durmalı ve çalışma zamanı hatalarını atmamalı.

Kodunuz belirli bir çalışma zamanına ihtiyaç duyuyorsa, kullanılmış ayrılmış anahtar kelimeler verilen ortamda kullanılmamalıdır.

Ayrılmış anahtar kelimelerin listesi

Puanlama ve örnekler

Puanınız, birbirini takip eden farklı ayrılmış anahtar kelimelerin sayısına eşit olacaktır.
Eşit puan durumunda, bayt cinsinden en kısa kaynak kodu kazanır. Yorum yapılan bölümler ve dizeler, ayrılmış anahtar kelimelere sayılmaz, bayt sayma sayılır.

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

Standart boşluklar uygulanır.


Sandbox tartışması , ilgilenenler için.
Nit

Anahtar kelimeler arasındaki parantezlere izin vermediyseniz, bunun daha ilginç olabileceğini düşünüyorum.
Buğday Sihirbazı,

Newline izin verilir mi?
l4m2

@ l4m2 Evet, bu boşluk.
Nit

1
@ l4m2 Aynı 43 puanlık çözüm yeni hatlar olmadan da mümkündür, bu yüzden belki de yapmaya çalıştığınız noktayı anlamıyorum.
Nit

Yanıtlar:


53

43 kelime, 603 bayt

Uhm, bu bir kaçamak mı? Bunun nasıl bir yasal JS olduğu hakkında hiçbir fikrim yok, ama işe yarıyor ve her bir anahtar kelimeyi kullanıyor.

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
Bu JS'ye aşina değil, ama ... bunlar aslında bu bağlamda kullanıldığında anahtar kelimeler mi , yoksa sadece anahtar kelimelerle aynı sözcüksel yapıya sahip ve tırnakları önlemek için şeker kullanıyorlar mı?
Leushenko

1
@Leushenko Muhtemelen ikincisi (JS'ye hiç de aşina olmamam da dahil), kullanıldıkları gibi işlev isimleri gibi görünüyorlar. Yine de normalde bu anahtar kelimeleri işlev veya sınıf adı olarak kullanmak mümkün olmamalıdır, ancak Siguza yine de parantez ve parantez kullanmanın zorluk kurallarına uyurken yine de yaptı. Diğer cevapların çoğu gerçekten anahtar kelimeler AS anahtar kelimelerini kullanmak için daha etkileyici görünse de, bu mücadeleyi söyleyeceğim tüm kelimelerle tamamlamak için iyi bir keşif . Yine de benden +1, kazananımız var gibi görünüyor.
Kevin Cruijssen

6
@ user202729 Neden olsa? Bu kadar basit yapılabildiğinde neden aşırı karmaşık bir şekilde bakıyorsunuz? Kod golfü genellikle mümkün olduğu kadar kısa bir şey yapar, ancak kişisel olarak hala okunabilirliği ve basitliği bir dereceye kadar uzatmayı tercih ediyorum (biliyorum, bunun kod golfü mücadelesi olmadığını biliyorum). Bazı örnekler: Ben kullanmayı tercih -1, i+1, i-1yukarıda ~0, -~i, ~-iben, bu daha net sırf kod golf ve çok aşina olmayanlar için okumaya zaman ~henüz. Tabii ki her zaman kullanacağım i+~jve i-~jo tek baytlık i-j-1ve golf oynamak i+j+1. ;)
Kevin Cruijssen

2
Evet, biraz daha ezebilirim ve baytın geri sayımını denemeye çalışabilirim ... bir başlangıç ​​gibi if(this)return void typeof function(){} else debuggergelmek zor değil, ama ondan sonra çirkin hızlı olur. Ama bazıları için - Ve evet, bu tamamen tanımlayıcılar anahtar kelimeleri döner sahip sırayla için (örneğin bunları kullanmak mümkün enum). Ben sadece aşırıya kaçtım, ama kod golf oynamaktan ibaret değil mi? : P
Siguza

1
@Micic No, bir sınıf yönteminin ismini vermek, basitçe, belirteçlere ayrılmış kelimeler olsalar bile özellik isimleri olarak muamele gören gramer bağlamıdır. Bu temelde, anlamsal olarak, obj["break"] = function (){}vb.
Aynıdır

53

37 kelime

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

Kullanılmayan anahtar kelimeler:

  • case gerektirir :
  • const gerektirir =
  • export sıkı mod gerektirir
  • import sıkı mod gerektirir
  • super gerektirir constructor


48
Örneğin hesaplamak için tipik Java boyler kodu gibi görünüyor 1 + 2.
Eric Duminil

2
@EricDuminil Bu _Java_ Script denilen gerçek nedeni budur.
wizzwizz4

5
@EricDuminil Bu kadar basit değil 1 + 2. Bu kodun tam değeri, yaşam, evren ve her şeyin nihai sorusunun cevabıdır. Bu karmaşık . :)
tsh

2
Bu sadece harika.
Pedro A

30

43 kelime, 302 299 bayt

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

Teorik alt sınır 277 (her iki sözcük bir bayt ile ayrılır)
l4m2

Güzel iş, şu anda sadece kaybediyorsun enum.
Nit

10

21 24 26 kelime, 185 bayt

+ 1 2 kelime Arnauld sayesinde ve 12Me21 +1!

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

Zorluğu anladığımı varsayarsak, bu 24 kelimeye puan veriyor. Parantez, parantez ve beyaz boşluk içermeyen kelimeler:

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 kelime, 177 bayt

"Doğru" ve "yanlış" olmadan, görünüşe göre soruya göre anahtar kelimeler değil.

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

Kelimeler:

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

(Yorum yapmak yerine
yorumumu

Ah evet. Bu kurala fazla dikkat etmedim.
Arnauld,

koyabilirsiniz case ... :veya default:sonunda (çünkü :anahtar kelimeler arasında izin verilmiyor)
12Me21

Ot for(let _;0;);+2 kelime ile sona erebilir (ancak caseartık kullanamazsınız ).
Arnauld,

switch({}){case{}:{}}=> switch({}){case{}:;}? ;Bazen gerekli olup olmadığını bilmiyorum
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
 }:
}

"super" ile "const" arasındaki kelimeler

Golf versiyonu:

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

Şimdi golf zamanı mı?
l4m2

Uncaught SyntaxError: Unexpected token deleteCevabınızı Google Chrome'daki Javascript konsolumda çalıştırmaya çalıştığımda alıyorum , Çözümünüzün geçerli olup olmadığını nasıl test edebilirim?
Ferrybig

@Ferrybig Firefox kullanıyorum ve iyi çalışıyor. Sistem nedeniyle Chrome yeni sürümünü yükleyemiyorum
l4m2

Firefox'ta bu hatayı alıyorumSyntaxError: yield expression is only valid in generators
TheChetan

Ff 52.7.2
l4m2

4

21 kelime

(emin değil letve 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;
}

, =ve ;ayırıcı olarak izin verilmez.
user202729

2
Onlar sayılmadığından
soktinpk

3

43 kelime, 300 bayt

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

Daha okunaklı:

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

Başa çıkmak için "ayrılmış kelimeyi yöntem adı olarak kullanmalıydım"

  • case(Zaten defaultbenim ile kullanmıştı beri swtich),
  • exportve import(modül kipi her zaman katı olduğundan diskalifiye olur with)
  • super(bir mülk erişimi tarafından takip edilmesi veya bir constructorfonksiyona yerleştirilmesi gerektiğinden ) ve
  • enum (hiç bir zaman kullanılamaz, dilbilgisi açısından geçerli bir kullanım olmadan ayrılmış bir kelime olarak)

Benim 39 çözüm super
şovum

3

14 15 16 Parantez veya satırsonu olmayan kelimeler

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

+1 için Bergi teşekkür ederiz


Bir jeneratör işlevi yapabilir ve a atabilir yieldmisiniz?
Bergi

Bunun ne olduğunu anlamaya çalıştım ama başım dönmeye başladı. Bir açıklama gönderir misiniz?
Philipp,

Uncaught SyntaxError: Unexpected token newJavascript konsolumun içine yapıştırdığımda alıyorum
Ferrybig

1
@Ferrybig yerini functionile function*bir jeneratör olarak kabul edilecektir, böylece.
guest-418

2

Parantezsiz 28 Kelime, 234 Bayt

Tanımlayıcı adlarını yöntem tanımı adları olarak koymak çok açıktı ( en azından benim için ), bu yüzden kod snippet'inde en uzun ardışık ayrılmış ayrılmış sözcük ve boşluk dizisini arıyordum.

Umarım sonra ölü kod returnbir boşluk olarak sayılmaz, ancak kullanılan tanımlayıcılar bildirilirse kod hala çalıştırılabilir durumdadır.

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

Bu, gelecekteki ayrılmış anahtar kelimelerin bazılarının yalnızca ES5.1’in katı modunda geçersiz sayıldığı gerçeğinden yararlanır (görünüşe göre motorlar , ES3’ün gelecekteki tüm ayrılmış kelimelerini engellemek için zahmete girmediğinden , web’de bunları kullanarak çok fazla kod kullanıldı. ).

Benzer şekilde, ES8'de sunulan asyncve awaitbelirteçleri yalnızca katı modda anahtar kelimeler olarak kabul edilir.


Can breakve continueorada?
l4m2

Fonksiyonu çağırdığımda, Uncaught SyntaxError: Undefined label 'implements'cevabınız belirli bir çalışma zamanı gerektiriyor mu?
Nit

@ Hayır, aslında aramadım, yalnızca sözdizimsel olarak izin verilip verilmediğini kontrol ettim (ve sonra optimize edilmiş prosaicism: D).
Bergi

@ l4m2 Oh, haklısın, yapamazlar ama bu bir çalışma zamanı hatasıydı, bu yüzden fark etmedim :-( Çalışmak için keyfi bir şekilde yeniden düzenlemeye ihtiyaç duydum (ve etiketli bir blok).
Bergi

@Bergi Firefox'ta bu çalışma zamanı tio nodejs üzerinde sözdizimi hatası
l4m2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.