n = read_line.chars.map(&.to_i) cand = Array.new(n.size, 4) if n < cand puts "5" * (n.size - 1) exit end cand.fill(5) if cand <= n puts cand.join exit end lo = Array.new(n.size, 0) hi = Array.new(n.size, 1) mid = Array.new(n.size + 1, 0) 1000.times do |turn| carry = 0 n.size.times do |i| carry += lo[i] + hi[i] mid[i] = carry % 2 if i > 0 cand[-i] = carry % 2 == 0 ? 4 : 5 end carry //= 2 end mid[n.size] = carry cand[0] = carry == 0 ? 4 : 5 if cand <= n lo = mid[1..] else hi = mid[1..] end end puts lo.map { |v| v == 0 ? 4 : 5 }.reverse.join