Об'єкт кодогольфа


14

Уявіть собі, у нас є середовище з глобальним розмахом, що містить лише один об'єкт, зване codegolf. Цей об’єкт має єдину дитину stackexchange, яка називається , яка має властивість називатися com.
Доступ до цього ресурсу виглядав би так codegolf.stackexchange.com.

Змагання

Вхід вашої програми / функції буде рядком, який намагається отримати доступ до властивості в глобальному масштабі. Щоразу, коли ця властивість буде знайдена, ви повинні надрукувати / повернути триєдине значення. Якщо властивість не знайдено, фальшиве значення надрукується / повернеться. Улов: коли ви намагаєтеся отримати доступ до властивості на неіснуючому об'єкті, ваша програма повинна видавати будь-які помилки¹.

Щоб зробити щось простіше, ви можете припустити, що введення завжди буде [a-z.], воно ніколи не буде порожнім, у нього ніколи не буде повторення ., і він ніколи не починається і не закінчується символом a .. Так 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було б доречніше.
Чарівний восьминога Урна

прохання додати codegolf.comдо тестових випадків, щоб виключити перевірку codegolf(.stackexchange)?(.com)?$типів
colsw

Ще один зниклий тестовий випадок:foo.stackexchange.com
Джеймі

@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/ 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 байт за допомогою синтаксичної помилки для переривання пакетного сценарію. Збережено 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 "властивості невизначеної або нульової посилання", " name file " : " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP

@RosLuP Я не впевнений, що ти маєш на увазі під цим коментарем. Ця функція повинна codegolf.foo.bar
призвести

ніж все добре для всіх вас ... але для мене помилка "кидання" - одна помилка
RosLuP

1
.split('.')-> split`.`Ласкаво просимо!
Mama Fun Roll

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, тому має працювати над основними сучасними браузерами.

Спробуйте тут (+ невольф)


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 тощо, тому немає функцій зі стрілками або параметрів за замовчуванням.
Conor O'Brien

+1 за чудову відповідь, +1 за e="e", але -1 для IE 10.
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 у рядку).
  • В іншому випадку повертається false, якщо будь-які елементи не збігаються.

.NET Fiddle



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)повинна помилитися, а не повертатися 0, наприклад.
Джонатан Аллан

я не повністю розумію, чому мій запис мови C, який містить менше символів, ніж C #, Java, Javascript, python, Bathc, Javascript, має менше балів (-1), ніж усі
RosLuP

Можливо, вони подали заявку перед тим, як ви виправили помилку codegolf.stackexchange.com.foo, або вони не усвідомлюють, що ви її виправили. Відредагуйте заголовок, щоб # C, <strike>98</strike> 112 bytes #зрозуміти, що ви його змінили.
Рей

3також не є помилкою, в C це те, що вважається значенням "truthy". Дивіться цей мета-пост і цей код .
Джонатан Аллан

Я не використовую винятки, у разі повернення програми помилки 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.