È una rapina?

Sep 15 2020

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 W
    

    Questo è 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")
  • 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

9 JonathanAllan Sep 15 2020 at 21:03

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

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.

6 KevinCruijssen Sep 16 2020 at 08:01

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

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!

4 Arnauld Sep 15 2020 at 18:32

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!

4 Noodle9 Sep 15 2020 at 19:38

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.

3 Abigail Sep 15 2020 at 20:12

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.

3 Razetime Sep 16 2020 at 10:05

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.

2 Mukundan314 Sep 15 2020 at 19:24

Pyth , 13 byte

*\lf&/TN@GTc

Provalo online!

Leggenda

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

R , 74 byte

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

Provalo online!

2 rtpax Sep 16 2020 at 13:07

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)

1 Neil Sep 15 2020 at 23:32

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