Gå til innhold

Den store project euler tråden


Anbefalte innlegg

Videoannonse
Annonse
Ingen bør bruteforce problem nr. 5 Har stått på i hele natt uten resultater.

Høh. Jeg sjekket min bruteforce løsning på nr 5, den tok 33 sekunder i Python. Sikker på du ikke har en feil et sted?

 

Edit: Jada zotbar1234, det er altfor lenge, jeg vet det :p

Endret av steingrim
Lenke til kommentar

Hmm, tallene fra 1-100 går ihvertfall mot bare nuller i de siste sifrene, tipper dette gjelder for resten av rekken også, desverre er dette feil.. hmm. Er jeg på villspor?

 

La meg gjenta hintet.

 

 

 

Du er interessert kun i de siste 10 siffrene i alle ledd i beregningen. Dvs. alle utregninger i #48 kan gjøres modulo 10^10. Og det er ikke slik at du faktisk må opphøye 983 i 983-e potens for så å ta modulo 10^10.

 

 

Lenke til kommentar
Ingen bør bruteforce problem nr. 5 Har stått på i hele natt uten resultater.

 

La meg gjenta et meget viktig poeng med projecteuler-oppgaver:

 

1) Bruce-force er så å si *aldri* løsningen. Hvis beregningsfasen tar mer enn 10-15 sekunder, gjør man noe veldig veldig galt.

2) En rekke av problemene kan ikke løses ved rå regnekraft (vi snakker om mange år med beregninger). Den eneste måten å angripe oppgaven er å finne på en Smart Framgangsmåte[tm], ikke teste alle mulige kandidatløsninger.

3) #5 løses med penn og papir. Man trenger *ikke* en datamaskin til det. Stikkordet her er å finne ut hva man kan si om et tall som er delelig med f.eks. 2, 6 og 8 (det er ikke 2*6*8, slik oppgaven er stilt).

Endret av zotbar1234
Lenke til kommentar

Nei, huff da må jeg tenke mer enn jeg allerede gjør.

Har mekket en kode for problem 14 nå, der jeg sliter med det samme skvipet:

 

 

 

makslengde = 0;
nmax = 0;

for n = 1:1000000

teller = n;
A = [];
A(1) = n;
k = 2;

while n > 1

	if mod(n, 2) == 1
		n = 3*n + 1;
		A(k) = n;
		k = k + 1;
	end

	if mod(n, 2) == 0
		n = n/2;
		A(k) = n;
		k = k + 1;
	end

end

lengde = length(A);

if makslengde < lengde
	makslengde = lengde;
	nmax = teller;
end

n = teller;

end

makslengde
nmax

 

 

 

Estimert tid er omtrent 300 minutter med min kode (kjørt i octave). Har ikke tålmodighet til slikt skvip, må jo en syk IQ til for å løse disse problemene da :wallbash:

Endret av runesole
Lenke til kommentar

Lær deg et nytt og bedre språk.

 

Du kan allerede programflyt og struktur - da er det kun bagateller som må inn for å kunne bruke et annet språk. Python er f.eks kjapt på slik bruteforcing.

 

Den kodesnippen der kan forøvrig optimiserers med en elseif. Mod() er typisk en krevende funksjon, og du kjører den unødvendig to ganger på samtlige tall som går gjennom løkken. Det fins vel også mer effektive måter å sjekke om et tall er odde eller partall.

Lenke til kommentar
@Jann_Ove: Takk, det korter tiden ned til ca 1,5 timer. :thumbup: Vet ikke hvordan jeg skal gå frem for å lære meg python.

 

pythonchallenge er muligens litt drøyt for å lære seg python, men man har "dive into python" og masse gratis ressurser om/rundt språket. Du kan uansett bruke det språket du er mest komfortabel med. Skjønt at Java er litt køddent å lese inn matriser med (kontra f.eks. Python eller Perl), men det er aldri en avgrensende faktor.

 

 

 

Hva #14 angår, så har jeg dessverre ikke funnet ut en smart løsning. Men en tur innom mathworld og google for å lese litt om Collatz problem er jo et must. Bruce-force løsningen er innlysende: regn ut lengden av sykelen for et tall x, dersom lengden er større enn beste resultat hittil, så har vi en ny verdi. Men det er lett å se at for et partall n, sykellengden(n) = sykellengden(n/2) + 1. Kan dette utnyttes på en eller annen måte? Spørsmålet er ikke retorisk -- jeg fikk en ca. 60x forbedring i tiden brukt på #14 etter å ha utnyttet akkurat den biten. Du gjør noe av det samme med å fylle ut A, men du utnytter det ikke. (Jeg må dessverre innrømme at #14 er en av de oppgavene hvor Python-løsningen min ikke kom under 1 sekund (2.4s ser ut til være tiden på en c2d E8400))

 

Jeg tror også at måten du regner sykellengdene på er fryktelig kostbar -- du lager en dynamisk array og ikke bruker resultatene du har regnet til noe. Vil ikke det være mye raskere å la være å fylle A? Bruce-force C-løsning uten en slik array bruker ca 5 sekunder (jeg har ikke testet ideen min med caching, men det er klart verdt å prøve i C i tillegg til Python).

 

 

 

 

Føkk Matlab :realmad:

 

Matlab er ikke problemet :D

Endret av zotbar1234
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...