14 svar
117 visningar
anony123 är nöjd med hjälpen
anony123 163 – Fd. Medlem
Postad: 8 dec 2022 16:30

Koordinater

Jag vill skriva ut totalt 36 koordinater mha A-F och talen 1-6 som en lista. Jag kom bara på en väldigt ineffektiv metod

som förlitar sig på att range är ett stort tal. Hur kan man modifiera den så att man dels bara har range(36) och dels inte får några dubbletter?

hidden  = list(set([choice(a_f) + str(choice(list(range(1,7)))) for i in range(100)]))
Fermatrix 7841 – Fd. Medlem
Postad: 8 dec 2022 16:36

Har jag fattat rätt nu:

Du vill skapa 36 random Koordinater av form BnSnB_n S_n där BnB_n alltid är en bokstav mellan a-f och SnS_n alltid är en siffra mellan 1-6 samt att dubbletter skall inte förekomma?

anony123 163 – Fd. Medlem
Postad: 8 dec 2022 16:38
Dracaena skrev:

Har jag fattat rätt nu:

Du vill skapa 36 random Koordinater av form BnSnB_n S_n där BnB_n alltid är en bokstav mellan a-f och SnS_n alltid är en siffra mellan 1-6 samt att dubbletter skall inte förekomma?

Exakt!

Analys 1202
Postad: 8 dec 2022 20:02

Varför inte loopa från 0-35 och i varje loop hitta slumpkoordinater som ännu inte finns i listan. Det blir ju en innerloop av detta.

Eller måste det vara en one-liner?

anony123 163 – Fd. Medlem
Postad: 8 dec 2022 20:04
Analys skrev:

Varför inte loopa från 0-35 och i varje loop hitta slumpkoordinater som ännu inte finns i listan. Det blir ju en innerloop av detta.

Eller måste det vara en one-liner?

jag försökte göra så men kom inte på hur så det måste inte vara en one-liner

Analys 1202
Postad: 8 dec 2022 20:07

Ge mig en stund, hur är a_f definierat?

anony123 163 – Fd. Medlem
Postad: 8 dec 2022 20:09
from string import ascii_uppercase as letters


a_f = list(letters[:6])
Analys 1202
Postad: 8 dec 2022 20:29
import random
from string import ascii_uppercase as letters
a_f=list(letters[0:6])
random_coordinates=[]
for i in range(36):
    new_found=False
    while not new_found:
        newc=random.choice(a_f) + str(random.choice(list(range(1,7))))
        if newc not in random_coordinates:
            random_coordinates.append(newc)
            new_found=True
anony123 163 – Fd. Medlem
Postad: 8 dec 2022 20:36
Analys skrev:
import random
from string import ascii_uppercase as letters
a_f=list(letters[0:6])
random_coordinates=[]
for i in range(36):
    new_found=False
    while not new_found:
        newc=random.choice(a_f) + str(random.choice(list(range(1,7))))
        if newc not in random_coordinates:
            random_coordinates.append(newc)
            new_found=True

Ah smart, tack så mycket!

Fermatrix 7841 – Fd. Medlem
Postad: 8 dec 2022 20:52 Redigerad: 8 dec 2022 20:58

Din lösning var ju inte så ineffektiv. Den tar 0.012\approx 0.012 sekunder med en range på 10410^4

Analys lösning tar ungefär 0.0002\approx 0.0002 sekunder

mha itertools så kan man hitta alla möjliga unika kombinationer, välja ut exakt 36 unika koordinater på 3.37·10-5\approx 3.37\cdot10^{-5} sekunder, men det handlar inte alltid om den snabbaste lösningen. Det är ju också viktigt att du, och de andra som ska läsa koden förstår vad den gör. :)


Analys lösning är alltså 60x snabbare ungefär (nu räknar jag fortfarande med en range på 10410^4.


Värt att notera är dock är att tiden varierar enormt mycket med Analys lösning. Det är inte alls ovanligt att det tar 2x längre tid pga kollisioner. Men är fortfarande minst 30x snabbare om man utgår från en range på 10410^4.

anony123 163 – Fd. Medlem
Postad: 8 dec 2022 20:57

hur tar du reda på hastigheten? dock tror jag att det finns en väldigt liten chans att man ändå får en dubblett med min lösning

Analys 1202
Postad: 8 dec 2022 21:01

Som jag minns det var det ungefär denna komplexitet på uppgifter på första programmeringskursen på xTH. Stämmer det fortfarande?

anony123 163 – Fd. Medlem
Postad: 8 dec 2022 21:03
Analys skrev:

Som jag minns det var det ungefär denna komplexitet på uppgifter på första programmeringskursen på xTH. Stämmer det fortfarande?

Haha precis, men det här var mest för skojs skull.

Fermatrix 7841 – Fd. Medlem
Postad: 8 dec 2022 21:05

Baguesses skrev:

hur tar du reda på hastigheten? dock tror jag att det finns en väldigt liten chans att man ändå får en dubblett med min lösning

Jag använde:

time.perf_counter_ns()

För att beräkna exekveringstiden. 

anony123 163 – Fd. Medlem
Postad: 8 dec 2022 21:06
Dracaena skrev:

Baguesses skrev:

hur tar du reda på hastigheten? dock tror jag att det finns en väldigt liten chans att man ändå får en dubblett med min lösning

Jag använde:

time.perf_counter_ns()

För att beräkna exekveringstiden. 

Jaha häftigt!

Svara Avbryt
Close