fork(1) download
  1. require 'pp'
  2. require 'minitest/autorun'
  3.  
  4. F=
  5. ->g,w,h{m=->y,x,d,v=[]{q=y,x
  6. r=->s{([""]*h+g)[y+h,h].map{|l|(?x*w+l)[x+w,w]}.join.count s}
  7. z=k=r[?v]-r[?^],j=r[?>]-r[?<]
  8. q[d=[d,1,0][j*j<=>k*k]]+=z[d]<=>0
  9. v&[q<<d]!=[]?q!=v[-1]:m[*q,v<<q]}
  10. m[0,0,1]}
  11.  
  12. describe :X do
  13. describe 'Grid 1 (2x2)' do
  14. before do
  15. @g = [
  16. '>v',
  17. '^<' ]
  18. end
  19.  
  20. it 'detects loop for 1x1' do assert F[@g, 1, 1] end
  21. it 'detects loop for 1x2' do assert F[@g, 1, 2] end
  22. it 'detects loop for 2x1' do assert F[@g, 2, 1] end
  23. it 'detects rest for 2x2' do refute F[@g, 2, 2] end
  24. end
  25.  
  26. describe 'Grid 2 (3x3)' do
  27. before do
  28. @g = [
  29. '> v',
  30. ' ',
  31. '^ <' ]
  32. end
  33.  
  34. it 'detects rest for 1x1' do refute F[@g, 1, 1] end
  35. it 'detects rest for 1x2' do refute F[@g, 1, 2] end
  36. it 'detects rest for 1x3' do refute F[@g, 1, 3] end
  37. it 'detects rest for 2x1' do refute F[@g, 2, 1] end
  38. it 'detects loop for 2x2' do assert F[@g, 2, 2] end
  39. it 'detects loop for 2x3' do assert F[@g, 2, 3] end
  40. it 'detects rest for 3x1' do refute F[@g, 3, 1] end
  41. it 'detects loop for 3x2' do assert F[@g, 3, 2] end
  42. it 'detects rest for 3x3' do refute F[@g, 3, 3] end
  43. end
  44.  
  45. describe 'Grid 3 (6x5)' do
  46. before do
  47. @g = [
  48. '>v>v>v',
  49. '^v^v^v',
  50. '^v^v^v',
  51. '^>^>^v',
  52. '^<<<<<']
  53. end
  54.  
  55. it 'detects loop for 1x1' do assert F[@g, 1, 1] end
  56. it 'detects rest for 1x2' do refute F[@g, 1, 2] end
  57. it 'detects loop for 2x1' do assert F[@g, 2, 1] end
  58. it 'detects loop for 2x2' do assert F[@g, 2, 2] end
  59. it 'detects loop for 2x4' do assert F[@g, 2, 4] end
  60. it 'detects rest for 2x5' do refute F[@g, 2, 5] end
  61. it 'detects rest for 3x1' do refute F[@g, 3, 1] end
  62. it 'detects loop for 3x2' do assert F[@g, 3, 2] end
  63. it 'detects loop for 3x3' do assert F[@g, 3, 3] end
  64. it 'detects loop for 3x5' do assert F[@g, 3, 5] end
  65. it 'detects rest for 6x2' do refute F[@g, 6, 2] end
  66. it 'detects loop for 6x3' do assert F[@g, 6, 3] end
  67. it 'detects rest for 6x5' do refute F[@g, 6, 5] end
  68. end
  69.  
  70. describe 'Grid 4 (10x6)' do
  71. before do
  72. @g = [
  73. '> <vv <',
  74. ' v ^ >v v ',
  75. ' >v^^>vv^',
  76. ' ^>^ v ',
  77. '> v<v >>',
  78. ' >v v<^ ']
  79. end
  80.  
  81. it 'detects rest for 1x1' do refute F[@g, 1, 1] end
  82. it 'detects rest for 2x3' do refute F[@g, 2, 3] end
  83. it 'detects rest for 2x6' do refute F[@g, 2, 6] end
  84. it 'detects loop for 3x2' do assert F[@g, 3, 2] end
  85. it 'detects rest for 5x4' do refute F[@g, 5, 4] end
  86. it 'detects loop for 6x1' do assert F[@g, 6, 1] end
  87. it 'detects rest for 10x6' do refute F[@g, 10, 6] end
  88. end
  89. end
  90.  
Success #stdin #stdout 0.12s 10856KB
stdin
Standard input is empty
stdout
Run options: --seed 52313

# Running tests:

.................................

Finished tests in 0.023631s, 1396.4669 tests/s, 1396.4669 assertions/s.

33 tests, 33 assertions, 0 failures, 0 errors, 0 skips