¡Lee un crucigrama con un giro!

13

Similar a esta pregunta , ¡pero esta es una variación de crucigramas!

En lugar de solo una letra por cuadrícula, puede tener una o dos .

Entrada:

  • Una matriz 2D, o lo que sea que funcione en tu idioma.
  • Puede asumir entradas válidas
  • Cualquier tamaño de matriz debe funcionar

Salida:

  • Un conjunto de todas las palabras.
    • De un lado a otro
    • Todas las palabras deben estar unidas, es decir, vinculadas en una cadena ininterrumpida de palabras (si no devuelve falso)
    • Las palabras deben ser al menos dos cuadrados de cuadrícula , no letras

Ejemplo:

[["",  "wo", "r",  "k"],
[ "",   "r",  "",   ""],
[ "he", "l",  "lo", ""],
[ "",   "d",  "ad", ""]]

Devoluciones:

["work", "world", "hello", "load", "dad"]

Ejemplo:

[["he", "ll", "o"],
[ "",   "",   ""],
[ "wo", "r",  "ld"]]

Devoluciones:

false

Este es , así que lo ejecutaré en Windows 7 con 2.5 ghz y 16 gb de ram. Si su código es realmente esotérico, proporcione un enlace al compilador para que realmente pueda ejecutarlo.

epicbob57
fuente
99
Bienvenido a PPCG!
FlipTack
2
Debe reemplazar la parte de dos espacios con dos cuadrados de cuadrícula .
Gábor Fekete
1
¿Con qué tamaño de entrada se medirá la velocidad?
Martin Ender
@MartinEnder los ejemplos
epicbob57
@ epicbob57 Eso parece demasiado pequeño para medir tiempos confiables. En su mayoría, estaría midiendo E / S y otros gastos generales.
Martin Ender

Respuestas:

1

Python 3

import numpy
from scipy.ndimage import measurements

def crosswords(arr):
    M=numpy.asarray(arr)
    # check connectivity
    if measurements.label(numpy.where(M!='',1,0))[-1] != 1:
        return 'false'

    words = []
    def get_words(mat):
        for r in mat:
            word,counter='',0
            for c in r:
                if c=='':
                    if counter>1:
                        words.append(word)
                    word, counter = '', 0
                else:
                    word, counter = word+c, counter+1
            if counter > 1:
                words.append(word)
    get_words(M)
    # transpose M
    get_words(M.T)
    return words

Uso:

La función toma una matriz de matriz de cadenas como entrada:

crosswords( [["", "wo", "r", "k"], [ "", "r", "", ""], [ "he", "l", "lo", ""], [ "", "d", "ad", ""]])

Devuelve la cadena. false cuando la conectividad devuelve múltiples etiquetas. Devuelve una matriz de palabras válidas de lo contrario.

Lo cronometré con timeit, time.time()y usando el comando de la consola, timepero no sé cuál usar o cuál publicar aquí.

Gábor Fekete
fuente
Me di cuenta de que no tengo Python 3 ... de todos modos, lo probaré usando time.time ()
epicbob57
Parece que no puedo instalar scipy usando pip ...
epicbob57
usaste pip3?
Gábor Fekete
pip 9.0.1 (python 3.5)
epicbob57
oh, estás en Windows, pruébalo con privilegios de administrador
Gábor Fekete