Lesen Sie ein Kreuzworträtsel mit einem Dreh!


13

Ähnlich wie bei dieser Frage , aber dies ist eine Kreuzworträtselvariante!

Anstelle von nur einem Buchstaben pro Gitterfeld können Sie auch einen oder zwei Buchstaben haben .

Eingang:

  • Ein 2D-Array oder was auch immer in Ihrer Sprache funktioniert.
  • Sie können gültige Eingaben annehmen
  • Jede Array-Größe muss funktionieren

Ausgabe:

  • Ein Array aller Wörter
    • Über und unter
    • Alle Wörter müssen zusammengefügt sein, dh zu einer ununterbrochenen Wortkette verbunden sein (wenn nicht false zurückgegeben wird)
    • Wörter müssen mindestens zwei Gitterquadrate und keine Buchstaben sein

Beispiel:

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

Kehrt zurück:

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

Beispiel:

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

Kehrt zurück:

false

Dies ist der , daher werde ich ihn unter Windows 7 mit 2,5 GHz und 16 GB RAM ausführen. Wenn Ihr Code wirklich esoterisch ist, stellen Sie einen Link zum Compiler bereit, damit ich ihn tatsächlich ausführen kann.


9
Willkommen bei PPCG!
FlipTack

2
Sie sollten den Teil mit zwei Leerzeichen durch zwei Gitterquadrate ersetzen .
Gábor Fekete

1
Mit welcher Eingabegröße wird die Geschwindigkeit gemessen?
Martin Ender

@ MartinEnder die Beispiele
epicbob57

@ epicbob57 Das scheint viel zu klein, um zuverlässige Timings zu messen. Sie würden meistens E / A und andere Gemeinkosten messen.
Martin Ender

Antworten:


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

Verwendung:

Die Funktion verwendet ein Array von Strings als Eingabe:

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

Gibt die Zeichenfolge zurück, falsewenn die Konnektivität mehrere Bezeichnungen zurückgibt. Gibt ansonsten ein Array gültiger Wörter zurück.

Ich timed es mit timeit, time.time()und mit dem Konsolenbefehl timeund , aber ich weiß nicht , welche zu benutzen oder eine , die hier zu posten.


Mir ist aufgefallen, dass ich Python 3 nicht besitze ... trotzdem werde ich es mit time.time ()
testen

Ich kann scipy nicht mit pip installieren ...
epicbob57 20.12.16

hast du pip3 benutzt
Gábor Fekete

pip 9.0.1 (Python 3.5)
epicbob57

Oh, du bist auf Windows, versuche es mit Administratorrechten
Gábor Fekete
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.