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 code-golf , 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.
źródło
foo => Error
byłoby bardziej odpowiednie.codegolf.com
do przypadków testowych w celu wykluczeniacodegolf(.stackexchange)?(.com)?$
kontroli typufoo.stackexchange.com
foo
wróciundefined
, ale nie wyrzuci błędu.foo.bar
zgłosi błąd, ponieważfoo
nie jest zdefiniowany.codegolf.foo => 0
, Takfoo => 0
.Odpowiedzi:
JavaScript, 135 bajtów
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.
źródło
JavaScript (ES6), 87 bajtów
Zwraca
false
/true
lub rzucaReferenceError
.Pokaż fragment kodu
Wersja probabilistyczna, 78 bajtów (niekonkurująca)
Ponieważ gwarantowane jest dopasowanie wszystkich właściwości
[a-z]
, możemy spróbować:Poza tym, że
587
jest 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.
Pokaż fragment kodu
źródło
Partia,
269231 bajtówPobiera dane wejściowe na STDIN; zgłasza błąd składniowy niepoprawnej właściwości. Działa przy użyciu
w
jako maszyna stanu. Jeśliw
koń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.źródło
JavaScript,
8482 bajtówNie 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.
Przechodzi wszystkie testy w pytaniu, zwraca
true
wartość istniejącą,false
nieistnieją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.toString
wywoływane są właściwości prototypu łańcucha, takie jak .Edytować : 2 bajty krótsze dzięki @MamaFunRoll
Fragment testowy:
źródło
codegolf.foo.bar
.split('.')
->split`.`
Witamy!f("codegolf.toString")
powinien wrócićfalse
.f("codegolf.toString.toString")
powinien rzucić.JavaScript, 173 bajtów
Działa z IE 10, więc powinien działać na głównych współczesnych przeglądarkach.
Wypróbuj tutaj (+ bez golfa)
źródło
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)e="e"
, ale -1 za IE 10.C #, 155 bajtów
Nie będzie najkrótszy, ale pomyślałem, że fajnie będzie spróbować w C # ...
IndexOutOfRangeException
przez dostęp do znaku w pozycji -1 w ciągu)..NET Fiddle
źródło
Rubinowy,
8480 bajtówFunkcja anonimowa, która zwraca
true
lubfalse
dzieli przez zero w celu zgłoszenia błędu:Wypróbuj online
źródło
C,
98112113 bajtówbez golfa
dla poniżej musi to segregować wina
źródło
f(codegolf.stackexchage.com.foo)
powinien0
na przykład błąd, a nie powrót .# C, <strike>98</strike> 112 bytes #
aby było jasne, że go zmodyfikowałeś.3
nie jest też błędem, w C jest to wartość uważana za „prawdziwą”. Zobacz ten meta post i ten kod .Java,
187138 bajtówWersja 2.0 ( 138 bajtów): pomysł bezwstydnie skradziony @Jamie.
Wersja 1.0 ( 187 bajtów):
Objaśnienie części zwrotnej:
źródło