Stellen Sie sich vor, wir haben eine Umgebung mit einem globalen Gültigkeitsbereich, der nur ein einzelnes Objekt namens enthält codegolf
. Dieses Objekt hat ein einzelnes Kind stackexchange
, das eine Eigenschaft namens hat com
.
Der Zugriff auf diese Eigenschaft würde so aussehen codegolf.stackexchange.com
.
Die Herausforderung
Die Eingabe Ihres Programms / Ihrer Funktion ist eine Zeichenfolge, die versucht, auf eine Eigenschaft im globalen Bereich zuzugreifen. Immer wenn diese Eigenschaft gefunden wird, müssen Sie einen Wahrheitswert drucken / zurückgeben. Wird die Eigenschaft nicht gefunden, wird ein falscher Wert gedruckt / zurückgegeben. Der Haken: Wenn Sie versuchen, auf eine Eigenschaft eines nicht vorhandenen Objekts zuzugreifen, sollte Ihr Programm einen Fehler auslösen¹.
Um die Sache ein bisschen einfacher zu machen, können Sie davon ausgehen, dass die Eingabe immer [a-z.]
, niemals leer, niemals wiederholt .
und niemals mit einem beginnen oder enden wird .
. Socodegolf.
also eine ungültige Eingabe.
Testfälle
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
Das ist Code-Golf , der kürzeste Code in Bytes gewinnt
¹ , wenn (und nur dann) die Sprache Ihrer Wahl unterstützen Fehler nicht bei allen , müssen Sie Ausgabe etwas , was deutlich macht , dass dies ein Fehler ist. Wenn Sie zum Beispiel 1 für wahr und 0 für falsch verwenden, können Sie "e" für einen Fehler verwenden. Seien Sie in Ihren Rückgabewerten konsistent und erklären Sie das Verhalten in Ihrem Beitrag.
quelle
foo => Error
angemessener.codegolf.com
zu den Testfällen hinzuzufügen , umcodegolf(.stackexchange)?(.com)?$
Typprüfungen auszuschließenfoo.stackexchange.com
foo
würde zurückkehrenundefined
, aber es würde keinen Fehler auslösen.foo.bar
würde einen Fehler auslösen, dafoo
nicht definiert.codegolf.foo => 0
sofoo => 0
.Antworten:
JavaScript, 135 Byte
Der erste Versuch, den Zugriff auf integrierte Schlüssel zu verhindern, wurde überarbeitet. An diesem Punkt ist es besser, einen anderen Ansatz zu verwenden, aber hey!
Gibt true für valid, false für missing und error für error zurück.
quelle
JavaScript (ES6), 87 Byte
Gibt zurück
false
/true
oder wirftReferenceError
.Code-Snippet anzeigen
Probabilistische Version, 78 Bytes (nicht konkurrierend)
Da alle Eigenschaften garantiert übereinstimmen
[a-z]
, können wir Folgendes ausprobieren:Abgesehen davon, dass
587
eine Primzahl ist und zu relativ kurzen Werten für die Wörter führt, an denen wir interessiert sind, ist dies eine eher zufällige Modulo-Wahl.Obwohl es alle Testfälle besteht, ist es wahrscheinlich, dass es falsch-positive Ergebnisse liefert.
Code-Snippet anzeigen
quelle
Batch,
269231 BytesÜbernimmt die Eingabe für STDIN; Löst einen Syntaxfehler für eine ungültige Eigenschaft aus. Funktioniert unter Verwendung
w
als Zustandsmaschine. Wennw
endet mit a.
bedeutet dies, dass der nächste Eigenschaftszugriff ungültig ist. Bearbeiten: Speichert 17 Bytes, indem der Syntaxfehler zum Abbrechen des Stapelskripts verwendet wird. 21 Bytes gespart durch die Erkenntnis, dass eine meiner Aufgaben bedingungslos sein kann.quelle
Javascript,
8482 BytesNicht kurz genug, um zu gewinnen, aber da ich ein Anfänger bin, dachte ich, es würde Spaß machen, es zu teilen. Vielleicht hat jemand einen Verbesserungsvorschlag.
Es besteht alle Tests in der Frage, gibt
true
für vorhandenen Wert zurück,false
für nicht vorhanden zurück und gibt einen Fehler aus, wenn Sie versuchen, eine Eigenschaft einer nicht vorhandenen oder nicht objektbezogenen Variablen abzurufen. Jetzt ist mir jedoch klar, dass diese Lösung auch einige Probleme hat. Wie von @Florent in den Kommentaren hervorgehoben, wird true zurückgegeben, wenn String-Prototyp-Eigenschaften wie.toString
aufgerufen werden.Bearbeiten : 2 Bytes kürzer dank @MamaFunRoll
Testschnipsel:
quelle
codegolf.foo.bar
.split('.')
->split`.`
Willkommen!f("codegolf.toString")
sollte zurückkehrenfalse
.f("codegolf.toString.toString")
sollte werfen.JavaScript, 173 Bytes
Funktioniert mit IE 10, sollte also auf den wichtigsten modernen Browsern funktionieren.
Probieren Sie es hier (+ ungolfed)
quelle
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"
, aber -1 für IE 10.155 Bytes
Wäre nicht die kürzeste, aber ich dachte, es würde Spaß machen, es in C # auszuprobieren ...
IndexOutOfRangeException
Zeichens durch Zugreifen auf ein Zeichen an der Position -1 in der Zeichenfolge)..NET Geige
quelle
Rubin,
8480 BytesAnonyme Funktion, die
true
oder zurückgibt oderfalse
durch Null dividiert, um einen Fehler auszulösen:Probieren Sie es online aus
quelle
C
98112113 Bytesungolfed
für das unten stehende muss es seg fehler geben
quelle
f(codegolf.stackexchage.com.foo)
sollte Fehler nicht zurückkehren0
, zum Beispiel.# C, <strike>98</strike> 112 bytes #
um zu verdeutlichen, dass Sie sie geändert haben.3
ist auch kein Fehler, in C ist es das, was als "wahrer" Wert angesehen wird. Siehe diesen Meta-Beitrag und diesen Code .Java,
187138 BytesVersion 2.0 ( 138 Bytes): Idee schamlos von @Jamie gestohlen.
Version 1.0 ( 187 Byte):
Erklärung des Rückgabeteils:
quelle