¡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.


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í.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.