Isso é um roubo?

Sep 15 2020

História

Você possui uma pequena joalheria nos subúrbios da cidade. Os subúrbios são superpovoados, então sua loja tem uma densidade de apenas um personagem para caber nas ruas movimentadas.

Recentemente, houve muitos casos de roubos no bairro, e você teme que ladrões também venham buscar sua recompensa.

Portanto, você instalou câmeras de vigilância para cuidar da loja. Mas há um grande problema: as câmeras não emitem bipes ou alarmes .


Você decide programar o alarme de segurança sozinho. Isso irá completar as engenhocas e (espero) tornar sua pequena loja segura e protegida.

Tarefa

  • Suas câmeras de vigilância mapearão sua loja assim:

    WI  J E W
    

    Esta é a sua entrada, que você pode obter de STDIN ou dos argumentos da linha de comando. Cada uma das letras tem significados diferentes.

    • W representa uma parede . Ladrões e intrusos não podem passar por eles.
    • E significa funcionários . Esses são os seres que as câmeras reconhecem. Se virem um intruso, irão imediatamente disparar o alarme antes que os ladrões possam fazer qualquer coisa. (Eles podem ver um intruso se não houver nenhuma parede , joia , intruso ou outro funcionário entre eles) Eles também tendem a ficar parados.
    • J significa joias . Essas são as coisas que os ladrões e invasores procuram.
    • Quero dizer intruso . Provavelmente são ladrões. O objetivo deles é roubar (pelo menos uma) as joias da loja.
    • Claro, você pode criar sua própria legenda do mapa para salvar bytes de código.
  • Com base na entrada, você precisa escrever um programa (ou função) que faça o seguinte:

    • Se um intruso pode colocar as mãos livremente em uma joia OU um funcionário pode ver um intruso :
      • Imprima um valor verdadeiro. ("1", "Verdadeiro", "Alerta")
      • Para ficar completamente alerta, imprima o caractere de sino ASCII. (Possui um código ASCII de 7. Quando impresso, reproduz um som ting em vários computadores e implementações)
        • Na maioria das implementações, não pode haver um som ting , então tome cuidado!
        • Em alguns casos onde o sino absolutamente não pode ser impresso, imprima uma exclamação ('!') Em vez dele. (Imprimir pontos de exclamação pode ser mais difícil de implementar em alguns idiomas)
    • Outro:
      • Imprima um valor falsey. ("0", "Falso", "Silencioso")
  • A loja não fecha .

  • Bem, seu computador fica lento quando você executa muitos bytes. Tente programar seu código o mais curto possível. ( code-golf)

Testes de exemplo

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)" refere-se ao caractere de sino, não à string.

Boa sorte!

Respostas

9 JonathanAllan Sep 15 2020 at 21:03

Gelatina ,  10  8 bytes

ḟ⁶OIA7fỌ

Um programa completo que imprime uma string vazia (falsey) se tudo estiver bem ou um caractere de sino se não (um caractere de sino também é verdadeiro).

Entrada:

    Wall W
Employee X
   Jewel J
Intruder Q

Experimente online!

Ou veja o test-suite (O rodapé primeiro traduz os caracteres dos exemplos e chama o Link para cada linha).

Quão?

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

-5 bytes por não distinguir entre funcionários e joias

-2 bytes usando adição, não multiplicação, então recebo 7 para \ a de graça

Os ladrilhos vazios são -, os intrusos também são hhumanos, as joias ainda são as Jenguias, os funcionários da loja são ee as paredes >estão se fechando. Em Brachylog, um predicado de sucesso é o valor verdadeiro. Portanto, é um valor como saída ( BEL) ou a unificação falhou, representado como false..

ạ%₉ᵐs+7g~ạ

Experimente online!

Isso tudo é feito para o ạ%₉ᵐmapa de módulo 9 de bytes (empty) => 0, I => 5, J => 2, E => 2, W => 8. Com isso, podemos somar todos os subconjuntos de elementos consecutivos s+e verificar se um deles é 7( I J, 5+0+0+2ou E Iseja, ou , ou seja 2+0+0+5). Como os blocos vazios são mapeados para 0, eles não mudam o valor, nem a ordem. Também 7 não pode ser feito por outros elementos. Se um subconjunto corresponder, retorne convert 7 em um byte ~gạ, que é \a.

6 KevinCruijssen Sep 16 2020 at 08:01

05AB1E , 7 bytes

áÇ¥Ä7Ãç

Porto da resposta Jelly de @JonathanAllan , portanto, certifique-se de votá-lo melhor também!

Assim como sua resposta, eu uso W= parede; J= joia; X= funcionário; Q= intruso.
Produz um ou vários caracteres BEL em uma lista como valor verdadeiro ou uma lista vazia como valor falsey.

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Usa em #vez de espaços vazios e em vez de Wparedes. A saída é uma string vazia como um valor falsey e o caractere de sino para entradas verdadeiras.

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

Experimente online!

4 Arnauld Sep 15 2020 at 18:32

JavaScript (ES6),  33  28 bytes

Economizei 5 bytes graças a @DomHastings!

Espera epor uma joia e os personagens definidos no desafio para os demais itens.

O não imprimível BELtem escape abaixo.

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

Experimente online!

4 Noodle9 Sep 15 2020 at 19:38

AWK , 47 \$\cdots\$ 27 26 bytes

Salvou 2 3 7 8 bytes graças a Dominic van Essen !!!
Possui campainha não imprimível entre aspas.

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

Experimente online! (Com campainha para impressão)

Se houver possibilidade de perigo próximo, gera o caractere de sino (verdadeiro) ou 0 (falsey) caso contrário.

3 Abigail Sep 15 2020 at 20:12

perl -pl, 26 bytes

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

Experimente online!

Como é difícil inserir caracteres não imprimíveis, o caractere de sino está aqui (e em TIO), representado pelo combo de dois caracteres ^G. No programa real, este é o caractere com código ASCII 7 (então, estou contando-o como 1 caractere).

Como funciona?

Todos os casos descritos resumem-se a um intruso próximo a algumas joias ou a um empregado. Portanto, usamos uma regexp para detectar esse caso.

perl -pl, 15 bytes

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

Experimente online!

Aqui, "truthy" é considerado "contém um caractere BEL" e "falsey" como "não contém um caractere BEL". E usa a sugestão de @Dom Hastings de usar ecomo símbolo para joias.

perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 bytes

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

Experimente online!

Podemos transferir parte do trabalho para uma opção de linha de comando e reduzi-lo para 13 bytes.

3 Razetime Sep 16 2020 at 10:05

Pip , 26 21 bytes

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

Experimente online!

-5 bytes após as alterações de entrada de Dominic Van Essen.

Aceita entradas como:

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

Pega as diferenças, converte em string, verifica se há 3 na representação da string.

2 Mukundan314 Sep 15 2020 at 19:24

Pyth , 13 bytes

*\lf&/TN@GTc

Experimente online!

lenda

  • j - joia
  • e - funcionários
  • " - intruso
  • - parede
  • # - vazio

Explicação

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

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

Experimente online!

2 rtpax Sep 16 2020 at 13:07

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

Experimente online (com ponto de exclamação em vez de sino, já que TIO não consegue lidar com isso)

1 Neil Sep 15 2020 at 23:32

Carvão , 18 bytes

×!⊙⪪EIIEIJJI²№⁻θ ι

Experimente online! O link é para a versão detalhada do código. As saídas !desde que BEL não estão na página de código do Charcoal. Explicação:

    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