Czy to napad?

Sep 15 2020

Backstory

Jesteś właścicielem małego sklepu z biżuterią na przedmieściach miasta. Przedmieścia są zbyt przeludnione, więc Twój sklep ma grubość tylko jednej postaci, aby zmieścić się na ruchliwych ulicach.

Ostatnio w okolicy było wiele przypadków napadu i obawiasz się, że złodzieje również przyjdą po twoją nagrodę.

Dlatego zainstalowałeś kamery monitorujące, aby zająć się sklepem. Ale jest jeden duży problem: kamery nie wydają sygnału dźwiękowego ani nie alarmują .


Decydujesz się samodzielnie zaprogramować alarm bezpieczeństwa. Dopełni to urządzenia i (miejmy nadzieję), że twój mały sklep będzie bezpieczny.

Zadanie

  • Twoje kamery monitorujące będą mapować Twój sklep w następujący sposób:

    WI  J E W
    

    To jest twoje wejście, które możesz pobrać ze STDIN lub z argumentów wiersza poleceń. Każda z liter ma inne znaczenie.

    • W reprezentuje ścianę . Nie mogą przez nie przejść rabusie i intruzi.
    • E oznacza pracowników . To są istoty, które rozpoznają kamery. Jeśli zobaczą intruza, natychmiast uruchomią alarm, zanim złodzieje będą mogli cokolwiek zrobić. (Mogą zobaczyć intruza, jeśli pomiędzy nimi nie ma ściany , klejnotu , intruza ani innego pracownika ).
    • J oznacza klejnoty . To są rzeczy, których szukają złodzieje i intruzi.
    • I oznacza intruz . Najprawdopodobniej są rabusiami. Ich celem jest kradzież (przynajmniej jednego) klejnotów ze sklepu.
    • Oczywiście możesz stworzyć własną legendę mapy w celu oszczędzania bajtów kodu.
  • Na podstawie danych wejściowych musisz napisać program (lub funkcję), która wykonuje następujące czynności:

    • Jeśli intruz może swobodnie położyć ręce na klejnocie LUB pracownik może zobaczyć intruza :
      • Wydrukuj prawdziwą wartość. („1”, „Prawda”, „Alert”)
      • Aby być całkowicie czujnym, wydrukuj znak dzwonka ASCII. (Ma kod ASCII 7. Po wydrukowaniu odgrywa ting dźwięku na wielu komputerach i wdrożeń)
        • W większości implementacji, nie może być ting dźwięk, więc należy zachować ostrożność!
        • W niektórych przypadkach, gdy dzwonek absolutnie nie może być wydrukowany, należy zamiast niego wydrukować wykrzyknik („!”). (Drukowanie wykrzykników może być trudniejsze do wykonania w niektórych językach)
    • Jeszcze:
      • Wydrukuj fałszywą wartość. („0”, „Fałsz”, „Cicho”)
  • Sklep się nie zawija .

  • Cóż, twój komputer działa wolno, gdy uruchomisz za dużo bajtów. Spróbuj zaprogramować jak najkrótszy kod. ( code-golf)

Przykładowe testy

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

Uwaga: „(BEL)” odnosi się do znaku dzwonka, a nie do ciągu.

Powodzenia!

Odpowiedzi

9 JonathanAllan Sep 15 2020 at 21:03

Galaretka ,  10  8 bajtów

ḟ⁶OIA7fỌ

Pełny program, który wypisuje pusty łańcuch (falsey), jeśli wszystko jest w porządku, lub znak dzwonka, jeśli nie (znak dzwonka jest również prawdziwy).

Wejście:

    Wall W
Employee X
   Jewel J
Intruder Q

Wypróbuj online!

Lub zobacz zestaw testów (stopka najpierw tłumaczy znaki z przykładowych i wywołuje link dla każdej linii).

W jaki sposób?

ḟ⁶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

Brachylog , 17 12 10 bajtów

-5 bajtów bez rozróżnienia między pracownikami a klejnotami

-2 bajty z dodawaniem, a nie mnożeniem, więc 7 za \ a dostaję za darmo

Puste kafelki -, intruzi to także humany, klejnoty to wciąż Jowsianki, pracownicy sklepu e, a ściany >się zbliżają. W Brachylogu prawdą jest, że sukces jest predykatem. Więc jest to albo wartość wyjściowa ( BEL), albo unifikacja nie powiodła się, reprezentowana jako false..

ạ%₉ᵐs+7g~ạ

Wypróbuj online!

To wszystko jest zrobione, więc ạ%₉ᵐmapa bajtów modulo 9 (empty) => 0, I => 5, J => 2, E => 2, W => 8. Dzięki temu możemy zsumować każdy podzbiór kolejnych elementów s+i sprawdzić, czy jeden z nich jest 7( I Jtj. 5+0+0+2Lub E I, tj 2+0+0+5.). Ponieważ puste kafelki odwzorowują 0, nie zmieniają wartości, podobnie jak kolejność. Również 7 nie może być wykonane przez inne elementy. Jeśli jeden podzbiór pasuje, zwraca konwersję 7 na bajt ~gạ, czyli \a.

6 KevinCruijssen Sep 16 2020 at 08:01

05AB1E , 7 bajtów

áÇ¥Ä7Ãç

Port of @JonathanAllan 's Jelly odpowiedź , więc pamiętaj, aby go również zagłosować!

Podobnie jak jego odpowiedź, używam W= wall; J= klejnot; X= pracownik; Q= intruz.
Wyświetla jeden lub wiele znaków BEL na liście jako prawdziwą wartość lub pustą listę jako wartość falsey.

Wypróbuj online lub zweryfikuj wszystkie przypadki testowe .

Wyjaśnienie:

á        # 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 bajty

Używa #zamiast pustych przestrzeni i zamiast Wścian. Dane wyjściowe to pusty ciąg znaków jako wartość falsey i znak dzwonka dla prawdziwych danych wejściowych.

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

Wypróbuj online!

4 Arnauld Sep 15 2020 at 18:32

JavaScript (ES6),  33  28 bajtów

Zapisano 5 bajtów dzięki @DomHastings!

Oczekuje eklejnotu i postaci określonych w wyzwaniu dla innych przedmiotów.

Niedrukowany BELjest ukryty poniżej.

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

Wypróbuj online!

4 Noodle9 Sep 15 2020 at 19:38

AWK , 47 \$\cdots\$ 27 26 bajtów

Zapisano 2 3 7 8 bajtów dzięki Dominicowi van Essen !!!
Ma niedrukowalny znak dzwonka w cudzysłowie.

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

Wypróbuj online! (Z dzwonkiem do nadruku)

Jeśli istnieje prawdopodobieństwo, że ręka jest niebezpieczna, wyświetla znak dzwonka (prawda) lub wyświetla 0 (falsey) w przeciwnym razie.

3 Abigail Sep 15 2020 at 20:12

perl -pl, 26 bajtów

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

Wypróbuj online!

Ponieważ trudno jest wprowadzić znaki niedrukowalne, znak dzwonka jest tutaj (iw TIO), reprezentowany przez kombinację dwóch znaków ^G. W prawdziwym programie jest to znak o kodzie ASCII 7 (więc liczę go jako 1 znak).

Jak to działa?

Wszystkie opisane przypadki sprowadzają się do tego, że intruz stoi obok klejnotów lub pracownika. Więc używamy wyrażenia regularnego, aby wykryć ten przypadek.

perl -pl, 15 bajtów

s/E *I|I *E/^G/i

Wypróbuj online!

Tutaj „prawda” oznacza „zawiera znak BEL”, a „falsey”, ponieważ „nie zawiera znaku BEL”. I używa sugestii @Dom Hastings, aby używać ejako symbolu klejnotów.

perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 bajtów

$_=@F>1?"^G":0

Wypróbuj online!

Część pracy możemy przenieść do przełącznika wiersza poleceń i zredukować do 13 bajtów.

3 Razetime Sep 16 2020 at 10:05

Pip , 26 21 bajtów

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

Wypróbuj online!

-5 bajtów po zmianie danych wejściowych Dominica Van Essena.

Pobiera dane wejściowe jako:

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

Pobiera różnice, konwertuje na łańcuch, sprawdza, czy w reprezentacji łańcuchowej są 3.

2 Mukundan314 Sep 15 2020 at 19:24

Pyth , 13 bajtów

*\lf&/TN@GTc

Wypróbuj online!

Legenda

  • j - klejnot
  • e - pracowników
  • " - intruz
  • - Ściana
  • # - pusty

Wyjaśnienie

*\!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 bajty

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

Wypróbuj online!

2 rtpax Sep 16 2020 at 13:07

C (gcc) , 97 bajtów

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

Wypróbuj online (z wykrzyknikiem zamiast dzwonka, ponieważ TIO sobie z tym nie radzi)

1 Neil Sep 15 2020 at 23:32

Węgiel , 18 bajtów

×!⊙⪪EIIEIJJI²№⁻θ ι

Wypróbuj online! Link prowadzi do pełnej wersji kodu. Dane wyjściowe, !ponieważ BEL nie znajduje się na stronie kodowej Charcoal. Wyjaśnienie:

    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