codegolfオブジェクト


14

これを想像してください。1つのオブジェクトのみを含むグローバルスコープを持つ環境がありますcodegolf。このオブジェクトにはと呼ばれる1つの子があり、この子stackexchangeにはというプロパティがありますcom
このプロパティへのアクセスは次のようになりcodegolf.stackexchange.comます。

チャレンジ

プログラム/関数の入力は、グローバルスコープのプロパティにアクセスしようとする文字列になります。このプロパティが見つかった場合は常に、真実の値を印刷/返却するものとします。プロパティが見つからない場合、偽の値が印刷/返されます。キャッチ:存在しないオブジェクトのプロパティにアクセスしようとすると、プログラムはあらゆる種類のエラーをスローします¹。

物事を少し簡単にするために、入力は常に[a-z.]空であり、空になることはなく、繰り返しを持た.ず、で始まったり終わることはないと想定することができます.。だから、codegolf.無効な入力です。

テストケース

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

これは、バイト単位の最短コードが勝ちです

¹選択した言語がエラーをまったくサポートしていない場合(のみ)、これがエラーであることを明確にする何かを出力する必要があります。たとえば、真理に1を、偽に0を使用する場合、エラーに「e」を使用できます。戻り値に一貫性を持たせ、投稿の動作を説明してください。


1
foo => Errorもっと適切だと思う。
魔法のタコUr

型チェックcodegolf.comを除外するためにテストケースに追加するリクエストcodegolf(.stackexchange)?(.com)?$
-colsw

別の欠落したテストケース:foo.stackexchange.com
ジェイミー

@carusocomputingいや。JavaScriptについて考えてください。fooを返しundefinedますが、エラーはスローされません。foo.barfoo定義されていないため、エラーがスローされます。
mbomb007

1
@carusocomputing True。ただし、両方の意味で理にかなっている場合、「より適切」であるとは言えません。codegolf.foo => 0、そうfoo => 0
mbomb007

回答:


8

JavaScript、135バイト

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

組み込みのキーにアクセスできないようにする最初の試みを作り直しました。この時点で、異なるアプローチを使用する方が良いでしょうが、ちょっと!

有効な場合はtrue、行方不明の場合はfalse、エラーの場合はエラーを返します。


4

JavaScript(ES6)、87バイト

を返すfalse/ trueまたはスローしReferenceErrorます。

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

確率バージョン、78バイト(非競合)

すべてのプロパティが一致することが保証されているため[a-z]、これを試してみることができます。

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

587素数であり、興味のある単語の値がかなり短いという事実は別として、これはかなりランダムなモジュロ選択です。

すべてのテストケースに合格しますが、もちろん、偽陽性を返す可能性があります。


3

バッチ、269 231バイト

@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

STDINで入力を受け取ります。無効なプロパティに対して構文エラーをスローします。を使用して動作しますwステートマシンとして機能します。でw終わる場合、.これは次のプロパティアクセスが無効であることを意味します。編集:構文エラーを使用してバッチスクリプトを中止することにより、17バイトを保存しました。私の割り当ての1つが無条件である可能性があることを認識して、21バイトを節約しました。


2

Javascript、84 82バイト

勝つには十分ではありませんが、私は初心者なので、共有するのは楽しいと思いました。誰かが改善の提案をしているかもしれません。

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

質問内のすべてのテストに合格し、true既存の値を返し、存在falseしない場合は返します。存在しない変数またはオブジェクト以外の変数のプロパティを取得しようとすると、エラーがスローされます。ただし、このソリューションにはいくつかの問題があることもわかりました。コメントで@Florentが指摘したように、次のような文字列プロトタイププロパティの場合、trueを返します。.toStringが呼び出されると。

編集:@MamaFunRollのおかげで2バイト短縮

テストスニペット:

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


{「メッセージ」:「未定義またはnull参照のプロパティ「バー」を取得できません」、「ファイル名」:「stacksnippets.net/js」、「lineno」:1、「colno」:37}
RosLuP

@RosLuPこのコメントの意味がわかりません。関数は、次のエラーをスローすることになっていますcodegolf.foo.bar
tjespe

すべてのあなたのために大丈夫...よりも...しかし、私にとって「スロー」エラーは1つのエラーです
-RosLuP

1
.split('.')-> split`.`ようこそ!
ママファンロール

1
動作しません。f("codegolf.toString") 返す必要がありfalseます。f("codegolf.toString.toString")スローする必要があります。
フローレント

1

JavaScript、173バイト

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}

IE 10で動作するため、主要な最新のブラウザーで動作するはずです。

ここで試してください(+ ungolfed)


2
もっとゴルフができるかもしれません: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バイト)
フロレント

@Florent彼はIE10などで動作するようにしようとしていると思うので、矢印関数やデフォルトパラメータはありません。
コナーオブライエン

+1が素晴らしい回答、+ 1がe="e"、IE -1が-1
NoOneIsHere

1

C#、155バイト

最短ではありませんでしたが、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;}
  • 文字列を分割し、結果を逆順に繰り返します。
  • 反復の深さが1を超える不一致要素、エラー(IndexOutOfRangeException文字列の-1位置にあるcharにアクセスしてスロー)。
  • それ以外の場合、要素が一致しなかった場合はfalseを返します。

.NETフィドル


1

ルビー、84 80バイト

trueまたはを返すfalse、またはゼロで除算してエラーを発生させる無名関数:

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

オンラインで試す


1

C、98 112 113バイト

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(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(codegolf.stackexchage.com.foo)
f(foo.bar)
f(foo.bar.baz)
f(codegolf.foo.bar)
f(foo.v)

エラーはどうですか?たとえば、f(codegolf.stackexchage.com.foo)returnではなくエラーになります0
ジョナサンアラン

C#、Java、Javascript、python、Bathc、Javascriptよりも文字数が少ないC言語エントリが、誰よりも少ないポイント(-1)を持っている理由を完全に理解していない
-RosLuP

codegolf.stackexchange.com.fooエラーを修正する前にダウン票を投じたか、修正したことに気付かない可能性があります。ヘッダーを編集して、# C, <strike>98</strike> 112 bytes #変更したことを明確にします。
レイ

3エラーでもありません。Cでは、「真の」値と見なされます。このメタ投稿このコードをご覧ください。
ジョナサンアラン

私はする必要がありますエラープログラムの戻り3の場合には、例外を使用-1が、3 1のセーブ文字ではない
RosLuP

0

Java、187138バイト

バージョン2.0(138バイト):@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;}

バージョン1.0(187バイト):

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

返品部分の説明:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.