Codegolf nesnesi


14

Bunu hayal edin, sadece tek bir nesne içeren küresel bir kapsama sahip bir ortamımız var codegolf. Bu nesnenin, stackexchangeadlı bir özelliği olan tek bir alt öğesi var com.
Bu mülke erişmek şöyle görünecektir codegolf.stackexchange.com.

Meydan okuma

Programınızın / fonksiyonunuzun girdisi, global kapsamdaki bir özelliğe erişmeye çalışan bir dize olacaktır. Bu özellik bulunduğunda, gerçek bir değer yazdırır / döndürürsünüz. Mülk bulunamazsa, bir sahte değer yazdırılır / iade edilir. Yakalama: var olmayan bir nesnede bir özelliğe erişmeye çalıştığınızda, programınız her türlü hatayı atmalıdır¹.

İşleri biraz kolaylaştırmak için, girdinin her zaman olacağını [a-z.], asla boş olmayacağını, asla tekrarlamayacağını .ve asla a ile başlamayacağını veya bitmeyeceğini varsayabilirsiniz .. Bu codegolf.geçersiz bir giriş.

Test senaryoları

codegolf.stackexchange.com => 1 // or any other truthy value
codegolf.stackexchange.net => 0 // or any other falsy value
codegolf.stackexchange => 1
codegolf.foo => 0
codegolf => 1
foo => 0
codegolf.com => 0
codegolf.constructor => 0

codegolf.foo.bar => Error (since foo is undefined)
codegolf.stackexchange.com.foo => Error (since com is a value, not an object)
codegolf.stackexchange.com.foo.bar => Error
foo.stackexchange.com => Error
foo.bar => Error
foo.bar.baz => Error

Bu , bayt kazanımında en kısa kod kazanıyor

¹ if (ve ancak) seçtiğiniz dil hataları desteklemez hiç yapmanız gerekir bunun bir hata olduğunu temizlemek yapar çıktı üretir. Örneğin, doğruluk için 1 ve yanlış için 0 kullanırsanız, hata için "e" kullanabilirsiniz. Dönüş değerlerinizde tutarlı olun ve yayınınızdaki davranışı açıklayın.


1
foo => ErrorDaha uygun olacağını hissediyorum .
Sihirli Ahtapot Urn

tip kontrollerini codegolf.comekarte etmek için test codegolf(.stackexchange)?(.com)?$
senaryolarına

Başka bir eksik test örneği:foo.stackexchange.com
Jamie

@carusocomputing Hayır. JavaScript'i düşünün. foodönecekti undefinedama bir hata atmayacaktı. tanımlanmadığı foo.bariçin hata verir foo.
mbomb007

1
@carusocomputing Doğru, ancak her iki şekilde de mantıklı olduğunda "daha uygun" olduğunu söyleyemezsiniz. codegolf.foo => 0, öyle foo => 0.
mbomb007

Yanıtlar:


8

JavaScript, 135 bayt

v=>(c=(p,i)=>new Proxy({}, {get:(o,q)=>(r=q==p[i]?c(p,i+1):o.$,i==3?r||z:r)}),x=c(["codegolf","stackexchange","com"],0),!!eval("x."+v))

Yerleşik anahtarların erişilebilir olmasını önlemek için ilk girişim yeniden düzenlendi, bu noktada farklı bir yaklaşım kullanmak daha iyi olacak, ama hey!

Geçerli için true, eksik için false ve hata durumunda hata döndürür.


4

JavaScript (ES6), 87 bayt

Döndürür false/ trueveya atar ReferenceError.

s=>s.split`.`.map((w,i)=>e|['codegolf','stackexchange','com'][i]!=w&&e++,e=0)&&e>1?X:!e

Olasılıksal sürüm, 78 bayt (rakip olmayan)

Tüm mülklerin eşleşmesi garanti edildiğinden [a-z], bunu deneyebiliriz:

s=>s.split`.`.map((w,i)=>e|[162,6,2][i]-parseInt(w,36)%587&&e++,e=0)&&e>1?X:!e

Aslında dışında 587biz ilgilenen kelimeler için oldukça kısa değerlere a ilk ve potansiyel olduğunu, bu oldukça rastgele modülo seçimdir.

Tüm test vakalarını geçmesine rağmen, elbette yanlış pozitifler döndürmesi olasıdır.


3

Toplu, 269231 bayt

@echo off
set/ps=
set w=1codegolf
for %%a in (%s:.= %)do call:l %%w
echo %w:~0,1%
exit/b
:g
if
:l
if %w:~-1%==. goto g
if not %1==%w% set w=0.&exit/b
set w=1com
if %1==com set w=1.
if %1==codegolf set w=1stackexchange

STDIN üzerine girdi alır; geçersiz bir özellik için bir sözdizimi hatası atar. Durum wmakinesi olarak kullanarak çalışır . Bu w, bir .sonraki özellik erişiminin geçersiz olduğu anlamına gelir. Düzenleme: Toplu komut dosyasını iptal etmek için sözdizimi hatası kullanılarak 17 bayt kaydedildi. Görevlerimden birinin koşulsuz olabileceğini fark ederek 21 bayt kazandım.


2

Javascript, 84 82 bayt

Kazanmak için yeterince kısa değil, ama bir acemi olduğum için onu paylaşmanın eğlenceli olacağını düşündüm. Belki birinin iyileştirilmesi için bir önerisi vardır.

s=>s.split`.`.length>3&&e||!!eval('codegolf={stackexchange:{com:true}};window.'+s)

Sorudaki tüm testleri geçer, truevar falseolmayan değer için var olmayan değer için döndürür ve var olmayan veya nesne olmayan değişkenin bir özelliğini almaya çalıştığınızda hata atar. Ancak şimdi bu çözümün de bazı sorunları olduğunu fark ediyorum. Yorumlarda @Florent tarafından işaret edildiği gibi, dize prototip özellikleri .toStringçağrıldığında true değerini döndürür .

Düzenleme : @MamaFunRoll sayesinde 2 bayt daha kısa

Test snippet'i:

var f =
s=>s.split`.`.length>3&&e||!!eval('codegolf={stackexchange:{com:true}};window.'+s)

console.log(f('codegolf.stackexchange.com')) //true
console.log(f('codegolf.stackexchange.net')) //false
console.log(f('codegolf.stackexchange')) //true
console.log(f('codegolf.foo')) //false
console.log(f('codegolf')) //true
console.log(f('foo')) //false
console.log(f('codegolf.com')) //false

console.log(f('codegolf.foo.bar')) // TypeError
console.log(f('codegolf.stackexchange.com.foo')) //ReferenceError
console.log(f('codegolf.stackexchange.com.foo.bar')) //ReferenceError
console.log(f('foo.stackexchange.com')) // TypeError
console.log(f('foo.bar')) // TypeError
console.log(f('foo.bar.baz')) // TypeError


{"message": "undefined veya null referansının 'bar' özelliği alınamadı ", " dosyaadı": " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP

@RosLuP Bu yorumla ne demek istediğinden emin değilim. Fonksiyon için bir hata atması gerekiyorcodegolf.foo.bar
tjespe

hepiniz için daha iyi ... ama benim için "atmak" hatası bir hatadır
RosLuP

1
.split('.')-> split`.`Hoşgeldiniz!
Mama Fun Roll

1
Çalışmıyor. f("codegolf.toString") dönmelidir false. f("codegolf.toString.toString")atmalı.
Florent

1

JavaScript, 173 bayt

function d(a){var b="codegolf",u="stackexchange",c=a.split("."),e="e";return c.length==1?c[0]==b:c.length==2?c[0]==b?c[1]==u:e:c.length==3?c[0]==b?c[1]==u?c[2]=="com":e:e:e}

IE 10 ile çalışır, bu nedenle büyük modern tarayıcılarda çalışmalıdır.

Burada deneyin (+ ungolfed)


2
Daha fazla golf olabilir: d=(a,b="codegolf",u="stackexchange",c=a.split`.`,e="e")=>c[l="length"]==1?c[0]==b:c[l]==2?c[0]==b?c[1]==u:e:c[l]==3?c[0]==b?c[1]==u?c[2]=="com":e:e:e(149 bytes)
Florent

@Florent IE10 vb. Üzerinde çalışmasına izin vermeye çalıştığını düşünüyorum, bu yüzden ok işlevleri veya varsayılan parametreler yok.
Conor O'Brien

Harika bir yanıt için +1 e="e", IE için +1 , ancak IE 10 için -1
NoOneIsHere

1

C #, 155 bayt

En kısa olmayacaktı ama eğlenceli olacağını düşündüm C # ...

bool f(string s){var a=s.Split('.');int e=0,l=a.Length-1,i=l;for(;0<=i;i--){e+=a[i]!=new[]{"codegolf","stackexchange","com"}[i]?i<l?s[-1]:1:0;}return e<1;}
  • Dizeyi böler ve sonuç boyunca tersini yineler.
  • 1'den fazla yineleme derinliğinde, eşleşmeyen bir eleman, hatalar ( IndexOutOfRangeExceptiondizgide -1 konumunda bir karaktere erişerek).
  • Aksi takdirde, herhangi bir öğe eşleşmezse false değerini döndürür.

.NET Keman


1

Yakut, 84 80 bayt

Hatayı artırmak için sıfıra dönen trueveya falsesıfıra bölen anonim işlev :

->s{k=1;s.split(?.).zip(%w[codegolf stackexchange com]){|i,o|1/0if !k;k=i==o};k} 

Çevrimiçi deneyin


1

Cı, 98 112 113 bayt

f(char*a){char*c="codegolf.stackexchage.com";while(*c&&*c==*a)++a,++c;return strchr(a,46)?*(a=0):!(*a|*c&*c-46);}

ungolfed

f(char*a){char*c="codegolf.stackexchage.com";
          while(*c&&*c==*a)++a,++c;
          return strchr(a,46)?*(a=0):!(*a|*c&*c-46);
         }

f(codegolf.stackexchage.com)=1
f(codegolf.stackexchage.net)=0
f(codegolf.stackexchage)=1
f(codegolf.foo)=0
f(codegolf)=1
f(foo)=0

Aşağıdakiler için hataya bölünmelidir

f(codegolf.stackexchage.com.foo)
f(foo.bar)
f(foo.bar.baz)
f(codegolf.foo.bar)
f(foo.v)

Hatalar ne olacak? örneğin f(codegolf.stackexchage.com.foo)hata, dönüş değil 0.
Jonathan Allan

ben neden C #, Java, Javascript, python, Bathc, Javascript, daha az karakter olan C dil girişim neden herkesten daha az puan (-1) olduğunu
anlamıyorum

Belki codegolf.stackexchange.com.foo hatasını düzeltmeden önce indirildiler veya düzelttiğinizi fark etmiyorlar. Üstbilgiyi, # C, <strike>98</strike> 112 bytes #değiştirdiğinizden emin olmak için düzenleyin.
Ray

3bu da bir hata değildir, C de "doğruluk" değeri olarak kabul edilir. Bkz bu meta yazı ve bu kodu .
Jonathan Allan

Hata programı dönüş 3 durumunda istisna kullanmıyorum. -1 olmalı, ancak 3 karakter 1 kaydetmeli
RosLuP

0

Java, 187138 bayt

Sürüm 2.0 ( 138 bayt): @Jamie'den utanmadan çalınan fikir.

l->{for(String []a=l.split,int l=i=a.length-1,e=0;i>=0;e+=a[i]!=new String[]{"codegolf","stackexchange","com"}[i]?i<l?s[-1]:1:0)return e;}

Sürüm 1.0 ( 187 bayt):

l->{String[]a=l.split(".");return a[0].equals("codegolf")?(a.length<2?1:(a[1].equals("stackexchange")?(a.length<3?1:(a[2].equals("com")?1:0)):(a.length<3?0:a[-1]))):(a.length<2?0:a[-1]);}

Geri dönüş kısmının açıklaması:

return a[0].equals("codegolf")?(a.length<2?1:(a[1].equals("stackexchange")?(a.length<3?1:(a[2].equals("com")?1:0)):(a.length<3?0:a[-1]))):(a.length<2?0:a[-1]);
return                                                                                                                                                        ;
       a[0].equals("codegolf")?                                                                                                          :
                               (a.length<2? :                                                                                           ) (a.length<2? :     )
                                           1 (a[1].equals("stackexchange")?                                       :                    )              0 a[-1]
                                                                           (a.length<3? :                        ) (a.length<3? :     )
                                                                                       1 (a[2].equals("com")? : )              0 a[-1]
                                                                                                             1 0
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.