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.


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.


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.


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.


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


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


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


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


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)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.