788 Dominating Numbers.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/ruby
  2. # Dominating numbers
  3. # A dominating number is a positive integer that has more than half of its digits equal.
  4. # https://projecteuler.net/problem=788
  5. # 1e3 ..^ 1e4 -> count { .digits.sort.run_length.map{.tail}.max*2 > .len }
  6. # 1e4 ..^ 1e5 -> count { .digits.sort.run_length.map{.tail}.max*2 > .len }
  7. # 1e5 ..^ 1e6 -> count { .digits.sort.run_length.map{.tail}.max*2 > .len }
  8. func f(n) {
  9. if (n == 1) {
  10. return 9
  11. }
  12. if (n == 2) {
  13. return 9
  14. }
  15. var j = (n.dec>>1)
  16. var count = 9
  17. for i in (1 .. j) {
  18. count += (9*i * (9**i * n))
  19. }
  20. if (n >= 6) {
  21. for i in (1 .. j+1) {
  22. count += 9**(j+1)
  23. }
  24. }
  25. count
  26. }
  27. say f(1)
  28. say f(2)
  29. say f(3)
  30. say f(4)
  31. say f(5)
  32. say f(6)
  33. assert_eq(f(1), 9)
  34. assert_eq(f(2), 9)
  35. assert_eq(f(3), 252)
  36. assert_eq(f(4), 333)
  37. assert_eq(f(5), 7704)
  38. assert_eq(f(6), 11430)
  39. assert_eq(f(1)+f(2)+f(3), 270)
  40. assert_eq(f(1)+f(2)+f(3)+f(4), 603)
  41. assert_eq(f(1)+f(2)+f(3)+f(4)+f(5), 8307)
  42. say f(1)+f(2)
  43. say f(1)+f(2)+f(3)
  44. say f(1)+f(2)+f(3)+f(4)
  45. say map(1..10, f)
  46. say map(1..10, f).sum
  47. assert_eq(map(1..10, f).sum, 21893256)