Прочитайте кроссворд с изюминкой!

13

Аналогично этому вопросу , но это вариант кроссворда!

Вместо одной буквы на квадрат сетки, вы можете иметь одну или две .

Входные данные:

  • 2d массив, или что-то еще работает на вашем языке.
  • Вы можете принять правильные данные
  • Любой размер массива должен работать

Выход:

  • Массив всех слов
    • Через и вниз
    • Все слова должны быть объединены, т. Е. Связаны в непрерывную цепочку слов (если не вернуть false)
    • Слова должны состоять как минимум из двух квадратов сетки , а не букв

Пример:

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

Возвращает:

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

Пример:

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

Возвращает:

false

Это , поэтому я буду запускать его на Windows 7 с 2,5 ГГц и 16 ГБ оперативной памяти. Если ваш код действительно эзотерический, предоставьте ссылку на компилятор, чтобы я мог его запустить.

epicbob57
источник
9
Добро пожаловать в PPCG!
FlipTack
2
Вы должны заменить часть двух пробелов двумя квадратами сетки .
Габор Фекете
1
Какой размер входного размера будет измерять скорость?
Мартин Эндер
@MartinEnder примеры
epicbob57
@ epicbob57 Это кажется малым, чтобы измерить надежные тайминги. В основном вы будете измерять ввод-вывод и другие накладные расходы.
Мартин Эндер

Ответы:

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

Использование:

Функция принимает массив строк в качестве входных данных:

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

Возвращает строку false когда подключение возвращает несколько меток. В противном случае возвращает массив допустимых слов.

Я рассчитал это timeit, time.time()используя консольную команду, timeно я не знаю, какую из них использовать или какую разместить здесь.

Габор Фекете
источник
Я понял, что у меня нет Python 3 ... во всяком случае, я буду тестировать его с помощью time.time ()
epicbob57
Я не могу установить scipy, используя pip ...
epicbob57
ты использовал pip3?
Габор Фекете
пип 9.0.1 (python 3.5)
epicbob57
о, вы на окнах, попробуйте это с правами администратора
Габор Фекете