Objek codegolf

14

Bayangkan ini, kita memiliki lingkungan dengan cakupan global yang hanya berisi satu objek, disebut codegolf. Objek ini memiliki satu anak yang dipanggil stackexchange, yang memiliki properti yang disebut com.
Mengakses properti ini akan terlihat seperti codegolf.stackexchange.com.

Tantangan

Input dari program / fungsi Anda akan berupa string yang mencoba mengakses properti pada lingkup global. Setiap kali properti ini ditemukan, Anda harus mencetak / mengembalikan nilai yang sebenarnya. Jika properti tidak ditemukan, nilai palsu akan dicetak / dikembalikan. Tangkapannya: ketika Anda mencoba mengakses properti pada objek yang tidak ada, program Anda harus melakukan kesalahan apa pun¹.

Untuk mempermudah, Anda dapat mengasumsikan bahwa input akan selalu ada [a-z.], tidak akan pernah kosong, tidak akan pernah berulang ., dan tidak akan pernah memulai atau berakhir dengan a .. Begitu codegolf.juga input yang tidak valid.

Uji kasus

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

Ini adalah , kode terpendek dalam byte yang menang

¹ jika (dan hanya jika) bahasa pilihan Anda tidak mendukung kesalahan sama sekali , Anda harus menampilkan sesuatu yang menjelaskan bahwa ini adalah kesalahan. Misalnya, jika Anda menggunakan 1 untuk truey dan 0 untuk falsy, Anda dapat menggunakan "e" untuk kesalahan. Konsisten dalam nilai pengembalian Anda dan jelaskan perilaku di pos Anda.

Bassdrop Cumberwubwubwub
sumber
1
Saya merasa foo => Errorakan lebih tepat.
Guci Gurita Ajaib
permintaan untuk menambah codegolf.comkasus uji untuk mengesampingkan codegolf(.stackexchange)?(.com)?$jenis cek
colsw
Kasus tes lain yang hilang:foo.stackexchange.com
Jamie
@carusocomputing Tidak. Pikirkan tentang JavaScript. fooakan kembali undefined, tetapi itu tidak akan menimbulkan kesalahan. foo.barakan melempar kesalahan karena footidak didefinisikan.
mbomb007
1
@carusocomputing Benar, tetapi Anda tidak bisa mengatakan itu "lebih tepat", ketika masuk akal kedua cara. codegolf.foo => 0, Jadi foo => 0.
mbomb007

Jawaban:

8

JavaScript, 135 byte

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

Mengolah kembali upaya pertama untuk mencegah kunci bawaan dapat diakses, pada titik ini akan lebih baik untuk menggunakan pendekatan yang berbeda, tapi hei!

Mengembalikan nilai true untuk valid, false untuk missing, dan error on error.

Skorm
sumber
4

JavaScript (ES6), 87 byte

Pengembalian false/ trueatau lemparan ReferenceError.

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

Versi probabilistik, 78 byte (tidak bersaing)

Karena semua properti dijamin sesuai [a-z] , kami dapat mencoba ini:

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

Terlepas dari fakta yang 587utama dan mengarah ke nilai yang agak pendek untuk kata-kata yang kami minati, ini adalah pilihan modulo yang agak acak.

Meskipun tidak lulus semua kasus uji, tentu saja kemungkinan untuk mengembalikan hasil positif palsu.

Arnauld
sumber
3

Batch, 269 231 byte

@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

Mengambil input dari STDIN; melempar kesalahan sintaks untuk properti yang tidak valid. Bekerja dengan menggunakan wmesin negara. Jika wdiakhiri dengan .ini berarti akses properti selanjutnya tidak valid. Sunting: Disimpan 17 byte dengan menggunakan kesalahan sintaks untuk membatalkan skrip batch. Disimpan 21 byte dengan menyadari bahwa salah satu tugas saya bisa tanpa syarat.

Neil
sumber
2

Javascript, 84 82 byte

Tidak cukup pendek untuk menang, tetapi karena saya seorang pemula saya pikir akan menyenangkan untuk membagikannya. Mungkin seseorang memiliki saran untuk perbaikan.

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

Itu melewati semua tes dalam pertanyaan, mengembalikan trueuntuk nilai yang ada, falseuntuk tidak ada dan melempar kesalahan jika Anda mencoba untuk mendapatkan properti dari variabel tidak ada atau tidak-objek. Namun saya sekarang menyadari bahwa solusi ini memiliki beberapa masalah juga. Seperti yang ditunjukkan oleh @Florent di komentar itu mengembalikan true ketika properti prototipe string seperti .toStringdipanggil.

Sunting : 2 byte lebih pendek berkat @MamaFunRoll

Cuplikan uji:

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

tjespe
sumber
{"message": "Tidak dapat memperoleh properti 'bar' dari referensi yang tidak ditentukan atau nol", "nama file": " stacksnippets.net/js ", "lineno": 1, "colno": 1, "colno": 37}
RosLuP
@ RosLuP Saya tidak yakin apa yang Anda maksud dengan komentar ini. Fungsi ini seharusnya melempar kesalahan untukcodegolf.foo.bar
tjespe
daripada semua ok untuk semua yang Anda ... tetapi bagi saya "melempar" kesalahan adalah satu kesalahan
RosLuP
1
.split('.')-> split`.`Selamat datang!
Mama Fun Roll
1
Tidak bekerja. f("codegolf.toString") harus kembali false. f("codegolf.toString.toString")harus membuang.
Florent
1

JavaScript, 173 byte

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}

Bekerja dengan IE 10, jadi harus bekerja pada browser modern utama.

Coba di sini (+ ungolfed)

Mencoba
sumber
2
Bisa jadi lebih banyak golf: 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 Saya pikir dia mencoba untuk memungkinkannya untuk bekerja pada IE10 dll, jadi tidak ada fungsi panah atau parameter default.
Conor O'Brien
+1 untuk jawaban yang bagus, +1 untuk e="e", tetapi -1 untuk IE 10.
NoOneIsHere
1

C #, 155 byte

Tidak akan menjadi yang terpendek tetapi berpikir akan menyenangkan mencobanya di 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;}
  • Pisahkan string dan balikkan hasilnya.
  • Elemen yang tidak cocok lebih dari 1 iterasi dalam, kesalahan (melempar IndexOutOfRangeException dengan mengakses char pada posisi -1 dalam string).
  • Jika tidak, mengembalikan false jika ada elemen yang tidak cocok.

.NET Fiddle

Jamie
sumber
1

Ruby, 84 80 byte

Fungsi anonim yang mengembalikan trueatau false, atau membaginya dengan nol untuk meningkatkan kesalahan:

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

Cobalah online

daniero
sumber
1

C, 98 112 113 byte

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

untuk di bawah ini harus kesalahan seg

f(codegolf.stackexchage.com.foo)
f(foo.bar)
f(foo.bar.baz)
f(codegolf.foo.bar)
f(foo.v)
RosLuP
sumber
Bagaimana dengan kesalahan? f(codegolf.stackexchage.com.foo)seharusnya kesalahan, tidak kembali 0, misalnya.
Jonathan Allan
saya tidak sepenuhnya mengerti mengapa entri bahasa C saya yang karakternya kurang dari C #, Java, Javascript, python, Bathc, Javascript, memiliki poin lebih sedikit (-1) dari semua orang
RosLuP
Mungkin mereka downvoted sebelum Anda memperbaiki kesalahan codegolf.stackexchange.com.foo, atau mereka tidak menyadari Anda memperbaikinya. Edit tajuk untuk # C, <strike>98</strike> 112 bytes #menjelaskan bahwa Anda memodifikasinya.
Ray
3juga bukan kesalahan, di C itu adalah apa yang dianggap sebagai nilai "kebenaran". Lihat posting meta ini , dan kode ini .
Jonathan Allan
Saya tidak menggunakan pengecualian, jika ada kesalahan program return 3. Seharusnya -1 tetapi 3 save 1 karakter
RosLuP
0

Jawa, 187 138 byte

Versi 2.0 ( 138 byte): Ide tanpa malu dicuri dari @Jamie.

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

Versi 1.0 ( 187 byte):

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

Penjelasan dari bagian yang dikembalikan:

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
Roman Gräf
sumber