Osmisměrka – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Osmisměrka – Python – Fórum – Programujte.comOsmisměrka – Python – Fórum – Programujte.com

 

rontorto
~ Anonymní uživatel
6 příspěvků
19. 11. 2019   #1
-
0
-

Ahoj,Mám problém, dělám na osmisměrce, vstupem jsou 2 soubory na řádce
v jednom je osmisměrka, v druhém slova, které má program najít
výstupem má být slovo, souřadnice, kde slovo začíná a směr(shora nebo zleva), všechno funguje, jenže potřebuji,aby se slova vypisovala v pořadí, v jakém jsou napsána v souboru číslo 2

soubor s osmisměrkou:
 

xmuinjekci
evelkochov
cadvouhrac
feminizaci
pyzlanpbik
ldvojlinky
osvrhloubd
dqldrvandy
yevergreen
olympskout


soubor se slovy:

dvojlinky
feminizaci
velkochov
dvouhra
olympskou
plody
dyn
rab
svrhlou
np
jo
lordem
velko
injekci
skout
mva
vandy
dvou
evergreen
ech
zla
kb
un
hrr
aj
ona


zdroják

def find_words(file_inputs, words):
    with open(file_inputs) as file:
        for line in file:
            line = line.replace('\n', '')
            line = line.lower()
            words.append(line)

def get_search_board(file_inputs, search_board):
    with open(file_inputs) as file:
        for line in file:
            if len(line) > 6:
                line = line.lower()
                search_board += line
    length = search_board.index('\n') + 1
    return search_board, length

def main():
    words = []
    search_board = ''
    z = input().split()
    file_input = z[0]
    file_inputs = z[1]
    find_words(file_inputs, words)
    search_board, length = get_search_board(file_input, search_board)
    lines = {}

    lines["1"] = []

    letters = [(letter, divmod(index, length))
               for index, letter in enumerate(search_board)]

    lines['0'] = letters

    for i in range(length):
            for j in range(i, len(letters), length):
                lines["1"].append(letters[j])

    for direction, tuple in lines.items():
        string = ''.join([i[0] for i in tuple])
        for word in words:
            if word in string:
                coordinates = tuple[string.index(word)][1]
                print(word,coordinates[0], coordinates[1], direction)

main()

výstup:

plody 4 0 1
dyn 6 9 1
rab 2 7 1
jo 0 5 1
lordem 4 3 1
mva 0 1 1
ech 0 6 1
kb 5 8 1
un 6 7 1
hrr 6 4 1
aj 4 4 1
ona 2 4 1
dvojlinky 5 1 0
feminizaci 3 0 0
velkochov 1 1 0
dvouhra 2 2 0
olympskou 9 0 0
svrhlou 6 1 0
np 4 5 0
velko 1 1 0
injekci 0 3 0
skout 9 5 0
vandy 7 5 0
dvou 2 2 0
evergreen 8 1 0
zla 4 2 0


ale potřeboval bych tento výstup:

dvojlinky 5 1 0
feminizaci 3 0 0
velkochov 1 1 0
dvouhra 2 2 0
olympskou 9 0 0
plody 4 0 1
dyn 6 9 1
rab 2 7 1
svrhlou 6 9 0
np 4 5 0
jo 0 5 1
lordem 4 3 1
velko 1 1 0
injekci 0 3 0
skout 9 5 0
mva 0 1 1
vandy 7 5 0
dvou 2 2 0
evergreen 8 1 0
ech 0 6 1
zla 4 2 0
kb 5 8 1
un 6 7 1
hrr 6 4 1
aj 4 4 1
ona 2 4 1


Díky za pomoc

Nahlásit jako SPAM
IP: 2a02:8308:23d:fb00:86b:242f:3dc2:9b38...–
gna
~ Anonymní uživatel
1891 příspěvků
19. 11. 2019   #2
-
0
-

Ten poslední cyklus otoč

for word...
    for direction...
Nahlásit jako SPAM
IP: 213.211.51.–
rontorto
~ Anonymní uživatel
6 příspěvků
19. 11. 2019   #3
-
0
-

#2 gna
 

import sys
words = []
s_b = ''
z = input().split()
file_input = z[0]
file_inputs = z[1]
with open(file_inputs) as file:
    for line in file:
        line = line.replace('\n', '')
        line = line.lower()
        words.append(line)
with open(file_inputs) as file:
    for line in file:
        if len(line) > 6:
            line = line.lower()
            s_b += line
length = s_b.index('\n') + 1
lines = {}
lines["1"] = []
letts = [(lett, divmod(index, length))
            for index, lett in enumerate(s_b)]
lines['0'] = letts

for word in words:
    for dir, tple in lines.items():
        for i in range(length):
            for j in range(i, len(letts), length):
                lines["1"].append(letts[j])
                string = ''.join([i[0] for i in tple])
        if word in string:
            coord = tple[string.index(word)][1]
            print(coord[0], coord[1], dir)

takto to funguje. .a nějaký způsob na zrychlení?

Nahlásit jako SPAM
IP: 2a02:8308:23d:fb00:86b:242f:3dc2:9b38...–
gna
~ Anonymní uživatel
1891 příspěvků
19. 11. 2019   #4
-
0
-

Já teda úplně nechápu, co v tom cyklu děláš, ale děláš to pokaždé. Připrav si data a pak jen hledej.

Já jsem tady udělal dva stringy v obou směrech a prosvištím je findem. 

def findall(haystack, needle):
    pos = -1
    while True:
        pos = haystack.find(needle, pos + 1)
        if pos == -1:
            break
        yield pos


fname_data, fname_words = input().split()

with open(fname_words) as file:
    words = file.read().lower().split()

with open(fname_data) as file:
    data_rows = file.read().lower().split()
data_cols = zip(*data_rows)

data_rows = '\n'.join(data_rows)
data_cols = '\n'. join((''.join(col) for col in data_cols))
data_width = data_rows.find('\n') + 1
data_height = data_cols.find('\n') + 1

for word in words:
    for pos in findall(data_rows, word):
        x, y = divmod(pos, data_width)
        print(word, x, y, 0)
    for pos in findall(data_cols, word):
        y, x = divmod(pos, data_height)
        print(word, x, y, 1)
Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Grafoman
19. 11. 2019   #5
-
0
-

#4 gna
pěkný někdy mě ta funkcionalita pythonu až překvapuje, jen technická nemělo by data_width a data_height být před tím spojováním?

Nahlásit jako SPAM
IP: 185.112.167.–
gna
~ Anonymní uživatel
1891 příspěvků
20. 11. 2019   #6
-
0
-

#5 MilanL
To by určitě šlo. Já jsem to narychlo namatlal tak, jak mě to napadalo. "A teď to spojím do stringu... Jo, a ještě budu potřebovat vědět rozměry..."

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý