codegolf 객체


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더 적절한 것 같은 느낌이 든다 .
매직 문어 Urn

유형 검사 codegolf.com를 배제하기 위해 테스트 케이스 에 추가 요청codegolf(.stackexchange)?(.com)?$
colsw

또 다른 누락 된 테스트 사례 :foo.stackexchange.com
Jamie

@carusocomputing 아뇨. JavaScript에 대해 생각하십시오. foo돌아올 것이다undefined 하지만 오류가 발생하지 않습니다. 정의되지 foo.bar않았기 때문에 오류가 발생 foo합니다.
mbomb007

1
@carusocomputing True, 그러나 두 가지 모두 의미가있는 경우 "더 적합"하다고 말할 수 없습니다. codegolf.foo => 0그렇습니다 foo => 0.
mbomb007

답변:


8

자바 스크립트, 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

배치, 269 231 바이트

@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끝나는 경우 .다음 속성 액세스가 유효하지 않음을 의미합니다. 편집 : 구문 오류를 사용하여 배치 스크립트를 중단하여 17 바이트를 절약했습니다. 내 할당 중 하나가 무조건적 일 수 있음을 인식하여 21 바이트를 절약했습니다.


2

자바 스크립트, 84 82 바이트

이길만큼 짧지는 않지만 초보자이기 때문에 공유하는 것이 재미있을 것이라고 생각했습니다. 누군가 개선을위한 제안이있을 수 있습니다.

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

문제의 모든 테스트를 통과하고 존재하지 않는 true값에 대해 기존 값을 반환 하며 false존재하지 않거나 객체가 아닌 변수의 속성을 얻으려고하면 오류가 발생합니다. 그러나 이제이 솔루션에도 몇 가지 문제가 있음을 알고 있습니다. 주석에서 @Florent가 지적한 것처럼 문자열 프로토 타입 속성과 같은 경우 true를 반환합니다..toString 호출 .

편집하다 : @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": "정의되지 않은 또는 null 참조의 '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") 반환해야합니다 false. f("codegolf.toString.toString")던져야한다.
Florent

1

자바 스크립트, 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에서 작동하므로 최신 주요 브라우저에서 작동해야합니다.

여기에서 시도하십시오 (+ ungolfed)


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

@Florent IE10 등에서 작동하도록 노력하고 있다고 생각하므로 화살표 기능이나 기본 매개 변수가 없습니다.
코너 O'Brien

훌륭한 답변은 +1 e="e", IE는 +1 , -1은 –1
여기

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

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.
Jonathan Allan

C #, Java, Javascript, python, Bathc, Javascript보다 문자가 적은 C 언어 항목이 모든 사람보다 적은 점수 (-1)를 갖는 이유를 완전히 이해하지 못합니다
RosLuP

어쩌면 그들은 codegolf.stackexchange.com.foo 오류를 해결하기 전에 downvoted 또는 그들은 당신이 그것을 이해하지 못했습니다. 헤더를 수정하여 # C, <strike>98</strike> 112 bytes #명확하게 수정하십시오.
Ray

3오류도 아니고 C에서는 "거짓"값으로 간주됩니다. 참조 이 메타 게시 하고, 이 코드를 .
Jonathan Allan

오류 프로그램 반환 3의 경우 예외를 사용하지 않습니다. -1이어야하지만 3은 1 자 저장
RosLuP

0

자바, 187 바이트

버전 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.