Problem:
Score : 300 points

Problem Statement

You are given an integer N. Among the integers between 1 and N (inclusive), how many Shichi-Go-San numbers (literally "Seven-Five-Three numbers") are there?

Here, a Shichi-Go-San number is a positive integer that satisfies the following condition:

When the number is written in base ten, each of the digits 7, 5 and 3 appears at least once, and the other digits never appear.

Constraints

1 \leq N < 10^9

N is an integer.

Input

Input is given from Standard Input in the following format:

N

Output

Print the number of the Shichi-Go-San numbers between 1 and N (inclusive).

Sample Input 1

575

Sample Output 1

4

There are four Shichi-Go-San numbers not greater than 575: 357, 375, 537 and 573.

Sample Input 2

3600

Sample Output 2

13

There are 13 Shichi-Go-San numbers not greater than 3600: the above four numbers, 735, 753, 3357, 3375, 3537, 3557, 3573, 3575 and 3577.

Sample Input 3

999999999

Sample Output 3

26484

Solution in Ruby (2.3.3) (judge verdict: Accepted)

# util functions
def dfs( zero_avail, flag, list, history )
  if list == []
    if history.uniq.size == 3
      # print "ok: "
      # p history
      return 1
    else
      # print "ng: "
      # p history      
      return 0
    end
  else
    sum = 0
    next_list = list.clone
    next_list.shift
    sum += dfs( true, true, next_list, history.clone ) if zero_avail
    sum += dfs( false, (flag or (list[0] != 3)), next_list, (history.clone << 3) ) if list[0] >= 3 or flag
    sum += dfs( false, (flag or (list[0] != 5)), next_list, (history.clone << 5) ) if list[0] >= 5 or flag
    sum += dfs( false, (flag or (list[0] != 7)), next_list, (history.clone << 7) ) if list[0] >= 7 or flag   
    return sum
  end
end

# debug
debugFlag = ( ARGV[0] != nil )
p "==== DEBUG MODE ====" if debugFlag

# input
inputs = []
lc = 0
while l = $stdin.gets do
  if false
    inputs << l.chomp.split(" ").map(&:to_s)
  else
    inputs << l.chomp.split(" ").map(&:to_i)
  end
  lc += 1
end

# input check
if debugFlag
  p "--- INPUT (begin) ---"
  inputs.each do |l_i|
    p l_i
  end
  p "--- INPUT (end) ---"
  print "\n"
end
num = inputs[0][0]

# body
if debugFlag
end

list = []
10.times do |i|
  if num >= 10**i 
    elem = (num / (10**i)) % 10
    list << elem
  end
end
list.reverse!

p list if debugFlag

puts dfs( true, false, list, [] )