MDays=(31 28 31 30 31 30 31 31 30 31 30)
DayNr=0
for i in $(seq 1 1 $(($honap-1))); do DayNr=$((DayNr+${MDays[$(($i-1))]})); done
DayNr=$(($DayNr+$nap))
egyszerűbben és szökőév helyesen
DayNr=$(date +%j | bc)
A bc a vezető nullák lecsapása miatt van.
Szerk.
zamboriz hozta a megoldást:
DayNr=$(date +%-j)
- bitvadasz blogja
- A hozzászóláshoz be kell jelentkezni
Hozzászólások
Aztán egyszer nehogy rádtámadjon egy nem-GNU date(1) implementáció, vagy derült égből egy szökőév :)
A bc helyett talán inkább egy DayNr=$((DayNr))-t csinálnék, franc sem akar forkolni egy dög nagy bc-t feleslegesen.
- A hozzászóláshoz be kell jelentkezni
Ennél az egy sornál igazad van a bc-vel.
De van egy jó pár ilyen sorom átforgatni:
dekl:=-23.5*COS(pi/180*(DayOffs+0.988*DayNr))
ezeket már nem úszom meg bc nélkül :))
Amúgy a szökőév a pascal verzióban nincs benne, ez idén nagyon látszik a végeredményen.
- A hozzászóláshoz be kell jelentkezni
... ha fáj a bc:
http://sourceforge.net/projects/sh-math/
gagyi egy cucc, de shellben számolni jó :D
-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
- A hozzászóláshoz be kell jelentkezni
Hmmm. Van egy kis probléma:
ironcat@ipd ~ $ echo $(($(date -d "20120201" +%j)))
26
Mert a 032-ből 26 lesz (0x26).
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
ezek szerint marad a bc.
echo $(date -d "20120201" +%j | bc)
32
- A hozzászóláshoz be kell jelentkezni
> ezek szerint marad a bc.
vagy nem marad:
$ date -d "20120201" +%j
032
$ date -d "20120201" +%-j
32
- A hozzászóláshoz be kell jelentkezni
Talált, süllyed - bc dobva :)
- A hozzászóláshoz be kell jelentkezni
jogos, viszont nem 0x26 lesz belőle, mert ugye a nulla prefix az oktálisat jelent, nem hexadecimálisat.
akkor viszont:
let DayNr="10#$DayNr"
- A hozzászóláshoz be kell jelentkezni
A Pascalos verzioban a for ciklust meg lehet sporolni, ha ilyen (ket, szokoev esetere) tombot hasznalsz:
MDays: array[1..12] of Integer =
(0,31,59,90,120,151,181,212,243,273,304,334);
Ezutan mar csak egy lookup meg egy osszeadas az egesz.
DayNr = MDays[Mon] + Day;
- A hozzászóláshoz be kell jelentkezni
Ennyi erovel irhatsz egy celprogramot es elinditod:
./a - wow, milyen rovid!
...
- A hozzászóláshoz be kell jelentkezni
Troll on:
Nem, túl sok kapcsolót és argumentumot kell átadnod neki.
(- wow, milyen rovid!)
Troll off.
- A hozzászóláshoz be kell jelentkezni
Ettol a for i in seq-tol felall a hatamon a szor. (Eleve linuxism a seq, de raadasul meg csak azt se hasznalod ki a shell lehetosegebol, ami benne van.) Mit szolnal ehhez:
MDays=(31 28 31 30 31 30 31 31 30 31 30)
DayNr=0
for i in $( seq 1 ${#MDays} ) ; do DayNr=$(( $DayNr + ${MDay[$(( $i - 1 ))]} )) ; done
echo $DayNr
De oszinten en inkabb ebben a sokkal egyszerubb formaban irnam:
for i in ${MDays[*]} ; do DayNr=$(( $DayNr + $i )) ; done
A kiirast amugy semelyik programod nem csinalja meg, csak a date (magatol).
- A hozzászóláshoz be kell jelentkezni
Oszinten: minek a ciklus?
- A hozzászóláshoz be kell jelentkezni
Hogy neked mennyire igazad van:
IFS="+$IFS" ;echo $(( ${MDays[*]} ))
Ez ugyan még mindig elég hosszú, de már azért egész jó.
- A hozzászóláshoz be kell jelentkezni
A szerk. utáni részt is olvastad?
- A hozzászóláshoz be kell jelentkezni
Ammira nem, hogy most neztem meg tuzetesen, hogy mi is a feladat. En csak szimplan a scriptre ugrottam ra :-) (De Mauzi fent hozzaszolasaval amugy egyetertek, ezt a date parancsot en pl. nem tudnam hasznalni, mig a tobbi kod sokkal hordozhatobb)
- A hozzászóláshoz be kell jelentkezni
Hordozhatóság:
kell még egy tömb szökőévre, és még egy ami a szökőéveket tartalmazza (elég snassz hogy nem számolva van).
és egy if-then-else a kezelésre.
a nem debian disztrókban miért snassz, ha a date esetleg tudná, hogy hanyadik napja van az évnek?
- A hozzászóláshoz be kell jelentkezni
Senki nem mondta, hogy snassz, csak épp tudtommal a POSIX szabványban nincs ilyen funkcionalitás, így elég sokféle *X rendszer date parancsa nem tudja.
- A hozzászóláshoz be kell jelentkezni
De hogy lesz ezekből csak az első három hónap?
- A hozzászóláshoz be kell jelentkezni
Lásd előző. Sehogy. Valamit nagyon benéztem. Leginkább azt, hogy több változó van, mint amit észrevettem. :-( (Valamiért az összes számot össze akartam adni.)
- A hozzászóláshoz be kell jelentkezni
O.K. legyen hordozható (és hosszabb),
mert ez nem hordozható: DayNr=$(date +%-j)
Ha már számolok, akkor táblázat is kizárva.
A Sunrise/Sunset Algorithm innen: Almanac for Computers, 1990
1. first calculate the day of the year
N1 = floor(275 * month / 9)
N2 = floor((month + 9) / 12)
N3 = (1 + floor((year - 4 * floor(year / 4) + 2) / 3))
DayNr = N1 - (N2 * N3) + day - 30
nem volt felkészülve a 100-zal és 400-zal osztható évekre.
Korrigáltam:
if [ $# -lt 3 ]
then
year=$(date +%-Y)
month=$(date +%-m)
day=$(date +%-d)
else
year=$1
month=$2
day=$3
fi
# fix napok száma
# N1 = floor(275 * month / 9)
f_loor=$(echo "275*$month/9" | bc )
N1=${f_loor/.*}
# letelt az első két hónap?
# N2 = floor((month + 9) / 12)
f_loor=$(echo "($month+9)/12" | bc)
N2=${f_loor/.*}
function floor(){ # $1=dátumév $2=ciklus
f_loor=$(echo "$1/$2" | bc) ; f_loor=${f_loor/.*}
f_loor=$(echo "$1-$2*$f_loor+$2-2" | bc) ; f_loor=${f_loor/.*}
echo $(echo "1+$f_loor/($2-1)" | bc)
}
# négyévente (szökőév)
# N4 = (1 + floor((year - 4 * floor(year / 4) + 2) / 3))
N4=$(floor $year 4)
# századforduló (nem szökőév)
# N100 = (1 + floor((year - 100 * floor(year / 100) + 98) / 99))
N100=$(floor $year 100)
# a négyszázzal osztható (szökőév)
# N400 = (1 + floor((year - 400 * floor(year / 400) + 398) / 399))
N400=$(floor $year 400)
# N = N1 - (N2 * N4) - (N2 * (1 - N100)) + (N2 * (1 - N400)) + day - 30
DayNr=$(echo "$N1-($N2*$N4)-($N2*(1-$N100))+($N2*(1-$N400))+$day-30" | bc)
echo $year"."$month"."$day" az év "$DayNr". napja"
Hát, kicsit hosszabb :)
A bc-től nem érdemes megszabadulnom, mert ilyen soraim is lesznek:
dekl:=-23.5*COS(pi/180*(DayOffs+0.988*DayNr))
- A hozzászóláshoz be kell jelentkezni
Off: Mi lesz ez? A Nap aktuális állását akarod kiszámolni? Mihez kell?
--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com
- A hozzászóláshoz be kell jelentkezni
Nem működik a Flux Ubuntu 12.04 destopon.
Ezért aztán kell a napkelte, napnyugta a netbookom képernyő-fényerő automatikus állításához.
Ha közben nem találok valamit, ami a webkamerával méri a világosságot a szobában.
- A hozzászóláshoz be kell jelentkezni
És ha egyszerűen innen beszerzed az adatokat?
--
Debian - The "What?!" starts not!
http://nyizsa.blogspot.com
- A hozzászóláshoz be kell jelentkezni
Ettől a "floor" kerekítéstől közben megszabadultam, gondolom bsd-ben is ugyanúgy működik a bc .
- A hozzászóláshoz be kell jelentkezni
Utoljára ilyet (mikrovezérlőn kellett implementálni, brrr) úgy csináltam, hogy:
* A programba bekerült egy táblázat, hogy melyik év melyik Unix time pillanatban kezdődik, illetve melyik szökő
* Minden dátum formátumot egyből Unix time-ra alakítottam a fenti táblázat segítségével (a konverziós metódusok remekül unit tesztelhetőek)
* Ha Unix time-od van, akkor csak ki kell vonni az év elejét belőle, majd osztogatni, és megvan.
"Rendes" platformokon vannak dátumkezelő könyvtárak, amik némi olvasgatás és gondolkodás után helyes paraméterezéssel jól működnek. Pl Javában java.util.Calendar Javában.
Arra vigyázz, hogy a libek, parancsok többsége a gépen beállított local beállításokból veszi az időzónát. Így ugyanaz a program simán tud "hülyeségeket" adni egy másra kalibrált gépen.
- A hozzászóláshoz be kell jelentkezni