Author Topic: Get characters between "." and "," in a string... STUMPED  (Read 6359 times)

0 Members and 1 Guest are viewing this topic.

Lee Mac

  • Seagull
  • Posts: 12912
  • London, England
Re: Get characters between "." and "," in a string... STUMPED
« Reply #15 on: September 19, 2016, 06:06:03 PM »
Code - Auto/Visual Lisp: [Select]
  1. (defun f (d s / i)
  2.   ;;(setq d ":;," s "A:B,C;D")
  3.   ;;(f d s)
  4.   (cond ((= d "") (list s))
  5.         ((setq i (vl-string-position (ascii d) s))
  6.          (append (f (substr d 2) (substr s 1 i)) (f d (substr s (+ 2 i))))
  7.         )
  8.         ((f (substr d 2) s))
  9.   )
  10. )

This reminds me of the form of recursion used when implementing the quicksort algorithm - very good Evgeniy  :-)

ElpanovEvgeniy

  • Water Moccasin
  • Posts: 1569
  • Moscow (Russia)
Re: Get characters between "." and "," in a string... STUMPED
« Reply #16 on: September 20, 2016, 02:46:38 AM »
This reminds me of the form of recursion used when implementing the quicksort algorithm - very good Evgeniy  :-)

Hello Lee!
You have a great memory ;)

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: Get characters between "." and "," in a string... STUMPED
« Reply #17 on: September 20, 2016, 03:51:18 AM »
Recursion is beautiful (very) but often is slower...
Code: [Select]
(defun AM1 (d s / n c p e l)
  (setq
    c (substr d 1 1)  n c
    n (repeat (strlen d) (setq n (strcat c n)))
    s (vl-string-translate d n s)
    c (ascii c)       p 0
    e (vl-string-position c s)
  )
  (while e
    (setq
      l (cons (substr s (1+ p) (- e p)) l)
      p (1+ e) e (vl-string-position c s p)
    )
  )
  (reverse (cons (substr s (1+ p)) l))
)
Code: [Select]
(setq Keys ":;," String "A:B,C;D")
Benchmark.lsp | © 2005 Michael Puckett | All Rights Reserved
Elapsed milliseconds / relative speed for 131072 iteration(s):
    (AM1 KEYS STRING)................1703 / 1.83 <fastest>
    (AM1 KEYS STRING)................1704 / 1.82
    (_StringSplit3 KEYS STRING)......1766 / 1.76
    (_StringSplit3 KEYS STRING)......1781 / 1.75
    (_StringSplit1 KEYS STRING)......1875 / 1.66
    (_StringSplit1 KEYS STRING)......1906 / 1.63
    (F KEYS STRING)..................2359 / 1.32
    (F KEYS STRING)..................2360 / 1.32
    (_StringSplit2 KEYS STRING)......3015 / 1.03
    (F1 KEYS STRING).................3046 / 1.02
    (_StringSplit2 KEYS STRING)......3094 / 1
    (F1 KEYS STRING).................3109 / 1 <slowest>

(setq Keys ":;," String "A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:A:B,C;D:")
Elapsed milliseconds / relative speed for 16384 iteration(s):
    (AM1 KEYS STRING)................1438 / 4.42 <fastest>
    (AM1 KEYS STRING)................1453 / 4.38
    (_StringSplit1 KEYS STRING)......2235 / 2.85
    (_StringSplit1 KEYS STRING)......2235 / 2.85
    (_StringSplit3 KEYS STRING)......3266 / 1.95
    (_StringSplit3 KEYS STRING)......3312 / 1.92
    (_StringSplit2 KEYS STRING)......5671 / 1.12
    (_StringSplit2 KEYS STRING)......5750 / 1.11
    (F KEYS STRING)..................5797 / 1.1
    (F KEYS STRING)..................5813 / 1.09
    (F1 KEYS STRING).................6297 / 1.01
    (F1 KEYS STRING).................6359 / 1 <slowest>

(setq Keys ":;," String "A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu")
(repeat 4 (setq String (strcat String ";" String))
Elapsed milliseconds / relative speed for 16384 iteration(s):
    (AM1 KEYS STRING).................1532 / 12.07 <fastest>
    (AM1 KEYS STRING).................1609 / 11.49
    (F KEYS STRING)...................3437 / 5.38
    (F KEYS STRING)...................3453 / 5.35
    (_StringSplit2 KEYS STRING).......4516 / 4.09
    (_StringSplit2 KEYS STRING).......4609 / 4.01
    (_StringSplit3 KEYS STRING)......15906 / 1.16
    (_StringSplit3 KEYS STRING)......15906 / 1.16
    (F1 KEYS STRING).................16375 / 1.13
    (F1 KEYS STRING).................16454 / 1.12
    (_StringSplit1 KEYS STRING)......17609 / 1.05
    (_StringSplit1 KEYS STRING)......18485 / 1 <slowest>
Test order:
Code: [Select]
(Benchmark '(
(_StringSplit1 Keys String)
(_StringSplit2 Keys String)
(_StringSplit3 Keys String)
(AM1 Keys String)
(f   Keys String)
(f1  Keys String)
(_StringSplit1 Keys String)
(_StringSplit2 Keys String)
(_StringSplit3 Keys String)
(AM1 Keys String)
(f   Keys String)
(f1  Keys String)
)           ) 

ElpanovEvgeniy

  • Water Moccasin
  • Posts: 1569
  • Moscow (Russia)
Re: Get characters between "." and "," in a string... STUMPED
« Reply #18 on: September 20, 2016, 05:50:57 AM »
Recursion is beautiful (very) but often is slower...

Hello Marc!
Yes!
Recursion is very slow.
The new version only for speed...
 :-)
Code - Auto/Visual Lisp: [Select]
  1. (defun f3 (d s / i)
  2.   (foreach a (vl-string->list d)
  3.     (while (setq i (vl-string-position a s)) (setq s (vl-string-subst "\"\"" (chr a) s)))
  4.   )
  5.   (read (strcat "(\"" s "\")"))
  6. )

VovKa

  • Water Moccasin
  • Posts: 1628
  • Ukraine
Re: Get characters between "." and "," in a string... STUMPED
« Reply #19 on: September 20, 2016, 06:22:22 AM »
:(
Code: [Select]
(f3 "." "A.B\"C.D")

VovKa

  • Water Moccasin
  • Posts: 1628
  • Ukraine
Re: Get characters between "." and "," in a string... STUMPED
« Reply #20 on: September 20, 2016, 06:26:43 AM »
Recursion is beautiful (very) but often is slower...
speed of some functions depends on the length of both arguments
try increasing the length of delimiters also

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: Get characters between "." and "," in a string... STUMPED
« Reply #21 on: September 20, 2016, 06:36:24 AM »
Recursion is beautiful (very) but often is slower...

Hello Marc!
Yes!
Recursion is very slow.
The new version only for speed...
 :-)
Code - Auto/Visual Lisp: [Select]
  1. (defun f3 (d s / i)
  2.   (foreach a (vl-string->list d)
  3.     (while (setq i (vl-string-position a s)) (setq s (vl-string-subst "\"\"" (chr a) s)))
  4.   )
  5.   (read (strcat "(\"" s "\")"))
  6. )
>>> (read (strcat "(\"" s "\")"))
Read in some strings get error:
(read (strcat "(\"" "\".ABC" "\")")) =>; errore: punto in posizione non corretta nell'input

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: Get characters between "." and "," in a string... STUMPED
« Reply #22 on: September 20, 2016, 07:07:30 AM »
Recursion is beautiful (very) but often is slower...
speed of some functions depends on the length of both arguments
try increasing the length of delimiters also
New test:
Code: [Select]
(setq Keys ":;,123456789abcd" String "A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu")

Elapsed milliseconds / relative speed for 32768 iteration(s):
    (AM1 KEYS STRING)................1781 / 9.61 <fastest>
    (AM1 KEYS STRING)................2329 / 7.35
    (_STRINGSPLIT1 KEYS STRING)......4547 / 3.76
    (_STRINGSPLIT1 KEYS STRING)......4890 / 3.5
    (_STRINGSPLIT3 KEYS STRING)......4922 / 3.48
    (_STRINGSPLIT3 KEYS STRING)......5468 / 3.13
    (F1 KEYS STRING).................6469 / 2.64
    (F1 KEYS STRING).................6750 / 2.53
    (F KEYS STRING)..................9844 / 1.74
    (F KEYS STRING).................10546 / 1.62
    (_STRINGSPLIT2 KEYS STRING).....16625 / 1.03
    (_STRINGSPLIT2 KEYS STRING).....17110 / 1 <slowest>



(setq Keys ":;,123456789abcd" String "A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu")
(repeat 4 (setq String (strcat String ";" String)))

Elapsed milliseconds / relative speed for 2048 iteration(s):
    (AM1 KEYS STRING)................1203 / 21.74 <fastest>
    (AM1 KEYS STRING)................1468 / 17.82
    (_STRINGSPLIT1 KEYS STRING)......4093 / 6.39
    (_STRINGSPLIT1 KEYS STRING)......4562 / 5.73
    (_STRINGSPLIT3 KEYS STRING)......5093 / 5.14
    (_STRINGSPLIT3 KEYS STRING)......5735 / 4.56
    (F KEYS STRING)..................9985 / 2.62
    (F KEYS STRING).................12672 / 2.06
    (_STRINGSPLIT2 KEYS STRING).....19579 / 1.34
    (_STRINGSPLIT2 KEYS STRING).....21281 / 1.23
    (F1 KEYS STRING)................24094 / 1.09
    (F1 KEYS STRING)................26157 / 1 <slowest>

ElpanovEvgeniy

  • Water Moccasin
  • Posts: 1569
  • Moscow (Russia)
Re: Get characters between "." and "," in a string... STUMPED
« Reply #23 on: September 20, 2016, 11:40:38 AM »
new version, оnly for the sake of comparison, the speed...
Code - Auto/Visual Lisp: [Select]
  1. (defun f5 (d s / I L)
  2.     (foreach a (VL-STRING->LIST d) (setq l (cons (1+ (VL-STRING-POSITION a s)) l)))
  3.     (setq d 1
  4.           l (vl-sort l (function <))
  5.     )
  6.                                 (setq i d
  7.                                       d (1+ a)
  8.                                 )
  9.                                 (substr s i (- a i))
  10.                               )
  11.                     )
  12.                     l
  13.             )
  14.             (list (substr s d))
  15.     )
  16.   )

I do not like such a long code.  :?

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: Get characters between "." and "," in a string... STUMPED
« Reply #24 on: September 20, 2016, 01:14:51 PM »
new version, оnly for the sake of comparison, the speed...
<>
I do not like such a long code.  :?
I get error in second sample:

Code: [Select]
Comando: (setq Keys ":;," String "A:B,C;D")
"A:B,C;D"

Comando: (f5  Keys String)
("A" "B" "C" "D")

Comando: (setq Keys ":;,123456789abcd" String "A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu")
"A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu"

Comando: (f5  Keys String)
; errore: tipo di argomento errato: numberp: nil

Comando: (f1  Keys String)
("A" "" "" "" "" "" "" "" "" "0" "s" "fghjklò" "s" "fghjklò" "By" "qwuy" "quyqw" "iu" "" "" "" "" "" "" "" "" "Cs" "kjs" "kjs" "jk" "" "" "" "" "Duyyuwe" "" "" "" "" "" "ijiu")

ElpanovEvgeniy

  • Water Moccasin
  • Posts: 1569
  • Moscow (Russia)
Re: Get characters between "." and "," in a string... STUMPED
« Reply #25 on: September 20, 2016, 01:35:16 PM »

I get error in second sample:

Code: [Select]
Comando: (setq Keys ":;,123456789abcd" String "A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu")
"A1234567890asdfghjklòasdfghjklò:Bybqwuybquyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu"

Comando: (f5  Keys String)
; errore: tipo di argomento errato: numberp: nil

Thank you!
I corrected the mistake...

Code - Auto/Visual Lisp: [Select]
  1. (defun f6 (d s / I L)
  2.     (foreach a (VL-STRING->LIST d) (setq l (cons (VL-STRING-POSITION a s) l)))
  3.     (setq d 1
  4.           l (vl-sort (vl-remove nil l) (function <))
  5.     )
  6.                                 (setq i d
  7.                                       d (1+ a)
  8.                                 )
  9.                                 (substr s i (- a i))
  10.                               )
  11.                     )
  12.                     l
  13.             )
  14.             (list (substr s d))
  15.     )
  16.   )

Lee Mac

  • Seagull
  • Posts: 12912
  • London, England
Re: Get characters between "." and "," in a string... STUMPED
« Reply #26 on: September 20, 2016, 01:39:43 PM »
Code: [Select]
_$ (f5 ";," "A;B,C;D,E")
("A" "B" "C;D,E")

_$ (f6 ";," "A;B,C;D,E")
("" ";" ",C;D,E")

ElpanovEvgeniy

  • Water Moccasin
  • Posts: 1569
  • Moscow (Russia)
Re: Get characters between "." and "," in a string... STUMPED
« Reply #27 on: September 20, 2016, 02:08:12 PM »
Code - Auto/Visual Lisp: [Select]
  1. (defun f7 (d s / I L)
  2.   (foreach a (VL-STRING->LIST d)
  3.     (setq i 0)
  4.     (while (setq i (VL-STRING-POSITION a s (1+ i))) (setq l (cons (1+ i) l)))
  5.   )
  6.   (setq d 1
  7.         l (vl-sort (vl-remove nil l) (function <))
  8.   )
  9.                               (setq i d
  10.                                     d (1+ a)
  11.                               )
  12.                               (substr s i (- a i))
  13.                             )
  14.                   )
  15.                   l
  16.           )
  17.           (list (substr s d))
  18.   )
  19. )

Lee Mac

  • Seagull
  • Posts: 12912
  • London, England
Re: Get characters between "." and "," in a string... STUMPED
« Reply #28 on: September 20, 2016, 02:26:52 PM »
Code: [Select]
_$ (f7 ";," ",A;B,C;D,E;")
(",A" "B" "C" "D" "E" "")

[sorry]

Marc'Antonio Alessi

  • Swamp Rat
  • Posts: 1451
  • Marco
Re: Get characters between "." and "," in a string... STUMPED
« Reply #29 on: September 20, 2016, 02:54:48 PM »
f5 was faster...
Code: [Select]
(setq Keys ":;,123456789abcd" String "A1234567890absdfghjklòasdfghjklò:Bybqwuybqcuyqwbiu89897879,Csdkjsdkjsdjk3443;Duyyuwe878723ijiu")
(repeat 4 (setq String (strcat String ";" String)))

Elapsed milliseconds / relative speed for 32768 iteration(s):
    (F5 KEYS STRING)..................1219 / 325.2 <fastest>
    (F5 KEYS STRING)..................1235 / 320.99
    (AM1 KEYS STRING)................20016 / 19.81
    (AM1 KEYS STRING)................20047 / 19.77
    (_STRINGSPLIT1 KEYS STRING)......67750 / 5.85
    (_STRINGSPLIT1 KEYS STRING)......68172 / 5.82
    (_STRINGSPLIT3 KEYS STRING)......84281 / 4.7
    (_STRINGSPLIT3 KEYS STRING)......84344 / 4.7 <slowest>

Elapsed milliseconds / relative speed for 2048 iteration(s):
    (AM1 KEYS STRING)...............1281 / 4.29 <fastest>
    (AM1 KEYS STRING)...............1313 / 4.19
    (F7 KEYS STRING)................2313 / 2.38
    (F7 KEYS STRING)................2390 / 2.3
    (_STRINGSPLIT1 KEYS STRING).....4188 / 1.31
    (_STRINGSPLIT1 KEYS STRING).....4375 / 1.26
    (_STRINGSPLIT3 KEYS STRING).....5390 / 1.02
    (_STRINGSPLIT3 KEYS STRING).....5500 / 1 <slowest>