Project Euler: Problem 33

For et stykke tid siden sad jeg og hørte et ret sjov foredrag af Randall Munroe, skaberen af xkcd.com en ret nørdet men sjov tegneserie. På et tidspunkt i foredraget taler han om Project Euler, om hvordan han brugte det til at lære python, det gjorde mig nysgerrig, så jeg oprettede en bruger derinde. Project Euler er en side med indtil videre 298 problemer, der bedst kan løses ved at programmere et program. Indtil videre har jeg løst 17 af dem, hvilke giver en sølle 6%. Hvis man har en bruger på siden, så kan man følge med i min fremskridt her: andreasjoensen. Jeg konkurrerer lidt med Dennis, men må desværre konstatere at han har løst 23, seks mere end mig.

I dag løste jeg problem 33 som havde titlen: “Discover all the fractions with an unorthodox cancelling method.”

Den går ud på at finde brøker hvor, hvis en af cifrene i både tælleren og nævneren er ens, så er det lig med den brøk hvor det ciffer er fjernet, fx: 49/984/8. Betingelsen er at både tælleren og nævneren er på to cifre og brøken er mindre end 1. Desuden tæller brøker hvor tælleren og nævneren kan deles med 10 ikke med, da de er lidt for oplagte, som i: 30/503/5. Alle disse tal skal så ganges sammen og den mindste fælles nævner for det tal findes.

Herunder er resultatet af min kode skrevet i Java:

		double res = 1.0;
		for (int num1 = 11; num1 < 100; num1++) {
			for (int den1 = num1 + 1; den1 < 100; den1++) {
				if (den1 % 10 == 0)
					continue;
				int num2 = 0, den2 = 0;
				if (num1 / 10 == den1 / 10) {
					num2 = num1 % 10;
					den2 = den1 % 10;
				} else if (num1 / 10 == den1 % 10) {
					num2 = num1 % 10;
					den2 = den1 / 10;
				} else if (num1 % 10 == den1 / 10) {
					num2 = num1 / 10;
					den2 = den1 % 10;
				} else if (num1 % 10 == den1 % 10) {
					num2 = num1 / 10;
					den2 = den1 / 10;
				}
				double fac1 = (double) num1 / den1;
				double fac2 = (double) num2 / den2;
				if (fac1 == fac2) {
					res *= fac1;
					System.out.println(num1 + "/" + den1 + " = " + num2 + "/" + den2);
				}
			}
		}
		System.out.println(res);

Udførselstiden er på 0,66ms.

Ideen er at jeg har to løkker der gennemløber fra 11 op til 99 på både tælleren og nævneren. Jeg søger dog for at løkken for tælleren starter ved en plus det for tælleren, pga betingelsen om at være under en.

Dernæst tjekker jeg om nævneren er deligt med 10, for at undgå de trivielle tilfælde, men også undgå at dele med nul.

Så tjekkes efter cifre fra tælleren og nævneren der er lig hinanden. Det gøres vha. fire if-sætninger, pga disse fire tilfælde: ax/bx, xa/bx, ax/xb og xa/xb. Hvis de er det, så laves en ny brøk bare uden det ciffer der er ens. Det viste sig så senere, ved at se på problem forumet på euler, at man kun kan opnår de tilfælde ved mønsteret: ax/xb. Udførselstiden bliver så til 0,27ms hvis man kun undersøger for det ene tilfælde.

Hvis de to brøker, det oprindelige og det uden det fælles ciffer, er lig med hinanden, så ganges det med de andre man har fundet. Det tal printes så til sidst og ud fra det, fandt jeg det mindste fælles nævner i hånden (hvilke er tilladt, problemerne er lavet sådan at de ikke kan løses udelukkende i hånden).

Resultatet blev:
16/64 = 1/4
19/95 = 1/5
26/65 = 2/5
49/98 = 4/8
Produktet af brøkerne: 0,01
Hvilke giver 100 som svar, da 1/100 = 0,01 og brøken kan ikke reduceres ydeligere.

Udgivet i Java, Programmering, Project Euler | Tagget , , , | 2 kommentarer

Google Apps

Før hen (indtil ca. 2007), hentede jeg al min email ned på min pc. Jeg brugte programmer som Outlook 2003, Windows Mail og Thunderbird. Jeg kunne godt lide fornemmelsen af at have alle mine emails tæt hos mig. Men da min samling af mails blev større og større, blev jeg mere og mere paranoid for at miste det hele hvis fx harddisken gik i stykker eller ved tyveri. Hver gang jeg skulle skifte computer, risikerede jeg at miste det hele ved en meget uheldig musetast (hvilke jeg kom til engang, bare ikke på min egen data).

Da jeg på et tidspunkt havde to computere på samme tid, en stationær og en bærbar, så var der ingen vej udenom en web baseret email løsning. Jeg valgte at bruge gmail. Jeg oprettede så en konto hos google og overgav al min værdifulde post i deres hænder. Jeg ønskede dog stadig at beholde min gamle domæne, joensen.eu som email, så jeg satte min svar adresse til joensen.eu i stedet for gmail.com. Dette virkede okay, men der var alligevel en del der svarede til min gmail konto.

Så stødte jeg på Google Apps (via Dennis). Det er alle googles websider, som email og kalender, bare på ens egen domæne. De hoster det stadig og man får de sædvanlige 7gb, men uden gmail.com i domænet. Men jeg var ret tøvende, da jeg har hele min familie på det domæne og der vil så være helt vildt mange mails der skulle overføres over IMAP, hvilke nok er det mest langsomme protocol til overførsel af data jeg kender til. Derudover var jeg også i tvivl om jeg kunne sync det med min android telefon, hvor jeg syncer email, kalender og kontakter, men det viste sig at det godt kunne lade sig gøre, næsten uden problemer. Jeg måtte lave en hard reset af min HTC Hero, hvilke så ikke er googles fejl (eller jo, det er vel dem der laver android :) ).

Det er virkelig rart endelig at være fri for gmail.com og gå over til at bruge joensen.eu. Hvis du også gerne vil bruge google apps, så har jeg lagt min fremgangsmåde herunder:

Oprettelse af Google Apps og godkendelse af domæne:

  • Gå ind på google apps tilmeldingssiden: http://www.google.com/apps/intl/da/group/index.html
  • Angav domænet, fx joensen.eu
  • Indtast de forskellige logon oplysninger som navn, brugernavn, kode, osv.
  • Inde på Google Apps admin siden vælg: “bekræft domæneejerskab” og dernæst vælg at bruge CNAME metoden.
  • Gå ind på DNS indstillingerne for dit domæne (uden adgang til DNS indstillingerne på dit domæne er det ikke muligt at bruge Google Apps).
  • Tilføj en CNAME post med den streng der blev genereret af google.
  • Til sidst tryk på “bekræft” og nogle minutter senere er domænet godkendt.

Oprettelse af emails, samt ændring i DNS indstillinger:

Overførelse af post fra den gamle gmail konto til den nye:

  • Download en mail client, som Thunderbird eller Windows Live Mail. Jeg brugte den sidst nævnte, men jeg har tidligere gjort det med Thunderbird.
  • På både den gamle og nye skal IMAP slås til. Gå ind i indstillinger > vidersendelse og POP/IMAP. Vælg aktiver IMAP.
  • Gå ind på http://mail.google.com/support/bin/answer.py?hl=da&ctx=mail&answer=75726 for at se hvordan du konfigurerer din mail client til at bruge IMAP.
  • Når begge konti er tilføjet, så vælg alle mails fra fx indbakken på den gamle og træk det over i indbakken på den nye. Så vil alle dine mails blive (meget langsomt) flyttet fra den ene konto til den anden.
  • Bemærk hvis man bruger Thunderbird, så begræns hvor mange beskeder der overføres på engang, ellers fryser Thunderbird.
Udgivet i Google, Internet | Tagget , , , , , | Skriv en kommentar