Obiekt codegolf

14

Wyobraź sobie, że mamy środowisko o zasięgu globalnym zawierające tylko jeden obiekt o nazwie codegolf. Ten obiekt ma jedno dziecko o nazwie stackexchange, które ma właściwość o nazwie com.
Wyglądałby dostęp do tej właściwości codegolf.stackexchange.com.

Wyzwanie

Dane wejściowe twojego programu / funkcji będą ciągiem próbującym uzyskać dostęp do właściwości w zasięgu globalnym. Ilekroć ta właściwość zostanie znaleziona, wydrukujesz / zwrócisz prawdziwą wartość. Jeżeli właściwość nie zostanie znaleziona, wartość fałszowania zostanie wydrukowana / zwrócona. Złap: gdy próbujesz uzyskać dostęp do właściwości nieistniejącego obiektu, twój program powinien zgłosić dowolny błąd¹.

Aby było trochę łatwiej, możesz założyć, że dane wejściowe zawsze będą [a-z.], nigdy nie będą puste, nigdy nie będą powtarzać .i nigdy nie zaczną się ani nie zakończą na .. Podobnie codegolf.jest z nieprawidłowym wejściem.

Przypadki testowe

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

To jest , wygrywa najkrótszy kod w bajtach

¹ jeśli (i tylko wtedy) swój język z wyboru nie obsługuje błędy w ogóle , trzeba wyjście coś, co sprawia, że jest jasne, że to błąd. Na przykład, jeśli użyjesz 1 dla prawdy i 0 dla fałszu, możesz użyć „e” dla błędu. Zachowaj spójność w zakresie wartości zwrotnych i wyjaśnij zachowanie w poście.

Bassdrop Cumberwubwubwub
źródło
1
Myślę, że foo => Errorbyłoby bardziej odpowiednie.
Magic Octopus Urn
prośba o dodanie codegolf.comdo przypadków testowych w celu wykluczenia codegolf(.stackexchange)?(.com)?$kontroli typu
colsw
Kolejny brakujący przypadek testowy:foo.stackexchange.com
Jamie
@carusocomputing Nie. Pomyśl o JavaScript. foowróci undefined, ale nie wyrzuci błędu. foo.barzgłosi błąd, ponieważ foonie jest zdefiniowany.
mbomb007
1
@carusocomputing Prawda, ale nie można powiedzieć, że jest „bardziej odpowiednia”, jeśli ma to sens w obie strony. codegolf.foo => 0, Tak foo => 0.
mbomb007

Odpowiedzi:

8

JavaScript, 135 bajtów

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

Przerobiono pierwszą próbę uniemożliwienia dostępu do wbudowanych kluczy, w tym momencie lepiej będzie zastosować inne podejście, ale hej!

Zwraca true dla prawidłowego, false dla brakującego i błędu w przypadku błędu.

Skorm
źródło
4

JavaScript (ES6), 87 bajtów

Zwraca false/ truelub rzuca ReferenceError.

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

Wersja probabilistyczna, 78 bajtów (niekonkurująca)

Ponieważ gwarantowane jest dopasowanie wszystkich właściwości [a-z], możemy spróbować:

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

Poza tym, że 587jest liczbą pierwszą i prowadzi do raczej krótkich wartości dla słów, którymi jesteśmy zainteresowani, jest to raczej przypadkowy wybór modulo.

Mimo, że zdaje wszystkie testy, prawdopodobnie zwróci fałszywie pozytywne wyniki.

Arnauld
źródło
3

Partia, 269 231 bajtów

@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

Pobiera dane wejściowe na STDIN; zgłasza błąd składniowy niepoprawnej właściwości. Działa przy użyciu wjako maszyna stanu. Jeśli wkończy się na, .oznacza to, że następny dostęp do właściwości jest nieprawidłowy. Edycja: Zapisano 17 bajtów, używając błędu składni do przerwania skryptu wsadowego. Zaoszczędziłem 21 bajtów, zdając sobie sprawę, że jedno z moich zadań może być bezwarunkowe.

Neil
źródło
2

JavaScript, 84 82 bajtów

Nie jest wystarczająco krótki, aby wygrać, ale ponieważ jestem początkujący, pomyślałem, że fajnie byłoby się nim podzielić. Może ktoś ma sugestię poprawy.

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

Przechodzi wszystkie testy w pytaniu, zwraca truewartość istniejącą, falsenieistniejącą i generuje błąd, jeśli próbujesz uzyskać właściwość nieistniejącej lub nieobiektywnej zmiennej. Teraz jednak zdaję sobie sprawę, że to rozwiązanie ma również pewne problemy. Jak wskazał @Florent w komentarzach, zwraca true, gdy .toStringwywoływane są właściwości prototypu łańcucha, takie jak .

Edytować : 2 bajty krótsze dzięki @MamaFunRoll

Fragment testowy:

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
źródło
{„message”: „Nie można uzyskać„ paska właściwości ”niezdefiniowanego lub zerowego odwołania”, „filename”: „ stacksnippets.net/js ”, „lineno”: 1, „colno”: 37}
RosLuP
@RosLuP Nie jestem pewien, co masz na myśli przez ten komentarz. Ta funkcja ma generować błąd dlacodegolf.foo.bar
tjespe
niż wszystko ok dla was wszystkich ... ale dla mnie błąd „wyrzucenia” to jeden błąd
RosLuP
1
.split('.')-> split`.`Witamy!
Mama Fun Roll
1
Nie działa. f("codegolf.toString") powinien wrócić false. f("codegolf.toString.toString")powinien rzucić.
Florent,
1

JavaScript, 173 bajtów

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}

Działa z IE 10, więc powinien działać na głównych współczesnych przeglądarkach.

Wypróbuj tutaj (+ bez golfa)

Próbować
źródło
2
Może być znacznie bardziej golfowy: 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 bajtów)
Florent
@Florent Wydaje mi się, że on próbuje pozwolić, aby działał na IE10 itp., Więc nie ma funkcji strzałek ani parametrów domyślnych.
Conor O'Brien
+1 za świetną odpowiedź, +1 za e="e", ale -1 za IE 10.
NoOneIsHere
1

C #, 155 bajtów

Nie będzie najkrótszy, ale pomyślałem, że fajnie będzie spróbować w 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;}
  • Dzieli ciąg i odwraca iterację wyniku.
  • Niepasujący element o głębokości większej niż 1 iteracja, błędy (wyrzucanie IndexOutOfRangeExceptionprzez dostęp do znaku w pozycji -1 w ciągu).
  • W przeciwnym razie zwraca false, jeśli któryś element nie pasuje.

.NET Fiddle

Jamie
źródło
1

Rubinowy, 84 80 bajtów

Funkcja anonimowa, która zwraca truelub falsedzieli przez zero w celu zgłoszenia błędu:

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

Wypróbuj online

daniero
źródło
1

C, 98 112 113 bajtów

f(char*a){char*c="codegolf.stackexchage.com";while(*c&&*c==*a)++a,++c;return strchr(a,46)?*(a=0):!(*a|*c&*c-46);}

bez golfa

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

dla poniżej musi to segregować wina

f(codegolf.stackexchage.com.foo)
f(foo.bar)
f(foo.bar.baz)
f(codegolf.foo.bar)
f(foo.v)
RosLuP
źródło
Co z błędami? f(codegolf.stackexchage.com.foo)powinien 0na przykład błąd, a nie powrót .
Jonathan Allan
nie do końca rozumiem, dlaczego mój wpis w języku C, który zawiera mniej znaków niż C #, Java, JavaScript, python, Bathc, JavaScript, ma mniej punktów (-1) niż wszyscy
RosLuP
Być może ocenili to zanim naprawiłeś błąd codegolf.stackexchange.com.foo, lub nie zdają sobie sprawy, że to naprawiłeś. Edytuj nagłówek, # C, <strike>98</strike> 112 bytes #aby było jasne, że go zmodyfikowałeś.
Ray
3nie jest też błędem, w C jest to wartość uważana za „prawdziwą”. Zobacz ten meta post i ten kod .
Jonathan Allan,
Nie używam wyjątków, w przypadku błędu program zwraca 3. Powinien wynosić -1, ale 3 zapisać 1 znak
RosLuP
0

Java, 187 138 bajtów

Wersja 2.0 ( 138 bajtów): pomysł bezwstydnie skradziony @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;}

Wersja 1.0 ( 187 bajtów):

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

Objaśnienie części zwrotnej:

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
źródło