mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	benchmark/*.rb is only benchmarks now. We don't need prefixes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63928 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			130 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#!/usr/local/bin/ruby
 | 
						|
# This program is contributed by Shin Nishiyama
 | 
						|
 | 
						|
 | 
						|
# modified by K.Sasada
 | 
						|
 | 
						|
NP = 5
 | 
						|
ROW = 8 + NP
 | 
						|
COL = 8
 | 
						|
 | 
						|
$p = []
 | 
						|
$b = []
 | 
						|
$no = 0
 | 
						|
 | 
						|
def piece(n, a, nb)
 | 
						|
  nb.each{|x|
 | 
						|
    a[n] = x
 | 
						|
    if n == NP-1
 | 
						|
      $p << [a.sort]
 | 
						|
    else
 | 
						|
      nbc=nb.dup
 | 
						|
      [-ROW, -1, 1, ROW].each{|d|
 | 
						|
        if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
 | 
						|
          nbc << x+d
 | 
						|
        end
 | 
						|
      }
 | 
						|
      nbc.delete x
 | 
						|
      piece(n+1,a[0..n],nbc)
 | 
						|
    end
 | 
						|
  }
 | 
						|
end
 | 
						|
 | 
						|
def kikaku(a)
 | 
						|
  a.collect {|x| x - a[0]}
 | 
						|
end
 | 
						|
def ud(a)
 | 
						|
  kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
 | 
						|
end
 | 
						|
def rl(a)
 | 
						|
  kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
 | 
						|
end
 | 
						|
def xy(a)
 | 
						|
  kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
 | 
						|
end
 | 
						|
 | 
						|
def mkpieces
 | 
						|
  piece(0,[],[0])
 | 
						|
  $p.each do |a|
 | 
						|
    a0 = a[0]
 | 
						|
    a[1] = ud(a0)
 | 
						|
    a[2] = rl(a0)
 | 
						|
    a[3] = ud(rl(a0))
 | 
						|
    a[4] = xy(a0)
 | 
						|
    a[5] = ud(xy(a0))
 | 
						|
    a[6] = rl(xy(a0))
 | 
						|
    a[7] = ud(rl(xy(a0)))
 | 
						|
    a.sort!
 | 
						|
    a.uniq!
 | 
						|
  end
 | 
						|
  $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
 | 
						|
end
 | 
						|
 | 
						|
def mkboard
 | 
						|
  (0...ROW*COL).each{|i|
 | 
						|
    if i % ROW >= ROW-NP
 | 
						|
      $b[i] = -2
 | 
						|
    else
 | 
						|
      $b[i] = -1
 | 
						|
    end
 | 
						|
    $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
 | 
						|
  }
 | 
						|
end
 | 
						|
 | 
						|
def pboard
 | 
						|
  return # skip print
 | 
						|
  print "No. #$no\n"
 | 
						|
  (0...COL).each{|i|
 | 
						|
    print "|"
 | 
						|
    (0...ROW-NP).each{|j|
 | 
						|
      x = $b[i*ROW+j]
 | 
						|
      if x < 0
 | 
						|
        print "..|"
 | 
						|
      else
 | 
						|
        printf "%2d|",x+1
 | 
						|
      end
 | 
						|
    }
 | 
						|
    print "\n"
 | 
						|
  }
 | 
						|
  print "\n"
 | 
						|
end
 | 
						|
 | 
						|
$pnum=[]
 | 
						|
def setpiece(a,pos)
 | 
						|
  if a.length == $p.length then
 | 
						|
    $no += 1
 | 
						|
    pboard
 | 
						|
    return
 | 
						|
  end
 | 
						|
  while $b[pos] != -1
 | 
						|
    pos += 1
 | 
						|
  end
 | 
						|
  ($pnum - a).each do |i|
 | 
						|
    $p[i].each do |x|
 | 
						|
      f = 0
 | 
						|
      x.each{|s|
 | 
						|
        if $b[pos+s] != -1
 | 
						|
          f=1
 | 
						|
          break
 | 
						|
        end
 | 
						|
      }
 | 
						|
      if f == 0 then
 | 
						|
        x.each{|s|
 | 
						|
          $b[pos+s] = i
 | 
						|
        }
 | 
						|
        a << i
 | 
						|
        setpiece(a.dup, pos)
 | 
						|
        a.pop
 | 
						|
        x.each{|s|
 | 
						|
          $b[pos+s] = -1
 | 
						|
        }
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
mkpieces
 | 
						|
mkboard
 | 
						|
$p[4] = [$p[4][0]]
 | 
						|
$pnum = (0...$p.length).to_a
 | 
						|
setpiece([],0)
 |