El objeto codegolf

14

Imagínese esto, tenemos un entorno con un alcance global que contiene un solo objeto, llamado codegolf. Este objeto tiene un solo hijo llamado stackexchange, que tiene una propiedad llamada com.
El acceso a esta propiedad se vería así codegolf.stackexchange.com.

El reto

La entrada de su programa / función será una cadena que intenta acceder a una propiedad en el ámbito global. Siempre que se encuentre esta propiedad, deberá imprimir / devolver un valor verdadero. Si no se encuentra la propiedad, se imprimirá / devolverá un valor falso. El problema: cuando intentas acceder a una propiedad en un objeto no existente, tu programa debería arrojar cualquier tipo de error¹.

Para hacer las cosas un poco más fáciles, puede suponer que la entrada siempre será [a-z.], nunca estará vacía, nunca tendrá repeticiones .y nunca comenzará o terminará con a .. Entonces codegolf.es una entrada inválida.

Casos de prueba

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

Este es el , el código más corto en bytes gana

¹ si (y sólo si) el idioma de su elección no admite errores en absoluto , debe algo de salida que deja claro que esto es un error. Por ejemplo, si usa 1 para verdadero y 0 para falso, puede usar "e" para un error. Sea consistente en sus valores de retorno y explique el comportamiento en su publicación.

Bassdrop Cumberwubwubwub
fuente
1
Siento foo => Errorque sería más apropiado.
Urna mágica del pulpo
solicitud para agregar codegolf.coma los casos de prueba para descartar codegolf(.stackexchange)?(.com)?$verificaciones de tipo
colsw
Otro caso de prueba que falta:foo.stackexchange.com
Jamie
@carusocomputing No. Piensa en JavaScript. foovolvería undefined, pero no arrojaría un error. foo.bararrojaría un error porque foono está definido.
mbomb007
1
@carusocomputing Es cierto, pero no se puede decir que es "más apropiado", cuando tiene sentido en ambos sentidos. codegolf.foo => 0, De modo foo => 0.
mbomb007

Respuestas:

8

JavaScript, 135 bytes

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

Se modificó el primer intento para evitar que las claves integradas sean accesibles, en este punto será mejor usar un enfoque diferente, pero ¡oye!

Devuelve verdadero para válido, falso para faltante y errores por error.

Skorm
fuente
4

JavaScript (ES6), 87 bytes

Devoluciones false/ trueo lanzamientos ReferenceError.

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

Versión probabilística, 78 bytes (no competitiva)

Debido a que se garantiza que todas las propiedades coinciden [a-z], podemos probar esto:

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

Además del hecho de que 587es primo y conduce a valores bastante cortos para las palabras que nos interesan, esta es una opción de módulo bastante aleatoria.

Aunque supera todos los casos de prueba, es probable que arroje falsos positivos.

Arnauld
fuente
3

Lote, 269 231 bytes

@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

Toma entrada en STDIN; arroja un error de sintaxis para una propiedad no válida. Funciona mediante el uso wcomo una máquina de estado. Si wtermina con un, .esto significa que el siguiente acceso a la propiedad no es válido. Editar: se guardaron 17 bytes usando el error de sintaxis para abortar el script por lotes. Ahorré 21 bytes al darme cuenta de que una de mis asignaciones podría ser incondicional.

Neil
fuente
2

Javascript, 84 82 bytes

No es lo suficientemente corto como para ganar, pero como soy un principiante, pensé que sería divertido compartirlo. Tal vez alguien tiene una sugerencia para mejorar.

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

Pasa todas las pruebas en la pregunta, regresa true valor existente, falseno existe y arroja un error si intenta obtener una propiedad de una variable no existente o no objeto. Sin embargo, ahora me doy cuenta de que esta solución también tiene algunos problemas. Como señaló @Florent en los comentarios, devuelve verdadero cuando .toStringse llaman propiedades de prototipo de cadena como .

Editar : 2 bytes más cortos gracias a @MamaFunRoll

Fragmento de prueba:

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
fuente
{"mensaje": "No se puede obtener la propiedad 'barra' de referencia indefinida o nula", "nombre de archivo": " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP
@RosLuP No estoy seguro de lo que quieres decir con este comentario. Se supone que la función arroja un error paracodegolf.foo.bar
tjespe
que todo está bien para todos ustedes ... pero para mí el error "tirar" es un error
RosLuP
1
.split('.')-> split`.`Bienvenido!
Mama Fun Roll
1
No funciona. f("codegolf.toString") Debería volver false. f("codegolf.toString.toString")debería tirar.
Florent
1

JavaScript, 173 bytes

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}

Funciona con IE 10, por lo que debería funcionar en los principales navegadores modernos.

Pruébalo aquí (+ sin golf)

Molesto
fuente
2
Podría ser mucho más golf: 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 Creo que está tratando de permitir que funcione en IE10, etc., por lo que no tiene funciones de flecha ni parámetros predeterminados.
Conor O'Brien
+1 para una gran respuesta, +1 para e="e", pero -1 para IE 10.
NoOneIsHere
1

C #, 155 bytes

No iba a ser el más corto, pero pensé que sería divertido intentarlo en 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;}
  • Divide la cadena y reversa itera a través del resultado.
  • Un elemento no coincidente con más de 1 iteración de profundidad, errores (arrojando un IndexOutOfRangeExceptionacceso a un carácter en la posición -1 en la cadena).
  • De lo contrario, devuelve falso si alguno de los elementos no coincide.

.NET Fiddle

Jamie
fuente
1

Ruby, 84 80 bytes

Función anónima que devuelve trueo false, o se divide por cero para generar un error:

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

Pruébalo en línea

daniero
fuente
1

C, 98 112 113 bytes

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

sin golf

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

para el siguiente tiene que seg culpa

f(codegolf.stackexchage.com.foo)
f(foo.bar)
f(foo.bar.baz)
f(codegolf.foo.bar)
f(foo.v)
RosLuP
fuente
¿Qué pasa con los errores? f(codegolf.stackexchage.com.foo)debería error, no volver 0, por ejemplo.
Jonathan Allan
No entiendo completamente por qué mi entrada en lenguaje C que tiene menos caracteres que C #, Java, Javascript, Python, Bathc, Javascript, tiene menos puntos (-1) que todos
RosLuP
Tal vez rechazaron el voto antes de que reparaste el error codegolf.stackexchange.com.foo, o no se dan cuenta de que lo arreglaste. Edite el encabezado para # C, <strike>98</strike> 112 bytes #dejar en claro que lo modificó.
Ray
3tampoco es un error, en C es lo que se considera un valor "verdadero". Vea esta meta publicación y este código .
Jonathan Allan
No uso excepciones, en caso de error, el programa devuelve 3. Debería ser -1 pero 3 guardar 1 carácter
RosLuP
0

Java, 187 138 bytes

Versión 2.0 ( 138 bytes): Idea robada descaradamente de @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;}

Versión 1.0 ( 187 bytes):

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

Explicación de la parte de devolución:

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
fuente