Lisez des mots croisés avec une touche!

13

Semblable à cette question , mais c'est une variation de mots croisés!

Au lieu d'une seule lettre par carré de grille, vous pouvez en avoir une ou deux .

Contribution:

  • Un tableau 2D, ou tout ce qui fonctionne dans votre langue.
  • Vous pouvez supposer des entrées valides
  • Toute taille de tableau doit fonctionner

Production:

  • Un tableau de tous les mots
    • De haut en bas
    • Tous les mots doivent être réunis, c'est-à-dire liés dans une chaîne de mots ininterrompue (sinon renvoyer faux)
    • Les mots doivent être au moins deux carrés de la grille , pas des lettres

Exemple:

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

Retour:

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

Exemple:

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

Retour:

false

C'est , donc je l'exécuterai sur Windows 7 avec 2,5 GHz et 16 Go de RAM. Si votre code est vraiment ésotérique, fournissez un lien vers le compilateur pour que je puisse l'exécuter.

epicbob57
la source
9
Bienvenue chez PPCG!
FlipTack
2
Vous devez remplacer la partie deux espaces par deux carrés de la grille .
Gábor Fekete
1
Avec quelle taille d'entrée la vitesse sera-t-elle mesurée?
Martin Ender
@MartinEnder les exemples
epicbob57
@ epicbob57 Cela semble trop petit pour mesurer des synchronisations fiables. Vous mesureriez principalement les E / S et autres frais généraux.
Martin Ender

Réponses:

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

Usage:

La fonction prend un tableau de tableau de chaînes en entrée:

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

Renvoie la chaîne false lorsque la connectivité renvoie plusieurs étiquettes. Renvoie un tableau de mots valides sinon.

Je l' ai chronométré avec timeit, time.time()et en utilisant la commande de la console timeet mais je ne sais pas lequel utiliser ou qui à poster ici.

Gábor Fekete
la source
J'ai réalisé que je n'ai pas Python 3 ... de toute façon, je vais le tester en utilisant time.time ()
epicbob57
Je n'arrive pas à installer scipy en utilisant pip ...
epicbob57
avez-vous utilisé pip3?
Gábor Fekete
pip 9.0.1 (python 3.5)
epicbob57
oh vous êtes sur windows, essayez-le avec les privilèges d'administrateur
Gábor Fekete