Liste des Groupes | Revenir à cl forth |
On 06/10/2024 08:51, dxf wrote:Is there an easier way of doing this? End goal is a double number representing centi-secs.
>
>
empty decimal
>
: SPLIT ( a u c -- a2 u2 a3 u3 ) >r 2dup r> scan 2swap 2 pick - ;
: >INT ( adr len -- u ) 0 0 2swap >number 2drop drop ;
>
: /T ( a u -- $hour $min $sec )
2 0 do [char] : split 2swap dup if 1 /string then loop
2 0 do dup 0= if 2rot 2rot then loop ;
>
: .T 2swap 2rot cr >int . ." hr " >int . ." min " >int . ." sec " ;
>
s" 1:2:3" /t .t
s" 02:03" /t .t
s" 03" /t .t
s" 23:59:59" /t .t
s" 0:00:03" /t .t
Another solution
: /t ( ca u -- sec min hour )
3 \ a count, decremented every recurse
[: -rot dup 0>
if 0. 2swap >number 1 /string 2swap drop ( -- ct ca' u' n1 )
>r rot 1-
recurse r> swap exit
then 2drop
;] execute
0 ?do 0 loop \ 0 hours and minutes if missing in source string
;
: .t cr . ." hr " . ." min " . ." sec " ;
cr
s" 1:2:3" /t .t
s" 02:03" /t .t
s" 03" /t .t
s" 23:59:59" /t .t
s" 0:00:03" /t .t
s" " /t .t
s" :" /t .t
s" :53" /t .t
s" 11/12/13" /t .t \ Different separator
s" 11::13" /t .t
s" :::" /t .t
s" 3:" /t .t
s" 1:2:" /t .t
\ Results
1 hr 2 min 3 sec
0 hr 2 min 3 sec
0 hr 0 min 3 sec
23 hr 59 min 59 sec
0 hr 0 min 3 sec
0 hr 0 min 0 sec
0 hr 0 min 0 sec
0 hr 0 min 53 sec
11 hr 12 min 13 sec
11 hr 0 min 13 sec
0 hr 0 min 0 sec
0 hr 0 min 3 sec
0 hr 1 min 2 sec
The last two could be regarded as wrong but you indicated elsewhere that they wouldn't occur.
Any non-digit is a separator
Les messages affichés proviennent d'usenet.