Encuentra a Santa y sus renos en una escena llena de gente.
Entrada
La entrada estará en STDIN y será un número variable de líneas de caracteres de igual longitud, pero variable. Si Santa (representado por el personaje S
) está en la escena, su saco de regalos (representado por el personaje P
) estará en una de las posiciones adyacentes a él (horizontal, vertical o diagonal). Sus renos (cada uno representado por el personaje R
) estarán todos dentro del cuadrado de 5x5 que lo rodea. Si S
aparece en la escena que no tiene un saco de regalos, o no está acompañado por al menos 4 renos, entonces no es Santa.
Salida
La escena se despejó de toda ofuscación (todos los personajes que no son Santa, no presentes, no renos reemplazados por un espacio), mostrando a Santa, su saco de regalos y sus renos; todos los demás personajes deben reemplazarse por espacios. Si Papá Noel y sus renos no están en la escena, déjelos sin cambios. Se garantiza que solo habrá una solución, por lo que nunca habrá más de un Papá Noel válido y nunca llevará más de un saco de regalos.
Ejemplos
En estos ejemplos sólo estoy usando el *
personaje para que sea fácil de ver los S
, P
y R
personajes, pero su programa debe ser capaz de manejar cualquier carácter ASCII a partir !
de `
(33 a 96). He omitido los caracteres en minúscula y superiores para evitar confusiones.
Entrada:
***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Salida: (ignore los puntos, obligarán a la página a mostrar las líneas en blanco)
.
.
.
R
P
S
R
R R
.
.
.
.
Entrada: (no hay suficientes renos)
***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Salida:
***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Entrada: (sin saco de regalos)
***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Salida:
***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Entrada: (presenta no lo suficientemente cerca)
***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********
Salida:
***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********
Entrada: (uno de los renos que no está dentro del cuadrado de 5x5 alrededor de Santa)
***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********
Salida:
***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********
Scripts de prueba
Como en algunas de mis preguntas anteriores, una vez más eliminé algunos scripts de prueba creados originalmente por Joey y Ventero para proporcionar algunos casos de prueba para esta pregunta:
Uso: ./test [your program and its arguments]
Versión de texto sin formato de las pruebas para referencia: texto sin formato
Recompensas
Cada entrada que pueda verificar que cumpla con las especificaciones, pase las pruebas y obviamente haya tenido algún intento de jugar al golf recibirá un voto positivo de mí (así que proporcione instrucciones de uso con su respuesta). La solución más corta para fines del 31/12/2013 será aceptada como ganadora.
Respuestas:
MATLAB: 110
, 95caracteresNo estoy seguro sobre la forma en que se supone que se procesa la entrada, pero el resto es bastante sencillo.
Versión con formato normal:
Entrada de ejemplo:
fuente
*
caracteres cuando parte del público para que sea más fácil ver laS
,P
yR
caracteres - mientras que las pruebas en el uso script de prueba todos los caracteres ASCII de 33 (!
) hasta a (e incluyendo) 96 (`` `). Dejaré esto claro en la pregunta. He hecho una versión en texto plano de las pruebas que necesita pasar, que también agregaré a la pregunta.Q
edredón, me habría salvado al menos 2 personajes.SQL_2
en la entrada de muestra ... agradable :)Pitón 2 (
353381)Primer intento de escribir código lo más compacto posible. Python no es realmente el lenguaje para eso, ya que el diseño simplemente requiere sangría y nuevas líneas. Principalmente elijo usar este lenguaje, debido a la forma en que puedes jugar con listas y cadenas como listas. Un lenguaje con fácil manipulación matricial sería ideal para esta tarea, pero lamentablemente no conozco ninguno de ellos.
Para probar algo, algo debe asignarse a un, p. Ej.Lo más interesante de este código es probablemente:
que es una forma elegante de escribir: "b se convierte en una lista de una representación (cadena de 25 caracteres) de cada cuadrado de 5x5 en la representación original".
fuente
Debe haber solo un Santa en el archivo (si hay más de 2 "S", necesito actualizar el código).
Usando awk
Ejecute el comando awk como se muestra a continuación
Resultado
fuente
S
se permiten 2 siempre y cuando solo uno sea un Santa 'válido'. Las pruebas (proporcionadas en la pregunta) tienen un par de casos que fallarían por este motivo.