วัตถุ codegolf


14

codegolfลองนึกภาพนี้เรามีสภาพแวดล้อมที่มีขอบเขตทั่วโลกที่มีเพียงวัตถุเดียวที่เรียกว่า วัตถุนี้มีเด็กเดียวที่เรียกว่าซึ่งมีคุณสมบัติที่เรียกว่า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จะเหมาะสมกว่า
Magic Octopus Urn

ขอเพิ่มcodegolf.comในกรณีทดสอบเพื่อออกกฎการcodegolf(.stackexchange)?(.com)?$ตรวจสอบประเภท
colsw

อีกกรณีทดสอบที่ขาดหายไป:foo.stackexchange.com
Jamie

@carusocomputing Nope คิดเกี่ยวกับ JavaScript fooจะกลับมาundefinedแต่มันจะไม่ผิดพลาด foo.barจะโยนข้อผิดพลาดเพราะfooไม่ได้กำหนดไว้
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))

ทำใหม่ในความพยายามครั้งแรกเพื่อป้องกันไม่ให้มีการเข้าถึงกุญแจในตัว ณ จุดนี้มันจะดีกว่าที่จะใช้วิธีการที่แตกต่างกัน แต่เฮ้!

ผลตอบแทนจริงสำหรับที่ถูกต้องเท็จสำหรับขาดหายไปและข้อผิดพลาดจากข้อผิดพลาด


4

JavaScript (ES6), 87 ไบต์

ผลตอบแทนfalse/ หรือพ่นtrueReferenceError

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 ไบต์โดยใช้ข้อผิดพลาดทางไวยากรณ์เพื่อยกเลิกสคริปต์ชุดงาน บันทึกแล้ว 21 ไบต์ด้วยการตระหนักว่าหนึ่งในการมอบหมายของฉันอาจไม่มีเงื่อนไข


2

Javascript, 84 82 ไบต์

ไม่สั้นพอที่จะชนะ แต่เนื่องจากฉันเป็นมือใหม่ฉันคิดว่ามันคงจะสนุกที่จะแบ่งปัน อาจมีบางคนมีข้อเสนอแนะสำหรับการปรับปรุง

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

มันผ่านการทดสอบทั้งหมดในคำถามส่งคืนtrueค่าที่มีอยู่falseสำหรับไม่มีอยู่จริงและส่งข้อผิดพลาดหากคุณพยายามรับคุณสมบัติของตัวแปรที่ไม่มีอยู่หรือไม่มีวัตถุ อย่างไรก็ตามตอนนี้ฉันรู้ว่าวิธีนี้มีปัญหาเช่นกัน ดังที่ชี้แจงโดย @Florent ในความคิดเห็นมันจะคืนค่าจริงเมื่อคุณสมบัติสตริงต้นแบบเช่น.toStringถูกเรียก

แก้ไข : สั้นลง 2 ไบต์ด้วย @MamaFunRoll

ตัวอย่างข้อมูลทดสอบ:

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": "ไม่สามารถรับคุณสมบัติ 'bar' ของการอ้างอิงที่ไม่ได้กำหนดหรือ null ได้", "filename": " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP

@RosLuP ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยความคิดเห็นนี้ ฟังก์ชั่นควรจะโยนข้อผิดพลาดสำหรับcodegolf.foo.bar
tjespe

กว่าทั้งหมดตกลงสำหรับคุณ ... แต่สำหรับฉัน "โยน" ข้อผิดพลาดเป็นข้อผิดพลาดหนึ่ง
RosLuP

1
.split('.')-> split`.`ยินดีต้อนรับ!
Mama Fun Roll

1
ไม่ทำงาน, ไม่เป็นผล. ควรกลับf("codegolf.toString") ควรโยน falsef("codegolf.toString.toString")
Florent

1

จาวาสคริปต์, 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 bytes)
Florent

@ เพิ่มเติมฉันคิดว่าเขาพยายามอนุญาตให้ทำงานบน IE10 เป็นต้นดังนั้นจึงไม่มีฟังก์ชั่นลูกศรหรือพารามิเตอร์เริ่มต้น
Conor O'Brien

+1 สำหรับคำตอบที่ดี +1 สำหรับe="e"แต่ -1 สำหรับ IE 10
ใครที่นี่

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 ในสตริง)
  • มิฉะนั้นส่งคืน false ถ้าองค์ประกอบใดไม่ตรงกัน

. ซอ


1

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

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

สำหรับด้านล่างจะต้องมีความผิด seg

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

ข้อผิดพลาดคืออะไร f(codegolf.stackexchage.com.foo)ควรมีข้อผิดพลาดไม่กลับมา0ตัวอย่างเช่น
Jonathan Allan

ฉันไม่เข้าใจว่าทำไมรายการภาษา C ของฉันที่เป็นตัวอักษรน้อยกว่า C #, Java, JavaScript, หลาม Bathc, JavaScript, มีจุดน้อย (-1) กว่าคน
RosLuP

บางทีพวกเขาอาจถูกแก้ไขก่อนที่คุณจะแก้ไขข้อผิดพลาดของ codegolf.stackexchange.com.foo หรือพวกเขาไม่ทราบว่าคุณได้แก้ไข แก้ไขส่วนหัวเป็น# C, <strike>98</strike> 112 bytes #เพื่อให้ชัดเจนว่าคุณแก้ไข
เรย์

3ไม่ใช่ข้อผิดพลาดอย่างใดอย่างหนึ่งใน C มันเป็นสิ่งที่ถือว่าเป็นค่า ดูโพสต์เมตานี้และรหัสนี้
Jonathan Allan

ฉันไม่ใช้ข้อยกเว้นในกรณีที่ข้อผิดพลาดของโปรแกรมส่งคืน 3 ควรเป็น -1 แต่ 3 บันทึก 1 ตัวอักษร
RosLuP

0

Java, 187 138 ไบต์

เวอร์ชัน 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.