Supongamos que le dan algunas letras mayúsculas distintas dispersas en una matriz rectangular de celdas en blanco de otro modo. Cada celda de la matriz pertenece a la letra más cercana a ella, definida como la letra alcanzable en el menor número de pasos horizontales y / o verticales, sin pasos diagonales. (Si una celda es equidistante de dos o más letras más cercanas, pertenece a cualquiera de esas letras que esté primero en orden alfabético. Una celda con una letra mayúscula pertenece a esa letra). Las celdas límite son aquellas que están horizontal o verticalmente adyacente a una o más celdas que no pertenecen a la letra a la que pertenecen.
Escriba un subprograma de procedimiento con el siguiente comportamiento, produciendo una especie de diagrama de Voronoi ...
Entrada : cualquier cadena ASCII compuesta solo de puntos, letras mayúsculas y nuevas líneas, de modo que cuando se imprime muestra una matriz rectangular del tipo descrito anteriormente, con puntos que actúan como espacios en blanco.
Salida : una impresión de la cadena de entrada con cada celda de límite en blanco reemplazada por la versión en minúscula de la letra a la que pertenece. (El subprograma imprime).
Ejemplo 1
Entrada:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Salida:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Un bosquejo que destaca los límites:
Ejemplo 2
Entrada:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Salida:
..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...............
Mejora de color:
Respuestas:
GolfScript,
138144137 caracteresLa entrada se da al subprograma como una sola cadena en la pila. Lamentablemente tuve que usar un
puts
debido al requisito de que la rutina tiene que imprimir el resultado.Explicación del código.
El bloque externo esencialmente recorre todas las posiciones (x, y) de acuerdo con el tamaño de los rectángulos de entrada. Dentro del bucle, las coordenadas x e y se dejan en la pila cada vez. Después de completar cada línea, el resultado se imprime en la consola.
El código ejecutado dentro del bucle primero toma el carácter correspondiente de la entrada.
Luego, básicamente verificamos si tenemos un
.
, es decir, si (posiblemente) tenemos que reemplazar el carácter.Nuevamente, el código interno comienza con un bucle, ahora sobre todas las coordenadas (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y)
El fragmento de código interno reciente simplemente devuelve la letra (minúscula) del punto más cercano, dadas las dos coordenadas.
Entonces, de las cinco letras más cercanas para las coordenadas (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y) tome la primera, si no todas son igual, de lo contrario tomar a
.
.fuente
Python 3 -
424422417332295 caracteres:Hay tres partes, cada una de las cuales debe estar en su propia línea debido a la sintaxis de Python:
w
es el ancho de una fila del tablero (incluida la nueva línea al final, que se reciclará como columna de relleno).r
es unrange
objeto que indexa todos los caracteres ens
.n
es una tupla de desplazamientos de índice para llegar a los vecinos de un personaje (por lo tanto, si desea permitir que las letras se extiendan en diagonal, solo necesitaría agregar-w-1,-w+1,w-1,w+1
a la tupla).x
es un nombre corto para elstr.replace
método, que se usa varias veces en el código posterior (las llamadas se verán extrañas, ya que usox(s,*"xy")
para guardar caracteres, en lugar de los convencionaless.replace("x", "y")
). Las
cadena de parámetros también se modifica ligeramente en este punto, y sus.
caracteres y líneas nuevas se reemplazan por~
caracteres (porque se ordenan después de todas las letras). Los~
caracteres de relleno de una fila también se agregan al final.t
más tarde se usará como referencia a la versión "antigua" des
, pero debe inicializarse a algo que no sea igual als
principio, y cero solo toma un carácter (un valor más pitónico seríaNone
, pero eso es tres caracteres adicionales) .s
utilizando una lista de comprensión. A medida que la comprensión itera sobre los índices des
, los~
caracteres son reemplazados por losmin
de sus vecinos. Si un~
personaje estaba completamente rodeado de otros~
s, esto no hará nada. Si era junto a una o más letras, se convertirá en el más pequeño de ellos (que favorece"a"
sobre"b"
, etc.). Las nuevas líneas que se convirtieron en~
caracteres se conservan al detectar sus índices con el operador de módulo. La fila de relleno al final no se actualiza en la comprensión de la lista (porque el rango de índicesr
, se calculó antes de agregarloss
). En cambio, una nueva fila de~
los caracteres se agregan después de que se realiza la comprensión. Tenga en cuenta que ses
convierte en una lista de caracteres en lugar de una cadena después del primer paso del bucle (pero debido a que Python es flexible sobre los tipos, todavía podemos indexarlos para obtener los caracteres de la misma manera).~
caracteres del relleno) se reemplaza por.
. A continuación, los caracteres se concatenan todos juntos en una sola cadena. Finalmente, los~
caracteres de relleno se convierten nuevamente en nuevas líneas y se imprime la cadena.fuente
r=range
debería estar dentro del cuerpo de la función para considerarse parte de un procedimiento invocable, pero puede guardar caracteres escribiendor=range;s=[l.replace
. También puede exprimir más caracteres escribiendoif"~"==s[y][x]else
yif"~"==s[y][x]else
, para un total de 422. (Por cierto, esto funcionó para mí con Python 2.7)r=range
al final de la primera línea de la función (donde configuré otras variables), y eliminé un par de espacios que había perdido antes. No estoy seguro de si obtuve los dos a los que se refería, ya que parece haber mencionado lo mismo dos veces. Y, en Python 2.7, pueden ser otros dos caracteres más cortos, ya que no necesita los paréntesis despuésprint
(generalmente eso solo guarda 1 carácter, peroprint"\n".join(...)
funciona).s[y][x]for
(eliminar un espacio), pero parece que lo has encontrado de todos modos.Python,
229226 caracteres¿Se llena una inundación para calcular el resultado? El trailing
for
/zip
combo genera una matrizx
para cada celda que contiene el valor en esa celda y sus cuatro vecinos. Luego usamos el truco de Blckknght ymin
un montón de posibilidades para cada celda. Esos son el valor de celda original, cualquier vecino si la celda aún no ha sido visitada, o un.
si se ha visitado y todos los vecinos son.
o iguales a la celda misma.fuente
return s
aprint s
. Además, no sey!=b
puede cambiar ay>b
? Eso haría 226 caracteres, creo.Aquí está. Este es mi primer programa F #. Si me perdí una característica del idioma, avíseme ya que todavía estoy aprendiendo.
Aquí está mi entrada de muestra
Aquí está la salida
Aquí está el código. Disfrutar.
Ahora necesitamos convertir esos datos en una matriz de doble dimensión para poder acceder a ellos a través de indexadores.
Creemos una matriz que represente la propiedad de cada celda
Tengamos un método de utilidad para ver qué ha sucedido.
Creemos un registro para representar dónde reside una letra mayúscula en particular.
Ahora queremos encontrar todas las letras mayúsculas.
A medida que avanzamos, necesitamos un concepto de dirección.
A medida que avanzamos, necesitaremos saber sobre el tamaño. Esto nos ayudará a controlar si nos estamos moviendo fuera de los límites.
Patrón activo: coincide con los criterios de una celda determinada.
Ahora nos estamos acercando al impuesto a los metales. ¡Esto reclama la celda!
Usando el patrón activo, reclame esta celda si no se reclama, y devuelva las coordenadas de las celdas adyacentes.
Estamos comenzando a crear listas de esta bolsa de datos, creemos un tipo para aclarar las cosas.
Dada una lista de criterios para reclamar celdas, iteraremos sobre la lista devolviendo las siguientes celdas para reclamar y recurrir a esa lista.
Para cada capital, cree un criterio de reclamo en cada dirección y luego recursivamente reclame esas celdas.
Todo programa necesita un principal.
fuente