factorions.sf 648 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/ruby
  2. #
  3. ## https://rosettacode.org/wiki/Factorions
  4. #
  5. func max_power(b = 10) {
  6. var m = 1
  7. var f = (b-1)!
  8. while (m*f >= b**(m-1)) {
  9. m += 1
  10. }
  11. return m-1
  12. }
  13. func factorions(b = 10) {
  14. var result = []
  15. var digits = @^b
  16. var fact = digits.map { _! }
  17. for k in (1 .. max_power(b)) {
  18. digits.combinations_with_repetition(k, {|*comb|
  19. var n = comb.sum_by { fact[_] }
  20. if (n.digits(b).sort == comb) {
  21. result << n
  22. }
  23. })
  24. }
  25.  
  26. return result
  27. }
  28. for b in (2..6) {
  29. var r = factorions(b)
  30. say "Base #{'%2d' % b} factorions: #{r}"
  31. }