Förnöjsam pappa: Ordnad genomräkning av möjliga lottorader (10 april, 2018)

Tisdagen den 10 april, 2018

Fyra och ett halvt år sedan sist, jag tänkte att det kunde passa att jag skriver ett program som gör en genomräkning av möjliga lottorader.

Förra gången, det var den 23 oktober 2013, använde jag en mycket enkel iteration med kryptisk kodning av de tillåtna talen 1 till 35 på binär form.

Nu ville jag istället göra en ordnad genomräkning, där jag istället använder sju variabler som motsvarar det första talet, andra talet, tredje talet och så vidare upp till det sjunde, i en lottorad.

#!bash
for ((i = 1; i <= 29; i++)); do
  for ((j = i + 1; j <= 30; j++)); do
    for ((k = j + 1; k <= 31; k++)); do
      for ((l = k + 1; l <= 32; l++)) do
        for ((m = l + 1; m <= 33; m++)) do
          for ((n = m + 1; n <= 34; n++)) do
            for ((o = n + 1; o <= 35; o++)) do
              echo $i $j $k $l $m $n $o
            done
          done
        done
      done
    done
  done
done

På en vanlig enkel laptop med processor av typen Intel i5, 8 gigabyte minne och solid state-disk, tog programmet tre och en halv minut att exekvera.

Jag har inte så noga kollat att det fungerar, men granskar jag början och slutet av utmatningen från programmet, noterar jag att första raden och sista raden båda är sammansatta på det vis jag förutsett.

$ head -8 out.txt
1 2 3 4 5 6 7
1 2 3 4 5 6 8
1 2 3 4 5 6 9
1 2 3 4 5 6 10
1 2 3 4 5 6 11
1 2 3 4 5 6 12
1 2 3 4 5 6 13
1 2 3 4 5 6 14

$ tail -8 out.txt
28 29 30 31 32 33 34
28 29 30 31 32 33 35
28 29 30 31 32 34 35
28 29 30 31 33 34 35
28 29 30 32 33 34 35
28 29 31 32 33 34 35
28 30 31 32 33 34 35
29 30 31 32 33 34 35

Kommandot ”head” (ovan) visar ett visst antal rader av filens början, ”tail” däremot visar slutet.

Antalet rader, 6.724.520, stämmer med antalet möjliga unika, sorterade kombinationer för en vanlig lottorad, .

$ wc -l out.txt
6724520 out.txt

Kommandot ”wc” (ovan) är inte en förkortning av ”water closet”, utan ”word count”. Med optionen ”-l” räknar wc antalet rader i en fil.

 

  1. pingal

    Jag har skrivit i perl och på ett sådant sätt att man kan välja antalet tal och högsta värde. På min 17 år gamla dator får jag därvid ned exekveringstiden från 45 minuter till 2:27. Jag tog sedan fram en åtta år gammal i5 2,53 MHz och då gick det på 8 sekunder.
    #! /usr/bin/perl -w
    my $n=7, $h=35; $,=” “;
    for my $j (1 .. $h) {&subr ($j)};
    sub subr {for my $i (@_[@_-1]+1 .. $h) {
    if (@_+1 eq $n) {print “@_ $i\n”} else {&subr (@_, $i)}}}


    https://polldaddy.com/js/rating/rating.js

    • fornojsampappa

      När det gäller programmering kan jag inte tävla med riktiga snillen som du.

      Men i det här fallet med förstår jag inte hur det kan göras snabbare, eftersom mitt program vad jag kan se inte exekverar något överflödigt. Det räknar sig igenom alla kombinationer av sju tal utan att sortera något, utan att kontrollera något. Beräkningskraften används enbart till att mata ut aktuell rad och stega variabler.

      Hur kan det komma sig att ditt program blir så mycket snabbare?

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Google+-foto

Du kommenterar med ditt Google+-konto. Logga ut /  Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.