range_expansion.sf 489 B

12345678910111213141516171819202122
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Range_expansion
  4. #
  5. func rangex(str) {
  6. str.split(',').map { |r|
  7. var m = r.match(/^
  8. (?(DEFINE) (?<int>[+-]?[0-9]+) )
  9. (?<from>(?&int))-(?<to>(?&int))
  10. $/x)
  11. m ? do {var c = m.ncap; @(Num(c{:from}) .. Num(c{:to}))}
  12. : Num(r)
  13. }
  14. }
  15. var rstr = rangex('-6,-3--1,3-5,7-11,14,15,17-20').flatten.join(',');
  16. assert_eq(rstr, "-6,-3,-2,-1,3,4,5,7,8,9,10,11,14,15,17,18,19,20");
  17. say rstr;