This is a little smaller.

$p = ARGV.shift.split(//)

def s
  h = Hash.new()
  80.times do |j|
    next if $p[j].to_i != 0
    80.times {|k| h[k.to_i / 9 == j / 9 ||k.to_i%9 == j%9 || k.to_i /
27 == j / 27 && k.to_i%9/3 == j%9/3 ?$p[k.to_i]:0] = 1}
    10.times {|v| next if v==0 || h.has_key?(v.to_s); $p[j] = v.to_s;
s}
      return $p[j] = 0;
  end
  return (puts "\nSolution:#{$p}" )
end

s