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?Respostas:
Perl - 636
Definitivamente, há mais golfe que pode ser feito. E provavelmente melhores maneiras de fazê-lo também.
635 caracteres + 1 para a
-C
bandeira manipular os euros.Se você tiver a entrada armazenada,
input.txt
poderá executá-la com:Aqui está a versão deparsed. Passei por isso e adicionei alguns comentários para ajudar a explicar as coisas. Talvez eu torne os nomes das variáveis mais legíveis em algum momento. Pode haver alguns casos extremos com os quais isso não funciona, mas funciona com os exemplos pelo menos.
Sinta-se livre para sugerir melhorias!
fonte
-C
bandeira antes disso. Vou deixá-lo lá para ser compatível de qualquer maneira, uma vez que é apenas uma diferença de 1 caractere.Python 3, 459 bytes
Assume que a entrada será fornecida como uma lista de strings.
fonte
~H
truque; Não posso testar isso agora, mas vou tentar fazê-lo hoje mais tarde.ValueError: not enough values to unpack (expected 3, got 1)
, python 3.6.6); você pode fornecer um link TIO ou alguma descrição sobre como executá-lo. Eu acho que pode estar distorcendo as regras, assumindo que a entrada está toda em uma linha, mas eu não fui totalmente claro sobre isso na questão, então não vou reclamar.