Suponha que você receba algumas letras maiúsculas distintas espalhadas em uma matriz retangular de células em branco. Cada célula na matriz pertence à letra mais próxima , definida como a letra alcançável no menor número de etapas horizontais e / ou verticais - sem etapas diagonais. (Se uma célula é equidistante de duas ou mais letras mais próximas, ela pertence à que ocorrer primeiro em ordem alfabética. Uma célula com uma letra maiúscula pertence a essa letra.) Limite - células são aquelas que são horizontal ou verticalmente adjacente a uma ou mais células que não pertencem à letra à qual eles próprios pertencem.
Escreva um subprograma de procedimento com o seguinte comportamento, produzindo um tipo de diagrama de Voronoi ...
Entrada : qualquer sequência ASCII composta apenas por pontos, letras maiúsculas e novas linhas, de modo que, quando impressa, exiba uma matriz retangular do tipo descrito acima, com pontos atuando como espaços em branco.
Saída : Uma impressão da sequência de entrada com cada célula limite em branco substituída pela versão em minúscula da letra à qual ela pertence. (O subprograma faz a impressão.)
Exemplo 1
Entrada:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Saída:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Um esboço destacando os limites:
Exemplo 2
Entrada:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Saída:
..rt.....ts...sg......gduu..U.....ui....
..rt..T..ts...sg......gddeu......ui.....
...rt...ts....sg......gddeeu....ui......
....rttts.....sggggggGgdde.euuuui.......
..R.rywss.S....sfffffFdDdEeeeeeei.....I.
...ryywwzs.....sf....fddhHhhhhhhhi......
..ryyYWwZzs..sssffff.fddh.......hi......
..rxxxXxzzs.sllvvvvvffddh....hhhhi......
rrrxxxxnzzssl.lv....vfddh...hjjjjii.....
mmmmmmmnnnnnl.lv.....vvdh..hj....jai....
mmmmmmMNnnnnl.lv...V...vvhhj.....jaai...
ppppppPQqqql...lv.......vhj......ja.ai..
ppppp.pq.ql....lkv.....vjj.......ja..aii
cccccppqql...L.lkkv...vj.....J...ja...aa
.....cpqqlll..lk..kvvvvj........ja......
......cccbbbllk....kkkkj.......ja.......
....C...cb..bk..K......kj.....ja........
.......cb....bk........kjjjjjja.........
......cb......bk.......kaaaaaa....A.....
.....cb....B...bk......ka...............
Aprimoramento de cores:
Respostas:
GolfScript,
138144137 caracteresA entrada é fornecida ao subprograma como uma única sequência na pilha. Infelizmente, tive que usar um
puts
devido ao requisito de que a rotina tenha que imprimir o resultado.Explicação do código
O bloco externo faz um loop essencialmente sobre todas as posições (x, y) de acordo com o tamanho dos retângulos de entrada. Dentro do loop, as coordenadas xey são deixadas na pilha de cada vez. Após a conclusão de cada linha, o resultado é impresso no console.
O código executado dentro do loop primeiro leva o caractere correspondente da entrada.
Então, basicamente, verificamos, se temos um
.
, ou seja, se (possivelmente) temos que substituir o personagem.Novamente, o código interno começa com um loop, agora sobre todas as coordenadas (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y)
O trecho de código interno recente simplesmente retorna a letra (minúscula) do ponto mais próximo, dadas as duas coordenadas.
Portanto, das cinco letras mais próximas para as coordenadas (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y), pegue a primeira, se não todas são igual, caso contrário, pegue a
.
.fonte
Python 3 -
424422417332295 caracteres:Existem três partes, cada uma das quais precisa estar em sua própria linha devido à sintaxe do Python:
w
é a largura de uma linha do quadro (incluindo a nova linha no final, que será reciclada como uma coluna de preenchimento).r
é umrange
objeto que indexa todos os caracteress
.n
é uma tupla de deslocamentos do índice para atingir os vizinhos de um caractere (portanto, se você quiser permitir que as letras se espalhem na diagonal, basta adicionar-w-1,-w+1,w-1,w+1
à tupla).x
é um nome abreviado para ostr.replace
método, que é usado várias vezes no código posterior (as chamadas parecerão estranhas, já que eu usox(s,*"xy")
para salvar caracteres, em vez do convencionals.replace("x", "y")
). As
sequência de parâmetros também é modificada levemente neste momento, com seus.
caracteres e novas linhas sendo substituídos por~
caracteres (porque eles ordenam depois de todas as letras). Os~
caracteres de preenchimento de uma linha também são adicionados ao final.t
mais tarde será usado como referência à versão "antiga" des
, mas precisa ser inicializada para algo diferentes
do início e zero leva apenas um caractere (um valor mais Pythonic seriaNone
, mas são três caracteres extras) .s
usando uma compreensão de lista. À medida que a compreensão percorre os índices des
, os~
caracteres são substituídos pelosmin
de seus vizinhos. Se um~
personagem estiver completamente cercado por outros~
s, isso não fará nada. Se estiver ao lado de uma ou mais letras, será a menor delas (favorecendo o"a"
excesso"b"
etc.). As novas linhas que foram transformadas em~
caracteres são preservadas, detectando seus índices com o operador de módulo. A linha de preenchimento no final não é atualizada na compreensão da lista (porque o intervalo de índices,,r
foi calculado antes de serem adicionados as
). Em vez disso, uma nova linha de~
caracteres é adicionado após a compreensão ser concluída. Observe ques
se torna uma lista de caracteres em vez de uma sequência após a primeira passagem do loop (mas como o Python é flexível sobre os tipos, ainda podemos indexar para obter os caracteres da mesma maneira).~
caracteres do preenchimento) é substituída por.
. Em seguida, todos os caracteres são concatenados juntos em uma única sequência. Por fim, os~
caracteres de preenchimento são convertidos novamente em novas linhas e a sequência é impressa.fonte
r=range
corpo da função deve estar dentro do corpo da função e ser considerado parte de um procedimento que pode ser chamado, mas você pode salvar caracteres escrevendor=range;s=[l.replace
. Você também pode espremer mais caracteres escrevendoif"~"==s[y][x]else
eif"~"==s[y][x]else
, para um total de 422. (Aliás, isso funcionou para mim com o Python 2.7)r=range
no final da primeira linha da função (onde configurei outras variáveis) e depilei alguns espaços que havia perdido antes. Não sei se consegui os dois a que você se referia, pois parece que você mencionou a mesma coisa duas vezes. E, no Python 2.7, podem ser mais dois caracteres mais curtos, já que você não precisa dos parênteses depoisprint
(geralmente isso salva apenas 1 caractere, masprint"\n".join(...)
funciona).s[y][x]for
(remover um espaço), mas você parece ter encontrado de qualquer maneira.Python,
229226 caracteresFaz uma inundação preencher para calcular o resultado. O trailing
for
/zip
combo gera uma matrizx
para cada célula que contém o valor nessa célula e seus quatro vizinhos. Em seguida, usamos o truque de Blckknght e váriasmin
possibilidades para cada célula. Esses são o valor original da célula, quaisquer vizinhos se a célula ainda não tiver sido visitada ou a.
se ela tiver sido visitada e todos os vizinhos forem.
iguais à própria célula.fonte
return s
paraprint s
. Além disso, não podey!=b
ser alterado paray>b
? Isso daria 226 caracteres, eu acho.Aqui está. Este é o meu primeiro programa de F #. Se eu perdi um recurso do idioma, me avise enquanto ainda estou aprendendo.
Aqui está a minha entrada de amostra
Aqui está a saída
Aqui está o código. Apreciar.
Agora, precisamos converter esses dados em uma matriz de dupla dimensão para que possamos acessá-los através de indexadores.
Vamos criar uma matriz representando a propriedade de cada célula
Vamos ter um método utilitário para ver o que aconteceu.
Vamos criar um registro para representar onde reside uma letra maiúscula específica.
Agora queremos encontrar todas as letras maiúsculas.
À medida que avançamos, precisamos de um conceito de direção.
À medida que avançamos, precisaremos saber sobre tamanho. Isso nos ajudará a monitorar se estamos saindo dos limites.
Padrão ativo: corresponde aos critérios de uma determinada célula.
Agora estamos reduzindo o imposto sobre metais. Isso reivindica a célula!
Usando o padrão ativo, reivindique esta célula se não for reivindicada e retorne as coordenadas das células adjacentes.
Estamos começando a criar listas desse pacote de dados, vamos criar um tipo para tornar as coisas mais claras.
Dada uma lista de critérios para reivindicar células, iteraremos sobre a lista retornando as próximas células para reivindicar e recuar nessa lista.
Para cada capital, crie um critério de reivindicação em cada direção e depois recursivamente reivindique essas células.
Todo programa precisa de um principal.
fonte