Project Euler, att. math./programming nerds of PN

#1| 0

Hey fellow nerds!

Jeg er pt. dybt begravet i Project Euler og tænkte, at PN kunne gøre det mere interessant. Dels i en konkurrence på tid (hurtigste programmering), men også for, at jeg kunne søge hjælp andre steder end google :-).

"Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems."

Jeg har løst de første 10 vha. VBA og Python. VBA var nok til at starte med, men måtte lære Python for at løse problem 8 - har brugt Python siden.

Er der nogen her der leger med PE, eller er det en dødssejler at søge hjælp på PN?
https://projecteuler.net

EDIT: Min friendkey: 29056029507221_3d1375b2e04ce2b8089401f7b665c1e4

Redigeret af AubreyGraham d. 12-11-2013 23:43
12-11-2013 18:43 #2| 0

Det viker fedt nok. Er gået igang efter at have læst din post her.

Er nået til 8'eren nu.
Jeg har primært brugt php til løsningerne.

Min fiendkey er 24524504553925_7118b4b602a37cff80fcb63c93a5d15a

Hvor langt er du nu?

12-11-2013 21:44 #3| 0

Jeg havde slet ikke set, at der er en friends funktion. Fedt! Jeg er ved 11. Jeg har ikke haft tid til at gå videre siden OP. Jeg synes de fleste op til problem 10 er til at overkomme, men så bliver den også, i min bog, klam. Jeg har i hvert fald ikke kunne løse problem 10 vha. 100% egen kode. Eller rettere; jeg har ikke haft tid til at vente på, at min egen kode fandt løsningen...

Redigeret af AubreyGraham d. 12-11-2013 21:46
12-11-2013 21:55 #5| 0

Jeg føler mig gammel og dum, når jeg læser sådanne tråde...

Var super god til at programmere på Commodore 64, kan det bruges til noget? ;)

12-11-2013 22:40 #6| 0
ShadeStar skrev:
Jeg føler mig gammel og dum, når jeg læser sådanne tråde...

Var super god til at programmere på Commodore 64, kan det bruges til noget? ;)

Alder er ingen hindring! Jeg kom ind i VBA og og LaTeX vha. bøger, og Python vha. Codeacademy. Hvis du har programmeret før, så er det bare igang med lidt selvstudie, også er du igang igen, før du ved af det!
Redigeret af AubreyGraham d. 12-11-2013 22:41
12-11-2013 23:13 #7| 0

Har lavet 25 i starten af skoleåret, men synes mange af dem er svære, hvor man godt kunne bruge lidt hints. Den jeg er mest stolt over er nr. 17, men som Aubrey siger, så kan man løse de første ret nemt, hvis man lærer basics af et moderne programmerings sprog.
40197150523752_65cfda5a9ee85409b09855ff5a8a3544

12-11-2013 23:28 #8| 0

Hvilket programmeringssprog er NUTS, hvis man vil slippe for hindringer, som fx. Python 2.7.3's problemer med rigtig store integers i ranges? Eller er det bare en mindre bagside, og Python ellers er det bedste valg?

Redigeret af AubreyGraham d. 12-11-2013 23:32
12-11-2013 23:36 #9| 0

Jeg har brugt C#. Ved ikke hvilke sprog der ellers kan håndtere det.

Edit: Og der er faktisk en del af opgaverne der kræver det. Opgave 25 fx, skal du finde det første fibonacci tal på over 1000 cifre.

Redigeret af Harry Butt d. 13-11-2013 00:05
13-11-2013 00:35 #10| 0

Har ikke lige fået læst op på det. Kan man bruge java?

Hvis ikke, er C# vel til at overkomme :)

13-11-2013 00:59 #11| 0

Jeg har løst 50+ opgaver i både SML og ruby, i SML har jeg lavet eget modul til at håndtere uendeligt store heltal uden at man mister præcision. I ruby er det indbygget direkte i sproget. Jeg foretrækker ruby. De mest elegante løsninger jeg har lavet er løsninger hvor der er brugt ren matematik til at komme frem til en løsning, således at man altid vil kunne finde en løsning i O(1)

13-11-2013 09:44 #12| 0

Jeg har løst de første 10 opgaver i Eclipse med Java.

13-11-2013 19:16 #13| 0

Som poker spiller burde det være oplagt at starte ud medat løse opgave 54. :-)
Jeg vil give den et skud i C#.

Redigeret af Ender d. 13-11-2013 19:17
13-11-2013 23:40 #14| 0

Tror I de kan Matlab'es

13-11-2013 23:47 #15| 0

Sagtens, Asger.

14-11-2013 00:25 #16| 0

en masse af de første kan løses i excel...

14-11-2013 12:03 #17| 0
ShadeStar skrev:
Jeg føler mig gammel og dum, når jeg læser sådanne tråde...

Var super god til at programmere på Commodore 64, kan det bruges til noget? ;)


poke53280,0
14-11-2013 21:49 #18| 0

Ok, jeg er igang ;-). 1 og 2 var nogenlunde snappy, men 3'eren ser trixy ud, så den gemmer jeg lige til weekenden.

15-11-2013 10:20 #19| 0

Har nu løst de første 10 i c#, målet for weekenden må være de næste 10 ;)

nummer 18 ser specielt sjov ud :)

15-11-2013 10:56 #20| 0
Asger_b skrev:
Ok, jeg er igang ;-). 1 og 2 var nogenlunde snappy, men 3'eren ser trixy ud, så den gemmer jeg lige til weekenden.

I 3'eren, og 10'eren for den sags skyld, er det vigtigere at kende matematikken bag prime factors end at være en god programmør, hvis man vil lave en hurtig kode.

Jeg er gået i stå ved 11'eren. Jeg føler ikke rigtig, at jeg har de nødvendige værktøjer i min programmeringsarsenal til at løse den. Jeg må have gang i Python-studiet igen.
15-11-2013 11:11 #21| 0

@Aubrey

11'eren ser også ulækker ud. Vil tro den kan brute forces i nogle arrays, men det er jo ikke så optimalt.

Måske en modificeret version af Kadanes' kan optimere?

15-11-2013 12:29 #22| 0
AubreyGraham skrev:
I 3'eren, og 10'eren for den sags skyld, er det vigtigere at kende matematikken bag prime factors end at være en god programmør, hvis man vil lave en hurtig kode.


Ikke nødvendigvis. .NET's Parallel.For kan gøre underværker på ens algoritmer, selvom man ikke er teoretisk dygtig :D
15-11-2013 12:32 #23| 0

Nu er jeg ingeniør og ikke matematiker, så jeg hælder mest til brute force løsninger ;)

Min løsning på opgave 11:


for(ulong i=0;i<20;i++)
for (ulong k = 0; k < 17; k++)
{
ulong temp = arrayOfNumber[i, k];
for (ulong j = 1; j < 4; j++)
{
temp *= arrayOfNumber[i,j+k];
}
if (temp > sum)
sum = temp;
}

for (ulong i = 0; i < 20; i++)
for (ulong k = 0; k < 17; k++)
{
ulong temp = arrayOfNumber[k, i];
for (ulong j = 1; j < 4; j++)
{
temp *= arrayOfNumber[k+j, i];
}
if (temp > sum)
sum = temp;
}

for (ulong i = 0; i < 17; i++)
{
for (ulong k = 0; k < 17; k++)
{
ulong temp = arrayOfNumber[i, k];
for (ulong j = 1; j < 4; j++)
{
temp *= arrayOfNumber[i + j, k + j];
}
if (temp > sum)
sum = temp;
}
}

for (ulong i = 0; i < 17; i++)
{
for (ulong k = 0; k < 17; k++)
{
ulong temp = arrayOfNumber[i, 19-k];
for (ulong j = 1; j < 4; j++)
{
temp *= arrayOfNumber[(i + j), 19-(k + j)];
}
if (temp > sum)
sum = temp;
}
}

15-11-2013 13:24 #24| 0

God spass ind til videre. Jeg har løst 20 nu.

15-11-2013 14:45 #25| 0

VBA sutter, og så er dens tilfældigheds generator måske verdens ringeste!

Hvis jeg skulle igang med at løse de her problemer ville jeg helt sikkert bruge R - dog uden at vide med sikkerhed, hvordan præcissionen er ved meget store tal.

15-11-2013 14:54 #26| 0

Yeah, VBA er bestemt forældet. Det er dog desværre en nødvendig i visse sammenhænge, da meget skrivebordsarbejde stadig foregår i Excel.

15-11-2013 15:01 #27| 0
AubreyGraham skrev:
Yeah, VBA er bestemt forældet. Det er dog desværre en nødvendig i visse sammenhænge, da meget skrivebordsarbejde stadig foregår i Excel.


Tell me about it ... har selv måtte programmere mit største projekt her i aktuariatet i VBA, da alle inputs var fra Excel :-/
15-11-2013 15:08 #28| 0

I feel your pain bro'

Redigeret af AubreyGraham d. 15-11-2013 15:08
15-11-2013 21:32 #29| 0

lol@AG

Jeg fandt i øvrigt en vej udenom Matlab's 2^32 begrænsning til 3'eren. 4'eren kan jeg til gengæld ikke umiddelbart løse matematisk :-S

16-11-2013 05:36 #30| 0

@ rickrick

Hvad er det du skal bruge af input fra Excel?

I feks python kan man sagtens læse worksheets ind...

16-11-2013 09:22 #31| 0

@Asger
4'eren er dog ret simpel at løse ved programmering.

16-11-2013 10:07 #32| 0

@Fuglsang

Hvis bare det var et spørgsmål om input/output kunne man selvfølgelig have brugt andre sprog.

Men det er Regnskab, der drifter modellen med input fra Investering, Risiko og Aktuariatet. De har brug for noget overskueligt både mht. input og ikke mindst output - og gerne noget de kan arbejde videre i.

Som med så meget andet startede det med en lille hyggelig model, men efter 3 års revision og diverse ændringer i bekendtgørelser fra Finanstilsynet har modellen udviklet sig til et monster, som man retrospektivt burde have udviklet i et mere robust sprog.

Det gode ved VBA er, at det spiller så godt med Excel og jeg derfor kan være behjælpelig med ekstra kontroller og automatiseringer for Regnskab.

16-11-2013 14:32 #33| 0
hermod skrev:
@Asger
4'eren er dog ret simpel at løse ved programmering.


Ja, det er sådan set problemet..
18-11-2013 20:31 #34| 0

Så fik jeg taget mig sammen til, at løse problem 11. Tvivler på at det er den hurtigste kode set, men den virker!

nums = (
( 8, 2,22,97,38,15, 0,40, 0,75, 4, 5, 7,78,52,12,50,77,91, 8,),
(49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48, 4,56,62, 0,),
(81,49,31,73,55,79,14,29,93,71,40,67,53,88,30, 3,49,13,36,65,),
(52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91,),
(22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,),
(24,47,32,60,99, 3,45, 2,44,75,33,53,78,36,84,20,35,17,12,50,),
(32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,),
(67,26,20,68, 2,62,12,20,95,63,94,39,63, 8,40,91,66,49,94,21,),
(24,55,58, 5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,),
(21,36,23, 9,75, 0,76,44,20,45,35,14, 0,61,33,97,34,31,33,95,),
(78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92,),
(16,39, 5,42,96,35,31,47,55,58,88,24, 0,17,54,24,36,29,85,57,),
(86,56, 0,48,35,71,89, 7, 5,44,44,37,44,60,21,58,51,54,17,58,),
(19,80,81,68, 5,94,47,69,28,73,92,13,86,52,17,77, 4,89,55,40,),
( 4,52, 8,83,97,35,99,16, 7,97,57,32,16,26,26,79,33,27,98,66,),
(88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69,),
( 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,),
(20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16,),
(20,73,35,29,78,31,90, 1,74,31,49,71,48,86,81,16,23,57, 5,54,),
( 1,70,54,71,83,51,54,69,16,92,33,48,61,43,52, 1,89,19,67,48,),
)
#Horizontal
x = 0
for i in range(len(nums)):
for j in range(len(nums[1])-3):
y = nums[j]*nums[j+1]*nums[j+2]*nums[j+3]
if y > x:
x = y

#Vertical
x = 0
for i in range(len(nums)-3):
for j in range(len(nums)):
y = nums[j]*nums[i+1][j]*nums[i+2][j]*nums[i+3][j]
if y > x:
x = y

#Diagonal left->right
x = 0
for i in range(len(nums)-3):
for j in range(len(nums)-3):
y = nums[j]*nums[i+1][j+1]*nums[i+2][j+2]*nums[i+3][j+3]
if y > x:
x = y

#Diagonal right->left
for i in range(len(nums)-3):
for j in range(len(nums)-1,-1,-1):
y = nums[j]*nums[i+1][j-1]*nums[i+2][j-2]*nums[i+3][j-3]
if y > x:
x = y
print x

Redigeret af AubreyGraham d. 18-11-2013 20:34
18-11-2013 22:30 #35| 0

Ha ha, der er da en fejl i #267...

Den kan selvfølgeligt godt løses som beskrevet, men det kan umuligt være meningen med opgaven - jeg synes den er mere interessant hvis den havde været "korrekt".

:-)

19-11-2013 01:05 #36| 0

Fedt at du er videre AubreyGraham, jeg var lige nervøs for at min eneste PE friend var gået i stå ;)

19-11-2013 09:53 #37| 0
ACO_Himself skrev:
Fedt at du er videre AubreyGraham, jeg var lige nervøs for at min eneste PE friend var gået i stå ;)

Er ved 14'eren nu. Fortsætter i aften ;-)
18-12-2013 08:43 #38| 0

Andre der i gang?

18-12-2013 09:31 #39| 0

Må simpelthen sætte mig ind i det der, hvor skal man starte??

18-12-2013 09:36 #40| 1
Pellez skrev:
Må simpelthen sætte mig ind i det der, hvor skal man starte??


www.khanacademy.org/cs
www.khanacademy.org/math/linear-algebra
19-12-2013 12:40 #41| 0

Man starter bare ved problem 1 og giver den gas :)

← Gå til forumoversigtenGå til toppen ↑
Skriv et svar