Đối tượng cá tuyết


14

Hãy tưởng tượng điều này, chúng ta có một môi trường với phạm vi toàn cầu chỉ chứa một đối tượng duy nhất, được gọi codegolf. Đối tượng này có một đứa trẻ được gọi stackexchange, trong đó có một tài sản được gọi com.
Truy cập vào tài sản này sẽ như thế nào codegolf.stackexchange.com.

Các thách thức

Đầu vào của chương trình / chức năng của bạn sẽ là một chuỗi cố gắng truy cập một thuộc tính trên phạm vi toàn cầu. Bất cứ khi nào tài sản này được tìm thấy, bạn sẽ in / trả lại một giá trị trung thực. Nếu thuộc tính không được tìm thấy, giá trị giả sẽ được in / trả lại. Lưu ý: khi bạn cố gắng truy cập một thuộc tính trên một đối tượng không tồn tại, chương trình của bạn sẽ đưa ra bất kỳ loại lỗi nào.

Để làm cho mọi thứ dễ dàng hơn một chút, bạn có thể cho rằng đầu vào sẽ luôn như vậy [a-z.], nó sẽ không bao giờ trống rỗng, nó sẽ không bao giờ lặp lại .và nó sẽ không bao giờ bắt đầu hoặc kết thúc bằng a .. Vì vậy, codegolf.là một đầu vào không hợp lệ.

Các trường hợp thử nghiệm

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

Đây là , mã ngắn nhất tính bằng byte thắng

¹ nếu (và chỉ nếu) ngôn ngữ của bạn lựa chọn không hỗ trợ lỗi gì cả , bạn phải ra một cái gì đó mà làm cho nó rõ ràng rằng đây là một lỗi. Ví dụ: nếu bạn sử dụng 1 cho sự thật và 0 cho sai, bạn có thể sử dụng "e" cho một lỗi. Hãy nhất quán trong các giá trị trả về của bạn và giải thích hành vi trong bài viết của bạn.


1
Tôi cảm thấy như foo => Errorsẽ thích hợp hơn.
Bạch tuộc ma thuật Urn

yêu cầu thêm codegolf.comvào các trường hợp kiểm tra để codegolf(.stackexchange)?(.com)?$loại trừ kiểm tra loại
colsw

Một trường hợp thử nghiệm mất tích khác:foo.stackexchange.com
Jamie

@carusocomputing Không. Hãy nghĩ về JavaScript. foosẽ trở lại undefined, nhưng nó sẽ không gây ra lỗi. foo.barsẽ ném một lỗi vì fookhông được xác định.
mbomb007

1
@carusocomputing Đúng, nhưng bạn không thể nói nó "phù hợp hơn", khi nó có ý nghĩa cả hai cách. codegolf.foo => 0, Vì vậy foo => 0.
mbomb007

Câu trả lời:


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

Làm lại nỗ lực đầu tiên để ngăn chặn các khóa dựng sẵn có thể truy cập được, tại thời điểm này sẽ tốt hơn nếu sử dụng một cách tiếp cận khác, nhưng này!

Trả về true cho hợp lệ, false cho thiếu và lỗi khi lỗi.


4

JavaScript (ES6), 87 byte

Trả về false/ truehoặc ném ReferenceError.

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

Phiên bản xác suất, 78 byte (không cạnh tranh)

Bởi vì tất cả các thuộc tính được đảm bảo khớp [a-z], chúng tôi có thể thử:

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

Ngoài thực tế 587là một số nguyên tố và dẫn đến các giá trị khá ngắn cho các từ chúng ta quan tâm, đây là một lựa chọn modulo khá ngẫu nhiên.

Mặc dù nó vượt qua tất cả các trường hợp thử nghiệm, nhưng tất nhiên nó có khả năng trả về kết quả dương tính giả.


3

Hàng loạt, 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

Đưa đầu vào vào STDIN; ném lỗi cú pháp cho một thuộc tính không hợp lệ. Hoạt động bằng cách sử dụng wnhư một máy trạng thái. Nếu wkết thúc bằng .điều này có nghĩa là quyền truy cập thuộc tính tiếp theo không hợp lệ. Chỉnh sửa: Đã lưu 17 byte bằng cách sử dụng lỗi cú pháp để hủy bỏ tập lệnh bó. Đã lưu 21 byte bằng cách nhận ra rằng một trong những bài tập của tôi có thể là vô điều kiện.


2

Javascript, 84 82 byte

Không đủ ngắn để giành chiến thắng, nhưng vì tôi là người mới bắt đầu nên tôi nghĩ sẽ rất vui khi chia sẻ nó. Có lẽ ai đó có một đề nghị để cải thiện.

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

Nó vượt qua tất cả các bài kiểm tra trong câu hỏi, trả về truegiá trị hiện tại, falsecho trường hợp không tồn tại và nó sẽ báo lỗi nếu bạn cố lấy một thuộc tính của biến không tồn tại hoặc không đối tượng. Tuy nhiên bây giờ tôi nhận ra rằng giải pháp này cũng có một số vấn đề. Như @Florent đã chỉ ra trong các bình luận, nó trả về giá trị true khi các thuộc tính nguyên mẫu chuỗi như .toStringđược gọi.

Biên tập : ngắn hơn 2 byte nhờ @MamaFunRoll

Đoạn kiểm tra:

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": "Không thể có được tài sản 'bar' không xác định hoặc null tham khảo", "filename": " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP

@RosLuP Tôi không chắc ý của bạn về bình luận này. Chức năng này được cho là sẽ gây ra lỗi chocodegolf.foo.bar
tjespe

hơn tất cả các bạn đều ổn ... nhưng đối với tôi, lỗi "ném" là một lỗi
RosLuP

1
.split('.')-> split`.`Chào mừng bạn!
Mama Fun Roll

1
Không hoạt động. f("codegolf.toString") nên trở về false. f("codegolf.toString.toString")nên ném.
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}

Hoạt động với IE 10, vì vậy nên hoạt động trên các trình duyệt hiện đại lớn.

Dùng thử tại đây (+ chưa được chỉnh sửa)


2
Có thể chơi golf nhiều hơn: 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 byte)
Florent

@Florent Tôi nghĩ rằng anh ta đang cố gắng cho phép nó hoạt động trên IE10, v.v., vì vậy không có chức năng mũi tên hoặc tham số mặc định.
Conor O'Brien

+1 cho câu trả lời tuyệt vời, +1 cho e="e", nhưng -1 cho IE 10.
NoOneIsHere

1

C #, 155 byte

Sẽ không phải là ngắn nhất nhưng nghĩ rằng sẽ rất vui nếu thử nó trong 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;}
  • Chia chuỗi và lặp lại thông qua kết quả.
  • Một phần tử không phù hợp sâu hơn 1 lần lặp, lỗi (ném một IndexOutOfRangeException bằng cách truy cập char ở vị trí -1 trong chuỗi).
  • Mặt khác, trả về false nếu bất kỳ phần tử nào không khớp.

.NET Fiddle


1

Ruby, 84 80 byte

Hàm ẩn danh trả về truehoặc false, hoặc chia cho 0 để tăng lỗi:

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

Dùng thử trực tuyến


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

vô dụng

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

cho bên dưới nó phải phân tách lỗi

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

Còn lỗi (s) thì sao? f(codegolf.stackexchage.com.foo)nên lỗi, không trả lại 0, ví dụ.
Jonathan Allan

Tôi không hiểu đầy đủ lý do tại sao mục nhập ngôn ngữ C của tôi có ít ký tự hơn C #, Java, Javascript, python, Bathc, Javascript, có ít điểm hơn (-1) so với mọi người
RosLuP

Có thể họ đã hạ cấp trước khi bạn sửa lỗi codegolf.stackexchange.com.foo hoặc họ không nhận ra bạn đã sửa nó. Chỉnh sửa tiêu đề để # C, <strike>98</strike> 112 bytes #làm rõ rằng bạn đã sửa đổi nó.
Ray

3cũng không phải là một lỗi, trong C, đó là giá trị "trung thực". Xem bài đăng meta này , và mã này .
Jonathan Allan

Tôi không sử dụng ngoại lệ, trong trường hợp chương trình lỗi trả về 3. Nên là -1 nhưng 3 lưu 1 ký tự
RosLuP

0

Java, 187 138 byte

Phiên bản 2.0 ( 138 byte): Ý tưởng bị đánh cắp một cách đáng xấu hổ từ @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;}

Phiên bản 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]);}

Giải thích về phần trả về:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.