Объект 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было бы более подходящим.
Волшебная Осьминог Урна

просьба добавить codegolf.comв тестовые codegolf(.stackexchange)?(.com)?$
наборы,

Еще один пропущенный тестовый пример:foo.stackexchange.com
Джейми

@carusocomputing Нет. Подумайте о JavaScript. fooвернется undefined, но не выдаст ошибку. foo.barвыдаст ошибку, потому что fooне определено.
mbomb007

1
@carusocomputing Правда, но вы не можете сказать, что это «более уместно», когда это имеет смысл в обоих направлениях. 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 байтов сохранены с помощью синтаксической ошибки для прерывания пакетного сценария. Сэкономил 21 байт, осознав, что одно из моих назначений может быть безусловным.


2

Javascript, 84 82 байта

Недостаточно коротка, чтобы победить, но, поскольку я новичок, я подумала, что было бы интересно поделиться этим. Может быть, у кого-то есть предложения по улучшению.

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

Он проходит все тесты в вопросе, возвращает trueдля существующего значения, falseдля несуществующего, и выдает ошибку, если вы пытаетесь получить свойство для несуществующей или не-объектной переменной. Однако теперь я понимаю, что у этого решения также есть некоторые проблемы. Как указано @Florent в комментариях, он возвращает true, когда .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' с неопределенной или нулевой ссылкой", "filename": " stacksnippets.net/js ", "lineno": 1, "colno": 37}
RosLuP

@RosLuP Я не уверен, что вы подразумеваете под этим комментарием. Функция должна codegolf.foo.bar
выдавать

чем все ок для всех вас ... но для меня "выкинуть" ошибку - это одна ошибка
РосЛуП

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 и т. Д., Поэтому нет функций стрелок или параметров по умолчанию.
Конор О'Брайен

+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

Рубин, 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

для нижеследующего он должен быть неисправен

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это тоже не ошибка, в Си это то, что считается «истинным» значением. Смотрите этот мета-пост и этот код .
Джонатан Аллан

Я не использую исключения, в случае ошибки программа возвращает 3. Должно быть -1, но 3 сохранить 1 символ
RosLuP

0

Ява, 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.