Juvelbesat algoritme II

Som tidligere skrevet er jeg i gang med at beskrive en algoritme, der kan løse spillet Bejeweled. Det har indtil videre resulteret i en masse skriblerier i mine notesbøger og en kladde til den første artikel om algoritmen.

Men før jeg kan gøre algoritmen færdig, er jeg nødt til at prøve nogle ideer af i praksis. Derfor er jeg nu gået i gang med at implementere selve spillet. Det giver mig den mest effektive måde at afprøve forskellige algoritmer.

Første udgave er skrevet i PHP, og i denne version 0.1 af spillet kan jeg tegne en plade med juveler, hvor der ikke optræder sæt. Se spillet i et nyt vindue.

Jeg vil ikke gå ind i detaljerne om opbygningen af selve programmet, men her er koden til den klasse, hvor jeg bygger spillepladen op med juveler.

class board {
  private $rows;
  private $cols;
  private $jewels;

  protected $squares;

  function __construct($cols = 8, $rows = 8, $jewels = 7) {

    $this->cols = $cols;
    $this->rows = $rows;
    $this->jewels = $jewels;

    // Rules only apply if there are more than two different jewels
    if ($this->jewels > 2) {
      // Run through all squares
      for ($i = 0; $i < ($this->cols * $this->rows); $i++) {
        // Rules only apply when there are >2 jewels on the board
        if ($i < 2) {
          // Fill square with random jewel
          $this->squares[$i] = rand(1, $this->jewels);
        }
        else {
          do {
            // Find a random jewel
            $v = rand(1, $this->jewels);
          } while (
              // Check jewel against rules
              $v == $this->squares[$i-1]
              && $v == $this->squares[$i-2]
              || (
                  $i >= $this->cols*2
                  && $v == $this->squares[$i - $this->cols]
                  && $v == $this->squares[$i - (2 * $this->cols)]
                 )
            );
            // Fill square with selected jewel
            $this->squares[$i] = $v;
        }
      }
    }
  }
}

Der findes selvfølgelig også andre metoder i klassen, men ovenstående kode viser princippet i strukturen. I øvrigt kan version 0.1 også tegne spillet i andre dimensioner og med et andet antal juveler. Det kan jo godt være nyttigt senere hen.

Stay tuned for næste version og måske en kort artikel med en beskrivelse af algoritmen.

Udgivet i Programmering | Tagget , , | Skriv en kommentar

Omregning fra uge til måned i Excel

I forrige uge kom der et nyt spørgsmål i min Excel-brevkasse. Denne gang var spørgsmålet, hvordan man omregner fra uge til måned.

Nogle uger indeholder selvfølgelig dage i to forskellige måneder, så for ikke at komplicere det yderligere, bruger jeg mandag i ugen til at bestemme måneden. Opgaven bliver derfor at finde antal dage fra nytår til mandag i uge 1 og lægge antal dage frem til den pågældende uges mandag oveni.

Til at begynde med skal jeg finde ud af, hvornår uge 1 er placeret i året. Siden 1. januar 1973 har definitionen på uge 1 været, at det er den første uge i året med mindst 4 dage i. Jeg har altså først brug for at finde ud af, hvilken ugedag 1. januar er i det pågældende år.

Med året i celle B1 er 1.januar let nok: =WEEKDAY(DATE(B1;1;1);2) - læg mærke til sidste parameter i kaldet til WEEKDAY(). Parameteren angiver hvordan ugedagene nummereres. Det er forskelligt fra land til land, men i Danmark er det mandag, der er første dag i ugen, og det angives med værdien 2.

Som det fremgår af nedenstående er formlen placeret i celle B3.

Hvis resultatet er en ugedag lavere end 5, så er ugen den første uge i året. Men jeg er interesseret i den første mandag eller rettere mandagen i ugen før. Formlen til at finde afstanden i dage fra uge 0 til nytår er =IF(B3<5;-B3-6;-B3+1). Jeg trækker B3 ugedage fra for at lande på søndagen før ugen, og så trækker jeg 6 fra, hvis det er ugen før eller lægger 1 til, hvis det er ugen efter. Ganske enkelt.

Med denne offset til uge 0 lægger jeg antal uger x 7 dage til 1. januar. Det sker i B5. Til sidste bruges MONTH() på denne dato og månedsnummeret vises i B6.

Udgivet i Excel | Tagget | Skriv en kommentar

Nyt plugin: LaTex

Efter en snak med min far i dag om formler på websites, fik jeg installeret et plugin til WordPress, så jeg kan skrive formler i LaTex-format på min blog.

Her er et velkendt eksempel på en formel: E=mc^2

Nu skal jeg bare have installeret WordPress på min fars domæne, så han kan begynde at skrive på sin blog. Han vil helt sikkert bruge LaTex mere, end jeg kommer til :-)

Udgivet i Blandet | Tagget , , | Skriv en kommentar