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.