Imaginez cela, nous avons un environnement avec une portée globale contenant un seul objet, appelé codegolf
. Cet objet a un seul enfant appelé stackexchange
, qui a une propriété appelée com
.
Accéder à cette propriété ressemblerait codegolf.stackexchange.com
.
Le défi
L'entrée de votre programme / fonction sera une chaîne essayant d'accéder à une propriété sur la portée globale. Chaque fois que cette propriété est trouvée, vous devez imprimer / retourner une valeur véridique. Si la propriété n'est pas trouvée, une valeur falsifiée doit être imprimée / retournée. Le hic: lorsque vous essayez d'accéder à une propriété sur un objet inexistant, votre programme doit lancer n'importe quel type d'erreur¹.
Pour rendre les choses un peu plus faciles, vous pouvez supposer que l'entrée sera toujours [a-z.]
, elle ne sera jamais vide, elle n'aura jamais de répétition .
et elle ne commencera ni ne se terminera jamais par a .
. Il en codegolf.
va de même pour une entrée non valide.
Cas de test
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
Ceci est le code-golf , le code le plus court en octets gagne
¹ si (et seulement si) langue de votre choix ne supporte pas les erreurs du tout , vous devez quelque chose de sortie qui le rend clair que cela est une erreur. Par exemple, si vous utilisez 1 pour la vérité et 0 pour la fausse, vous pouvez utiliser "e" pour une erreur. Soyez cohérent dans vos valeurs de retour et expliquez le comportement dans votre message.
la source
foo => Error
serait plus approprié.codegolf.com
aux cas de test pour exclure lescodegolf(.stackexchange)?(.com)?$
vérifications de typefoo.stackexchange.com
foo
reviendraitundefined
, mais cela ne générerait pas d'erreur.foo.bar
lancerait une erreur carfoo
n'est pas défini.codegolf.foo => 0
, doncfoo => 0
.Réponses:
JavaScript, 135 octets
Retravaillé la première tentative pour empêcher l'accès aux clés intégrées, à ce stade, il vaudrait mieux utiliser une approche différente, mais bon!
Renvoie vrai pour valide, faux pour manquant et erreurs sur erreur.
la source
JavaScript (ES6), 87 octets
Renvoie
false
/true
ou jetteReferenceError
.Afficher l'extrait de code
Version probabiliste, 78 octets (non concurrent)
Parce que toutes les propriétés sont garanties pour correspondre
[a-z]
, nous pouvons essayer ceci:Mis à part le fait que
587
c'est un nombre premier et conduit à des valeurs plutôt courtes pour les mots qui nous intéressent, c'est un choix modulo plutôt aléatoire.Bien qu'il réussisse tous les cas de test, il est bien sûr susceptible de renvoyer des faux positifs.
Afficher l'extrait de code
la source
Lot,
269231 octetsPrend entrée sur STDIN; renvoie une erreur de syntaxe pour une propriété non valide. Fonctionne en utilisant
w
comme une machine d'état. Siw
se termine par un,.
cela signifie que le prochain accès à la propriété n'est pas valide. Modifier: 17 octets enregistrés en utilisant l'erreur de syntaxe pour abandonner le script de commandes. Enregistré 21 octets en réalisant que l'une de mes affectations pourrait être inconditionnelle.la source
Javascript,
8482 octetsPas assez court pour gagner, mais depuis que je suis débutant, j'ai pensé que ce serait amusant de le partager. Peut-être que quelqu'un a une suggestion d'amélioration.
Il passe tous les tests de la question, retourne
true
pour la valeur existante,false
pour inexistant et il renvoie une erreur si vous essayez d'obtenir une propriété d'une variable inexistante ou non objet. Cependant, je me rends compte maintenant que cette solution présente également certains problèmes. Comme indiqué par @Florent dans les commentaires, il renvoie true lorsque des propriétés de prototype de chaîne telles que.toString
sont appelées.Edit : 2 octets plus court grâce à @MamaFunRoll
Extrait de test:
la source
codegolf.foo.bar
.split('.')
->split`.`
Bienvenue!f("codegolf.toString")
devrait revenirfalse
.f("codegolf.toString.toString")
devrait jeter.JavaScript, 173 octets
Fonctionne avec IE 10, devrait donc fonctionner sur les principaux navigateurs modernes.
Essayez-le ici (+ non golfé)
la source
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 octets)e="e"
, mais -1 pour IE 10.C #, 155 octets
N'allait pas être le plus court mais pensait que ce serait amusant d'essayer en C # ...
IndexOutOfRangeException
en accédant à un char à -1 position dans la chaîne)..NET Fiddle
la source
Rubis,
8480 octetsFonction anonyme qui renvoie
true
oufalse
, ou divise par zéro pour générer une erreur:Essayez-le en ligne
la source
C,
98112113 octetsnon golfé
pour le ci-dessous, il doit seg faute
la source
f(codegolf.stackexchage.com.foo)
devrait erreur, pas retourner0
, par exemple.# C, <strike>98</strike> 112 bytes #
indiquer clairement que vous l'avez modifié.3
n'est pas une erreur non plus, en C c'est ce qui est considéré comme une valeur "véridique". Voir cette méta publication et ce code .Java,
187138octetsVersion 2.0 ( 138 octets): Idée volée sans vergogne à @Jamie.
Version 1.0 ( 187 octets):
Explication de la partie retour:
la source