mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 433af16167
			
		
	
	
		433af16167
		
	
	
	
	
		
			
			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)
 |