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.
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))
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]
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>
Jotain vikaa on aikaleimoissa, vai mille planeetalle nuo yli 24-tuntiset kellonajat on? 2023-01-19T46:00:00+02:00
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.