Czy to napad?
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 WTo 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”)
- Jeśli intruz może swobodnie położyć ręce na klejnocie LUB pracownik może zobaczyć intruza :
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
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
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.
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)
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!
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!
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.
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.
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.
Pyth , 13 bajtów
*\lf&/TN@GTc
Wypróbuj online!
Legenda
j- klejnote- 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
R , 74 bajty
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Wypróbuj online!
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)
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