Jardim do Programador
Sendo um desenvolvedor de software profissional, você não pode se arriscar a se expor à luz não artificial do sol, mas também tem uma queda por flores e deseja manter seu jardim em boa forma o ano todo.
Para esse fim, um jardineiro é contratado todos os meses para arrumar o canteiro ao pé de sua casa. No entanto, você precisa garantir que o jardineiro esteja fazendo o trabalho corretamente e calcule um pagamento adequado para o colega que trabalha duro. Naturalmente, uma solução de software é a melhor.
Entrada
Seu programa será alimentado com informações que descrevem o canteiro como parece atual e detalhes dos itens que precisam ser removidos. O programa deve produzir o jardim sem a bagunça e imprimir uma repartição do pagamento dos jardineiros. A entrada pode ser do STDIN ou como um único argumento de linha de comando.
A primeira linha de entrada é do formato
width height unwanted_item_type_count
onde width
está a largura do canteiro, height
é a altura do canteiro (ambos em caracteres ASCII) e unwanted_item_type_count
informa quantas linhas seguirão contendo uma descrição de um tipo de item a ser removido do jardim.
Cada linha para cada tipo de item indesejado tem o formato
width height string_representation name fee_per_item
onde width
é a largura do item, height
é a altura do item (ambos em caracteres ASCII), string_representation
é a representação de string do item sem quebras de linha, name
é um identificador para o tipo de item (os espaços serão substituídos por sublinhados) e fee_per_item
é quanto o jardineiro deve ser pago pela remoção de cada tipo de item.
Por exemplo
3 2 .R.\|/ rouge_flower 3
Representa um tipo de item de nome rouge_flower
, que custa 3 para remover e fica assim:
.R.
\|/
Os itens não conterão espaços e nenhum item poderá ter uma borda composta inteiramente por pontos, e a representação da sequência também terá o tamanho exato descrito. Assim, todos os itens a seguir são entradas inválidas:
3 1 ( ) space 0
1 1 . dot 0
2 1 .! bang 0
3 2 .@.\|/. plant 0
Observe que 0 é, no entanto, uma taxa válida (as taxas sempre serão números inteiros maiores que -1).
Observe também que o canteiro é predominantemente composto de pontos ( .
) em vez de espaços, e você pode usar com segurança o espaço em branco como delimitação para todas as entradas. O canteiro é sempre delimitado pelos próprios pontos.
Depois que os tipos de itens indesejados são listados, vem a representação ASCII do canteiro de flores de determinada largura e altura.
Resultado
A saída deve ser STDOUT, ou alternativa adequada, se o seu idioma não suportar.
A saída começa com uma impressão do canteiro, mas com todos os itens indesejados removidos (substituídos por pontos), para que você possa ver como deve aparecer e verifique se o jardineiro fez seu trabalho. Cada item no canteiro será cercado por um retângulo de pontos e será um item contíguo (ou seja, não haverá pontos de separação dentro do item). Por exemplo
.....
.#.#.
.....
mostra 2 itens separados
.....
.\@/.
.....
mostra 1 item
......
.#....
....|.
....|.
.o--/.
......
é inválido, pois enquanto a pedra (#) pode ser correspondida, a cobra (você não poderia dizer que era uma cobra?) não pode porque a pedra interfere no contorno exigido dos pontos.
...
\@.
...
Isso também é inválido, pois o caracol está na borda do canteiro e a borda deve sempre ser delimitada por pontos em uma entrada válida.
Depois disso, deve haver uma lista de cada tipo de item indesejado, fornecendo a contagem, o custo por item e os custos de todos os itens (contagem * custo por item), no formato:
<count> <name> at <cost_per_item> costs <cost>
Depois disso, deve haver uma única linha que produza o custo total (a soma dos custos para itens indesejados):
total cost <total_cost>
Exemplo
Para esta entrada dada
25 18 3
4 2 .\/.\\// weeds 5
2 1 \@ snails 2
1 1 # stones 1
.........................
.\@/.................\@..
............\/...........
......O....\\//..^|^.....
.#...\|/.........^|^.....
..................|......
.................\|/.....
..\@.....\/...........#..
........\\//....#........
....*....................
...\|/......\/......\@/..
...........\\//..........
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
.......#...\|/....\@.....
.........................
O programa deve produzir essa saída
.........................
.\@/.....................
.........................
......O..........^|^.....
.....\|/.........^|^.....
..................|......
.................\|/.....
.........................
.........................
....*....................
...\|/..............\@/..
.........................
..................*......
.......\@/.......\|/.....
...O.....................
..\|/.......*............
...........\|/...........
.........................
3 weeds at 5 costs 15
3 snails at 2 costs 6
4 stones at 1 costs 4
total cost 25
A saída deve ser finalizada por uma quebra de linha.
Este é o código-golfe, que ganhe o menor código.
Caso de teste adicional
Editar: isso costumava conter Unicode, o que não é permitido no canteiro, muito moderno. Isso foi corrigido, desculpe por isso.
25 15 5
5 3 ..@..\\|//.\|/. overgrown_plants 3
5 3 @-o....|...\|/. semi-articulated_plant 4
3 2 .|.\@/ mutant_plants 5
1 1 $ dollars 0
1 1 # stones 1
.........................
........@................
....$..\|/...........@...
............|.......\|/..
...#.......\@/...........
.........................
.........................
......@.......@......@...
.....\|/....\\|//...\|/..
.............\|/.........
.#....................#..
.........$.......|.......
...\/.......\/..\@/..\/..
..\\//.....\\//.....\\//.
.........................
Saída esperada:
.........................
........@................
.......\|/...........@...
....................\|/..
.........................
.........................
.........................
......@..............@...
.....\|/............\|/..
.........................
.........................
.........................
...\/.......\/.......\/..
..\\//.....\\//.....\\//.
.........................
1 overgrown_plants at 3 costs 3
0 semi-articulated_plants at 4 costs 0
2 mutant_plants at 5 costs 10
2 dollars at 0 costs 0
3 stones at 1 costs 3
total cost 16
\@
e @/
por exemplo .. Ou eles apontam eternamente para o oeste?