277 A Modified Collatz sequence.sf 1019 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/ruby
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 25 August 2016
  4. # License: GPLv3
  5. # Website: https://github.com/trizen
  6. # https://projecteuler.net/problem=277
  7. # Runtime: 0.271s
  8. func collatz(n) {
  9. gather {
  10. loop {
  11. n.is_one && break
  12. if (n % 3 == 0) {
  13. n /= 3
  14. take('D')
  15. }
  16. elsif (n % 3 == 1) {
  17. n = ((4*n + 2) / 3)
  18. take('U')
  19. }
  20. elsif (n % 3 == 2) {
  21. n = ((2*n - 1) / 3)
  22. take('d')
  23. }
  24. }
  25. }.join
  26. }
  27. var step = 1
  28. var from = 10**15
  29. var j = 1
  30. var s = 'UDDDUdddDDUDDddDdDddDDUDDdUUDd'
  31. var l = s.len
  32. loop {
  33. for i in RangeNum(from, Inf, step) {
  34. var c = collatz(i)
  35. if (c.begins_with(s.substr(0, j))) {
  36. if (j == l) {
  37. say i;
  38. goto :OUTER
  39. }
  40. from = i
  41. step *= 3
  42. j += 1
  43. break
  44. }
  45. }
  46. }; @:OUTER