Это ограбление?
Предыстория
У вас есть крошечный ювелирный магазин в пригороде города. Пригороды слишком перенаселены, поэтому ваш магазин имеет толщину только одного символа, чтобы поместиться на оживленных улицах.
В последнее время в окрестностях было много случаев ограбления, и вы опасаетесь, что грабители также придут за вашей наградой.
Поэтому вы установили камеры наблюдения, чтобы заботиться о магазине. Но есть одна большая проблема: камеры не издают звуковой сигнал и не срабатывают .
Вы сами решаете запрограммировать охранную сигнализацию. Это завершит создание хитроумных приспособлений и (надеюсь) сделает ваш магазинчик безопасным и надежным.
Задача
Ваши камеры наблюдения отобразят ваш магазин следующим образом:
WI J E WЭто ваш ввод, который вы можете взять из STDIN или из аргументов командной строки. Каждая из букв имеет разное значение.
- W представляет собой стену . Грабители и злоумышленники не могут пройти через них.
- E означает сотрудников . Это существа, которых распознают камеры. Если они увидят злоумышленника, они немедленно включат сигнализацию, прежде чем грабители смогут что-либо сделать. (Они могут видеть злоумышленника, если между ними нет стены , драгоценного камня , злоумышленника или другого сотрудника ). Они также склонны стоять на месте.
- J означает драгоценности . Это то, что ищут грабители и злоумышленники.
- Я имею в виду нарушителя . Скорее всего, это грабители. Их цель - украсть (хотя бы одну из) драгоценностей из магазина.
- Конечно, вы можете создать свою собственную легенду карты для экономии байтов кода.
На основе входных данных вам необходимо написать программу (или функцию), которая выполняет следующие действия:
- Если злоумышленник может свободно взять в руки драгоценность ИЛИ сотрудник может увидеть злоумышленника :
- Выведите истинное значение. («1», «Верно», «Предупреждение»)
- Чтобы быть полностью внимательными, выведите символ колокольчика ASCII. (Это имеет ASCII - код 7. При печати, он играет Ting звука на большом количестве компьютеров и реализаций)
- В большинстве реализаций не может быть звука звонка , поэтому будьте осторожны!
- В некоторых случаях, когда колокол абсолютно не может быть напечатан, выведите вместо него восклицательный знак ('!'). (Печать восклицательных знаков может быть труднее реализовать на некоторых языках)
- Остальное:
- Выведите ложное значение. («0», «Ложь», «Тихо»)
- Если злоумышленник может свободно взять в руки драгоценность ИЛИ сотрудник может увидеть злоумышленника :
Магазин не зацикливается .
Хорошо, ваш компьютер работает медленно, когда вы используете слишком много байтов. Постарайтесь запрограммировать свой код как можно короче. (
code-golf)
Примеры тестов
STDIN: EXAMPLE STDOUT:
WI J E W 1(BEL)
WIWWJWE W 0
E I J I E 1(BEL)
I W J E 0
I E W E E 1(BEL)
IIIIEIIII 1(BEL)
JJJJEJJWI 0
Примечание: «(BEL)» относится к символу звонка, а не к строке.
Удачи!
Ответы
Желе , 10 8 байт
ḟ⁶OIA7fỌ
Полная программа, которая печатает пустую строку (ложь), если все в порядке, или символ колокольчика, если нет (символ колокола также правдив).
Вход:
Wall W
Employee X
Jewel J
Intruder Q
Попробуйте онлайн!
Или посмотрите набор тестов (нижний колонтитул сначала переводит символы из примеров и вызывает ссылку для каждой строки).
Как?
ḟ⁶OIA7fỌ - Main Link: list of characters in "W QJX"
⁶ - a space character
ḟ - filter-discard (remove any spaces)
O - to ordinals (e.g. "WXQJ" -> [87,88,81,74])
I - incremental differences (e.g. [87,88,81,74] -> [1,-7,-7])
...possible values are: -14 -13 -7 -6 -1 0 1 6 7 13 14
-7 and 7 indicate an intruder (Q) is next to a jewel (J) or employee (X)
A - absolute values
7 - seven
f - filter keep ([7] if any of the values are 7 else [])
Ọ - cast to characters (bell character in a list or an empty list)
- implicit print
...single-element lists print their element
while empty lists print an empty string
Брахилог , 17 12 10 байт
-5 байт, так как не различать сотрудников и драгоценности
-2 байта с использованием сложения, а не умножения, поэтому я получаю 7 за \ a бесплатно
Пустые плитки - это -, злоумышленники - тоже hуманы, драгоценности - все еще Jуэли, работники магазина - такие e, а стены >закрываются. В Брахилоге предикат успеха - истинное значение. Таким образом, это либо значение как output ( BEL), либо объединение не удалось, представленное как false..
ạ%₉ᵐs+7g~ạ
Попробуйте онлайн!
Все это сделано для ạ%₉ᵐотображения байтов по модулю 9 (empty) => 0, I => 5, J => 2, E => 2, W => 8. С его помощью мы можем просуммировать каждое подмножество последовательных элементов s+и проверить, является ли один из них 7( I J, т.е. 5+0+0+2или E I, т.е. 2+0+0+5). Поскольку пустые плитки сопоставляются 0, они не меняют ни значение, ни порядок. Также 7 не могут быть составлены другими элементами. Если совпадает одно подмножество, вернуть преобразование 7 в байт ~gạ, то есть \a.
05AB1E , 7 байт
áÇ¥Ä7Ãç
Порт ответа Jelly от @JonathanAllan , так что не забудьте проголосовать и за него!
Как и его ответ, я использую W= wall; J= драгоценность; X= сотрудник; Q= злоумышленник.
Выводит один или несколько символов BEL в списке как истинное значение или пустой список как ложное значение.
Попробуйте онлайн или проверьте все тестовые примеры .
Пояснение:
á # Only keep the letters of the (implicit) input-string (removes spaces)
Ç # Convert each character to its codepoint integer
¥ # Get the forward difference between each codepoint pair
# (one of: [-14,-13,-7,-6,-1,0,1,6,7,13,14])
Ä # Take the absolute value of each difference
7Ã # Only keep all 7s in the list
ç # And convert those 7s (if any) to an ASCII character with this codepoint
# (after which the resulting list is output implicitly as result)
Python 3 , 52 байта
Используется #вместо пустых пространств и вместо Wстен. Выходные данные - это пустая строка как ложное значение и символ звонка для правдивых входных данных.
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
Попробуйте онлайн!
JavaScript (ES6), 33 28 байт
Сохранено 5 байт благодаря @DomHastings!
Ожидает eдрагоценный камень, а персонажи, определенные в задании, - другие предметы.
Непечатаемый текст BELэкранирован ниже.
s=>/E *I|I *E/i.test(s)&&'\7'
Попробуйте онлайн!
AWK , 47 \$\cdots\$ 27 26 байт
Сохранено 2 3 7 8 байт благодаря Доминику ван Эссену !!!
Имеет непечатаемый символ колокольчика в кавычках.
$0=/[EJ] *I|I *[EJ]/?"":0
Попробуйте онлайн! (С колокольчиком для печати)
Если есть вероятность опасности, выдает символ звонка (правда) или 0 (ложь) в противном случае.
perl -pl, 26 байт
$_=/I *[EJ]|[EJ] *I/?"^G":0
Попробуйте онлайн!
Поскольку трудно вводить непечатаемые символы, здесь (и в TIO) присутствует символ колокольчика, представленный комбинацией из двух символов ^G. В реальной программе это символ с кодом ASCII 7 (так что я считаю его за 1 символ).
Как это работает?
Все описанные случаи сводятся к злоумышленнику рядом с драгоценностями или сотрудником. Поэтому мы используем регулярное выражение для обнаружения этого случая.
perl -pl, 15 байт
s/E *I|I *E/^G/i
Попробуйте онлайн!
Здесь «истина» означает «содержит символ BEL», а «falsey» означает «не содержит символа BEL». И он использует предложение @Dom Hastings об использовании eв качестве символа для драгоценностей.
perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 байт
$_=@F>1?"^G":0
Попробуйте онлайн!
Мы можем переложить часть работы на переключатель командной строки и уменьшить ее до 13 байт.
Pip , 26 21 байт
3NST(_-BMPaRMs)?o.'!i
Попробуйте онлайн!
-5 байт после изменения ввода Доминика Ван Эссена.
Принимает входные данные как:
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
Принимает различия, преобразует в строку, проверяет, есть ли 3 в строковом представлении.
Pyth , 13 байт
*\lf&/TN@GTc
Попробуйте онлайн!
Легенда
j- драгоценностьe- сотрудники"- нарушитель- стена#- пусто
Объяснение
*\!lf&/TN@GTc
f # filter
c # input split on whitespace chars
# with lambda T:
@GT # some lowercase alphabet in T
&/TN # and '"' in T
*\!l # output '!' repeated length of results of filter times
R , 74 байта
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Попробуйте онлайн!
C (gcc) , 97 байт
i;j;r;t;f(char*s){for(i=j=r=0;t=*s++;t==87?i=j=0:0)i|=t==73,j|=t==74|t==69,r|=i&j;r&&putchar(7);}
Попробуйте онлайн (с восклицательным знаком вместо звонка, поскольку TIO не может с этим справиться)
Уголь , 18 байт
×!⊙⪪EIIEIJJI²№⁻θ ι
Попробуйте онлайн! Ссылка на подробную версию кода. Выводится, !поскольку BEL отсутствует на кодовой странице Charcoal. Пояснение:
EIIEIJJI Literal string `EIIEIJJI`
⪪ ² Split into 2-character substrings
⊙ Any substring satisfies
№ (non-zero) Count of
ι Current substring in
θ Input string
⁻ With spaces deleted
×! `!` if the above is true
Implicitly print