Welkom, Gast. Je bent niet ingelogd.

Math: weekdays.

Door iisys op 18 Feb 2007, 13:43

Zeuhw, ik heb geen zin in hw en er is al veel te lang geen nieuwe blog geweest.

Deze blog gaat over het berekenen op welke dag een bepaalde datum valt.
Dit is altijd handig, en als je het uit je hoofd kan (ik kan t al voor elke datum in elk jaar, in de maanden januari tot juni :\')) heb je geen kalenders meer nodig :\')
Met wat oefening gaat vaak ook sneller dan dat je eerst ff op je mobiel of computer moet kijken.

Ik heb het uit het boek \"Mind Performance Hacks\", geschreven door Ron Hale-Evans, uitgegeven door O\'Reilly.
En natuurlijk ben ik niet zó stupid om een Engels boek te bestellen die ik maar 1 keer ga lezen, dus heb ik de e-book gedownload :\')
Als er vraag naar is zal ik m uploaden of de downloadlink posten. Kijk onderaan deze blog.
Dit is trouwens hack #43 uit hoofdstuk 4: Math uit het boek (gaat over mindhacks, niet over computerhacks).

Wat je vooraf moet weten.

De div operator.
Deze gebruiken we om de eerste variabele te berekenen. De div is hetzelde als het normale delen-door, alleen zonder de \'rest\'.
Bij bijvoorbeeld 8 div 3 wordt het antwoord dus 2, omdat 3 twee keer in 8 past. In php zou je het zo berekenen: $answer = floor(8 / 3);
Die rond het af naar beneden, waardoor het getal achter de komma (dat is dus de \'rest\') verdwijnt.

De modulo operator.
Deze schrijven we in onze berekeningen als getal mod getal (zo tik je het ook in je rekenmachine in).
Dit is precies het omgekeerde van de div. Deze haalt niet de \'rest\' weg, maar ís de \'rest\'.
Als we weer hetzelfde voorbeeld gebruiken, wordt 8 modulo 3 = 2. Dat omdat 3 twee keer in 8 past, en dan blijft er nog 2 over.
Naar mijn redenering (weet niet of het klopt, hebben we nog niet gehad met wiskunde :\')) wordt de modulo berekent door de restwaarde (getal achter de komma) vermenigvuldigt met het getal waar je door zou delen.
Als je dus 8 / 3 doet, komt daar 2,667 uit. Als je nu de 0,667 x het getal waar je door deelde (3) doet, kom je op 2.
Mmnouja, veel zullen hier niks van snappen, maar wees gerust, er zit een knopje \'mod\' op je Windows-rekenmachine :\')
Ohja, en dit noemen we ook wel \'cast out sevens\', oftewel, de zevens eruit halen. Dat is eigenlijk ook precies wat er gebeurd.

Let\'s begin.

De variabelen.
We hebben 5 variabelen nodig om de weekdag te berekenen:
1. het jaaronderdeel.
2. het maandonderdeel.
3. het dagonderdeel.
4. de jaarinstelling.
5. het schrikkeljaar.

Ik ga het hier ff wat korter benoemen, dus we gebruiken het op de php-manier: $year, $month, $day, $yAdjustment en $leap.

Het jaaronderdeel: $year.
Deze bereken je door de laatste 2 cijfers van het jaar in te vullen voor de YY in de volgende formule:

(YY + (YY div 4)) mod 7

Het maandonderdeel: $month.
Hier hoef je niks te berekenen, deze zoek je gewoon op in de volgende tabel:

SAVEN! Waar blijft die [table] tag?!

1
2
3
4
5
6
7
8
9
10
11
12
13
Maand       Key
Januari      0 
Februari     3 
Maart        3 
April        6 
Mei          1 
Juni         4 
Juli         6 
Augustus     2 
September    5 
Oktober      0 
November     3 
December     5

Het dagonderdeel: $day.
Deze is gewoon hetzelfde als de dag. Als je datum 22 maart 2005 heb gekozen is je $day dus 22.

De jaarinstelling: $yAdjustment.
Hier ligt nog wat meer achter dan ik hier ga vertellen, maar voor wat wij hier doet is het volgende goed genoeg. Achter de tijdspan staat de key, je $yAdjustment.

1
2
3
4
5
6
7
8
Tijdspan      Key
1700-1799     4 
1800-1899     2 
1900-1999     0 
2000-2099     6 
2100-2199     4 
2200-2299     2 
2300-2399     0

Het schrikkeljaar: $leap.
We rekenen hier met data vanaf 1752 (heeft met de Juliaanse en de Gregoriaanse kalenders te maken, wordt te uitgebreidt om hier te vertellen).
De $leap wordt eigenlijk alleen maar een 1 of een 0. Als je datum in een januari of februari van een schrikkeljaar valt, wordt $leap 1.

Een jaar is een schrikkeljaar als het jaar deelbaar is door 4, behalve jaren die ook deelbaar zijn door 100. Behalve jaren die ook deelbaar zijn door 400, zijn wel schrikkeljaren.
Lekker ingewikkeld. Voorbeeldjes:
1936 was wél een schrikkeljaar (deelbaar door 4).
1937 was géén schrikkeljaar (níet deelbaar door 4).
1800 en 1900 waren géén schrikkeljaren (deelbaar door 100),
maar 2000 was het wél (ook deelbaar door 400).

Dus, schrikkeljaar? $leap = 1. Geen schrikkeljaar? $leap = 0.

De berekening.
Nu we de vijf variabelen hebben, gaan we de berekening maken.
Zoals ik al zei, gebruiken we voor de variabelen die we hebben berekend, de woorden $year, $month, $day en $yAdjustment.
We gaan het eerst met zogenaamde letter(variabele)berekeningen doen, en daarna met een voorbeeld.
We onthouden telkens één cijfer, die noemen we $c, waar de c staat voor current.

$c = $year = (YY + (YY div 4)) mod 7
$c = ($c + $month) mod 7
$c = ($c + $day) mod 7
$c = ($c + $yAdjustment - $leap) mod 7

En wat doen we nu met die uiteindelijke $c ? Dat is het nummer van de weekdag. Kijk hier maar eens:

1
2
3
4
5
6
7
8
Weekdag    Resultaat 
Zondag      0 
Maandag     1 
Dinsdag     2 
Woensdag    3 
Donderdag   4 
Vrijdag     5 
Zaterdag    6

Is je $c dus 2? Dan valt je datum op een dinsdag

Het voorbeeld.
Nu een concreet voorbeeld.

We gaan de weekdag van 13 mei 2009 berekenen.
We beginnen bij het begin.

1. Het jaaronderdeel. (YY + (YY div 4)) = (9 + (9 div 4)) = (9 + (2)) = 11.    9 div 4 = 2 omdat 4 twee hele keren in 9 past.
Daar halen we de zevens uit: 11 mod 7 = 4 omdat we er 1 keer een zeven uit kunnen halen. Dan blijft er dus nog 4 over. Die onthouden we.

2. De Key voor mei is 1, dus ons maandonderdeel is 1. Dan doen we (4 + 1) mod 7 = 5 mod 7 = 5. Omdat we daar geen zeven uit kunnen halen blijft het gewoon 5.

3. De Key voor onze dag (13) is gewoon 13. Dus dan wordt (5 + 13) mod 7 = 18 mod 7 = 4. Omdat we 2 keer een zeven uit 18 kunnen halen, en dan blijft er nog 4 over.

4. De jaaraanpassing/jaarinstelling voor 2009 is 6, omdat het tussen 2000 en 2099 valt. Het is géén schrikkeljaar omdat het niet deelbaar is door 4.
Dus onze berekening wordt: (4 + 6 - 0) mod 7 = 10 mod 7 = 3

Ons resultaat is 3, dus de datum valt op woensdag!
En dat kunnen we in elke kloppende kalender nakijken, en dan zien we dat het klopt

Uit je hoofd.
Het is niet zo moeilijk uit je hoofd. Het enige wat je moet weten is de (YY + (YY div 4)) mod 7 formule, de jaaraanpassingen en de maandkey\'s.
Als je die kent hoef je alleen maar het jaaronderdeel + maandkey, dan het verkregen resultaat + de dag, daarna dát verkregen resultaat + de jaaraanpassing - of het een schrikkeljaar is, en tussen die handelingen telkens de zevens eruit halen.

Oefen het een paar keer en het is echt makkelijk, geloof me

References.
Als je nog wilt kijken of je datumberekening klopt, kan je altijd op mijn simpele kalendertje kijken: [url]http://www.iisysz.com/calendr.php[/url].
Op verzoek van Thaan en Florian:
Origineel artikel komt uit het volgende boek (pass staat in het commentaar van de rar).
(sry voor de [code] tags, maar anders werd de link gefuckt door het _O_ gedeelte :\'))

1
http://rapidshare.de/files/20285083/Mind_Performance_Hacks_Tips_and_Tools_for_Overclocking_Your_Brain_-_O_Reilly.rar.html

Wat je in de rar zal vinden is een .chm bestand (een Windows helpbestand) met daar het hele boek in, verdeeld in hoofdstukken. Volgens mij alleen te openen in Windows Sorry Twy :\')

Hoop dat jullie er wat van onthouden hebben :\')

Well, have fun and spread the word Or weekday

Lennard
?
Geplaatst op: 21 Feb 2007, 21:48

In die getallen van de maanden zit ook nog een logica...

\"If it begins or ends with a vowel, subtract the number, denoting its place in the year, from 10. This, plus its number of days, gives the item for the following month. The item for January is \"0\"; for February or March, \"3\"; for December, \"12\".\"

dus dan hoef je die ook niet te onthouden.

Lijkt me btw wel kansloos als je dit voor je beroep ofzo moet doen. :\')

Florian
kunjeditzien:')?
Geplaatst op: 21 Feb 2007, 20:34

Ja, het lijkt mij zeker leuk om te kunnen .

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 21 Feb 2007, 20:30

Florian schreef:

Goedzo jongen :\').

Jaja ik weet het. Het is niet nuttig ofzo :\') Maar t is wel grappig/leuk om te kunnen :\')

Florian
kunjeditzien:')?
Geplaatst op: 21 Feb 2007, 19:42

Goedzo jongen :\').

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 21 Feb 2007, 16:47

Lennard schreef:

[...]
[...]
Volgens mij werkt hij wel aardig [ alleen 2000 - 2099 ] maar weet niet zeker enzo :\')

Maar is wel übervet als je dat zo kan enzo. :\')


Mja zoiets had ik ook in gedachten, alleen dan veel korter

En ja, het is echt grappig als je t kan Ik kan het nu binnen ongeveer 5 seconden voor elke datum in 2007 :\')

Lennard
?
Geplaatst op: 20 Feb 2007, 23:41

iisys schreef:

[...]
Mmja dat kan ik wel maken, maar het heeft niet heel veel zin omdat dat er al is met de date(\'w\') functie :\')

Zou opzich trouwens niet zo heel moeilijk zijn om daar een functie van te maken
Regel maar meer mensen die het willen en dan maak ik m wel.


1
2
3
4
5
6
7
8
<?php
$dag = 13;
$maand = 5;
$jaar = 2009;

$dagen = array(\'zondag\', \'maandag\', \'dinsdag\', \'woensdag\', \'donderdag\', \'vrijdag\', \'zaterdag\');
echo $dagen[date(\'w\', mktime(0, 0, 0, $maand, $dag, $jaar))];
?>

Of jouw voorbeeld verPHPt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
$datum = \'13 mei 2009\';

$welke = explode(\' \', strtolower($datum));

$maanden = array(
                    \'januari\' => 0,
                    \'februari\' => 3,
                    \'maart\' => 3,
                    \'april\' => 6,
                    \'mei\' => 1,
                    \'juni\' => 4,
                    \'juli\' => 6,
                    \'augustus\' => 2,
                    \'september\' => 5,
                    \'oktober\' => 0,
                    \'november\' => 3,
                    \'december\' => 5
                );
                
$year = strlen($welke[2]) == 4 ? substr($welke[2], 2) : $welke[2];
$year = floor($year / 4) + $year;

$month = $maanden[$welke[1]] + $year % 7;

$day = ( $month + $welke[0] ) % 7;

if(strlen($welke[2]) == 2)
{
    
    $welke[2] = \'20\'.$welke[2];

}

$leap = $welke[2] % 4 == 0 || $welke[2] % 100 == 0 || $welke[2] % 400 == 0 ? 1 : 0;

$leap = 6 - $leap;

$einde = ( $day + $leap ) % 7;

$dagen = array(
                \'Zondag\',
                \'Maandag\',
                \'Dinsdag\',
                \'Woensdag\',
                \'Donderdag\',
                \'Vrijdag\',
                \'Zaterdag\'
            );
echo $datum.\' valt op een: \'.$dagen[$einde];
?>

Volgens mij werkt hij wel aardig [ alleen 2000 - 2099 ] maar weet niet zeker enzo :\')

Maar is wel übervet als je dat zo kan enzo. :\')

Wouser
Cadeau'tjes :r
Geplaatst op: 20 Feb 2007, 15:37

tip

http://www.google.nl/search?source=ig&hl=nl&q=i%5E2&meta=

:\') Wat oh wat valt op?

Rinaldo
Geplaatst op: 20 Feb 2007, 12:58

ik ook even doornemen :\')

maar pc gecrasht dus duurt even

Florian
kunjeditzien:')?
Geplaatst op: 20 Feb 2007, 00:46

Ik snap hem niet? :\')
\'k Zal zo goed slapen en dan morgen nog eens lezen ofzo :\')...

@ iisys, ziet er leuk uit, ik zal het eens doornemen .

Wouser
Cadeau'tjes :r
Geplaatst op: 20 Feb 2007, 00:17

Florian schreef:

i kwadraat?

Nee 20pompoenen in een sloot Moet toch een inkoppertje zijn als je van wiskunde houdt

[Laatst bewerkt door Wouser op dinsdag 20 februari 2007, om 00:18]
Florian
kunjeditzien:')?
Geplaatst op: 19 Feb 2007, 23:22

i kwadraat?

Wouser
Cadeau'tjes :r
Geplaatst op: 19 Feb 2007, 22:50

iisys schreef:

Heb de downloadlink van het boek erop gezet, onderaan bij de references
[...]
Ik ik ik ik! Doe dope met wiskunde!

ok zal morgen eens kijken of er een leuk onderwerp kan vinden

ps: wat is i^2?

BlackWhizz
Je moeder
Geplaatst op: 19 Feb 2007, 20:31

iisys schreef:

[...]
Mmja dat kan ik wel maken, maar het heeft niet heel veel zin omdat dat er al is met de date(\'w\') functie :\')

Zou opzich trouwens niet zo heel moeilijk zijn om daar een functie van te maken
Regel maar meer mensen die het willen en dan maak ik m wel.


Maar om dat in kalendervorm te maken dan word het moeilijker.

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 19 Feb 2007, 18:42

Heb de downloadlink van het boek erop gezet, onderaan bij de references

Wouser schreef:

-nvm- verkeerd geleze . En wie wil dat ik nu ff dope ga doen met wiskunde :\')

Ik ik ik ik! Doe dope met wiskunde!

Wouser
Cadeau'tjes :r
Geplaatst op: 19 Feb 2007, 15:46

-nvm- verkeerd geleze . En wie wil dat ik nu ff dope ga doen met wiskunde :\')

[Laatst bewerkt door Wouser op maandag 19 februari 2007, om 15:48]
Florian
kunjeditzien:')?
Geplaatst op: 19 Feb 2007, 13:25

ohja, ik heb wel interesse @ dat boek .

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 19 Feb 2007, 11:07

BlackWhizz schreef:

Nu nog een tut hoe dat moet met php of moet ik die maken

Mmja dat kan ik wel maken, maar het heeft niet heel veel zin omdat dat er al is met de date(\'w\') functie :\')

Zou opzich trouwens niet zo heel moeilijk zijn om daar een functie van te maken
Regel maar meer mensen die het willen en dan maak ik m wel.

[Laatst bewerkt door iisys op maandag 19 februari 2007, om 11:17]
Florian
kunjeditzien:')?
Geplaatst op: 19 Feb 2007, 00:05

Da\'s toevallig, pas werd er een filmpje gelogd van iemand die dat uit zn hoofd wist .
Die gebruikte dan niet je techniek, maar er was iets mis met z\'n geheugen ofzo, hij wist ook nog wat voor weer het was :\').

hier in het 2e deel van het filmpje komt ie voor als het goed is.

Maar wel vet als je dat kunt , beetje rain man achtig :\').

BlackWhizz
Je moeder
Geplaatst op: 18 Feb 2007, 22:31

Nu nog een tut hoe dat moet met php of moet ik die maken

Gkhn
duh mothafoKING
Geplaatst op: 18 Feb 2007, 21:16

iisys schreef:

[...]
Altijd leuk om indruk te maken :\')

Zo ben ik er bijvoorbeeld achtergekomen dat er iets in mijn geschiedenisboek niet klopt
Bloedige Zondag (1e (aanleiding tot) Russische revolutie) valt volgens mijn geschiedenisboek op 9 januari 1905, maar 9/01/1905 valt op een maandag
Wikipedia zegt 22 januari 1905, die valt wel op zondag.


PEUWND

Sharp
:')
moderator
Geplaatst op: 18 Feb 2007, 20:08

iisys schreef:

[...]
Uhhuh

Heb trouwens wel eens gehoord van iemand die geestelijk gehandicapt was en die daardoor heel veel dingen niet kon, maar bepaalde andere dingen juist weer wél. Eén van de dingen die hij heel goed was, was de weekdag geven van elke datum die je noemde.
Misschien was dat niet zo\'n \'gave\', maar heeft hij gewoon ergens die berekening gehoord
Mmnouja, waar het dus op neer komt, wat hij kan, kunnen jullie ook met een beetje oefening.


Omfg, mijn achterneef kan dat ook, is gehandikapt geworden door skooter ongeluk (op zijn achterhoofd gevallen)

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 18 Feb 2007, 20:00

Soaddemon schreef:

Best handig ding
maar denk nie dat ik em ga gebruikenn ofzo :\')

Altijd leuk om indruk te maken :\')

Zo ben ik er bijvoorbeeld achtergekomen dat er iets in mijn geschiedenisboek niet klopt
Bloedige Zondag (1e (aanleiding tot) Russische revolutie) valt volgens mijn geschiedenisboek op 9 januari 1905, maar 9/01/1905 valt op een maandag
Wikipedia zegt 22 januari 1905, die valt wel op zondag.

AfcAjax
Geplaatst op: 18 Feb 2007, 18:49

Cool iisys

iiy. edit: het is iisys, niet Iisys :\')

[Laatst bewerkt door iisys op zondag 18 februari 2007, om 20:01]
Artofdead
Master Fish
Geplaatst op: 18 Feb 2007, 18:08

Best handig ding
maar denk nie dat ik em ga gebruikenn ofzo :\')

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 18 Feb 2007, 18:01

Saven schreef:

Zit goed in mekaar

Uhhuh

Heb trouwens wel eens gehoord van iemand die geestelijk gehandicapt was en die daardoor heel veel dingen niet kon, maar bepaalde andere dingen juist weer wél. Eén van de dingen die hij heel goed kon, was de weekdag geven van elke datum die je noemde.
Misschien was dat niet zo\'n \'gave\', maar heeft hij gewoon ergens die berekening gehoord
Mmnouja, waar het dus op neer komt, wat hij kan, kunnen jullie ook met een beetje oefening.

[Laatst bewerkt door iisys op zondag 18 februari 2007, om 21:19]
📫

Nieuw privébericht

🔥

Registreren


Login