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.


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.


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.


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.


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


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


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


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


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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.