Это ограбление?

Sep 15 2020

Предыстория

У вас есть крошечный ювелирный магазин в пригороде города. Пригороды слишком перенаселены, поэтому ваш магазин имеет толщину только одного символа, чтобы поместиться на оживленных улицах.

В последнее время в окрестностях было много случаев ограбления, и вы опасаетесь, что грабители также придут за вашей наградой.

Поэтому вы установили камеры наблюдения, чтобы заботиться о магазине. Но есть одна большая проблема: камеры не издают звуковой сигнал и не срабатывают .


Вы сами решаете запрограммировать охранную сигнализацию. Это завершит создание хитроумных приспособлений и (надеюсь) сделает ваш магазинчик безопасным и надежным.

Задача

  • Ваши камеры наблюдения отобразят ваш магазин следующим образом:

    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)» относится к символу звонка, а не к строке.

Удачи!

Ответы

9 JonathanAllan Sep 15 2020 at 21:03

Желе ,  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
9 xash Sep 15 2020 at 21:26

Брахилог , 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.

6 KevinCruijssen Sep 16 2020 at 08:01

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)
5 ovs Sep 15 2020 at 20:03

Python 3 , 52 байта

Используется #вместо пустых пространств и вместо Wстен. Выходные данные - это пустая строка как ложное значение и символ звонка для правдивых входных данных.

lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''

Попробуйте онлайн!

4 Arnauld Sep 15 2020 at 18:32

JavaScript (ES6),  33  28 байт

Сохранено 5 байт благодаря @DomHastings!

Ожидает eдрагоценный камень, а персонажи, определенные в задании, - другие предметы.

Непечатаемый текст BELэкранирован ниже.

s=>/E *I|I *E/i.test(s)&&'\7'

Попробуйте онлайн!

4 Noodle9 Sep 15 2020 at 19:38

AWK , 47 \$\cdots\$ 27 26 байт

Сохранено 2 3 7 8 байт благодаря Доминику ван Эссену !!!
Имеет непечатаемый символ колокольчика в кавычках.

$0=/[EJ] *I|I *[EJ]/?"":0

Попробуйте онлайн! (С колокольчиком для печати)

Если есть вероятность опасности, выдает символ звонка (правда) или 0 (ложь) в противном случае.

3 Abigail Sep 15 2020 at 20:12

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 байт.

3 Razetime Sep 16 2020 at 10:05

Pip , 26 21 байт

3NST(_-BMPaRMs)?o.'!i

Попробуйте онлайн!

-5 байт после изменения ввода Доминика Ван Эссена.

Принимает входные данные как:

8 → Wall
4 → intruder
7 → Jewel
1 → Employee

Принимает различия, преобразует в строку, проверяет, есть ли 3 в строковом представлении.

2 Mukundan314 Sep 15 2020 at 19:24

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  
2 CongChen Sep 16 2020 at 07:59

R , 74 байта

function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)

Попробуйте онлайн!

2 rtpax Sep 16 2020 at 13:07

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 не может с этим справиться)

1 Neil Sep 15 2020 at 23:32

Уголь , 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