Introdução
Considere uma grade de caracteres f A\/
como
f f f
A
A / \
\ / A
A \/
/
\/
Onde:
f
representa uma torneira que derrama um fluxo de água para baixoA
bifurca o fluxo de água acima, então exatamente metade vai para a esquerda e exatamente metade vai para a direita\
desloca o fluxo de água acima para a direita em uma unidade/
desloca o fluxo de água acima para a esquerda em uma unidade- as combinações
\/
criam uma calha com capacidade infinita que coleta as correntes de água acima dela [space]
é um espaço vazio do que a água pode se mover
A partir disso, podemos imaginar o caminho que a água ( *
) seguiria ao sair das torneiras e cair nas calhas ou fora da área da grade:
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
Assumindo que as 3 torneiras produzem a mesma quantidade de água, uma de cada vez, podemos ver que
- Toda a água da primeira torneira vai para a calha mais baixa.
- Metade da água da segunda torneira vai para a calha inferior e a outra metade é dividida entre a calha inferior e caindo da grade.
- Um quarto da água da terceira torneira vai para a calha inferior, um quarto cai na parte inferior da grade, um quarto entra na calha superior e um quarto cai da grade para a direita.
A partir disso, podemos dizer que (1 + 3/4 + 1/4 + 1/4) / 3 = 75%
a água é capturada pelas valas e (1/4 + 1/4 + 1/4) / 3 = 25%
cai da rede.
Desafios
Você pode concluir um ou todos esses desafios relacionados a esta configuração de fluxo de água ASCII. Todos eles são golfe de código, a resposta mais curta para cada desafio é o vencedor. A resposta aceita será a pessoa que concluir a maioria dos desafios, com o comprimento total do código como desempate.
Desafio 1
Escreva um programa que produza a fração de água que flui para as calhas de uma determinada grade. A saída do exemplo acima seria simplesmente 0.75
.
Desafio 2
Escreva um programa que, dado uma grade, desenhe *
os lugares nos locais em que a água flui, como fiz acima. Você não deve substituir nada além de caracteres de espaço e a grade não deve mudar de tamanho. Então, para algo como
f
/A
nada precisa ser feito, pois, embora a água flua em ambos os lados do A, ela não pode ser desenhada para a esquerda sem remover a /
e não pode ser desenhada para a direita sem aumentar a grade 2 × 2.
Desafio 3 (Atualizado)
Escreva um programa que inclua dois números inteiros não negativos, o T total e o valor para manter K (T> = K). Gere e desenhe uma grade com exatamente uma f
tal que, quando essa torneira derramar T unidades de água, exatamente K fluirá para as calhas. Se for impossível fazer isso em uma grade finita para um par específico (T, K), em seguida, imprima 'Impossível'.
Esclarecimentos (aplicáveis a todos os desafios)
- A entrada pode ser via stdin, ou um arquivo, ou mesmo uma chamada de função na representação de string da grade. Apenas torne óbvio como executar diferentes entradas.
- A saída deve ir para stdout.
\A
eA/
eAA
são também por declínios como seria de esperar.- Uma grade w por h sempre será um retângulo bem formatado de caracteres w * h sem contar novas linhas. Não haverá espaços à direita ausentes nem ocorrências de
*
. - As dimensões da grade podem ser tão pequenas quanto 1 × 1 e arbitrariamente grandes. (Arbitrariamente grande dentro da razão, int.maxValue ou similar é um limite aceitável. O mesmo vale para T e K.)
- Um fluxo acima de um
f
flui direto através dele. - As torneiras podem estar em qualquer lugar, não apenas na linha superior.
A
sempre divide a quantidade de água derramada exatamente ao meio.
Nota: Coisas como /A
e //
são perfeitamente válidas. A água não fluir livremente entre os caracteres (embora para desafio 2 não há espaço suficiente para desenhá-lo).
Então, na configuração
ff
/A
O f
fluxo da esquerda desce, bate no /
e muda para a esquerda. O f
fluxo da direita flui para baixo, bate no A
, metade vai para a direita e metade vai para a esquerda entre o A
e o /
.
por exemplo
ff
**
*/A*
** *
** *
/A
se a água caísse na A
. Para todos os desafios, seria bom esclarecer se isso \A
é um problema. Para o terceiro desafio, deve- A
se supor que 3 unidades que caem em uma divisão se dividam 1.5 / 1.5
(para que a entrada seja realmente um único número racional) ou é 2 / 1
, nesse caso, qual lado recebe o 2
?
A
, em seguida, ambos os lados se obter 1,5 Cabe ao codificador para se certificar de precisão flutuante não é um problema..)
f
s