move_to_front_algorithm_2.sf 789 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Move-to-front_algorithm#Sidef
  4. #
  5. module MoveToFront {
  6. define ABC = @("a".."z")
  7. func m2f(ar,i) {
  8. [ar.delete_index(i)] + ar
  9. }
  10. func encode(str) {
  11. var ar = ABC+[]
  12. gather {
  13. str.each_char { |char|
  14. take(var i = ar.index(char))
  15. ar = m2f(ar, i);
  16. }
  17. }
  18. }
  19. func decode(indices) {
  20. var ar = ABC+[]
  21. gather {
  22. indices.each { |i|
  23. take ar[i];
  24. ar = m2f(ar, i)
  25. }
  26. }.join
  27. }
  28. }
  29. %w(broood bananaaa hiphophiphop).each { |test|
  30. var encoded = MoveToFront::encode($test);
  31. say "#{test}: #{encoded}";
  32. var decoded = MoveToFront::decode(encoded);
  33. print "in" if (decoded != test);
  34. say "correctly decoded to #{decoded}";
  35. assert_eq(test, decoded);
  36. }