Ist das ein Raub?
Hintergrundgeschichte
Sie besitzen ein kleines Juweliergeschäft in den Vororten der Stadt. Die Vororte sind zu stark überfüllt, sodass Ihr Geschäft nur einen Charakter hat , um in die belebten Straßen zu passen.
In letzter Zeit gab es in der Nachbarschaft viele Fälle von Raubüberfällen, und Sie befürchten, dass auch Räuber kommen werden, um Ihr Kopfgeld zu erhalten.
Deshalb haben Sie Überwachungskameras installiert, um den Laden zu pflegen. Es gibt jedoch ein großes Problem: Die Kameras piepen oder alarmieren nicht .
Sie beschließen, den Sicherheitsalarm selbst zu programmieren. Dies wird die Geräte vervollständigen und (hoffentlich) Ihren kleinen Laden sicher machen.
Aufgabe
Ihre Überwachungskameras ordnen Ihren Shop folgendermaßen zu:
WI J E WDies ist Ihre Eingabe, die Sie von STDIN oder von den Befehlszeilenargumenten übernehmen können. Jeder der Buchstaben hat unterschiedliche Bedeutungen.
- W steht für eine Wand . Räuber und Eindringlinge können sie nicht passieren.
- E bedeutet Mitarbeiter . Dies sind die Wesen, die die Kameras erkennen. Wenn sie einen Eindringling sehen, lösen sie sofort den Alarm aus, bevor die Räuber etwas unternehmen können. (Sie können einen Eindringling sehen, wenn sich keine Wand , kein Juwel , kein Eindringling oder ein anderer Mitarbeiter dazwischen befindet.) Sie neigen auch dazu, still zu stehen.
- J bedeutet Juwelen . Dies sind die Dinge, nach denen Räuber und Eindringlinge suchen.
- Ich meine Eindringling . Sie sind höchstwahrscheinlich Räuber. Ihr Ziel ist es, (mindestens eines) der Juwelen des Geschäfts zu stehlen.
- Natürlich können Sie Ihre eigene Legende der Karte erstellen, um Code-Bytes zu speichern.
Basierend auf der Eingabe müssen Sie ein Programm (oder eine Funktion) schreiben, das Folgendes ausführt:
- Wenn ein Eindringling seine Hände frei auf ein Juwel legen kann ODER ein Mitarbeiter einen Eindringling sehen kann :
- Drucken Sie einen wahrheitsgemäßen Wert. ("1", "True", "Alert")
- Um vollständig aufmerksam zu sein, drucken Sie das ASCII-Glockenzeichen. (Es verfügt über einen ASCII - Code von 7. Wenn gedruckt, es spielt eine ting - Sound auf vielen Computern und Implementierungen)
- In den meisten Implementierungen kann es nicht sein , ting - Sound, so seien Sie vorsichtig!
- In einigen Fällen, in denen die Glocke absolut nicht gedruckt werden kann, drucken Sie stattdessen einen Ausruf ('!'). (Das Drucken von Ausrufezeichen ist in einigen Sprachen möglicherweise schwieriger zu implementieren.)
- Sonst:
- Drucken Sie einen Falsey-Wert. ("0", "Falsch", "Leise")
- Wenn ein Eindringling seine Hände frei auf ein Juwel legen kann ODER ein Mitarbeiter einen Eindringling sehen kann :
Der Laden wickelt sich nicht um .
Welp, Ihr Computer läuft langsam, wenn Sie zu viele Bytes ausführen. Versuchen Sie, Ihren Code so kurz wie möglich zu programmieren. (
code-golf)
Beispieltests
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
Hinweis: "(BEL)" bezieht sich auf das Glockenzeichen, nicht auf die Zeichenfolge.
Viel Glück!
Antworten
Gelee , 10 8 Bytes
ḟ⁶OIA7fỌ
Ein vollständiges Programm, das eine leere Zeichenfolge (Falsey) druckt, wenn alles in Ordnung ist, oder ein Glockenzeichen, wenn nicht (ein Glockenzeichen ist auch wahr).
Eingang:
Wall W
Employee X
Jewel J
Intruder Q
Probieren Sie es online aus!
Oder sehen Sie sich die Testsuite an (Die Fußzeile übersetzt zuerst die Zeichen aus den Beispielzeichen und ruft den Link für jede Zeile auf).
Wie?
ḟ⁶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 Bytes
-5 Bytes, indem nicht zwischen Mitarbeitern und Juwelen unterschieden wird
-2 Bytes mit Addition, nicht mit Multiplikation, also bekomme ich 7 für \ a kostenlos
Leere Kacheln sind -, Eindringlinge sind auch hUmans, Juwelen sind immer noch JEwels, die Ladenangestellten sind es eund Wände >schließen sich. In Brachylog ist ein erfolgreiches Prädikat der Wahrheitswert. Es ist also entweder ein Wert als Ausgabe ( BEL) oder die Vereinigung ist fehlgeschlagen, dargestellt als false..
ạ%₉ᵐs+7g~ạ
Probieren Sie es online aus!
Dies ist alles getan, damit die Bytes Modulo 9 ạ%₉ᵐMap (empty) => 0, I => 5, J => 2, E => 2, W => 8. Damit können wir jede Teilmenge aufeinanderfolgender Elemente summieren s+und prüfen, ob eines davon 7( I J, dh 5+0+0+2oder E I, dh 2+0+0+5) ist. Da leere Kacheln zugeordnet sind 0, ändern sie weder den Wert noch die Reihenfolge. Auch 7 kann nicht von anderen Elementen gemacht werden. Wenn eine Teilmenge Streichhölzer, Return convert 7 auf ein Byte ~gạ, das ist \a.
05AB1E , 7 Bytes
áÇ¥Ä7Ãç
Port of @JonathanAllans Jelly-Antwort , also stellen Sie sicher, dass Sie ihn ebenfalls positiv bewerten!
Genau wie seine Antwort benutze ich W= Wand; J= Juwel; X= Mitarbeiter; Q= Eindringling.
Gibt ein oder mehrere BEL-Zeichen in einer Liste als Wahrheitswert oder eine leere Liste als Falschwert aus.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
á # 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 Bytes
Verwendet #statt für leere Räume und statt Wfür Wände. Die Ausgabe ist eine leere Zeichenfolge als Falsey-Wert und das Glockenzeichen für wahrheitsgemäße Eingaben.
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
Probieren Sie es online aus!
JavaScript (ES6), 33 28 Byte
5 Bytes dank @DomHastings gespart!
Erwartet eein Juwel und die in der Herausforderung definierten Charaktere für die anderen Gegenstände.
Das nicht druckbare BELwird unten maskiert .
s=>/E *I|I *E/i.test(s)&&'\7'
Probieren Sie es online aus!
AWK , 47 \$\cdots\$ 27 26 Bytes
2 3 7 8 Bytes dank Dominic van Essen gespeichert !!!
Hat nicht druckbares Glockenzeichen in Anführungszeichen.
$0=/[EJ] *I|I *[EJ]/?"":0
Probieren Sie es online aus! (Mit bedruckbarer Glocke)
Wenn möglicherweise eine Gefahr zur Hand ist, wird ein Glockenzeichen (wahr) oder andernfalls 0 (falsch) ausgegeben.
perl -pl, 26 Bytes
$_=/I *[EJ]|[EJ] *I/?"^G":0
Probieren Sie es online aus!
Da es schwierig ist, nicht druckbare Zeichen einzugeben, befindet sich das Glockenzeichen hier (und in TIO), dargestellt durch die Kombination aus zwei Zeichen ^G. Im realen Programm ist dies das Zeichen mit ASCII-Code 7 (also zähle ich es als 1 Zeichen).
Wie funktioniert es?
Alle beschriebenen Fälle laufen auf einen Eindringling neben einigen Juwelen oder einem Angestellten hinaus. Daher verwenden wir einen regulären Ausdruck, um diesen Fall zu erkennen.
perl -pl, 15 Bytes
s/E *I|I *E/^G/i
Probieren Sie es online aus!
Hier wird "wahr" als "enthält ein BEL-Zeichen" und "falsey" als "enthält kein BEL-Zeichen" verstanden. Und es verwendet @ Dom Hastings Vorschlag, eals Symbol für Juwelen zu verwenden.
perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 Bytes
$_=@F>1?"^G":0
Probieren Sie es online aus!
Wir können einen Teil der Arbeit auf einen Befehlszeilenschalter verlagern und auf 13 Byte reduzieren.
Pip , 26 21 Bytes
3NST(_-BMPaRMs)?o.'!i
Probieren Sie es online aus!
-5 Bytes, nachdem sich die Eingabe von Dominic Van Essen geändert hat.
Nimmt Eingaben als:
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
Nimmt die Unterschiede auf, konvertiert sie in eine Zeichenfolge und prüft, ob die Zeichenfolgendarstellung 3 enthält.
Pyth , 13 Bytes
*\lf&/TN@GTc
Probieren Sie es online aus!
Legende
j- Juwele- Angestellte"- Eindringling- Wand#- leer
Erläuterung
*\!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 Bytes
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Probieren Sie es online aus!
C (gcc) , 97 Bytes
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);}
Probieren Sie es online aus (mit Ausrufezeichen anstelle von Glocke, da TIO damit nicht umgehen kann)
Holzkohle , 18 Bytes
×!⊙⪪EIIEIJJI²№⁻θ ι
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Ausgaben !seit BEL nicht auf der Codepage von Charcoal. Erläuterung:
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