text_processing_1.sf 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Text_processing/1
  4. #
  5. var gaps = [];
  6. var previous = :valid;
  7.  
  8. DATA.each { |line|
  9. var (date, *readings) = line.words...;
  10. var valid = [];
  11. var hour = 0;
  12. for reading, flag in readings.map{.to_n}.slices(2) {
  13. if (flag > 0) {
  14. valid << reading;
  15. if (previous == :invalid) {
  16. gaps[-1]{:end} = "#{date} #{hour}:00";
  17. previous = :valid;
  18. }
  19. }
  20. else {
  21. if (previous == :valid) {
  22. gaps << Hash(start => "#{date} #{hour}:00");
  23. }
  24. gaps[-1]{:count} := 0 ++;
  25. previous = :invalid;
  26. }
  27. ++hour;
  28. }
  29. say ("#{date}: #{ '%8s' % (valid ? ('%.3f' % Math.avg(valid...)) : 0) }",
  30. " mean from #{ '%2s' % valid.len } valid.");
  31. }
  32.  
  33. var longest = gaps.sort_by{|a| -a{:count} }.first;
  34.  
  35. say ("Longest period of invalid readings was #{longest{:count}} hours,\n",
  36. "from #{longest{:start}} till #{longest{:end}}.");
  37. __DATA__
  38. 1991-03-30 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1
  39. 1991-03-31 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 10.000 1 20.000 1 20.000 1 20.000 1 35.000 1 50.000 1 60.000 1 40.000 1 30.000 1 30.000 1 30.000 1 25.000 1 20.000 1 20.000 1 20.000 1 20.000 1 20.000 1 35.000 1
  40. 1991-03-31 40.000 1 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2 0.000 -2
  41. 1991-04-01 0.000 -2 13.000 1 16.000 1 21.000 1 24.000 1 22.000 1 20.000 1 18.000 1 29.000 1 44.000 1 50.000 1 43.000 1 38.000 1 27.000 1 27.000 1 24.000 1 23.000 1 18.000 1 12.000 1 13.000 1 14.000 1 15.000 1 13.000 1 10.000 1
  42. 1991-04-02 8.000 1 9.000 1 11.000 1 12.000 1 12.000 1 12.000 1 27.000 1 26.000 1 27.000 1 33.000 1 32.000 1 31.000 1 29.000 1 31.000 1 25.000 1 25.000 1 24.000 1 21.000 1 17.000 1 14.000 1 15.000 1 12.000 1 12.000 1 10.000 1
  43. 1991-04-03 10.000 1 9.000 1 10.000 1 10.000 1 9.000 1 10.000 1 15.000 1 24.000 1 28.000 1 24.000 1 18.000 1 14.000 1 12.000 1 13.000 1 14.000 1 15.000 1 14.000 1 15.000 1 13.000 1 13.000 1 13.000 1 12.000 1 10.000 1 10.000 1