Das Codegolf-Objekt


14

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 , 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.


1
Ich fühle mich foo => Errorangemessener.
Magic Octopus Urn

Bitte, codegolf.comzu den Testfällen hinzuzufügen , um codegolf(.stackexchange)?(.com)?$Typprüfungen auszuschließen
colsw

Ein weiterer fehlender Testfall:foo.stackexchange.com
Jamie

@carusocomputing Nein. Denken Sie an JavaScript. foowürde zurückkehren undefined, aber es würde keinen Fehler auslösen. foo.barwürde einen Fehler auslösen, da foonicht definiert.
mbomb007

1
@carusocomputing Stimmt, aber man kann nicht sagen, dass es "angemessener" ist, wenn es in beide Richtungen Sinn macht. codegolf.foo => 0so foo => 0.
mbomb007

Antworten:


8

JavaScript, 135 Byte

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

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.


4

JavaScript (ES6), 87 Byte

Gibt zurück false/ trueoder wirft ReferenceError.

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

Probabilistische Version, 78 Bytes (nicht konkurrierend)

Da alle Eigenschaften garantiert übereinstimmen [a-z], können wir Folgendes ausprobieren:

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

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.


3

Batch, 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

Übernimmt die Eingabe für STDIN; Löst einen Syntaxfehler für eine ungültige Eigenschaft aus. Funktioniert unter Verwendung wals Zustandsmaschine. Wenn wendet 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.


2

Javascript, 84 82 Bytes

Nicht 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.

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

Es besteht alle Tests in der Frage, gibt truefü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 .toStringaufgerufen werden.

Bearbeiten : 2 Bytes kürzer dank @MamaFunRoll

Testschnipsel:

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": "Eigenschaftsleiste mit undefiniertem oder ungültigem Verweis kann nicht abgerufen werden ", "filename": " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP

@ RosLuP Ich bin mir nicht sicher, was du mit diesem Kommentar meinst. Die Funktion soll einen Fehler fürcodegolf.foo.bar
tjespe 30.11.16

als alle ok für alle du ... aber für mich "werfen" Fehler ist ein Fehler
RosLuP

1
.split('.')-> split`.`Willkommen!
Mama Fun Roll

1
Funktioniert nicht. f("codegolf.toString") sollte zurückkehren false. f("codegolf.toString.toString")sollte werfen.
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}

Funktioniert mit IE 10, sollte also auf den wichtigsten modernen Browsern funktionieren.

Probieren Sie es hier (+ ungolfed)


2
Könnte viel mehr Golf sein: 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 Ich denke, er versucht, es auf IE10 usw. arbeiten zu lassen, also keine Pfeilfunktionen oder Standardparameter.
Conor O'Brien

+1 für eine gute Antwort, +1 für e="e", aber -1 für IE 10.
NoOneIsHere

1

155 Bytes

Wäre nicht die kürzeste, aber ich dachte, es würde Spaß machen, es in C # auszuprobieren ...

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;}
  • Teilt die Zeichenfolge und durchläuft das Ergebnis in umgekehrter Reihenfolge.
  • Ein nicht passendes Element mehr als 1 Iteration tief, Fehler (werfen ein IndexOutOfRangeException Zeichens durch Zugreifen auf ein Zeichen an der Position -1 in der Zeichenfolge).
  • Andernfalls wird false zurückgegeben, wenn Elemente nicht übereinstimmen.

.NET Geige


1

Rubin, 84 80 Bytes

Anonyme Funktion, die trueoder zurückgibt oder falsedurch Null dividiert, um einen Fehler auszulösen:

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

Probieren Sie es online aus


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

ungolfed

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

für das unten stehende muss es seg fehler geben

f(codegolf.stackexchage.com.foo)
f(foo.bar)
f(foo.bar.baz)
f(codegolf.foo.bar)
f(foo.v)

Was ist mit den Fehlern? f(codegolf.stackexchage.com.foo)sollte Fehler nicht zurückkehren 0, zum Beispiel.
Jonathan Allan

Ich verstehe nicht ganz, warum mein C-Sprache-Eintrag, der weniger Zeichen als C #, Java, Javascript, Python, Bathc, Javascript ist, weniger Punkte (-1) als jeder
andere hat

Vielleicht haben sie einen Downvot durchgeführt, bevor Sie den Fehler codegolf.stackexchange.com.foo behoben haben, oder sie haben nicht bemerkt, dass Sie ihn behoben haben. Bearbeiten Sie die Kopfzeile, # C, <strike>98</strike> 112 bytes #um zu verdeutlichen, dass Sie sie geändert haben.
Ray

3ist auch kein Fehler, in C ist es das, was als "wahrer" Wert angesehen wird. Siehe diesen Meta-Beitrag und diesen Code .
Jonathan Allan

Ich benutze keine Ausnahmen, im Falle eines Fehlers wird Programm 3 zurückgegeben. Sollte -1 sein, aber 3, 1 Zeichen speichern
RosLuP

0

Java, 187 138 Bytes

Version 2.0 ( 138 Bytes): Idee schamlos von @Jamie gestohlen.

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

Version 1.0 ( 187 Byte):

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

Erklärung des Rückgabeteils:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.