¿Es esto un robo?
Trasfondo
Eres dueño de una pequeña joyería en las afueras de la ciudad. Los suburbios están demasiado superpoblados, por lo que su tienda tiene un grosor de solo un carácter para caber en las calles concurridas.
Recientemente, ha habido muchos casos de robos en el vecindario y temes que los ladrones también vengan a buscar tu recompensa.
Por lo tanto, instaló cámaras de vigilancia para cuidar la tienda. Pero hay un gran problema: las cámaras no emiten pitidos ni alarman .
Decide programar la alarma de seguridad usted mismo. Esto completará los artilugios y (con suerte) hará que su pequeña tienda esté segura y protegida.
Tarea
Sus cámaras de vigilancia mapearán su tienda de esta manera:
WI J E WEsta es su entrada, que puede tomar de STDIN o de los argumentos de la línea de comandos. Cada una de las letras tiene diferentes significados.
- W representa una pared . Los ladrones e intrusos no pueden atravesarlos.
- E significa empleados . Estos son los seres que reconocen las cámaras. Si ven a un intruso, inmediatamente activarán la alarma antes de que los ladrones puedan hacer algo. (Pueden ver a un intruso si no hay una pared , joya , intruso u otro empleado en el medio) También tienden a quedarse quietos.
- J significa joyas . Estas son las cosas que buscan los ladrones e intrusos.
- Me refiero a intruso . Lo más probable es que sean ladrones. Su objetivo es robar (al menos una de) las joyas de la tienda.
- Por supuesto, puede crear su propia leyenda del mapa para ahorrar bytes de código.
Según la entrada, debe escribir un programa (o función) que haga lo siguiente:
- Si un intruso puede poner libremente sus manos sobre una joya O un empleado puede ver a un intruso :
- Imprime un valor veraz. ("1", "Verdadero", "Alerta")
- Para estar completamente alerta, imprima el carácter de campana ASCII. (Tiene un código ASCII de 7. Cuando se imprime, reproduce un sonido tintineante en muchas computadoras e implementaciones)
- En la mayoría de las implementaciones, no puede haber un tintineo , ¡así que ten cuidado!
- En algunos casos en los que la campana no pueda imprimirse en absoluto , imprima una exclamación ('!') En su lugar. (La impresión de signos de exclamación puede ser más difícil de implementar en algunos idiomas)
- Más:
- Imprime un valor falso. ("0", "Falso", "Silencio")
- Si un intruso puede poner libremente sus manos sobre una joya O un empleado puede ver a un intruso :
La tienda no se envuelve .
Bien, su computadora funciona lento cuando ejecuta demasiados bytes. Intente programar su código lo más corto posible. (
code-golf)
Pruebas de ejemplo
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)" se refiere al carácter de campana, no a la cadena.
¡Buena suerte!
Respuestas
Gelatina , 10 8 bytes
ḟ⁶OIA7fỌ
Un programa completo que imprime una cadena vacía (falsey) si todo está bien o un carácter de campana si no (un carácter de campana también es verdadero).
Entrada:
Wall W
Employee X
Jewel J
Intruder Q
¡Pruébelo en línea!
O vea el conjunto de pruebas (el pie de página primero traduce los caracteres de los del ejemplo y llama al enlace para cada línea).
¿Cómo?
ḟ⁶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 al no distinguir entre Empleados y Joyas
-2 bytes usando la suma, no la multiplicación, así que obtengo 7 por \ a gratis
Los azulejos vacíos son -, los intrusos también son hhumanos, las joyas siguen siendo Jewels, los empleados de la tienda lo son ey las paredes se >están cerrando. En Brachylog, un predicado que triunfa es el valor de la verdad. Entonces es un valor como salida ( BEL) o la unificación falló, representada como false..
ạ%₉ᵐs+7g~ạ
¡Pruébelo en línea!
Todo esto se hace para que el ạ%₉ᵐmapa de bytes módulo 9 (empty) => 0, I => 5, J => 2, E => 2, W => 8. Con esto, podemos sumar cada subconjunto de elementos consecutivos s+y verificar si uno de ellos es 7( I J, ie 5+0+0+2o E I, ie 2+0+0+5). Debido a que los mosaicos vacíos se asignan a 0, no cambian el valor, ni tampoco el orden. Además, otros elementos no pueden hacer 7. Si un subconjunto coincide, devuelva convertir 7 a un byte ~gạ, que es \a.
05AB1E , 7 bytes
áÇ¥Ä7Ãç
Puerto de la respuesta de Jelly de @JonathanAllan , ¡así que asegúrate de votarlo también!
Al igual que su respuesta, uso W= wall; J= joya; X= empleado; Q= intruso.
Muestra uno o varios caracteres BEL en una lista como valor verdadero o una lista vacía como valor falso.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
á # 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
Se utiliza en #lugar de para espacios vacíos y en lugar de Wpara paredes. La salida es una cadena vacía como un valor falso y el carácter de campana para entradas veraces.
lambda s:any({*'I#'}<{*g,'#'}for g in s.split())*''
¡Pruébelo en línea!
JavaScript (ES6), 33 28 bytes
¡Ahorró 5 bytes gracias a @DomHastings!
Espera euna joya y los personajes definidos en el desafío para los otros elementos.
Lo no imprimible BELse escapa a continuación.
s=>/E *I|I *E/i.test(s)&&'\7'
¡Pruébelo en línea!
AWK , 47 \$\cdots\$ 27 26 bytes
Guardado 2 3 7 8 bytes gracias a Dominic van Essen !!!
Tiene un carácter de campana no imprimible entre comillas.
$0=/[EJ] *I|I *[EJ]/?"":0
¡Pruébelo en línea! (Con campana imprimible)
Si hay peligro en la mano, emite el carácter de campana (veraz) o emite 0 (falsey) en caso contrario.
perl -pl, 26 bytes
$_=/I *[EJ]|[EJ] *I/?"^G":0
¡Pruébelo en línea!
Dado que es difícil ingresar caracteres no imprimibles, el carácter de campana está aquí (y en TIO), representado por el combo de dos caracteres ^G. En el programa real, este es el carácter con código ASCII 7 (entonces, lo cuento como 1 carácter).
¿Como funciona?
Todos los casos descritos se reducen a un intruso junto a algunas joyas o un empleado. Entonces usamos una expresión regular para detectar este caso.
perl -pl, 15 bytes
s/E *I|I *E/^G/i
¡Pruébelo en línea!
Aquí, "veraz" se toma como "contiene un carácter BEL" y "falsey" como "no contiene un carácter BEL". Y usa la sugerencia de @Dom Hastings de usar ecomo símbolo para las joyas.
perl -F / [EJ] \ s * I | I \ s * [EJ] / -pl, 13 bytes
$_=@F>1?"^G":0
¡Pruébelo en línea!
Podemos descargar parte del trabajo a un conmutador de línea de comando y reducirlo a 13 bytes.
Pip , 26 21 bytes
3NST(_-BMPaRMs)?o.'!i
¡Pruébelo en línea!
-5 bytes después de que cambie la entrada de Dominic Van Essen.
Toma entradas como:
8 → Wall
4 → intruder
7 → Jewel
1 → Employee
Toma las diferencias, convierte a cadena, comprueba si hay 3 en la representación de cadena.
Pyth , 13 bytes
*\lf&/TN@GTc
¡Pruébelo en línea!
Leyenda
j- joyae- empleados"- intruso- pared#- vacio
Explicación
*\!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)
¡Pruébelo en línea!
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);}
Pruébelo en línea (con un signo de exclamación en lugar de una campana, ya que TIO no puede manejarlo)
Carbón , 18 bytes
×!⊙⪪EIIEIJJI²№⁻θ ι
¡Pruébelo en línea! El enlace corresponde a la versión detallada del código. Resultados !ya que BEL no está en la página de códigos de Charcoal. Explicación:
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