Imagine isso, temos um ambiente com um escopo global contendo apenas um único objeto, chamado codegolf
. Este objeto tem um único filho chamado stackexchange
, que possui uma propriedade chamada com
.
Acessar esta propriedade seria semelhante codegolf.stackexchange.com
.
O desafio
A entrada do seu programa / função será uma string tentando acessar uma propriedade no escopo global. Sempre que essa propriedade for encontrada, você deverá imprimir / retornar um valor verdadeiro. Se a propriedade não for encontrada, um valor falso será impresso / retornado. O problema: quando você tenta acessar uma propriedade em um objeto inexistente, seu programa deve gerar qualquer tipo de erro¹.
Para facilitar um pouco as coisas, você pode assumir que a entrada sempre será [a-z.]
, nunca estará vazia, nunca terá repetições .
e nunca começará ou terminará com a .
. Assim codegolf.
é uma entrada inválida.
Casos de teste
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 é o código-golfe , o código mais curto em bytes ganha
¹ se (e somente se) o seu idioma de escolha não suporta erros em tudo , você deve imprimir algo que deixa claro que este é um erro. Por exemplo, se você usar 1 para verdade e 0 para falsidade, poderá usar "e" para um erro. Seja consistente com seus valores de retorno e explique o comportamento em sua postagem.
fonte
foo => Error
seria mais apropriado.codegolf.com
aos casos de teste para descartarcodegolf(.stackexchange)?(.com)?$
verificações de tipofoo.stackexchange.com
foo
retornariaundefined
, mas não causaria um erro.foo.bar
lançaria um erro porquefoo
não está definido.codegolf.foo => 0
entãofoo => 0
.Respostas:
JavaScript, 135 bytes
Retrabalhada a primeira tentativa de impedir o acesso às chaves internas, neste momento será melhor usar uma abordagem diferente, mas ei!
Retorna verdadeiro para válido, falso para ausente e erros em erro.
fonte
JavaScript (ES6), 87 bytes
Retorna
false
/true
ou jogaReferenceError
.Mostrar snippet de código
Versão probabilística, 78 bytes (não concorrente)
Como todas as propriedades são garantidas para corresponder
[a-z]
, podemos tentar:Além do fato de
587
ser primo e levar a valores bastante curtos para as palavras em que estamos interessados, essa é uma opção de módulo bastante aleatória.Embora seja aprovado em todos os casos de teste, é provável que retorne falsos positivos.
Mostrar snippet de código
fonte
Lote,
269231 bytesRecebe entrada em STDIN; gera um erro de sintaxe para uma propriedade inválida. Funciona usando
w
como uma máquina de estado. Sew
terminar com um,.
significa que o próximo acesso à propriedade é inválido. Editar: salvou 17 bytes usando o erro de sintaxe para abortar o script em lote. Economizei 21 bytes ao perceber que uma de minhas atribuições pode ser incondicional.fonte
Javascript,
8482 bytesNão é curto o suficiente para vencer, mas, como sou iniciante, pensei que seria divertido compartilhá-lo. Talvez alguém tenha uma sugestão de melhoria.
Ele passa em todos os testes da pergunta, retorna
true
para o valor existente,false
para inexistente e gera um erro se você tentar obter uma propriedade de uma variável inexistente ou sem objeto. No entanto, agora percebo que esta solução também apresenta alguns problemas. Conforme apontado por @Florent nos comentários, ele retorna true quando propriedades de protótipo de string, como.toString
são chamadas.Editar : 2 bytes mais curto graças a @MamaFunRoll
Snippet de teste:
fonte
codegolf.foo.bar
.split('.')
->split`.`
Bem vindo!f("codegolf.toString")
deve retornarfalse
.f("codegolf.toString.toString")
deve jogar.JavaScript, 173 bytes
Funciona com o IE 10, portanto, deve funcionar nos principais navegadores modernos.
Experimente aqui (+ não destruído)
fonte
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)e="e"
, mas -1 para IE 10.C #, 155 bytes
Não seria o mais curto, mas achei que seria divertido tentar em C # ...
IndexOutOfRangeException
acessando um caracter na posição -1 na sequência)..NET Fiddle
fonte
Ruby,
8480 bytesFunção anônima que retorna
true
oufalse
, ou divide por zero para gerar erro:Experimente online
fonte
C,
98112113 bytesdestroçado
para o abaixo tem que seg falha
fonte
f(codegolf.stackexchage.com.foo)
deve erro, não retornar0
, por exemplo.# C, <strike>98</strike> 112 bytes #
para deixar claro que você o modificou.3
também não é um erro, em C é o que é considerado um valor "verdadeiro". Veja este meta post e este código .Java,
187138 bytesVersão 2.0 ( 138 bytes): Idéia roubada descaradamente do @Jamie.
Versão 1.0 ( 187 bytes):
Explicação da peça de devolução:
fonte