fork download
  1. long straightforward(long n) {
  2. return (0..n).sum(Long.&bitCount)
  3. }
  4. assert (0..10).collect(this.&straightforward) == [0, 1, 2, 4, 5, 7, 9, 12, 13, 15, 17]
  5.  
  6. long separateDigits(long n) {
  7. ++n
  8. long acc = 0
  9. long mask = 0
  10. for (long scanbit = 1; scanbit < n; scanbit <<= 1) {
  11. mask |= scanbit
  12. long remainder = n & mask
  13. acc += (n - remainder) >> 1
  14. if (n & scanbit)
  15. acc += remainder - scanbit
  16. }
  17. return acc
  18. }
  19. (0..100).each { assert separateDigits(it) == straightforward(it) }
Success #stdin #stdout 1.46s 332736KB
stdin
Standard input is empty
stdout
Standard output is empty