Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Paras tapa poimia peräkkäiset tunnit taulukosta ryhmiin?

jalski [17.01.2023 08:35:10]

#

Tarkoitus olisi hakea taulukosta mihin on tallennettu sähkön tuntikohtaiset hinnat ne jaksot mitkä ylittävät tietyn raja-arvon.

Onko parempaa tapaa, kuin tallentaa taulukkoon kyseisten tuntien taulukon indeksit ja ryhmitellä tuosta peräkkäiset numerot?

Tuosta saa sitten ryhmien ensimmäisestä ja viimeisestä indeksistä muodostettua ajat releohjauksille. Eli ajatustasolla jotenkin näin:

: consecutive-numbers?  \ a -- a
  0 >r a:new swap
  repeat
    a:len n:1- r@ n:> !if
      rdrop break
    else
      r@ n:1+ a:@ n:1- swap r@ a:@ rot n:= !if
        r> n:1+ a:/ _swap a:push swap
        0 >r
      else
        1 n:r+
      then
    then
  again a:push ;

: app:main
  a:new
  [5.77,5.84,5.32,5.23,5.06,5.16,5.67,7.46,8.79,9.10,
   9.00,9.17,9.44,9.92,9.31,8.95,9.37,9.43,9.49,9.11,
   8.33,7.46,6.66,5.88] ( 9 n:< !if a:push else drop then ) a:each drop
  consecutive-numbers?
  ( [0,-1] a:_@ 1 ' n:1+ a:op! ( "%02d:00:00" s:strfmt ) a:map ) a:map . cr ;

Nyt vain d:parse ja saa noista sitten aikaleimat tapahtumille.

Metabolix [17.01.2023 21:10:49]

#

Yleensä tekisin yhdellä silmukalla.

rele = None # tai esim. viimeisin tallennettu
for aika, hinta in hinnat:
  x = hinta <= raja
  if rele != x:
    rele = x
    muutokset.append((aika, rele))

jalski [18.01.2023 00:30:22]

#

Metabolix kirjoitti:

Yleensä tekisin yhdellä silmukalla.

rele = None # tai esim. viimeisin tallennettu
for aika, hinta in hinnat:
  x = hinta <= raja
  if rele != x:
    rele = x
    muutokset.append((aika, rele))

Tuo on kyllä toimiva! Päädyin alunperin keräilemään nuo taulukon indeksit siltä varalta, että sattuisin jossain välissä vielä tarvitsemaan johonkin ryhmien sisältöjä kokonaisuudessaan. Saan 8th:lla haettua kätevästi noiden taulukoissa olevien indeksien avulla ryhmien sisällöt alkuperäisestä taulukosta suoraan.

esimerkiksi:

[1,2,3,4,5,6] [1,3,5] a:_@

Palauttaa:

[2,4,6]

jalski [19.01.2023 12:17:26]

#

Päädyin nyt koodaamaan ja tallentamaan kanavakohtaiset tapahtumat bitteinä. Lopputulos on kompakti sekä on helppo ja nopea muodostaa tapahtumat uudelleen, kun seuraavan päivän hintatiedot tulevat saataville.

: consecutive-numbers?  \ a -- a
  0 >r a:new swap
  repeat
    a:len n:1- r@ n:> !if
      rdrop break
    else
      r@ n:1+ a:@ n:1- swap r@ a:@ rot n:= !if
        r> n:1+ a:/ _swap a:push swap
        0 >r
      else
        1 n:r+
      then
    then
  again a:push ;

: map-to-time-range  \  a -- a
  ( [-1,0] a:_@ 0 ' n:1+ a:op! ( "%02d:00:00" s:strfmt d:parse ) a:map ) a:map ;

: msb?  \ n -- msb
  n:ln 2 n:ln n:/ n:int ;

: decode  \ n -- a
  a:new
  ( 2 pick 1 n:band if
      a:push
    else
      drop
    then
    swap 1 n:shr swap
  ) 0 3 pick msb? loop nip ;

: encode  \ a -- n
  0 swap ( 1 swap n:shl n:bor ) a:each! drop ;

: app:main
  ( 1 a:_@ swap 1 a:_@ d:cmp ) h:new
  %110111000011111000010011
  %001110000011111000110111
  24 n:shl n:bor
  decode
  consecutive-numbers?
  map-to-time-range
  ( ( 2 a:close h:push ) a:each drop ) a:each! drop
  ( h:pop "Tila: %d, Tapahtuma: %s\n" s:strfmt . ) over h:len nip times drop ;
C:\temp>8th encdec.8th
Tila: 1, Tapahtuma: 2023-01-19T00:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T02:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T04:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T05:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T09:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T14:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T18:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T21:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T22:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T27:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T28:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T30:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T33:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T38:00:00+02:00
Tila: 1, Tapahtuma: 2023-01-19T43:00:00+02:00
Tila: 0, Tapahtuma: 2023-01-19T46:00:00+02:00

C:\temp>

Metabolix [22.01.2023 10:21:08]

#

Jotain vikaa on aikaleimoissa, vai mille planeetalle nuo yli 24-tuntiset kellonajat on? 2023-01-19T46:00:00+02:00

jalski [22.01.2023 10:43:41]

#

Metabolix kirjoitti:

Jotain vikaa on aikaleimoissa, vai mille planeetalle nuo yli 24-tuntiset kellonajat on? 2023-01-19T46:00:00+02:00

Tuo johtuu vain siitä miten d:parse toimii silloin kun parsitussa merkkijonossa on pelkkä kellonaika. Eli antaa tulokseksi nykyisen päiväyksen ja aika siirroksen siihen. Tuloshan on sama kun muunnan tuon kuitenkin millisekunneiksi, jotta voin laskea kuinka kauan tarvitsee nukkua ennen kyseistä tapahtumaa. Varsinaisessa ohjelmassa olen kyllä korjannut nuo näkyville tulevat aikaleimat oikeaan muotoon.

EDIT:

Ilmoitin tuon nyt kuitenkin bugina varmuuden vuoksi.

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta