Dada una lista de longitudes y una cadena que representa esas longitudes, ¿coinciden?

16

Dado un patrón que representa una lista de longitudes, y una cadena que representa esas longitudes, ¿coinciden?

Para aquellos interesados, esta es una pregunta equivalente a verificar si una fila o columna de un Nonograma puede ser correcta. Sin embargo, he omitido todo el lenguaje relacionado con Nonogramas para hacer la pregunta menos confusa para aquellos que no están familiarizados con estos acertijos.

Entrada

Dos líneas de datos, separadas por una nueva línea.

  1. La primera línea será una lista de enteros separados por espacios, por ejemplo:

    3 6 1 4 6
    

    Esta línea describe un patrón de espacios rellenos de tamaño igual a la lista entera, separados por espacios vacíos de longitud desconocida y positiva que debe coincidir con la segunda línea. También puede haber espacios vacíos al principio y al final de la cadena coincidente.

  2. La segunda línea será una línea que puede o no coincidir con el patrón en la línea uno. Se compone en su totalidad de #, x, y _. Se garantiza que esta línea será al menos tan larga como la suma de los enteros en la primera línea, más el número de enteros distintos, menos 1, y puede ser más larga. Por lo tanto, la segunda línea en este caso tiene una (3+6+1+4+6) + (5) - 1longitud mínima de 24 caracteres. Aquí hay una línea de 24 caracteres de ejemplo que coincide con el patrón en la primera línea:

    ###_######_#_####_######
    

Significado de los símbolos:

  • # Esto representa un cuadro lleno
  • x Esto representa un cuadro marcado como "garantizado de estar vacío"
  • _ Esto representa un cuadro desconocido / sin marcar.

Objetivo

La idea es:

  1. Valide que la segunda línea podría ser una fila válida que cumpla con el patrón de la primera línea.
    • Debe imprimir un mensaje de error inequívoco (la forma en que elige hacer esto depende de usted; los ejemplos a continuación escriben ERRORpero no es necesario que sean esos 5 caracteres) si los espacios desconocidos no se pueden completar con ninguno #o xpara que coincidan con el primero línea.
  2. Imprima los índices indexados a cero de los enteros que se han colocado completamente en la fila, delimitado por espacios. Si hay ambigüedad, no imprima el índice .

Ejemplos:

Input:                    |  Output:    |  Reason:
--------------------------------------------------------------------------
3 6 1 4 6                 | 0 1 2 3 4   |  This is a complete string that 
###x######x#x####x######  |             |  matches perfectly.
--------------------------------------------------------------------------
1 2 1                     | 0 1 2       |  There is no ambiguity which filled cells 
#____xx___##__x_#         |             |  correspond to which parts of the pattern.
--------------------------------------------------------------------------
1 2 1                     |             |  I don't know whether the filled block is
____#___x                 |             |  part of the 1, 2, or 1, so output nothing.
--------------------------------------------------------------------------
1 2 1                     | ERROR       | The first unknown cell will create a block that
#_#x_#                    |             | matches either 1 1 or 3, but not 1 2.
--------------------------------------------------------------------------
1 2 1                     | 0 2         | Even though we know where all the filled cells
#____#                    |             | must be, only 0 and 2 are actually filled here.
--------------------------------------------------------------------------
1 1 1 1                   |             | There are so many possible ways to do fill this,
__#_______#____           |             | we don't know which indices are actually matched.
--------------------------------------------------------------------------
4 4                       |             | Again, we don't know WHICH 4 is matched here, 
______x####________       |             | so output nothing.
--------------------------------------------------------------------------
4 4                       | 0           | However, here, there's no room for a previous 4,
__x####________           |             | so the displayed 4 must be index 0.
--------------------------------------------------------------------------
3                         | ERROR       | We can't fit a 3 into a space before or after
__x__                     |             | the x, so this is impossible to match.
--------------------------------------------------------------------------
5 1 3                     | 0           | While we can match the 5, we don't know whether
x#####x____#____          |             | the single block matches the 1 or the 3.
--------------------------------------------------------------------------
3 2 3                     | 1           | The two has been completely placed,
____##x##____             |             | even though we don't know which it is.

Reglas:

Puede escribir un programa o función , que recibe la entrada como una cadena delimitada por una nueva línea o desde STDIN (o la alternativa más cercana), y devuelve la salida como una cadena delimitada por espacios o imprimiéndola en STDOUT (o la alternativa más cercana). Opcionalmente, puede incluir una nueva línea final en la salida.

Además, las lagunas estándar que ya no son divertidas están prohibidas .

durron597
fuente
1
Esto es para resolver nonogramas, ¿verdad? Puede ser útil mencionar los nogramas ya que eso hace que el desafío tenga sentido inmediato para quienes los resuelven.
xnor
@ jimmy23013 Editado en respuesta.
durron597

Respuestas:

5

Perl, 134 bytes

(incluye 1 interruptor)

perl -pe '$p.="([#_]{$_})[x_]+"for@l=split;chop$p,$_=<>;/^[x_]*$p*$(?{$h[$_-1].=$$_ for 1..@l})(?!)/;$_=@h?join$",grep{$h[$_]!~/_/}0..$#l:ERROR'

Toma dos líneas de entrada de STDIN. Se debe volver a ejecutar para cada entrada.

La idea es extraer primero todos los patrones posibles que coincidan con las longitudes dadas. Por ejemplo, si tenemos las longitudes 1 2y el patrón #_x_#_, entonces los patrones coincidentes son (#, _#)y (#, #_). Luego, concatene los patrones coincidentes para cada índice; por ejemplo, el resultado es la lista(##, _##_) . Ahora, imprima los índices de todas las cadenas de la lista que solo tienen caracteres '#'.

Obtuve el método para extraer todas las coincidencias posibles de una expresión regular en Perl aquí .

svsd
fuente
Frio. ¿Podría agregar una versión no golfista y un enlace ideone por favor?
durron597
Claro, he agregado el enlace al final de mi respuesta.
svsd
¡Un verdadero ejemplo de lo horrible que puede verse un fragmento de código de golf! Al menos para mi.
Arjun
1
@Arjun Golfing tiende a ofuscar el código. Hay belleza en código golfed, pero sólo si se conoce el idioma está escrito en.
SVSD
1
Agregué un nuevo ejemplo porque un escenario aún era ambiguo en la descripción del problema. Afortunadamente, su programa todavía funciona correctamente en ese caso también.
durron597