高尔夫对象


14

想象一下,我们有一个环境,它的全局范围仅包含一个称为的对象codegolf。该对象有一个名为的子对象stackexchange,该子对象具有的属性com
访问此属性看起来像codegolf.stackexchange.com

挑战

程序/函数的输入将是试图访问全局范围内的属性的字符串。只要找到此属性,就应打印/返回真实值。如果找不到该属性,则应打印/返回伪造的值。要注意的是:当您尝试访问不存在的对象上的属性时,您的程序应该抛出任何类型的错误¹。

为了使事情变得容易一些,您可以假设输入将始终为[a-z.],永远不会为空,永远不会有重复.的,也永远不会以开头或结尾.codegolf.无效的输入也是如此。

测试用例

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

这是,以字节为单位的最短代码获胜

¹当(且仅当)您选择的语言根本不支持错误,您必须输出一些明确表明这是错误的内容。例如,如果将1表示真实,将0表示虚假,则可以使用“ e”表示错误。保持一致的返回值,并在帖子中说明行为。


1
我觉得foo => Error会更合适。
魔术章鱼缸

请求添加codegolf.com到测试用例中以排除codegolf(.stackexchange)?(.com)?$类型检查
colsw

另一个丢失的测试用例:foo.stackexchange.com
Jamie

@carusocomputing不。考虑一下JavaScript。foo将返回undefined,但不会引发错误。foo.bar由于foo未定义,将引发错误。
mbomb007 '16

1
@carusocomputing是的,但是当两种方式都有意义时,您不能说它“更合适”。codegolf.foo => 0所以foo => 0
mbomb007 '16

Answers:


8

JavaScript,135个字节

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

重做了防止内置键可访问的第一次尝试,这时使用其他方法会更好,但是,嘿!

对于有效返回true,对于丢失返回false,如果出错则返回错误。


4

JavaScript(ES6),87个字节

返回false/ true或抛出ReferenceError

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

概率版本,78字节(无竞争)

因为所有属性都保证匹配[a-z],所以我们可以尝试一下:

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

除了587是一个质数并导致我们感兴趣的单词的值很短之外,这是一个相当随机的取模选择。

尽管它确实通过了所有测试用例,但它当然很可能返回假阳性。


3

批次,269231字节

@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上输入;为无效的属性引发语法错误。通过w用作状态机来工作。如果w以a结尾,.则意味着下一个属性访问无效。编辑:通过使用语法错误中止批处理脚本保存了17个字节。通过意识到我的一项分配可能是无条件的,节省了21个字节。


2

Javascript,84 82个字节

尚不足以赢得比赛,但由于我是初学者,所以我认为分享它会很有趣。也许有人有改进的建议。

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

它通过问题中的所有测试,返回true现有值,返回false不存在的值,如果尝试获取不存在或非对象变量的属性,则会引发错误。但是,我现在意识到该解决方案也存在一些问题。正如@Florent在评论中指出的那样,当.toString调用字符串原型属性(例如)时,它将返回true 。

编辑:由于@MamaFunRoll而缩短了2个字节

测试代码段:

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”:“无法获得未定义或空引用的属性'bar'”,“ filename”:“ stacksnippets.net/js ”,“ lineno”:1,“ colno”:37}
RosLuP

@RosLuP我不确定此评论的意思。该功能应该为codegolf.foo.bar
-tjespe

比所有人都好...但是对我来说,“抛出”错误是一个错误
RosLuP

1
.split('.')-> split`.`欢迎!
Mama Fun Roll

1
不起作用。f("codegolf.toString") 应该回来falsef("codegolf.toString.toString")应该扔。
佛罗伦萨(Florent)

1

JavaScript,173个字节

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一起使用,因此应可在主要的现代浏览器上使用。

在这里尝试(+取消高尔夫)


2
可能会更多地打高尔夫球: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字节)
Florent

@Florent我认为他正在尝试允许它在IE10等上运行,因此没有箭头功能或默认参数。
科纳·奥布莱恩

+1一个伟大的回答,为+1 e="e",但-1 IE 10
NoOneIsHere

1

C#,155个字节

不会是最短的,但是认为用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;}
  • 拆分字符串并反向迭代结果。
  • 深度超过1次迭代的非匹配元素会出错(IndexOutOfRangeException通过访问字符串中-1位置的char 引发)。
  • 否则,如果任何元素不匹配,则返回false。

.NET小提琴


1

Ruby,84个 80字节

返回truefalse或除以零以引发错误的匿名函数:

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

在线尝试


1

C,98 112 113个字节

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

对于下面它必须隔离故障

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

错误如何?例如f(codegolf.stackexchage.com.foo),应该出错而不是不返回0
乔纳森·艾伦

我不完全理解为什么我的C语言条目的字符数少于C#,Java,Javascript,python,Bathc,Javascript的得分(-1)比每个人都少
RosLuP 2016年

也许他们在您修复codegolf.stackexchange.com.foo错误之前就投票否决了,或者他们没有意识到您已解决它。编辑标题,# C, <strike>98</strike> 112 bytes #以明确您已对其进行了修改。

3也不是错误,在C中它被认为是“真实”值。请参阅此meta帖子此代码
乔纳森·艾伦

在错误程序返回3的情况下,我不使用异常。应该为-1,但3保存1个字符
RosLuP

0

Java,187138字节

版本2.0(138字节):想法从@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;}

版本1.0(187字节):

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

返回部分的说明:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.