Introducción
Considere una cuadrícula de los caracteres f A\/
como
f f f
A
A / \
\ / A
A \/
/
\/
dónde:
f
representa un grifo que vierte una corriente de agua hacia abajoA
bifurca la corriente de agua arriba, así que exactamente la mitad va hacia la izquierda y exactamente la mitad va hacia la derecha\
desplaza la corriente de agua arriba a la derecha en una unidad/
desplaza la corriente de agua arriba a la izquierda por una unidad- Las combinaciones
\/
crean un canal con capacidad infinita que recoge las corrientes de agua por encima [space]
es un espacio vacío del que el agua puede moverse
A partir de esto, podemos imaginar el camino *
que tomaría el agua ( ) a medida que sale de los grifos y cae en los canales o fuera del área de la cuadrícula:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
Suponiendo que las 3 llaves emiten la misma cantidad de agua, una por vez, podemos ver que
- Toda el agua del primer grifo va al canal inferior.
- La mitad del agua del segundo grifo va al canal inferior y la otra mitad se divide entre el canal inferior y se cae de la red.
- Un cuarto del agua del tercer grifo va al canal inferior, un cuarto cae del fondo de la rejilla, un cuarto entra al canal superior y un cuarto cae de la rejilla a la derecha.
De esto podemos decir que (1 + 3/4 + 1/4 + 1/4) / 3 = 75%
el agua es atrapada por los canales y se (1/4 + 1/4 + 1/4) / 3 = 25%
cae de la red.
Desafíos
Puede completar cualquiera o todos estos desafíos relacionados con esta configuración de flujo de agua ASCII. Todos son códigos de golf, la respuesta más corta para cada desafío es el ganador. La respuesta aceptada será la persona que complete la mayoría de los desafíos, con una longitud total de código como desempate.
Desafío 1
Escriba un programa que genere la fracción de agua que fluye hacia los canales para una red determinada. El resultado del ejemplo anterior sería simplemente 0.75
.
Desafío 2
Escriba un programa que, dada una cuadrícula, dibuje los *
's en los lugares donde fluye el agua como lo hice anteriormente. No debe sobrescribir nada además de los caracteres de espacio y la cuadrícula no debe cambiar el tamaño. Entonces para algo como
f
/A
no es necesario hacer nada ya que, aunque el agua fluye a ambos lados de la A, no se puede arrastrar hacia la izquierda sin quitar la /
y no se puede dibujar hacia la derecha sin agrandar la cuadrícula de 2 × 2.
Desafío 3 (actualizado)
Escriba un programa que tome dos enteros no negativos, la T total y la cantidad para mantener K (T> = K). Genere y dibuje una cuadrícula con exactamente una de f
tal manera que cuando ese grifo vierta T unidades de agua, exactamente K fluirá hacia los canales. Si es imposible hacer esto en una cuadrícula finita para un par particular (T, K), entonces envíe 'Imposible'.
Aclaraciones (se aplican a todos los desafíos)
- La entrada puede ser a través de stdin, o un archivo, o incluso una llamada de función en la representación de cadena de la cuadrícula. Simplemente haz que sea obvio cómo ejecutar diferentes entradas.
- La salida debe ir a stdout.
\A
yA/
yAA
son también depresiones como era de esperar.- Una cuadrícula w por h siempre será un rectángulo bien formateado de caracteres w * h sin contar nuevas líneas. No habrá espacios finales faltantes ni ocurrencias de
*
. - Las dimensiones de la cuadrícula pueden ser tan pequeñas como 1 × 1 y arbitrariamente grandes. (Arbitrariamente grande dentro de lo razonable, int.maxValue o similar es un límite aceptable. Lo mismo ocurre con T y K.)
- Una corriente sobre una
f
fluye a través de ella. - Los grifos pueden estar en cualquier lugar, no solo en la fila superior.
A
siempre divide la cantidad de agua que se vierte exactamente por la mitad.
Nota: Cosas como /A
y //
son perfectamente válidas. El agua no fluya libremente entre los personajes (aunque para el desafío 2 no hay suficiente espacio para dibujar).
Entonces, en la configuración
ff
/A
La f
corriente izquierda se derrama, golpea /
y se desplaza a la izquierda. El derecho f
corriente se derrama, golpea el A
, la mitad va a la derecha y la otra mitad va a la izquierda entre el A
y el /
.
p.ej
ff
**
*/A*
** *
** *
/A
si el agua cae sobre el A
. Para todos los desafíos, sería bueno aclarar si se \A
trata de una depresión. Para el tercer desafío, ¿deberían A
suponerse que 3 unidades que caen sobre un se dividen 1.5 / 1.5
(por lo que la entrada es realmente un único número racional) o es 2 / 1
, en cuyo caso, qué lado recibe el 2
?
A
entonces ambas partes no consiguen 1,5 Está hasta el codificador para asegurarse de que la precisión de flotación no es un problema..)
f
s