È una rapina?
Backstory
Possiedi una minuscola gioielleria nei sobborghi della città. I sobborghi sono troppo sovrappopolati, quindi il tuo negozio ha uno spessore di un solo personaggio per adattarsi alle strade trafficate.
Recentemente, ci sono stati molti casi di rapina nel quartiere e temi che anche i ladri vengano a prendere la tua taglia.
Pertanto, hai installato telecamere di sorveglianza per occuparti del negozio. Ma c'è un grosso problema: le telecamere non emettono segnali acustici o allarmi .
Decidi di programmare da solo l'allarme di sicurezza. Questo completerà gli aggeggi e (si spera) renderà il tuo piccolo negozio sicuro e protetto.
Compito
Le tue telecamere di sorveglianza mapperanno il tuo negozio in questo modo:
WI J E WQuesto è il tuo input, che puoi prendere da STDIN o dagli argomenti della riga di comando. Ciascuna delle lettere ha significati diversi.
- W rappresenta un muro . Ladri e intrusi non possono attraversarli.
- E significa dipendenti . Questi sono gli esseri che le telecamere riconoscono. Se vedono un intruso, attiveranno immediatamente l'allarme prima che i ladri possano fare qualsiasi cosa. (Possono vedere un intruso se non ci sono muri , gioielli , intrusi o altri dipendenti nel mezzo) Tendono anche a stare fermi.
- J significa gioielli . Queste sono le cose che i ladri e gli intrusi stanno cercando.
- Ho significa intruso . Sono molto probabilmente ladri. Il loro obiettivo è rubare (almeno uno dei) gioielli del negozio.
- Naturalmente, puoi creare la tua legenda della mappa per salvare i byte di codice.
In base all'input, è necessario scrivere un programma (o una funzione) che faccia quanto segue:
- Se un intruso può mettere liberamente le mani su un gioiello OPPURE un dipendente può vedere un intruso :
- Stampa un valore veritiero. ("1", "Vero", "Avviso")
- Per essere completamente allerta, stampa il carattere campanello ASCII. (Ha un codice ASCII di 7. Quando viene stampato, riproduce un suono simile a quello di molti computer e implementazioni)
- Nella maggior parte delle implementazioni, non può essere emesso alcun suono, quindi fai attenzione!
- In alcuni casi in cui non è assolutamente possibile stampare la campana , stampa un'esclamazione ("!") Al suo posto. (La stampa di punti esclamativi potrebbe essere più difficile da implementare in alcune lingue)
- Altro:
- Stampa un valore falso. ("0", "False", "Silenzioso")
- Se un intruso può mettere liberamente le mani su un gioiello OPPURE un dipendente può vedere un intruso :
Il negozio non si avvolge .
Welp, il tuo computer funziona lentamente quando esegui troppi byte. Prova a programmare il tuo codice il più breve possibile. (
code-golf)
Test di esempio
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
Nota: "(BEL)" si riferisce al carattere campanello, non alla stringa.
In bocca al lupo!
Risposte
Gelatina , 10 8 byte
ḟ⁶OIA7fỌ
Un programma completo che stampa una stringa vuota (falso) se tutto va bene o un carattere campana in caso contrario (anche un carattere campana è vero).
Ingresso:
Wall W
Employee X
Jewel J
Intruder Q
Provalo online!
Oppure vedere la suite di test (il piè di pagina prima traduce i caratteri da quelli di esempio e chiama il collegamento per ogni riga).
Come?
ḟ⁶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 byte
-5 byte non distinguendo tra dipendenti e gioielli
-2 byte usando l'addizione, non la moltiplicazione, quindi ottengo 7 per \ a gratuitamente
Le piastrelle vuote sono -, gli intrusi sono anche humani, i gioielli sono ancora Janguille, i dipendenti del negozio lo sono ee le pareti >si chiudono. In Brachylog un predicato di successo è il valore veritiero. Quindi è un valore come output ( BEL) o l'unificazione non è riuscita, rappresentata come false..
ạ%₉ᵐs+7g~ạ
Provalo online!
Tutto questo viene fatto in modo che i byte modulo 9 ạ%₉ᵐmap (empty) => 0, I => 5, J => 2, E => 2, W => 8. Con questo, possiamo sommare ogni sottoinsieme di elementi consecutivi s+e controllare se uno di essi è 7( I J, ie 5+0+0+2or E I, ie 2+0+0+5). Poiché le tessere vuote vengono mappate a 0, non cambiano il valore e nemmeno l'ordine. Inoltre 7 non può essere fatto da altri elementi. Se un sottoinsieme corrisponde, restituisci convert 7 in un byte ~gạ, che è \a.
05AB1E , 7 byte
áÇ¥Ä7Ãç
Port of @JonathanAllan 's Jelly answer , quindi assicurati di votare anche lui!
Proprio come la sua risposta, io uso W= wall; J= gioiello; X= dipendente; Q= intruso.
Emette uno o più caratteri BEL in un elenco come valore vero o un elenco vuoto come valore falso.
Provalo online o verifica tutti i casi di test .
Spiegazione:
á # 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 byte
Utilizza #invece che per spazi vuoti e invece che Wper pareti. L'output è una stringa vuota come valore falso e il carattere campana per input veritieri.
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
Provalo online!
JavaScript (ES6), 33 28 byte
Salvati 5 byte grazie a @DomHastings!
Aspetta eun gioiello e i personaggi definiti nella sfida per gli altri oggetti.
Il non stampabile BELè sottoposto a escape di seguito.
s=>/E *I|I *E/i.test(s)&&'\7'
Provalo online!
AWK , 47 \$\cdots\$ 27 26 byte
Salvato 2 3 7 8 byte grazie a Dominic van Essen !!!
Ha un carattere campana non stampabile tra virgolette.
$0=/[EJ] *I|I *[EJ]/?"":0
Provalo online! (Con campanello stampabile)
Se è possibile che vi sia un pericolo a portata di mano emette il carattere campanello (veritiero) o restituisce 0 (falso) altrimenti.
perl -pl, 26 byte
$_=/I *[EJ]|[EJ] *I/?"^G":0
Provalo online!
Poiché è difficile inserire caratteri non stampabili, il carattere campana è qui (e in TIO), rappresentato dalla combinazione di due caratteri ^G. Nel programma reale, questo è il carattere con codice ASCII 7 (quindi lo conto come 1 carattere).
Come funziona?
Tutti i casi descritti si riducono a un intruso accanto ad alcuni gioielli oa un impiegato. Quindi usiamo una regexp per rilevare questo caso.
perl -pl, 15 byte
s/E *I|I *E/^G/i
Provalo online!
Qui, "truthy" è inteso come "contiene un carattere BEL" e "falsey" come "non contiene un carattere BEL". E utilizza il suggerimento di @Dom Hastings di utilizzare ecome simbolo per i gioielli.
perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 byte
$_=@F>1?"^G":0
Provalo online!
Possiamo scaricare parte del lavoro su uno switch della riga di comando e ridurlo a 13 byte.
Pip , 26 21 byte
3NST(_-BMPaRMs)?o.'!i
Provalo online!
-5 byte dopo la modifica dell'input di Dominic Van Essen.
Accetta input come:
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
Prende le differenze, converte in stringa, controlla se c'è 3 nella rappresentazione di stringa.
Pyth , 13 byte
*\lf&/TN@GTc
Provalo online!
Leggenda
j- gioielloe- dipendenti"- intruso- muro#- vuoto
Spiegazione
*\!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 byte
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Provalo online!
C (gcc) , 97 byte
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);}
Provalo online (con punto esclamativo anziché campanello poiché TIO non può gestirlo)
Carboncino , 18 byte
×!⊙⪪EIIEIJJI²№⁻θ ι
Provalo online! Il collegamento è alla versione dettagliata del codice. Risultati !poiché BEL non è nella codepage di Charcoal. Spiegazione:
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