Isso é um roubo?
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 WEsta é 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")
- Se um intruso pode colocar as mãos livremente em uma joia OU um funcionário pode ver um intruso :
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
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
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.
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)
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!
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!
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.
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.
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.
Pyth , 13 bytes
*\lf&/TN@GTc
Experimente online!
lenda
j- joiae- 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
R , 74 bytes
function(x)`if`(grepl('IE|EI|IJ|JI',gsub(' ', '',x)),intToUtf8(c(49,7)),0)
Experimente online!
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)
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