From a47eac84e5c3746335ad6737221f6d0571ca7cac Mon Sep 17 00:00:00 2001 From: Rhys Walker Date: Tue, 20 May 2025 12:00:26 +0100 Subject: [PATCH 1/7] Added Benchmark for Vector --- Examples/Benchmarks/VectorBenchmark.som | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Examples/Benchmarks/VectorBenchmark.som diff --git a/Examples/Benchmarks/VectorBenchmark.som b/Examples/Benchmarks/VectorBenchmark.som new file mode 100644 index 00000000..dba9de5f --- /dev/null +++ b/Examples/Benchmarks/VectorBenchmark.som @@ -0,0 +1,23 @@ +"A benchmark to exercise #, , #remove: , and #at:put: of the Vector class" +VectorBenchmark = Benchmark ( + + benchmark = ( + | v | + + "Create a vector and add 1000 items to it" + v := Vector new. + 1 to: 1000 do: [ :i | v, i]. + + "Remove 100 items from the middle" + 450 to: 550 do: [:i | v remove: i]. + + "Now change the terms located from 350 to 450" + 350 to: 450 do: [:i | v at: i put: i+1]. + + ^v + ) + + verifyResult: result = ( + ^ self assert: 351 equals: (result at: 350) + ) +) From 6ccd17195ec0dfba2faa359478907d790b32aab5 Mon Sep 17 00:00:00 2001 From: Rhys Walker Date: Fri, 6 Jun 2025 13:41:44 +0100 Subject: [PATCH 2/7] New doIndexes test --- TestSuite/VectorTest.som | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/TestSuite/VectorTest.som b/TestSuite/VectorTest.som index 130601bd..39ea11f9 100644 --- a/TestSuite/VectorTest.som +++ b/TestSuite/VectorTest.som @@ -401,4 +401,16 @@ VectorTest = TestCase ( ]. self assert: 6 equals: i. ) + + "doIndexes iterates from 1 rather then start check core-lib/Vector implementation" + testDoIndexesDoubleRemove = ( + | v | + v := Vector new. + 1 to: 10 do: [:i | v , i]. + + v removeFirst. + v removeFirst. + + v doIndexes: [:i | self assert: i equals: ((v at: i)-2)] + ) ) From 63bad3b95e3ab54152b2917731c216137b3dea50 Mon Sep 17 00:00:00 2001 From: Rhys Walker Date: Wed, 18 Jun 2025 15:23:56 +0100 Subject: [PATCH 3/7] Additions to VectorTest and a new benchmark --- Examples/Benchmarks/Knapsack.som | 437 +++++++++++++++++++++++++++++++ TestSuite/VectorTest.som | 13 + 2 files changed, 450 insertions(+) create mode 100644 Examples/Benchmarks/Knapsack.som diff --git a/Examples/Benchmarks/Knapsack.som b/Examples/Benchmarks/Knapsack.som new file mode 100644 index 00000000..f20f57ca --- /dev/null +++ b/Examples/Benchmarks/Knapsack.som @@ -0,0 +1,437 @@ +Knapsack = Benchmark ( + + benchmark = ( + | ws vs | + ws := Vector new. + vs := Vector new. + + ws, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1. + ws, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1. + ws, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. + ws, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. + ws, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3. + ws, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3. + ws, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4. + ws, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4. + ws, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5. + ws, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5. + ws, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6. + ws, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6. + ws, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7. + ws, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8. + ws, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8. + ws, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9. + ws, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9. + ws, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10. + ws, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10. + ws, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11. + ws, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11. + ws, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12. + ws, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12. + ws, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13. + ws, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13. + ws, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14. + ws, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14. + ws, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14. + ws, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15. + ws, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15. + ws, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16. + ws, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16. + ws, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17. + ws, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17. + ws, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18. + ws, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18. + ws, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19. + ws, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19. + ws, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20. + ws, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21. + ws, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21. + ws, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21. + ws, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22. + ws, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22. + ws, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23. + ws, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23. + ws, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24. + ws, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24. + ws, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24. + ws, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25. + ws, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26. + ws, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26. + ws, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27. + ws, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27. + ws, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27. + ws, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28. + ws, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28. + ws, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29. + ws, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29. + ws, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30. + ws, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30. + ws, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31. + ws, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31. + ws, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32. + ws, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32. + ws, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33. + ws, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33. + ws, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34. + ws, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34. + ws, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35. + ws, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35. + ws, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36. + ws, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36. + ws, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37. + ws, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37. + ws, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38. + ws, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38. + ws, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39. + ws, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39. + ws, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40. + ws, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40. + ws, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41. + ws, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41. + ws, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42. + ws, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42. + ws, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43. + ws, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43. + ws, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44. + ws, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45. + ws, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45. + ws, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45. + ws, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46. + ws, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46. + ws, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47. + ws, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47. + ws, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48. + ws, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49. + ws, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49. + ws, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49. + ws, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50. + ws, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50. + ws, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51. + ws, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51. + ws, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52. + ws, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52. + ws, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53. + ws, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53. + ws, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54. + ws, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55. + ws, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55. + ws, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56. + ws, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56. + ws, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57. + ws, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57. + ws, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58. + ws, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58. + ws, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59. + ws, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59. + ws, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60. + ws, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60. + ws, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60. + ws, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61. + ws, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61. + ws, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62. + ws, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63. + ws, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63. + ws, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64. + ws, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64. + ws, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65. + ws, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65. + ws, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66. + ws, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67. + ws, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67. + ws, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67. + ws, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68. + ws, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68. + ws, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69. + ws, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69. + ws, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70. + ws, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70. + ws, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71. + ws, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71. + ws, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72. + ws, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72. + ws, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73. + ws, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73. + ws, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74. + ws, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74. + ws, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75. + ws, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75. + ws, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76. + ws, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76. + ws, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77. + ws, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77. + ws, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77. + ws, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78. + ws, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79. + ws, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79. + ws, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80. + ws, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80. + ws, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81. + ws, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81. + ws, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82. + ws, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82. + ws, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83. + ws, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83. + ws, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84. + ws, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84. + ws, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85. + ws, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85. + ws, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85. + ws, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86. + ws, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87. + ws, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87. + ws, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88. + ws, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88. + ws, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89. + ws, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89. + ws, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90. + ws, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90. + ws, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91. + ws, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91. + ws, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92. + ws, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92. + ws, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93. + ws, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93. + ws, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94. + ws, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94. + ws, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95. + ws, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95. + ws, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96. + ws, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96. + ws, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97. + ws, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98. + ws, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98. + ws, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99. + ws, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99. + ws, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99. + ws, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100. + ws, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100. + + vs, 69, 58, 44, 85, 34, 76, 58, 23, 58, 21, 61, 83, 21, 92, 12, 33, 67, 8, 14, 28, 57, 47, 6, 72, 59. + vs, 3, 70, 49, 52, 52, 63, 35, 52, 72, 5, 84, 89, 55, 51, 85, 24, 80, 91, 92, 60, 25, 30, 90, 36, 8. + vs, 93, 41, 54, 48, 96, 72, 91, 42, 38, 47, 48, 39, 69, 84, 20, 71, 39, 95, 59, 31, 86, 20, 68, 51, 20. + vs, 66, 21, 56, 67, 71, 20, 13, 24, 90, 96, 62, 51, 45, 44, 99, 2, 8, 49, 24, 31, 83, 62, 60, 50, 37. + vs, 58, 46, 35, 69, 28, 36, 19, 62, 37, 95, 5, 66, 58, 3, 41, 11, 42, 91, 43, 8, 16, 59, 23, 39, 59. + vs, 79, 99, 69, 32, 3, 32, 28, 8, 44, 64, 68, 31, 57, 24, 63, 61, 13, 7, 88, 78, 43, 18, 25, 67, 65. + vs, 4, 90, 30, 6, 58, 19, 86, 6, 82, 46, 42, 69, 47, 26, 30, 51, 56, 20, 72, 39, 19, 68, 99, 17, 79. + vs, 15, 68, 53, 96, 76, 49, 35, 57, 61, 93, 63, 67, 2, 16, 7, 89, 57, 59, 16, 96, 21, 70, 17, 18, 83. + vs, 89, 27, 40, 31, 69, 56, 64, 57, 91, 7, 99, 40, 50, 26, 41, 56, 27, 79, 67, 70, 13, 12, 33, 55, 65. + vs, 98, 32, 96, 63, 70, 89, 15, 81, 17, 60, 97, 42, 5, 76, 38, 35, 90, 7, 57, 47, 12, 42, 17, 49, 6. + vs, 61, 88, 82, 66, 73, 18, 37, 51, 91, 100, 37, 80, 100, 74, 44, 79, 82, 95, 48, 72, 39, 94, 88, 20, 10. + vs, 49, 98, 49, 74, 34, 8, 21, 90, 74, 5, 45, 86, 51, 19, 5, 34, 83, 82, 37, 54, 54, 16, 26, 14, 56. + vs, 67, 75, 24, 70, 62, 86, 42, 8, 36, 99, 75, 72, 20, 59, 4, 88, 52, 96, 76, 62, 26, 69, 82, 21, 17. + vs, 59, 95, 100, 42, 45, 64, 46, 76, 2, 38, 82, 59, 98, 84, 41, 59, 46, 2, 82, 91, 56, 92, 84, 11, 88. + vs, 29, 67, 15, 60, 29, 92, 68, 84, 88, 63, 22, 47, 71, 56, 31, 44, 100, 32, 18, 38, 48, 6, 43, 78, 12. + vs, 20, 66, 66, 3, 75, 94, 58, 93, 30, 2, 97, 41, 97, 84, 23, 68, 60, 88, 1, 55, 67, 97, 23, 93, 11. + vs, 82, 22, 55, 34, 27, 48, 21, 73, 93, 69, 88, 9, 76, 91, 44, 80, 27, 77, 42, 37, 72, 2, 31, 84, 46. + vs, 10, 9, 21, 81, 79, 86, 30, 69, 38, 2, 32, 52, 19, 8, 45, 17, 27, 58, 70, 17, 71, 64, 85, 20, 43. + vs, 42, 49, 47, 69, 27, 77, 93, 77, 8, 49, 68, 81, 98, 30, 65, 97, 33, 92, 5, 48, 77, 75, 35, 15, 22. + vs, 54, 77, 86, 34, 74, 77, 85, 43, 73, 64, 22, 45, 40, 54, 22, 62, 98, 82, 99, 30, 70, 70, 15, 83, 43. + vs, 17, 21, 2, 82, 69, 15, 6, 29, 45, 42, 10, 33, 71, 57, 29, 25, 91, 54, 93, 98, 51, 38, 21, 16, 23. + vs, 68, 77, 51, 18, 13, 40, 55, 6, 21, 22, 70, 29, 69, 57, 59, 73, 11, 16, 56, 27, 87, 75, 82, 40, 61. + vs, 77, 12, 44, 7, 49, 73, 79, 66, 13, 65, 74, 83, 86, 19, 73, 20, 69, 91, 45, 99, 61, 5, 86, 73, 6. + vs, 93, 42, 36, 71, 1, 51, 96, 26, 59, 56, 100, 5, 81, 92, 77, 95, 60, 73, 82, 52, 30, 45, 35, 11, 85. + vs, 81, 23, 81, 16, 47, 91, 28, 47, 64, 19, 15, 8, 38, 71, 34, 98, 78, 72, 28, 26, 83, 38, 96, 47, 6. + vs, 59, 26, 96, 98, 26, 56, 47, 54, 100, 39, 97, 98, 58, 96, 22, 19, 10, 43, 12, 38, 61, 49, 43, 19, 65. + vs, 48, 20, 90, 24, 66, 38, 93, 2, 8, 48, 71, 73, 46, 1, 75, 3, 54, 20, 29, 12, 92, 11, 40, 17, 42. + vs, 26, 85, 66, 99, 42, 42, 31, 66, 68, 28, 12, 95, 27, 17, 24, 20, 22, 55, 70, 59, 79, 100, 15, 28, 89. + vs, 65, 9, 95, 25, 90, 70, 16, 39, 40, 86, 19, 35, 27, 24, 41, 92, 52, 54, 9, 87, 7, 10, 60, 70, 16. + vs, 89, 100, 20, 97, 55, 93, 18, 72, 89, 73, 42, 90, 19, 76, 5, 8, 60, 8, 47, 66, 94, 88, 19, 70, 52. + vs, 34, 53, 24, 20, 46, 92, 100, 38, 65, 53, 12, 36, 71, 22, 5, 65, 86, 9, 22, 52, 37, 81, 88, 8, 5. + vs, 58, 49, 46, 30, 68, 92, 77, 27, 87, 57, 83, 55, 31, 69, 20, 25, 60, 19, 71, 20, 46, 33, 39, 79, 97. + vs, 58, 96, 6, 29, 64, 34, 78, 59, 81, 81, 81, 89, 34, 76, 83, 62, 25, 15, 66, 64, 44, 13, 66, 21, 34. + vs, 88, 87, 9, 99, 21, 52, 29, 9, 57, 3, 75, 78, 73, 47, 40, 64, 34, 83, 39, 81, 26, 12, 61, 79, 72. + vs, 22, 61, 30, 45, 87, 60, 42, 60, 5, 73, 74, 24, 28, 18, 95, 89, 57, 69, 88, 56, 97, 68, 6, 34, 42. + vs, 62, 56, 40, 80, 50, 78, 77, 25, 33, 77, 84, 73, 56, 41, 94, 32, 78, 37, 85, 64, 26, 12, 6, 52, 12. + vs, 84, 36, 80, 19, 33, 35, 36, 67, 54, 13, 52, 65, 44, 72, 65, 8, 71, 90, 47, 16, 47, 78, 19, 32, 94. + vs, 83, 4, 38, 56, 2, 69, 73, 57, 53, 19, 82, 26, 52, 91, 27, 7, 26, 57, 75, 68, 9, 14, 99, 94, 94. + vs, 21, 29, 16, 43, 30, 18, 7, 29, 19, 4, 12, 58, 87, 77, 62, 59, 37, 5, 25, 42, 93, 15, 89, 31, 61. + vs, 72, 97, 56, 62, 24, 59, 34, 26, 32, 75, 86, 72, 68, 45, 15, 55, 1, 41, 66, 16, 49, 47, 81, 2, 61. + vs, 25, 4, 71, 47, 80, 25, 3, 74, 97, 14, 8, 93, 94, 3, 29, 19, 17, 34, 44, 74, 44, 49, 74, 78, 39. + vs, 57, 18, 83, 71, 16, 7, 13, 100, 20, 68, 40, 61, 28, 50, 48, 57, 94, 98, 2, 58, 57, 83, 98, 77, 92. + vs, 32, 2, 41, 28, 13, 57, 2, 51, 52, 79, 71, 92, 84, 76, 54, 14, 11, 22, 26, 69, 22, 60, 97, 24, 83. + vs, 93, 97, 86, 26, 43, 86, 90, 31, 78, 25, 86, 26, 14, 66, 6, 11, 6, 36, 14, 13, 16, 8, 74, 59, 54. + vs, 57, 16, 59, 38, 25, 67, 18, 46, 13, 99, 91, 80, 100, 95, 17, 27, 23, 27, 100, 85, 26, 87, 52, 11, 71. + vs, 3, 61, 98, 61, 15, 19, 12, 53, 73, 74, 31, 64, 52, 82, 19, 87, 13, 59, 82, 17, 95, 96, 25, 48, 25. + vs, 3, 26, 58, 34, 82, 54, 50, 95, 90, 68, 60, 87, 75, 20, 4, 85, 1, 23, 83, 19, 41, 68, 49, 13, 60. + vs, 95, 5, 97, 32, 59, 99, 75, 90, 24, 69, 53, 61, 32, 15, 58, 40, 30, 80, 93, 78, 93, 93, 33, 68, 35. + vs, 81, 49, 59, 82, 24, 48, 72, 75, 62, 30, 6, 49, 10, 20, 61, 3, 41, 18, 27, 82, 86, 59, 5, 77, 35. + vs, 87, 41, 74, 4, 21, 5, 28, 67, 96, 86, 55, 95, 49, 66, 21, 28, 3, 42, 54, 71, 80, 17, 11, 13, 76. + vs, 90, 35, 31, 15, 58, 70, 87, 31, 95, 54, 15, 89, 24, 33, 32, 4, 15, 63, 83, 96, 20, 51, 88, 85, 13. + vs, 39, 62, 9, 52, 38, 70, 43, 83, 6, 99, 35, 62, 8, 64, 1, 72, 18, 10, 48, 91, 15, 36, 91, 74, 34. + vs, 51, 61, 56, 36, 39, 46, 21, 82, 97, 21, 95, 79, 6, 37, 65, 54, 56, 64, 70, 7, 61, 98, 34, 75, 48. + vs, 37, 30, 23, 89, 31, 88, 46, 54, 67, 84, 60, 69, 33, 32, 53, 74, 77, 33, 80, 96, 95, 53, 27, 33, 26. + vs, 11, 10, 51, 98, 20, 8, 56, 13, 17, 15, 32, 53, 16, 36, 91, 59, 47, 10, 33, 28, 53, 82, 93, 10, 10. + vs, 80, 85, 99, 43, 32, 2, 13, 30, 86, 98, 74, 14, 50, 8, 56, 77, 33, 25, 15, 51, 38, 51, 36, 17, 27. + vs, 56, 16, 6, 39, 3, 75, 32, 11, 91, 55, 86, 74, 16, 37, 16, 42, 86, 8, 54, 63, 58, 5, 36, 28, 14. + vs, 40, 62, 15, 20, 16, 31, 13, 15, 1, 54, 28, 58, 29, 79, 17, 2, 59, 41, 88, 74, 19, 74, 67, 42, 98. + vs, 79, 11, 91, 48, 3, 88, 17, 72, 56, 61, 21, 22, 76, 66, 17, 53, 14, 100, 75, 11, 35, 51, 51, 56, 23. + vs, 18, 4, 96, 65, 54, 76, 72, 3, 14, 94, 97, 47, 23, 39, 41, 9, 14, 63, 88, 61, 81, 50, 36, 8, 84. + vs, 81, 95, 16, 73, 20, 60, 78, 49, 23, 45, 21, 4, 100, 29, 29, 44, 7, 86, 43, 75, 58, 44, 70, 38, 70. + vs, 91, 30, 15, 72, 55, 89, 14, 93, 4, 4, 48, 92, 8, 25, 99, 71, 51, 28, 66, 51, 94, 50, 28, 93, 14. + vs, 55, 49, 71, 89, 21, 31, 16, 2, 52, 58, 38, 78, 45, 61, 50, 28, 95, 68, 42, 84, 63, 61, 28, 84, 20. + vs, 69, 8, 34, 26, 73, 95, 6, 89, 8, 63, 55, 90, 44, 33, 90, 8, 33, 18, 81, 96, 34, 22, 76, 98, 72. + vs, 95, 51, 42, 66, 82, 81, 53, 89, 71, 55, 61, 47, 53, 7, 54, 84, 52, 100, 98, 19, 53, 40, 11, 12, 7. + vs, 1, 61, 58, 33, 27, 57, 19, 52, 71, 39, 70, 13, 1, 26, 6, 70, 47, 11, 61, 40, 50, 4, 7, 38, 60. + vs, 10, 95, 7, 52, 33, 32, 15, 91, 28, 98, 90, 94, 52, 1, 61, 62, 68, 78, 45, 14, 39, 3, 3, 86, 88. + vs, 54, 45, 30, 42, 59, 13, 88, 31, 76, 3, 29, 43, 9, 45, 38, 91, 54, 48, 32, 94, 18, 2, 18, 42, 79. + vs, 61, 98, 4, 72, 73, 67, 39, 1, 62, 17, 26, 81, 80, 32, 95, 18, 41, 92, 34, 43, 4, 31, 13, 88, 70. + vs, 15, 84, 57, 16, 63, 95, 11, 65, 27, 67, 75, 4, 24, 49, 40, 40, 11, 48, 54, 76, 71, 28, 24, 76, 3. + vs, 15, 35, 4, 94, 72, 17, 4, 48, 12, 71, 11, 96, 44, 86, 13, 57, 48, 57, 33, 75, 68, 23, 12, 19, 98. + vs, 61, 50, 35, 18, 12, 38, 33, 31, 86, 5, 79, 39, 70, 64, 50, 24, 63, 4, 33, 83, 95, 80, 37, 90, 40. + vs, 69, 50, 37, 56, 72, 61, 30, 11, 73, 79, 76, 57, 19, 6, 64, 28, 32, 57, 59, 31, 56, 93, 65, 55, 66. + vs, 84, 68, 72, 40, 37, 96, 37, 80, 80, 58, 72, 50, 79, 47, 6, 65, 73, 25, 79, 100, 84, 84, 26, 75, 85. + vs, 91, 95, 96, 3, 98, 38, 1, 5, 21, 61, 50, 46, 86, 39, 9, 87, 40, 17, 75, 74, 78, 46, 26, 60, 63. + vs, 53, 98, 44, 7, 80, 9, 51, 22, 82, 74, 5, 87, 84, 80, 78, 27, 98, 63, 69, 63, 66, 76, 77, 92, 93. + vs, 27, 16, 28, 49, 20, 58, 31, 6, 25, 44, 81, 67, 73, 38, 18, 98, 85, 73, 39, 97, 81, 17, 97, 88, 67. + vs, 12, 33, 47, 16, 38, 83, 83, 8, 80, 95, 83, 33, 22, 16, 58, 5, 100, 83, 10, 53, 49, 37, 14, 92, 26. + vs, 85, 29, 88, 74, 8, 86, 49, 80, 14, 46, 77, 35, 33, 83, 69, 4, 99, 2, 22, 82, 92, 69, 50, 60, 34. + vs, 35, 23, 42, 71, 80, 13, 20, 98, 75, 3, 96, 86, 81, 60, 14, 18, 23, 40, 51, 48, 69, 95, 91, 54, 20. + vs, 29, 12, 98, 27, 76, 37, 38, 88, 5, 75, 77, 97, 32, 58, 27, 74, 41, 78, 89, 36, 71, 2, 100, 58, 15. + vs, 26, 1, 81, 45, 57, 62, 58, 65, 49, 10, 61, 7, 65, 91, 75, 27, 98, 98, 5, 78, 69, 16, 8, 58, 11. + vs, 72, 16, 96, 67, 66, 45, 65, 42, 5, 15, 90, 32, 28, 35, 75, 78, 69, 75, 42, 80, 9, 36, 31, 38, 13. + vs, 62, 98, 56, 20, 1, 8, 99, 7, 9, 8, 87, 64, 22, 65, 59, 55, 67, 19, 47, 97, 34, 45, 81, 46, 16. + vs, 91, 17, 4, 55, 91, 58, 52, 41, 25, 45, 54, 68, 29, 15, 3, 47, 89, 21, 46, 22, 20, 69, 80, 51, 31. + vs, 67, 44, 78, 8, 48, 21, 10, 17, 8, 46, 39, 3, 1, 17, 66, 56, 46, 70, 47, 14, 9, 2, 65, 25, 77. + vs, 46, 97, 69, 41, 83, 75, 33, 5, 48, 19, 6, 5, 90, 80, 90, 28, 15, 94, 32, 56, 21, 1, 37, 52, 4. + vs, 96, 61, 32, 39, 56, 19, 19, 99, 65, 97, 64, 44, 22, 35, 74, 71, 53, 81, 63, 71, 81, 49, 58, 57, 72. + vs, 84, 5, 55, 35, 51, 30, 48, 82, 46, 71, 36, 82, 61, 19, 82, 33, 33, 49, 81, 23, 65, 66, 11, 9, 46. + vs, 61, 44, 43, 74, 12, 47, 73, 52, 13, 21, 24, 93, 69, 47, 17, 45, 46, 50, 45, 32, 89, 60, 48, 94, 71. + vs, 47, 5, 38, 14, 45, 79, 67, 77, 86, 15, 49, 35, 15, 66, 85, 61, 8, 97, 72, 38, 14, 89, 24, 74, 59. + vs, 54, 25, 7, 61, 33, 6, 42, 34, 34, 99, 29, 92, 63, 61, 58, 83, 9, 51, 47, 76, 17, 5, 18, 94, 33. + vs, 25, 11, 84, 33, 46, 84, 88, 91, 81, 19, 60, 1, 1, 3, 1, 26, 37, 98, 56, 80, 76, 19, 36, 30, 82. + vs, 86, 39, 31, 79, 34, 92, 7, 15, 6, 45, 6, 56, 18, 54, 81, 28, 52, 52, 75, 42, 96, 51, 64, 44, 40. + vs, 58, 11, 83, 46, 61, 44, 98, 99, 58, 34, 14, 33, 5, 79, 30, 9, 1, 11, 59, 56, 46, 97, 1, 50, 30. + vs, 19, 61, 10, 76, 73, 8, 26, 38, 79, 98, 4, 2, 15, 64, 53, 56, 55, 53, 88, 3, 23, 30, 82, 97, 19. + vs, 36, 5, 73, 5, 12, 10, 29, 15, 63, 66, 4, 19, 28, 5, 90, 72, 67, 27, 36, 4, 64, 58, 35, 86, 66. + vs, 9, 32, 51, 72, 23, 29, 13, 21, 48, 32, 58, 18, 22, 37, 96, 1, 48, 5, 81, 68, 84, 66, 53, 42, 98. + vs, 60, 29, 100, 13, 37, 72, 74, 58, 3, 20, 87, 60, 47, 50, 16, 13, 10, 25, 92, 55, 81, 55, 48, 72, 41. + vs, 50, 30, 24, 82, 16, 73, 75, 55, 31, 92, 63, 9, 9, 84, 68, 2, 61, 82, 21, 96, 92, 51, 44, 2, 69. + vs, 67, 55, 52, 45, 85, 57, 53, 55, 82, 81, 77, 91, 51, 6, 64, 16, 36, 62, 26, 3, 13, 50, 73, 51, 87. + vs, 4, 3, 75, 36, 57, 86, 87, 56, 41, 65, 46, 59, 71, 93, 5, 68, 32, 34, 54, 72, 62, 36, 70, 93, 60. + vs, 83, 10, 41, 32, 98, 16, 66, 16, 14, 12, 58, 61, 96, 90, 38, 28, 51, 62, 32, 55, 29, 37, 27, 99, 51. + vs, 90, 25, 69, 31, 40, 99, 75, 88, 43, 23, 46, 3, 18, 87, 80, 9, 23, 11, 87, 98, 56, 53, 100, 43, 66. + vs, 20, 66, 97, 43, 99, 90, 88, 60, 11, 84, 1, 29, 11, 34, 35, 92, 23, 35, 25, 94, 73, 88, 23, 53, 79. + vs, 65, 85, 77, 22, 72, 48, 98, 16, 99, 82, 11, 22, 57, 79, 14, 52, 52, 93, 65, 57, 8, 4, 66, 70, 84. + vs, 66, 22, 88, 20, 36, 65, 80, 36, 28, 71, 32, 53, 63, 32, 10, 4, 68, 48, 24, 64, 69, 12, 32, 22, 34. + vs, 54, 23, 19, 32, 77, 29, 20, 53, 91, 15, 29, 6, 42, 99, 73, 27, 81, 76, 48, 35, 37, 62, 73, 40, 98. + vs, 6, 32, 64, 90, 35, 12, 31, 39, 89, 18, 26, 60, 89, 69, 61, 88, 29, 91, 40, 22, 92, 29, 90, 75, 60. + vs, 23, 16, 88, 4, 19, 19, 94, 39, 47, 26, 94, 84, 93, 100, 29, 46, 96, 27, 74, 41, 25, 55, 99, 40, 4. + vs, 24, 72, 97, 69, 37, 12, 94, 59, 49, 43, 100, 28, 94, 10, 24, 96, 33, 6, 56, 30, 94, 47, 70, 45, 21. + vs, 36, 35, 91, 71, 57, 30, 28, 98, 64, 15, 61, 84, 18, 13, 75, 83, 90, 58, 63, 19, 51, 84, 41, 22, 68. + vs, 73, 51, 22, 24, 77, 59, 24, 61, 33, 85, 29, 25, 32, 79, 6, 41, 33, 42, 93, 10, 90, 6, 79, 4, 97. + vs, 68, 27, 21, 77, 33, 95, 9, 87, 1, 13, 91, 12, 59, 76, 44, 66, 11, 89, 48, 50, 77, 56, 42, 33, 84. + vs, 10, 57, 1, 75, 29, 85, 44, 62, 37, 71, 97, 62, 85, 42, 93, 34, 46, 99, 64, 71, 67, 62, 87, 4, 4. + vs, 67, 62, 50, 23, 50, 18, 6, 21, 71, 10, 54, 81, 79, 16, 3, 37, 57, 12, 5, 93, 97, 36, 58, 31, 14. + vs, 91, 62, 57, 34, 38, 11, 78, 93, 71, 69, 76, 77, 41, 63, 53, 67, 59, 63, 65, 45, 52, 71, 24, 36, 52. + vs, 23, 80, 62, 58, 74, 62, 85, 4, 100, 90, 52, 20, 62, 100, 84, 84, 96, 43, 25, 63, 39, 93, 24, 60, 73. + vs, 70, 37, 4, 53, 9, 88, 82, 14, 66, 44, 71, 98, 44, 85, 77, 12, 99, 24, 65, 7, 4, 22, 1, 71, 33. + vs, 62, 26, 92, 97, 39, 21, 84, 70, 22, 31, 22, 69, 76, 54, 92, 57, 30, 97, 86, 37, 80, 81, 24, 89, 99. + vs, 48, 28, 73, 39, 30, 77, 47, 94, 13, 7, 59, 9, 59, 24, 12, 74, 67, 29, 46, 5, 97, 72, 89, 11, 79. + vs, 60, 71, 47, 19, 27, 72, 71, 23, 8, 53, 14, 25, 97, 41, 63, 83, 6, 83, 94, 83, 40, 81, 65, 31, 11. + vs, 43, 8, 69, 80, 33, 80, 98, 60, 7, 22, 91, 4, 23, 39, 79, 14, 47, 68, 1, 98, 62, 7, 36, 37, 89. + vs, 78, 45, 41, 96, 14, 24, 83, 17, 32, 34, 44, 36, 81, 25, 43, 95, 58, 58, 83, 25, 52, 90, 100, 80, 61. + vs, 84, 37, 8, 39, 36, 4, 73, 89, 90, 74, 53, 3, 17, 16, 9, 27, 95, 13, 21, 67, 77, 97, 33, 6, 70. + vs, 52, 94, 30, 79, 21, 93, 40, 73, 7, 97, 99, 20, 92, 72, 17, 53, 59, 60, 94, 44, 96, 76, 25, 2, 14. + vs, 4, 38, 26, 17, 78, 87, 16, 32, 80, 19, 35, 84, 69, 16, 13, 49, 75, 43, 55, 50, 97, 43, 87, 86, 92. + vs, 92, 76, 79, 74, 93, 47, 14, 80, 2, 81, 26, 82, 22, 87, 21, 10, 1, 67, 77, 33, 2, 23, 84, 56, 18. + vs, 99, 33, 9, 82, 61, 5, 32, 48, 26, 93, 87, 98, 56, 56, 70, 34, 49, 34, 87, 17, 100, 36, 67, 24, 12. + vs, 30, 64, 71, 35, 14, 42, 45, 78, 93, 59, 2, 49, 23, 22, 86, 73, 40, 45, 82, 71, 20, 7, 28, 15, 10. + vs, 76, 51, 88, 59, 25, 40, 42, 82, 52, 6, 34, 49, 23, 9, 64, 41, 36, 38, 68, 47, 8, 26, 93, 32, 62. + vs, 49, 97, 20, 49, 11, 93, 39, 30, 8, 67, 54, 71, 22, 93, 38, 54, 26, 41, 100, 32, 80, 88, 10, 34, 16. + vs, 35, 81, 80, 75, 68, 14, 3, 94, 92, 37, 91, 98, 37, 83, 40, 35, 58, 51, 6, 76, 73, 69, 81, 81, 92. + vs, 59, 49, 33, 12, 61, 99, 75, 44, 23, 38, 91, 85, 92, 66, 15, 56, 93, 99, 90, 78, 89, 77, 78, 27, 38. + vs, 40, 25, 85, 7, 86, 82, 36, 90, 82, 98, 89, 56, 72, 26, 11, 94, 15, 15, 84, 59, 90, 14, 36, 51, 90. + vs, 82, 34, 63, 35, 58, 6, 75, 93, 54, 16, 90, 16, 56, 82, 95, 88, 29, 94, 57, 16, 48, 35, 90, 74, 55. + vs, 34, 55, 81, 90, 74, 63, 28, 88, 72, 66, 66, 9, 85, 72, 18, 29, 17, 2, 43, 91, 39, 35, 41, 12, 82. + vs, 14, 22, 31, 30, 66, 4, 61, 65, 78, 25, 84, 50, 41, 66, 66, 98, 82, 100, 65, 82, 87, 40, 5, 88, 8. + vs, 27, 4, 30, 5, 39, 61, 33, 60, 2, 13, 55, 32, 85, 71, 53, 82, 23, 66, 36, 5, 41, 26, 31, 2, 28. + vs, 9, 95, 44, 8, 88, 87, 60, 55, 23, 78, 44, 81, 38, 99, 96, 63, 7, 3, 25, 20, 28, 34, 25, 60, 77. + vs, 71, 53, 7, 35, 73, 30, 57, 96, 19, 78, 69, 81, 96, 60, 71, 61, 72, 97, 77, 88, 58, 85, 34, 5, 88. + vs, 82, 91, 75, 76, 41, 21, 66, 75, 39, 21, 28, 39, 36, 43, 53, 45, 42, 43, 2, 91, 17, 61, 50, 17, 73. + vs, 87, 56, 93, 59, 53, 20, 87, 32, 21, 34, 5, 74, 66, 79, 48, 65, 49, 48, 57, 28, 33, 19, 91, 9, 32. + vs, 85, 80, 64, 85, 40, 64, 17, 33, 82, 64, 43, 61, 59, 98, 70, 53, 82, 22, 79, 28, 14, 97, 52, 2, 53. + vs, 50, 6, 61, 24, 35, 9, 6, 76, 27, 32, 88, 98, 95, 31, 13, 9, 5, 7, 34, 76, 28, 73, 10, 72, 21. + vs, 56, 42, 74, 69, 35, 11, 23, 25, 20, 11, 6, 61, 83, 74, 13, 34, 36, 29, 23, 40, 20, 14, 82, 54, 84. + vs, 92, 81, 50, 82, 93, 12, 10, 98, 8, 66, 37, 67, 16, 22, 69, 39, 97, 98, 56, 28, 85, 52, 59, 92, 18. + vs, 48, 20, 55, 60, 32, 21, 99, 34, 74, 8, 86, 34, 54, 36, 33, 24, 65, 93, 30, 58, 38, 43, 55, 11, 55. + vs, 20, 27, 40, 86, 41, 9, 43, 76, 40, 38, 91, 28, 54, 91, 49, 72, 61, 5, 11, 21, 49, 44, 69, 90, 100. + vs, 81, 58, 22, 16, 36, 8, 16, 22, 86, 49, 90, 38, 97, 13, 55, 72, 20, 31, 55, 7, 81, 83, 98, 95, 26. + vs, 5, 100, 78, 98, 78, 31, 37, 46, 91, 28, 90, 65, 60, 14, 69, 64, 62, 53, 17, 54, 25, 37, 48, 76, 67. + vs, 77, 82, 55, 61, 35, 5, 29, 85, 76, 6, 23, 29, 61, 47, 3, 35, 1, 69, 23, 74, 35, 50, 46, 84, 66. + vs, 18, 2, 64, 53, 10, 3, 10, 43, 49, 65, 50, 15, 1, 31, 19, 35, 46, 37, 87, 71, 37, 55, 61, 91, 49. + vs, 88, 14, 48, 93, 51, 97, 2, 1, 98, 27, 32, 4, 79, 85, 32, 59, 87, 58, 28, 62, 88, 100, 97, 98, 48. + vs, 18, 78, 40, 22, 17, 56, 61, 46, 3, 84, 67, 36, 73, 28, 50, 24, 81, 32, 68, 28, 45, 31, 58, 19, 61. + vs, 4, 39, 5, 92, 3, 78, 88, 93, 90, 34, 97, 97, 2, 6, 30, 19, 22, 1, 58, 61, 6, 50, 70, 13, 76. + vs, 18, 49, 38, 83, 61, 32, 20, 56, 60, 65, 92, 66, 67, 6, 36, 32, 89, 55, 38, 38, 44, 17, 15, 68, 69. + vs, 23, 71, 84, 14, 32, 20, 61, 77, 35, 78, 82, 11, 31, 37, 16, 31, 7, 57, 6, 50, 89, 95, 80, 80, 22. + vs, 83, 3, 63, 50, 44, 76, 15, 21, 75, 56, 92, 18, 29, 59, 78, 56, 86, 30, 84, 46, 29, 93, 50, 98, 86. + vs, 39, 4, 6, 52, 18, 16, 14, 83, 38, 83, 26, 47, 74, 70, 31, 82, 56, 96, 93, 81, 86, 14, 36, 99, 95. + vs, 6, 46, 62, 74, 80, 84, 98, 24, 70, 35, 58, 39, 82, 67, 25, 61, 6, 99, 16, 67, 20, 66, 94, 84, 86. + vs, 36, 11, 19, 47, 71, 26, 18, 59, 9, 56, 35, 23, 57, 90, 13, 32, 69, 2, 23, 56, 23, 5, 43, 62, 64. + vs, 69, 38, 58, 85, 97, 53, 9, 52, 67, 46, 53, 35, 32, 97, 82, 5, 23, 58, 12, 7, 75, 91, 56, 65, 99. + vs, 63, 43, 37, 27, 82, 7, 37, 75, 60, 88, 36, 17, 92, 16, 96, 28, 67, 7, 68, 26, 28, 16, 75, 52, 88. + vs, 100, 42, 87, 83, 60, 64, 30, 10, 20, 72, 91, 52, 66, 83, 32, 79, 85, 60, 60, 44, 87, 90, 87, 10, 7. + vs, 95, 81, 55, 71, 62, 52, 56, 21, 18, 58, 63, 66, 35, 81, 97, 39, 56, 43, 79, 4, 20, 20, 78, 26, 89. + vs, 58, 36, 54, 21, 91, 54, 76, 93, 51, 11, 89, 33, 24, 80, 9, 77, 58, 92, 91, 45, 78, 40, 41, 30, 47. + vs, 96, 18, 100, 48, 47, 13, 64, 1, 95, 45, 23, 26, 69, 40, 42, 26, 29, 32, 8, 70, 80, 36, 99, 86, 16. + vs, 12, 76, 83, 50, 99, 70, 48, 18, 12, 43, 42, 37, 62, 63, 80, 75, 80, 92, 10, 10, 30, 90, 47, 81, 97. + vs, 61, 81, 29, 35, 96, 94, 14, 11, 62, 9, 29, 23, 100, 16, 11, 72, 64, 93, 24, 64, 59, 5, 80, 45, 26. + vs, 19, 37, 72, 88, 36, 11, 59, 1, 36, 67, 7, 81, 41, 35, 37, 92, 47, 87, 62, 79, 22, 3, 50, 82, 26. + vs, 4, 30, 73, 41, 52, 9, 15, 54, 63, 37, 8, 1, 70, 46, 94, 92, 35, 85, 91, 17, 54, 32, 97, 59, 43. + vs, 34, 100, 62, 93, 21, 51, 78, 4, 94, 33, 33, 46, 38, 11, 93, 14, 12, 77, 90, 52, 19, 90, 22, 47, 55. + vs, 91, 74, 13, 41, 39, 54, 85, 69, 17, 73, 87, 76, 85, 74, 12, 51, 43, 41, 13, 45, 28, 82, 27, 90, 93. + vs, 2, 73, 69, 15, 30, 43, 93, 10, 73, 38, 3, 72, 21, 2, 30, 23, 43, 3, 11, 92, 22, 8, 54, 36, 22. + vs, 36, 65, 57, 69, 57, 56, 9, 12, 37, 16, 29, 71, 39, 98, 97, 12, 36, 66, 5, 90, 25, 86, 11, 87, 60. + vs, 6, 28, 96, 96, 30, 14, 3, 60, 73, 65, 74, 19, 78, 2, 54, 24, 5, 66, 68, 27, 99, 34, 69, 81, 74. + vs, 91, 5, 8, 42, 75, 32, 13, 20, 25, 20, 30, 93, 86, 56, 24, 97, 51, 61, 4, 9, 25, 41, 57, 67, 52. + vs, 2, 28, 48, 14, 71, 23, 2, 100, 4, 10, 31, 60, 46, 75, 31, 59, 85, 61, 91, 54, 17, 83, 81, 59, 71. + vs, 93, 84, 96, 96, 12, 25, 33, 88, 29, 77, 33, 62, 30, 75, 48, 58, 21, 28, 76, 98, 63, 93, 47, 34, 8. + vs, 49, 48, 73, 22, 74, 69, 69, 30, 12, 4, 16, 51, 54, 95, 95, 7, 8, 83, 55, 10, 34, 100, 46, 73, 82. + vs, 85, 30, 30, 76, 99, 89, 35, 26, 45, 63, 52, 72, 90, 42, 91, 72, 7, 43, 69, 92, 4, 39, 2, 87, 56. + vs, 94, 99, 51, 29, 81, 60, 17, 34, 76, 10, 48, 29, 73, 63, 61, 2, 21, 15, 88, 84, 95, 17, 8, 76, 81. + vs, 37, 25, 70, 16, 97, 46, 4, 86, 61, 72, 16, 56, 54, 75, 24, 58, 29, 36, 82, 3, 74, 34, 12, 77, 20. + vs, 41, 84, 52, 3, 66, 4, 7, 11, 53, 1, 41, 56, 72, 62, 54, 44, 21, 94, 92, 51, 97, 75, 47, 6, 45. + vs, 46, 82, 43, 66, 31, 7, 73, 62, 22, 41, 70, 65, 9, 44, 62, 42, 71, 30, 1, 40, 91, 9, 10, 85, 71. + vs, 35, 92, 16, 7, 76, 17, 85, 43, 13, 35, 28, 37, 10, 21, 50, 28, 91, 56, 29, 3, 100, 69, 14, 5, 44. + vs, 35, 35, 57, 88, 81, 55, 67, 80, 54, 65, 1, 73, 43, 89, 98, 32, 69, 84, 63, 19, 79, 28, 79, 68, 15. + vs, 9, 100, 87, 8, 57, 52, 67, 1, 38, 76, 98, 86, 85, 25, 51, 45, 89, 93, 85, 88, 63, 70, 22, 25, 64. + vs, 40, 39, 29, 63, 81, 43, 2, 33, 26, 81, 76, 86, 94, 52, 65, 27, 73, 88, 91, 75, 1, 79, 8, 93, 44. + vs, 82, 67, 1, 92, 62, 37, 74, 64, 36, 5, 70, 48, 76, 52, 46, 15, 89, 51, 87, 10, 24, 96, 57, 50, 72. + vs, 3, 39, 89, 9, 68, 2, 20, 28, 54, 11, 59, 77, 25, 61, 5, 93, 72, 8, 11, 47, 60, 68, 72, 37, 30. + vs, 22, 8, 29, 88, 10, 70, 7, 95, 14, 77, 92, 87, 18, 34, 26, 35, 89, 79, 74, 66, 29, 94, 92, 40, 49. + vs, 93, 65, 62, 75, 43, 30, 45, 65, 93, 54, 1, 73, 63, 68, 35, 96, 84, 60, 8, 22, 42, 10, 49, 88, 9. + vs, 70, 29, 21, 47, 15, 42, 96, 23, 50, 52, 60, 75, 79, 76, 85, 67, 15, 31, 8, 5, 38, 92, 8, 50, 81. + vs, 93, 9, 67, 67, 57, 37, 85, 78, 31, 81, 79, 96, 50, 70, 88, 94, 40, 20, 30, 49, 48, 64, 78, 3, 86. + vs, 35, 89, 88, 31, 100, 32, 57, 2, 21, 86, 89, 47, 99, 46, 13, 38, 49, 55, 45, 6, 43, 66, 5, 32, 83. + vs, 51, 38, 31, 30, 51, 83, 83, 51, 2, 13, 23, 3, 13, 46, 69, 71, 4, 46, 39, 21, 32, 23, 25, 24, 1. + vs, 55, 56, 7, 46, 66, 20, 73, 49, 54, 30, 65, 47, 18, 98, 16, 84, 8, 44, 2, 9, 35, 85, 99, 7, 16. + vs, 80, 12, 74, 36, 24, 97, 25, 60, 37, 72, 34, 91, 33, 22, 89, 96, 9, 36, 37, 51, 45, 9, 78, 51, 62. + + ^ self knapsack: 501 weights: ws values: vs + ) + + verifyResult: result = ( + ^ self assert: 11991 equals: result + ) + + knapsack: goal weights: w values: v = ( + | m | + ((w size <= 0) || (goal <= 0)) ifTrue: [ ^ 0 ]. + + m := Vector new. + 1 to: 1 + w size do: [ :i | + m, Vector new. + 1 to: 1 + goal do: [ :j | + (m at: i), 0 ] ]. + + 1 to: w size do: [ :i | + 1 to: goal do: [ :j | + (w at: i) > j + ifTrue: [ (m at: i + 1) at: j + 1 put: ((m at: i) at: j + 1) ] + ifFalse: [ (m at: i + 1) at: j + 1 put: (((m at: i) at: j + 1) max: (((m at: i) at: j + 1 - (w at: i)) + (v at: i))) ] + ] + ]. + + ^ (m at: w size) last + ) +) diff --git a/TestSuite/VectorTest.som b/TestSuite/VectorTest.som index 39ea11f9..750f6564 100644 --- a/TestSuite/VectorTest.som +++ b/TestSuite/VectorTest.som @@ -413,4 +413,17 @@ VectorTest = TestCase ( v doIndexes: [:i | self assert: i equals: ((v at: i)-2)] ) + + "Check that asArray copies and does not overwrite" + testAsArray = ( + | vec arr | + vec := Vector new. + vec append: 1. + vec append: 2. + + arr := vec asArray. + arr at: 1 put: 44. + + self assert: (vec at: 1) equals: 1. + ) ) From 712ae99e7b3698743508aa306102cb189d84c73b Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Thu, 26 Jun 2025 18:03:10 +0100 Subject: [PATCH 4/7] Move test up and give it distinct name Signed-off-by: Stefan Marr --- TestSuite/VectorTest.som | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/TestSuite/VectorTest.som b/TestSuite/VectorTest.som index 750f6564..9b638026 100644 --- a/TestSuite/VectorTest.som +++ b/TestSuite/VectorTest.som @@ -251,7 +251,20 @@ VectorTest = TestCase ( self assert: 2 equals: (arr at: 1). self assert: 5 equals: (arr at: 2). ) - + + "Check that asArray copies storage and a later access does not overwrite the vec's content" + testAsArrayEnsureItCopiesStorageArray = ( + | vec arr | + vec := Vector new. + vec append: 1. + vec append: 2. + + arr := vec asArray. + arr at: 1 put: 44. + + self assert: (vec at: 1) equals: 1. + ) + testAsSet = ( | v set | v := Vector new. @@ -413,17 +426,4 @@ VectorTest = TestCase ( v doIndexes: [:i | self assert: i equals: ((v at: i)-2)] ) - - "Check that asArray copies and does not overwrite" - testAsArray = ( - | vec arr | - vec := Vector new. - vec append: 1. - vec append: 2. - - arr := vec asArray. - arr at: 1 put: 44. - - self assert: (vec at: 1) equals: 1. - ) ) From 475122257f26004a57e8b8cfaa31ec8cdb41312a Mon Sep 17 00:00:00 2001 From: Rhys Walker Date: Wed, 2 Jul 2025 15:30:51 +0100 Subject: [PATCH 5/7] Reduce hard-coding in Knapsack and make it work on more restricted SOMs --- Examples/Benchmarks/Knapsack.som | 431 ++++++++++++++++--------------- 1 file changed, 228 insertions(+), 203 deletions(-) diff --git a/Examples/Benchmarks/Knapsack.som b/Examples/Benchmarks/Knapsack.som index f20f57ca..2d925923 100644 --- a/Examples/Benchmarks/Knapsack.som +++ b/Examples/Benchmarks/Knapsack.som @@ -5,207 +5,137 @@ Knapsack = Benchmark ( ws := Vector new. vs := Vector new. - ws, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1. - ws, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1. - ws, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. - ws, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2. - ws, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3. - ws, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3. - ws, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4. - ws, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4. - ws, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5. - ws, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5. - ws, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6. - ws, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6. - ws, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7. - ws, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8. - ws, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8. - ws, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9. - ws, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9. - ws, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10. - ws, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10. - ws, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11. - ws, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11. - ws, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12. - ws, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12. - ws, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13. - ws, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13. - ws, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14. - ws, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14. - ws, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14. - ws, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15. - ws, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15. - ws, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16. - ws, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16. - ws, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17. - ws, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17. - ws, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18. - ws, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18. - ws, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19. - ws, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19. - ws, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20. - ws, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21. - ws, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21. - ws, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21. - ws, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22. - ws, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22. - ws, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23. - ws, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23. - ws, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24. - ws, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24. - ws, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24. - ws, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25. - ws, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26. - ws, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26. - ws, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27. - ws, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27. - ws, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27. - ws, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28. - ws, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28. - ws, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29. - ws, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29. - ws, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30. - ws, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30. - ws, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31. - ws, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31. - ws, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32. - ws, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32. - ws, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33. - ws, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33. - ws, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34. - ws, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34. - ws, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35. - ws, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35. - ws, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36. - ws, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36. - ws, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37. - ws, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37. - ws, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38. - ws, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38. - ws, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39. - ws, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39. - ws, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40. - ws, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40. - ws, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41. - ws, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41. - ws, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42. - ws, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42. - ws, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43. - ws, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43. - ws, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44. - ws, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45. - ws, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45. - ws, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45. - ws, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46. - ws, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46. - ws, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47. - ws, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47. - ws, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48. - ws, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49. - ws, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49. - ws, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49. - ws, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50. - ws, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50. - ws, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51. - ws, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51. - ws, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52. - ws, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52. - ws, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53. - ws, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53. - ws, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54. - ws, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55. - ws, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55. - ws, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56. - ws, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56. - ws, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57. - ws, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57. - ws, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58. - ws, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58. - ws, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59. - ws, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59. - ws, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60. - ws, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60. - ws, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60. - ws, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61. - ws, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61. - ws, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62. - ws, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63. - ws, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63. - ws, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64. - ws, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64. - ws, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65. - ws, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65. - ws, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66. - ws, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67. - ws, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67. - ws, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67. - ws, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68. - ws, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68. - ws, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69. - ws, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69. - ws, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70. - ws, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70. - ws, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71. - ws, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71. - ws, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72. - ws, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72. - ws, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73. - ws, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73. - ws, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74. - ws, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74. - ws, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75. - ws, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75. - ws, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76. - ws, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76. - ws, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77. - ws, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77. - ws, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77. - ws, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78. - ws, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79. - ws, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79. - ws, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80. - ws, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80. - ws, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81. - ws, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81. - ws, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82. - ws, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82. - ws, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83. - ws, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83. - ws, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84. - ws, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84. - ws, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85. - ws, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85. - ws, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85. - ws, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86. - ws, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87. - ws, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87. - ws, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88. - ws, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88. - ws, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89. - ws, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89. - ws, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90. - ws, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90. - ws, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91. - ws, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91. - ws, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92. - ws, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92. - ws, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93. - ws, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93. - ws, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94. - ws, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94. - ws, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95. - ws, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95. - ws, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96. - ws, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96. - ws, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97. - ws, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98. - ws, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98. - ws, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99. - ws, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99. - ws, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99. - ws, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100. - ws, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100. + 1 to: 64 do: [:i | ws, 1]. + 1 to: 52 do: [:i | ws, 2]. + 1 to: 36 do: [:i | ws, 3]. + 1 to: 52 do: [:i | ws, 4]. + 1 to: 49 do: [:i | ws, 5]. + 1 to: 45 do: [:i | ws, 6]. + 1 to: 47 do: [:i | ws, 7]. + 1 to: 41 do: [:i | ws, 8]. + 1 to: 46 do: [:i | ws, 9]. + 1 to: 48 do: [:i | ws, 10]. + 1 to: 45 do: [:i | ws, 11]. + 1 to: 63 do: [:i | ws, 12]. + 1 to: 57 do: [:i | ws, 13]. + 1 to: 57 do: [:i | ws, 14]. + 1 to: 47 do: [:i | ws, 15]. + 1 to: 58 do: [:i | ws, 16]. + 1 to: 47 do: [:i | ws, 17]. + 1 to: 51 do: [:i | ws, 18]. + 1 to: 44 do: [:i | ws, 19]. + 1 to: 45 do: [:i | ws, 20]. + 1 to: 60 do: [:i | ws, 21]. + 1 to: 46 do: [:i | ws, 22]. + 1 to: 63 do: [:i | ws, 23]. + 1 to: 60 do: [:i | ws, 24]. + 1 to: 39 do: [:i | ws, 25]. + 1 to: 53 do: [:i | ws, 26]. + 1 to: 66 do: [:i | ws, 27]. + 1 to: 49 do: [:i | ws, 28]. + 1 to: 48 do: [:i | ws, 29]. + 1 to: 59 do: [:i | ws, 30]. + 1 to: 46 do: [:i | ws, 31]. + 1 to: 54 do: [:i | ws, 32]. + 1 to: 42 do: [:i | ws, 33]. + 1 to: 49 do: [:i | ws, 34]. + 1 to: 51 do: [:i | ws, 35]. + 1 to: 54 do: [:i | ws, 36]. + 1 to: 50 do: [:i | ws, 37]. + 1 to: 63 do: [:i | ws, 38]. + 1 to: 49 do: [:i | ws, 39]. + 1 to: 38 do: [:i | ws, 40]. + 1 to: 49 do: [:i | ws, 41]. + 1 to: 42 do: [:i | ws, 42]. + 1 to: 53 do: [:i | ws, 43]. + 1 to: 43 do: [:i | ws, 44]. + 1 to: 57 do: [:i | ws, 45]. + 1 to: 55 do: [:i | ws, 46]. + 1 to: 48 do: [:i | ws, 47]. + 1 to: 41 do: [:i | ws, 48]. + 1 to: 57 do: [:i | ws, 49]. + 1 to: 55 do: [:i | ws, 50]. + 1 to: 48 do: [:i | ws, 51]. + 1 to: 45 do: [:i | ws, 52]. + 1 to: 50 do: [:i | ws, 53]. + 1 to: 41 do: [:i | ws, 54]. + 1 to: 44 do: [:i | ws, 55]. + 1 to: 48 do: [:i | ws, 56]. + 1 to: 43 do: [:i | ws, 57]. + 1 to: 60 do: [:i | ws, 58]. + 1 to: 52 do: [:i | ws, 59]. + 1 to: 65 do: [:i | ws, 60]. + 1 to: 47 do: [:i | ws, 61]. + 1 to: 46 do: [:i | ws, 62]. + 1 to: 41 do: [:i | ws, 63]. + 1 to: 45 do: [:i | ws, 64]. + 1 to: 46 do: [:i | ws, 65]. + 1 to: 41 do: [:i | ws, 66]. + 1 to: 53 do: [:i | ws, 67]. + 1 to: 56 do: [:i | ws, 68]. + 1 to: 49 do: [:i | ws, 69]. + 1 to: 51 do: [:i | ws, 70]. + 1 to: 45 do: [:i | ws, 71]. + 1 to: 57 do: [:i | ws, 72]. + 1 to: 46 do: [:i | ws, 73]. + 1 to: 59 do: [:i | ws, 74]. + 1 to: 47 do: [:i | ws, 75]. + 1 to: 59 do: [:i | ws, 76]. + 1 to: 64 do: [:i | ws, 77]. + 1 to: 39 do: [:i | ws, 78]. + 1 to: 42 do: [:i | ws, 79]. + 1 to: 37 do: [:i | ws, 80]. + 1 to: 59 do: [:i | ws, 81]. + 1 to: 47 do: [:i | ws, 82]. + 1 to: 52 do: [:i | ws, 83]. + 1 to: 61 do: [:i | ws, 84]. + 1 to: 56 do: [:i | ws, 85]. + 1 to: 47 do: [:i | ws, 86]. + 1 to: 32 do: [:i | ws, 87]. + 1 to: 55 do: [:i | ws, 88]. + 1 to: 53 do: [:i | ws, 89]. + 1 to: 53 do: [:i | ws, 90]. + 1 to: 51 do: [:i | ws, 91]. + 1 to: 50 do: [:i | ws, 92]. + 1 to: 44 do: [:i | ws, 93]. + 1 to: 57 do: [:i | ws, 94]. + 1 to: 40 do: [:i | ws, 95]. + 1 to: 47 do: [:i | ws, 96]. + 1 to: 44 do: [:i | ws, 97]. + 1 to: 50 do: [:i | ws, 98]. + 1 to: 59 do: [:i | ws, 99]. + 1 to: 41 do: [:i | ws, 100]. + self addN1: vs. + self addN2: vs. + self addN3: vs. + self addN4: vs. + self addN5: vs. + self addN6: vs. + self addN7: vs. + self addN8: vs. + self addN9: vs. + self addN10: vs. + self addN11: vs. + self addN12: vs. + self addN13: vs. + self addN14: vs. + self addN15: vs. + self addN16: vs. + self addN17: vs. + self addN18: vs. + self addN19: vs. + self addN20: vs. + self addN21: vs. + self addN22: vs. + self addN23: vs. + self addN24: vs. + self addN25: vs. + + ^ self knapsack: 501 weights: ws values: vs + ) + + addN1: vs = ( vs, 69, 58, 44, 85, 34, 76, 58, 23, 58, 21, 61, 83, 21, 92, 12, 33, 67, 8, 14, 28, 57, 47, 6, 72, 59. vs, 3, 70, 49, 52, 52, 63, 35, 52, 72, 5, 84, 89, 55, 51, 85, 24, 80, 91, 92, 60, 25, 30, 90, 36, 8. vs, 93, 41, 54, 48, 96, 72, 91, 42, 38, 47, 48, 39, 69, 84, 20, 71, 39, 95, 59, 31, 86, 20, 68, 51, 20. @@ -214,6 +144,10 @@ Knapsack = Benchmark ( vs, 79, 99, 69, 32, 3, 32, 28, 8, 44, 64, 68, 31, 57, 24, 63, 61, 13, 7, 88, 78, 43, 18, 25, 67, 65. vs, 4, 90, 30, 6, 58, 19, 86, 6, 82, 46, 42, 69, 47, 26, 30, 51, 56, 20, 72, 39, 19, 68, 99, 17, 79. vs, 15, 68, 53, 96, 76, 49, 35, 57, 61, 93, 63, 67, 2, 16, 7, 89, 57, 59, 16, 96, 21, 70, 17, 18, 83. + ^vs + ) + + addN2: vs = ( vs, 89, 27, 40, 31, 69, 56, 64, 57, 91, 7, 99, 40, 50, 26, 41, 56, 27, 79, 67, 70, 13, 12, 33, 55, 65. vs, 98, 32, 96, 63, 70, 89, 15, 81, 17, 60, 97, 42, 5, 76, 38, 35, 90, 7, 57, 47, 12, 42, 17, 49, 6. vs, 61, 88, 82, 66, 73, 18, 37, 51, 91, 100, 37, 80, 100, 74, 44, 79, 82, 95, 48, 72, 39, 94, 88, 20, 10. @@ -222,6 +156,10 @@ Knapsack = Benchmark ( vs, 59, 95, 100, 42, 45, 64, 46, 76, 2, 38, 82, 59, 98, 84, 41, 59, 46, 2, 82, 91, 56, 92, 84, 11, 88. vs, 29, 67, 15, 60, 29, 92, 68, 84, 88, 63, 22, 47, 71, 56, 31, 44, 100, 32, 18, 38, 48, 6, 43, 78, 12. vs, 20, 66, 66, 3, 75, 94, 58, 93, 30, 2, 97, 41, 97, 84, 23, 68, 60, 88, 1, 55, 67, 97, 23, 93, 11. + ^vs + ) + + addN3: vs = ( vs, 82, 22, 55, 34, 27, 48, 21, 73, 93, 69, 88, 9, 76, 91, 44, 80, 27, 77, 42, 37, 72, 2, 31, 84, 46. vs, 10, 9, 21, 81, 79, 86, 30, 69, 38, 2, 32, 52, 19, 8, 45, 17, 27, 58, 70, 17, 71, 64, 85, 20, 43. vs, 42, 49, 47, 69, 27, 77, 93, 77, 8, 49, 68, 81, 98, 30, 65, 97, 33, 92, 5, 48, 77, 75, 35, 15, 22. @@ -230,6 +168,10 @@ Knapsack = Benchmark ( vs, 68, 77, 51, 18, 13, 40, 55, 6, 21, 22, 70, 29, 69, 57, 59, 73, 11, 16, 56, 27, 87, 75, 82, 40, 61. vs, 77, 12, 44, 7, 49, 73, 79, 66, 13, 65, 74, 83, 86, 19, 73, 20, 69, 91, 45, 99, 61, 5, 86, 73, 6. vs, 93, 42, 36, 71, 1, 51, 96, 26, 59, 56, 100, 5, 81, 92, 77, 95, 60, 73, 82, 52, 30, 45, 35, 11, 85. + ^vs + ) + + addN4: vs = ( vs, 81, 23, 81, 16, 47, 91, 28, 47, 64, 19, 15, 8, 38, 71, 34, 98, 78, 72, 28, 26, 83, 38, 96, 47, 6. vs, 59, 26, 96, 98, 26, 56, 47, 54, 100, 39, 97, 98, 58, 96, 22, 19, 10, 43, 12, 38, 61, 49, 43, 19, 65. vs, 48, 20, 90, 24, 66, 38, 93, 2, 8, 48, 71, 73, 46, 1, 75, 3, 54, 20, 29, 12, 92, 11, 40, 17, 42. @@ -238,6 +180,10 @@ Knapsack = Benchmark ( vs, 89, 100, 20, 97, 55, 93, 18, 72, 89, 73, 42, 90, 19, 76, 5, 8, 60, 8, 47, 66, 94, 88, 19, 70, 52. vs, 34, 53, 24, 20, 46, 92, 100, 38, 65, 53, 12, 36, 71, 22, 5, 65, 86, 9, 22, 52, 37, 81, 88, 8, 5. vs, 58, 49, 46, 30, 68, 92, 77, 27, 87, 57, 83, 55, 31, 69, 20, 25, 60, 19, 71, 20, 46, 33, 39, 79, 97. + ^vs + ) + + addN5: vs = ( vs, 58, 96, 6, 29, 64, 34, 78, 59, 81, 81, 81, 89, 34, 76, 83, 62, 25, 15, 66, 64, 44, 13, 66, 21, 34. vs, 88, 87, 9, 99, 21, 52, 29, 9, 57, 3, 75, 78, 73, 47, 40, 64, 34, 83, 39, 81, 26, 12, 61, 79, 72. vs, 22, 61, 30, 45, 87, 60, 42, 60, 5, 73, 74, 24, 28, 18, 95, 89, 57, 69, 88, 56, 97, 68, 6, 34, 42. @@ -246,6 +192,10 @@ Knapsack = Benchmark ( vs, 83, 4, 38, 56, 2, 69, 73, 57, 53, 19, 82, 26, 52, 91, 27, 7, 26, 57, 75, 68, 9, 14, 99, 94, 94. vs, 21, 29, 16, 43, 30, 18, 7, 29, 19, 4, 12, 58, 87, 77, 62, 59, 37, 5, 25, 42, 93, 15, 89, 31, 61. vs, 72, 97, 56, 62, 24, 59, 34, 26, 32, 75, 86, 72, 68, 45, 15, 55, 1, 41, 66, 16, 49, 47, 81, 2, 61. + ^vs + ) + + addN6: vs = ( vs, 25, 4, 71, 47, 80, 25, 3, 74, 97, 14, 8, 93, 94, 3, 29, 19, 17, 34, 44, 74, 44, 49, 74, 78, 39. vs, 57, 18, 83, 71, 16, 7, 13, 100, 20, 68, 40, 61, 28, 50, 48, 57, 94, 98, 2, 58, 57, 83, 98, 77, 92. vs, 32, 2, 41, 28, 13, 57, 2, 51, 52, 79, 71, 92, 84, 76, 54, 14, 11, 22, 26, 69, 22, 60, 97, 24, 83. @@ -254,6 +204,10 @@ Knapsack = Benchmark ( vs, 3, 61, 98, 61, 15, 19, 12, 53, 73, 74, 31, 64, 52, 82, 19, 87, 13, 59, 82, 17, 95, 96, 25, 48, 25. vs, 3, 26, 58, 34, 82, 54, 50, 95, 90, 68, 60, 87, 75, 20, 4, 85, 1, 23, 83, 19, 41, 68, 49, 13, 60. vs, 95, 5, 97, 32, 59, 99, 75, 90, 24, 69, 53, 61, 32, 15, 58, 40, 30, 80, 93, 78, 93, 93, 33, 68, 35. + ^vs + ) + + addN7: vs = ( vs, 81, 49, 59, 82, 24, 48, 72, 75, 62, 30, 6, 49, 10, 20, 61, 3, 41, 18, 27, 82, 86, 59, 5, 77, 35. vs, 87, 41, 74, 4, 21, 5, 28, 67, 96, 86, 55, 95, 49, 66, 21, 28, 3, 42, 54, 71, 80, 17, 11, 13, 76. vs, 90, 35, 31, 15, 58, 70, 87, 31, 95, 54, 15, 89, 24, 33, 32, 4, 15, 63, 83, 96, 20, 51, 88, 85, 13. @@ -262,6 +216,10 @@ Knapsack = Benchmark ( vs, 37, 30, 23, 89, 31, 88, 46, 54, 67, 84, 60, 69, 33, 32, 53, 74, 77, 33, 80, 96, 95, 53, 27, 33, 26. vs, 11, 10, 51, 98, 20, 8, 56, 13, 17, 15, 32, 53, 16, 36, 91, 59, 47, 10, 33, 28, 53, 82, 93, 10, 10. vs, 80, 85, 99, 43, 32, 2, 13, 30, 86, 98, 74, 14, 50, 8, 56, 77, 33, 25, 15, 51, 38, 51, 36, 17, 27. + ^vs + ) + + addN8: vs = ( vs, 56, 16, 6, 39, 3, 75, 32, 11, 91, 55, 86, 74, 16, 37, 16, 42, 86, 8, 54, 63, 58, 5, 36, 28, 14. vs, 40, 62, 15, 20, 16, 31, 13, 15, 1, 54, 28, 58, 29, 79, 17, 2, 59, 41, 88, 74, 19, 74, 67, 42, 98. vs, 79, 11, 91, 48, 3, 88, 17, 72, 56, 61, 21, 22, 76, 66, 17, 53, 14, 100, 75, 11, 35, 51, 51, 56, 23. @@ -270,6 +228,10 @@ Knapsack = Benchmark ( vs, 91, 30, 15, 72, 55, 89, 14, 93, 4, 4, 48, 92, 8, 25, 99, 71, 51, 28, 66, 51, 94, 50, 28, 93, 14. vs, 55, 49, 71, 89, 21, 31, 16, 2, 52, 58, 38, 78, 45, 61, 50, 28, 95, 68, 42, 84, 63, 61, 28, 84, 20. vs, 69, 8, 34, 26, 73, 95, 6, 89, 8, 63, 55, 90, 44, 33, 90, 8, 33, 18, 81, 96, 34, 22, 76, 98, 72. + ^vs + ) + + addN9: vs = ( vs, 95, 51, 42, 66, 82, 81, 53, 89, 71, 55, 61, 47, 53, 7, 54, 84, 52, 100, 98, 19, 53, 40, 11, 12, 7. vs, 1, 61, 58, 33, 27, 57, 19, 52, 71, 39, 70, 13, 1, 26, 6, 70, 47, 11, 61, 40, 50, 4, 7, 38, 60. vs, 10, 95, 7, 52, 33, 32, 15, 91, 28, 98, 90, 94, 52, 1, 61, 62, 68, 78, 45, 14, 39, 3, 3, 86, 88. @@ -278,6 +240,10 @@ Knapsack = Benchmark ( vs, 15, 84, 57, 16, 63, 95, 11, 65, 27, 67, 75, 4, 24, 49, 40, 40, 11, 48, 54, 76, 71, 28, 24, 76, 3. vs, 15, 35, 4, 94, 72, 17, 4, 48, 12, 71, 11, 96, 44, 86, 13, 57, 48, 57, 33, 75, 68, 23, 12, 19, 98. vs, 61, 50, 35, 18, 12, 38, 33, 31, 86, 5, 79, 39, 70, 64, 50, 24, 63, 4, 33, 83, 95, 80, 37, 90, 40. + ^vs + ) + + addN10: vs = ( vs, 69, 50, 37, 56, 72, 61, 30, 11, 73, 79, 76, 57, 19, 6, 64, 28, 32, 57, 59, 31, 56, 93, 65, 55, 66. vs, 84, 68, 72, 40, 37, 96, 37, 80, 80, 58, 72, 50, 79, 47, 6, 65, 73, 25, 79, 100, 84, 84, 26, 75, 85. vs, 91, 95, 96, 3, 98, 38, 1, 5, 21, 61, 50, 46, 86, 39, 9, 87, 40, 17, 75, 74, 78, 46, 26, 60, 63. @@ -286,6 +252,10 @@ Knapsack = Benchmark ( vs, 12, 33, 47, 16, 38, 83, 83, 8, 80, 95, 83, 33, 22, 16, 58, 5, 100, 83, 10, 53, 49, 37, 14, 92, 26. vs, 85, 29, 88, 74, 8, 86, 49, 80, 14, 46, 77, 35, 33, 83, 69, 4, 99, 2, 22, 82, 92, 69, 50, 60, 34. vs, 35, 23, 42, 71, 80, 13, 20, 98, 75, 3, 96, 86, 81, 60, 14, 18, 23, 40, 51, 48, 69, 95, 91, 54, 20. + ^vs + ) + + addN11: vs = ( vs, 29, 12, 98, 27, 76, 37, 38, 88, 5, 75, 77, 97, 32, 58, 27, 74, 41, 78, 89, 36, 71, 2, 100, 58, 15. vs, 26, 1, 81, 45, 57, 62, 58, 65, 49, 10, 61, 7, 65, 91, 75, 27, 98, 98, 5, 78, 69, 16, 8, 58, 11. vs, 72, 16, 96, 67, 66, 45, 65, 42, 5, 15, 90, 32, 28, 35, 75, 78, 69, 75, 42, 80, 9, 36, 31, 38, 13. @@ -294,6 +264,10 @@ Knapsack = Benchmark ( vs, 67, 44, 78, 8, 48, 21, 10, 17, 8, 46, 39, 3, 1, 17, 66, 56, 46, 70, 47, 14, 9, 2, 65, 25, 77. vs, 46, 97, 69, 41, 83, 75, 33, 5, 48, 19, 6, 5, 90, 80, 90, 28, 15, 94, 32, 56, 21, 1, 37, 52, 4. vs, 96, 61, 32, 39, 56, 19, 19, 99, 65, 97, 64, 44, 22, 35, 74, 71, 53, 81, 63, 71, 81, 49, 58, 57, 72. + ^vs + ) + + addN12: vs = ( vs, 84, 5, 55, 35, 51, 30, 48, 82, 46, 71, 36, 82, 61, 19, 82, 33, 33, 49, 81, 23, 65, 66, 11, 9, 46. vs, 61, 44, 43, 74, 12, 47, 73, 52, 13, 21, 24, 93, 69, 47, 17, 45, 46, 50, 45, 32, 89, 60, 48, 94, 71. vs, 47, 5, 38, 14, 45, 79, 67, 77, 86, 15, 49, 35, 15, 66, 85, 61, 8, 97, 72, 38, 14, 89, 24, 74, 59. @@ -302,6 +276,10 @@ Knapsack = Benchmark ( vs, 86, 39, 31, 79, 34, 92, 7, 15, 6, 45, 6, 56, 18, 54, 81, 28, 52, 52, 75, 42, 96, 51, 64, 44, 40. vs, 58, 11, 83, 46, 61, 44, 98, 99, 58, 34, 14, 33, 5, 79, 30, 9, 1, 11, 59, 56, 46, 97, 1, 50, 30. vs, 19, 61, 10, 76, 73, 8, 26, 38, 79, 98, 4, 2, 15, 64, 53, 56, 55, 53, 88, 3, 23, 30, 82, 97, 19. + ^vs + ) + + addN13: vs = ( vs, 36, 5, 73, 5, 12, 10, 29, 15, 63, 66, 4, 19, 28, 5, 90, 72, 67, 27, 36, 4, 64, 58, 35, 86, 66. vs, 9, 32, 51, 72, 23, 29, 13, 21, 48, 32, 58, 18, 22, 37, 96, 1, 48, 5, 81, 68, 84, 66, 53, 42, 98. vs, 60, 29, 100, 13, 37, 72, 74, 58, 3, 20, 87, 60, 47, 50, 16, 13, 10, 25, 92, 55, 81, 55, 48, 72, 41. @@ -310,6 +288,10 @@ Knapsack = Benchmark ( vs, 4, 3, 75, 36, 57, 86, 87, 56, 41, 65, 46, 59, 71, 93, 5, 68, 32, 34, 54, 72, 62, 36, 70, 93, 60. vs, 83, 10, 41, 32, 98, 16, 66, 16, 14, 12, 58, 61, 96, 90, 38, 28, 51, 62, 32, 55, 29, 37, 27, 99, 51. vs, 90, 25, 69, 31, 40, 99, 75, 88, 43, 23, 46, 3, 18, 87, 80, 9, 23, 11, 87, 98, 56, 53, 100, 43, 66. + ^vs + ) + + addN14: vs = ( vs, 20, 66, 97, 43, 99, 90, 88, 60, 11, 84, 1, 29, 11, 34, 35, 92, 23, 35, 25, 94, 73, 88, 23, 53, 79. vs, 65, 85, 77, 22, 72, 48, 98, 16, 99, 82, 11, 22, 57, 79, 14, 52, 52, 93, 65, 57, 8, 4, 66, 70, 84. vs, 66, 22, 88, 20, 36, 65, 80, 36, 28, 71, 32, 53, 63, 32, 10, 4, 68, 48, 24, 64, 69, 12, 32, 22, 34. @@ -318,6 +300,10 @@ Knapsack = Benchmark ( vs, 23, 16, 88, 4, 19, 19, 94, 39, 47, 26, 94, 84, 93, 100, 29, 46, 96, 27, 74, 41, 25, 55, 99, 40, 4. vs, 24, 72, 97, 69, 37, 12, 94, 59, 49, 43, 100, 28, 94, 10, 24, 96, 33, 6, 56, 30, 94, 47, 70, 45, 21. vs, 36, 35, 91, 71, 57, 30, 28, 98, 64, 15, 61, 84, 18, 13, 75, 83, 90, 58, 63, 19, 51, 84, 41, 22, 68. + ^vs + ) + + addN15: vs = ( vs, 73, 51, 22, 24, 77, 59, 24, 61, 33, 85, 29, 25, 32, 79, 6, 41, 33, 42, 93, 10, 90, 6, 79, 4, 97. vs, 68, 27, 21, 77, 33, 95, 9, 87, 1, 13, 91, 12, 59, 76, 44, 66, 11, 89, 48, 50, 77, 56, 42, 33, 84. vs, 10, 57, 1, 75, 29, 85, 44, 62, 37, 71, 97, 62, 85, 42, 93, 34, 46, 99, 64, 71, 67, 62, 87, 4, 4. @@ -326,6 +312,10 @@ Knapsack = Benchmark ( vs, 23, 80, 62, 58, 74, 62, 85, 4, 100, 90, 52, 20, 62, 100, 84, 84, 96, 43, 25, 63, 39, 93, 24, 60, 73. vs, 70, 37, 4, 53, 9, 88, 82, 14, 66, 44, 71, 98, 44, 85, 77, 12, 99, 24, 65, 7, 4, 22, 1, 71, 33. vs, 62, 26, 92, 97, 39, 21, 84, 70, 22, 31, 22, 69, 76, 54, 92, 57, 30, 97, 86, 37, 80, 81, 24, 89, 99. + ^vs + ) + + addN16: vs = ( vs, 48, 28, 73, 39, 30, 77, 47, 94, 13, 7, 59, 9, 59, 24, 12, 74, 67, 29, 46, 5, 97, 72, 89, 11, 79. vs, 60, 71, 47, 19, 27, 72, 71, 23, 8, 53, 14, 25, 97, 41, 63, 83, 6, 83, 94, 83, 40, 81, 65, 31, 11. vs, 43, 8, 69, 80, 33, 80, 98, 60, 7, 22, 91, 4, 23, 39, 79, 14, 47, 68, 1, 98, 62, 7, 36, 37, 89. @@ -334,6 +324,10 @@ Knapsack = Benchmark ( vs, 52, 94, 30, 79, 21, 93, 40, 73, 7, 97, 99, 20, 92, 72, 17, 53, 59, 60, 94, 44, 96, 76, 25, 2, 14. vs, 4, 38, 26, 17, 78, 87, 16, 32, 80, 19, 35, 84, 69, 16, 13, 49, 75, 43, 55, 50, 97, 43, 87, 86, 92. vs, 92, 76, 79, 74, 93, 47, 14, 80, 2, 81, 26, 82, 22, 87, 21, 10, 1, 67, 77, 33, 2, 23, 84, 56, 18. + ^vs + ) + + addN17: vs = ( vs, 99, 33, 9, 82, 61, 5, 32, 48, 26, 93, 87, 98, 56, 56, 70, 34, 49, 34, 87, 17, 100, 36, 67, 24, 12. vs, 30, 64, 71, 35, 14, 42, 45, 78, 93, 59, 2, 49, 23, 22, 86, 73, 40, 45, 82, 71, 20, 7, 28, 15, 10. vs, 76, 51, 88, 59, 25, 40, 42, 82, 52, 6, 34, 49, 23, 9, 64, 41, 36, 38, 68, 47, 8, 26, 93, 32, 62. @@ -342,6 +336,10 @@ Knapsack = Benchmark ( vs, 59, 49, 33, 12, 61, 99, 75, 44, 23, 38, 91, 85, 92, 66, 15, 56, 93, 99, 90, 78, 89, 77, 78, 27, 38. vs, 40, 25, 85, 7, 86, 82, 36, 90, 82, 98, 89, 56, 72, 26, 11, 94, 15, 15, 84, 59, 90, 14, 36, 51, 90. vs, 82, 34, 63, 35, 58, 6, 75, 93, 54, 16, 90, 16, 56, 82, 95, 88, 29, 94, 57, 16, 48, 35, 90, 74, 55. + ^vs + ) + + addN18: vs = ( vs, 34, 55, 81, 90, 74, 63, 28, 88, 72, 66, 66, 9, 85, 72, 18, 29, 17, 2, 43, 91, 39, 35, 41, 12, 82. vs, 14, 22, 31, 30, 66, 4, 61, 65, 78, 25, 84, 50, 41, 66, 66, 98, 82, 100, 65, 82, 87, 40, 5, 88, 8. vs, 27, 4, 30, 5, 39, 61, 33, 60, 2, 13, 55, 32, 85, 71, 53, 82, 23, 66, 36, 5, 41, 26, 31, 2, 28. @@ -350,6 +348,10 @@ Knapsack = Benchmark ( vs, 82, 91, 75, 76, 41, 21, 66, 75, 39, 21, 28, 39, 36, 43, 53, 45, 42, 43, 2, 91, 17, 61, 50, 17, 73. vs, 87, 56, 93, 59, 53, 20, 87, 32, 21, 34, 5, 74, 66, 79, 48, 65, 49, 48, 57, 28, 33, 19, 91, 9, 32. vs, 85, 80, 64, 85, 40, 64, 17, 33, 82, 64, 43, 61, 59, 98, 70, 53, 82, 22, 79, 28, 14, 97, 52, 2, 53. + ^vs + ) + + addN19: vs = ( vs, 50, 6, 61, 24, 35, 9, 6, 76, 27, 32, 88, 98, 95, 31, 13, 9, 5, 7, 34, 76, 28, 73, 10, 72, 21. vs, 56, 42, 74, 69, 35, 11, 23, 25, 20, 11, 6, 61, 83, 74, 13, 34, 36, 29, 23, 40, 20, 14, 82, 54, 84. vs, 92, 81, 50, 82, 93, 12, 10, 98, 8, 66, 37, 67, 16, 22, 69, 39, 97, 98, 56, 28, 85, 52, 59, 92, 18. @@ -358,6 +360,10 @@ Knapsack = Benchmark ( vs, 81, 58, 22, 16, 36, 8, 16, 22, 86, 49, 90, 38, 97, 13, 55, 72, 20, 31, 55, 7, 81, 83, 98, 95, 26. vs, 5, 100, 78, 98, 78, 31, 37, 46, 91, 28, 90, 65, 60, 14, 69, 64, 62, 53, 17, 54, 25, 37, 48, 76, 67. vs, 77, 82, 55, 61, 35, 5, 29, 85, 76, 6, 23, 29, 61, 47, 3, 35, 1, 69, 23, 74, 35, 50, 46, 84, 66. + ^vs + ) + + addN20: vs = ( vs, 18, 2, 64, 53, 10, 3, 10, 43, 49, 65, 50, 15, 1, 31, 19, 35, 46, 37, 87, 71, 37, 55, 61, 91, 49. vs, 88, 14, 48, 93, 51, 97, 2, 1, 98, 27, 32, 4, 79, 85, 32, 59, 87, 58, 28, 62, 88, 100, 97, 98, 48. vs, 18, 78, 40, 22, 17, 56, 61, 46, 3, 84, 67, 36, 73, 28, 50, 24, 81, 32, 68, 28, 45, 31, 58, 19, 61. @@ -366,6 +372,10 @@ Knapsack = Benchmark ( vs, 23, 71, 84, 14, 32, 20, 61, 77, 35, 78, 82, 11, 31, 37, 16, 31, 7, 57, 6, 50, 89, 95, 80, 80, 22. vs, 83, 3, 63, 50, 44, 76, 15, 21, 75, 56, 92, 18, 29, 59, 78, 56, 86, 30, 84, 46, 29, 93, 50, 98, 86. vs, 39, 4, 6, 52, 18, 16, 14, 83, 38, 83, 26, 47, 74, 70, 31, 82, 56, 96, 93, 81, 86, 14, 36, 99, 95. + ^vs + ) + + addN21: vs = ( vs, 6, 46, 62, 74, 80, 84, 98, 24, 70, 35, 58, 39, 82, 67, 25, 61, 6, 99, 16, 67, 20, 66, 94, 84, 86. vs, 36, 11, 19, 47, 71, 26, 18, 59, 9, 56, 35, 23, 57, 90, 13, 32, 69, 2, 23, 56, 23, 5, 43, 62, 64. vs, 69, 38, 58, 85, 97, 53, 9, 52, 67, 46, 53, 35, 32, 97, 82, 5, 23, 58, 12, 7, 75, 91, 56, 65, 99. @@ -374,6 +384,10 @@ Knapsack = Benchmark ( vs, 95, 81, 55, 71, 62, 52, 56, 21, 18, 58, 63, 66, 35, 81, 97, 39, 56, 43, 79, 4, 20, 20, 78, 26, 89. vs, 58, 36, 54, 21, 91, 54, 76, 93, 51, 11, 89, 33, 24, 80, 9, 77, 58, 92, 91, 45, 78, 40, 41, 30, 47. vs, 96, 18, 100, 48, 47, 13, 64, 1, 95, 45, 23, 26, 69, 40, 42, 26, 29, 32, 8, 70, 80, 36, 99, 86, 16. + ^vs + ) + + addN22: vs = ( vs, 12, 76, 83, 50, 99, 70, 48, 18, 12, 43, 42, 37, 62, 63, 80, 75, 80, 92, 10, 10, 30, 90, 47, 81, 97. vs, 61, 81, 29, 35, 96, 94, 14, 11, 62, 9, 29, 23, 100, 16, 11, 72, 64, 93, 24, 64, 59, 5, 80, 45, 26. vs, 19, 37, 72, 88, 36, 11, 59, 1, 36, 67, 7, 81, 41, 35, 37, 92, 47, 87, 62, 79, 22, 3, 50, 82, 26. @@ -382,6 +396,10 @@ Knapsack = Benchmark ( vs, 91, 74, 13, 41, 39, 54, 85, 69, 17, 73, 87, 76, 85, 74, 12, 51, 43, 41, 13, 45, 28, 82, 27, 90, 93. vs, 2, 73, 69, 15, 30, 43, 93, 10, 73, 38, 3, 72, 21, 2, 30, 23, 43, 3, 11, 92, 22, 8, 54, 36, 22. vs, 36, 65, 57, 69, 57, 56, 9, 12, 37, 16, 29, 71, 39, 98, 97, 12, 36, 66, 5, 90, 25, 86, 11, 87, 60. + ^vs + ) + + addN23: vs = ( vs, 6, 28, 96, 96, 30, 14, 3, 60, 73, 65, 74, 19, 78, 2, 54, 24, 5, 66, 68, 27, 99, 34, 69, 81, 74. vs, 91, 5, 8, 42, 75, 32, 13, 20, 25, 20, 30, 93, 86, 56, 24, 97, 51, 61, 4, 9, 25, 41, 57, 67, 52. vs, 2, 28, 48, 14, 71, 23, 2, 100, 4, 10, 31, 60, 46, 75, 31, 59, 85, 61, 91, 54, 17, 83, 81, 59, 71. @@ -390,6 +408,10 @@ Knapsack = Benchmark ( vs, 85, 30, 30, 76, 99, 89, 35, 26, 45, 63, 52, 72, 90, 42, 91, 72, 7, 43, 69, 92, 4, 39, 2, 87, 56. vs, 94, 99, 51, 29, 81, 60, 17, 34, 76, 10, 48, 29, 73, 63, 61, 2, 21, 15, 88, 84, 95, 17, 8, 76, 81. vs, 37, 25, 70, 16, 97, 46, 4, 86, 61, 72, 16, 56, 54, 75, 24, 58, 29, 36, 82, 3, 74, 34, 12, 77, 20. + ^vs + ) + + addN24: vs = ( vs, 41, 84, 52, 3, 66, 4, 7, 11, 53, 1, 41, 56, 72, 62, 54, 44, 21, 94, 92, 51, 97, 75, 47, 6, 45. vs, 46, 82, 43, 66, 31, 7, 73, 62, 22, 41, 70, 65, 9, 44, 62, 42, 71, 30, 1, 40, 91, 9, 10, 85, 71. vs, 35, 92, 16, 7, 76, 17, 85, 43, 13, 35, 28, 37, 10, 21, 50, 28, 91, 56, 29, 3, 100, 69, 14, 5, 44. @@ -398,6 +420,10 @@ Knapsack = Benchmark ( vs, 40, 39, 29, 63, 81, 43, 2, 33, 26, 81, 76, 86, 94, 52, 65, 27, 73, 88, 91, 75, 1, 79, 8, 93, 44. vs, 82, 67, 1, 92, 62, 37, 74, 64, 36, 5, 70, 48, 76, 52, 46, 15, 89, 51, 87, 10, 24, 96, 57, 50, 72. vs, 3, 39, 89, 9, 68, 2, 20, 28, 54, 11, 59, 77, 25, 61, 5, 93, 72, 8, 11, 47, 60, 68, 72, 37, 30. + ^vs + ) + + addN25: vs = ( vs, 22, 8, 29, 88, 10, 70, 7, 95, 14, 77, 92, 87, 18, 34, 26, 35, 89, 79, 74, 66, 29, 94, 92, 40, 49. vs, 93, 65, 62, 75, 43, 30, 45, 65, 93, 54, 1, 73, 63, 68, 35, 96, 84, 60, 8, 22, 42, 10, 49, 88, 9. vs, 70, 29, 21, 47, 15, 42, 96, 23, 50, 52, 60, 75, 79, 76, 85, 67, 15, 31, 8, 5, 38, 92, 8, 50, 81. @@ -406,12 +432,11 @@ Knapsack = Benchmark ( vs, 51, 38, 31, 30, 51, 83, 83, 51, 2, 13, 23, 3, 13, 46, 69, 71, 4, 46, 39, 21, 32, 23, 25, 24, 1. vs, 55, 56, 7, 46, 66, 20, 73, 49, 54, 30, 65, 47, 18, 98, 16, 84, 8, 44, 2, 9, 35, 85, 99, 7, 16. vs, 80, 12, 74, 36, 24, 97, 25, 60, 37, 72, 34, 91, 33, 22, 89, 96, 9, 36, 37, 51, 45, 9, 78, 51, 62. - - ^ self knapsack: 501 weights: ws values: vs + ^vs ) verifyResult: result = ( - ^ self assert: 11991 equals: result + ^ self assert: 11966 equals: result ) knapsack: goal weights: w values: v = ( From b6de222e517cf1785819c7f9b29885d33b9da1a2 Mon Sep 17 00:00:00 2001 From: Rhys Walker Date: Wed, 2 Jul 2025 15:41:49 +0100 Subject: [PATCH 6/7] Updated CI to look for alternative SOM implementations --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b5be10c..c3583870 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -121,6 +121,11 @@ jobs: fi done + if [ ! -d som-vm ]; then + echo "All clone attempts failed, falling back to SOM-st" + git clone --depth 1 https://github.com/SOM-st/$REPO som-vm + fi + - name: Install Apt Packages if: ${{ matrix.apt != '' }} run: | From 1cfbf4bc5bd89e73e3df2ffbba225105302f8ea8 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Thu, 3 Jul 2025 12:24:03 +0200 Subject: [PATCH 7/7] Replace hard-coded values in Knapsack by using random numbers This works mostly. It also allows us to size the benchmark now, which is useful. I would expect this is still maintaining the focus on Vector operations of the benchmark, but have not checked that to be sure. Signed-off-by: Stefan Marr --- Examples/Benchmarks/Knapsack.som | 493 ++++--------------------------- 1 file changed, 53 insertions(+), 440 deletions(-) diff --git a/Examples/Benchmarks/Knapsack.som b/Examples/Benchmarks/Knapsack.som index 2d925923..2c8a8e20 100644 --- a/Examples/Benchmarks/Knapsack.som +++ b/Examples/Benchmarks/Knapsack.som @@ -1,442 +1,55 @@ Knapsack = Benchmark ( - - benchmark = ( - | ws vs | - ws := Vector new. - vs := Vector new. - - 1 to: 64 do: [:i | ws, 1]. - 1 to: 52 do: [:i | ws, 2]. - 1 to: 36 do: [:i | ws, 3]. - 1 to: 52 do: [:i | ws, 4]. - 1 to: 49 do: [:i | ws, 5]. - 1 to: 45 do: [:i | ws, 6]. - 1 to: 47 do: [:i | ws, 7]. - 1 to: 41 do: [:i | ws, 8]. - 1 to: 46 do: [:i | ws, 9]. - 1 to: 48 do: [:i | ws, 10]. - 1 to: 45 do: [:i | ws, 11]. - 1 to: 63 do: [:i | ws, 12]. - 1 to: 57 do: [:i | ws, 13]. - 1 to: 57 do: [:i | ws, 14]. - 1 to: 47 do: [:i | ws, 15]. - 1 to: 58 do: [:i | ws, 16]. - 1 to: 47 do: [:i | ws, 17]. - 1 to: 51 do: [:i | ws, 18]. - 1 to: 44 do: [:i | ws, 19]. - 1 to: 45 do: [:i | ws, 20]. - 1 to: 60 do: [:i | ws, 21]. - 1 to: 46 do: [:i | ws, 22]. - 1 to: 63 do: [:i | ws, 23]. - 1 to: 60 do: [:i | ws, 24]. - 1 to: 39 do: [:i | ws, 25]. - 1 to: 53 do: [:i | ws, 26]. - 1 to: 66 do: [:i | ws, 27]. - 1 to: 49 do: [:i | ws, 28]. - 1 to: 48 do: [:i | ws, 29]. - 1 to: 59 do: [:i | ws, 30]. - 1 to: 46 do: [:i | ws, 31]. - 1 to: 54 do: [:i | ws, 32]. - 1 to: 42 do: [:i | ws, 33]. - 1 to: 49 do: [:i | ws, 34]. - 1 to: 51 do: [:i | ws, 35]. - 1 to: 54 do: [:i | ws, 36]. - 1 to: 50 do: [:i | ws, 37]. - 1 to: 63 do: [:i | ws, 38]. - 1 to: 49 do: [:i | ws, 39]. - 1 to: 38 do: [:i | ws, 40]. - 1 to: 49 do: [:i | ws, 41]. - 1 to: 42 do: [:i | ws, 42]. - 1 to: 53 do: [:i | ws, 43]. - 1 to: 43 do: [:i | ws, 44]. - 1 to: 57 do: [:i | ws, 45]. - 1 to: 55 do: [:i | ws, 46]. - 1 to: 48 do: [:i | ws, 47]. - 1 to: 41 do: [:i | ws, 48]. - 1 to: 57 do: [:i | ws, 49]. - 1 to: 55 do: [:i | ws, 50]. - 1 to: 48 do: [:i | ws, 51]. - 1 to: 45 do: [:i | ws, 52]. - 1 to: 50 do: [:i | ws, 53]. - 1 to: 41 do: [:i | ws, 54]. - 1 to: 44 do: [:i | ws, 55]. - 1 to: 48 do: [:i | ws, 56]. - 1 to: 43 do: [:i | ws, 57]. - 1 to: 60 do: [:i | ws, 58]. - 1 to: 52 do: [:i | ws, 59]. - 1 to: 65 do: [:i | ws, 60]. - 1 to: 47 do: [:i | ws, 61]. - 1 to: 46 do: [:i | ws, 62]. - 1 to: 41 do: [:i | ws, 63]. - 1 to: 45 do: [:i | ws, 64]. - 1 to: 46 do: [:i | ws, 65]. - 1 to: 41 do: [:i | ws, 66]. - 1 to: 53 do: [:i | ws, 67]. - 1 to: 56 do: [:i | ws, 68]. - 1 to: 49 do: [:i | ws, 69]. - 1 to: 51 do: [:i | ws, 70]. - 1 to: 45 do: [:i | ws, 71]. - 1 to: 57 do: [:i | ws, 72]. - 1 to: 46 do: [:i | ws, 73]. - 1 to: 59 do: [:i | ws, 74]. - 1 to: 47 do: [:i | ws, 75]. - 1 to: 59 do: [:i | ws, 76]. - 1 to: 64 do: [:i | ws, 77]. - 1 to: 39 do: [:i | ws, 78]. - 1 to: 42 do: [:i | ws, 79]. - 1 to: 37 do: [:i | ws, 80]. - 1 to: 59 do: [:i | ws, 81]. - 1 to: 47 do: [:i | ws, 82]. - 1 to: 52 do: [:i | ws, 83]. - 1 to: 61 do: [:i | ws, 84]. - 1 to: 56 do: [:i | ws, 85]. - 1 to: 47 do: [:i | ws, 86]. - 1 to: 32 do: [:i | ws, 87]. - 1 to: 55 do: [:i | ws, 88]. - 1 to: 53 do: [:i | ws, 89]. - 1 to: 53 do: [:i | ws, 90]. - 1 to: 51 do: [:i | ws, 91]. - 1 to: 50 do: [:i | ws, 92]. - 1 to: 44 do: [:i | ws, 93]. - 1 to: 57 do: [:i | ws, 94]. - 1 to: 40 do: [:i | ws, 95]. - 1 to: 47 do: [:i | ws, 96]. - 1 to: 44 do: [:i | ws, 97]. - 1 to: 50 do: [:i | ws, 98]. - 1 to: 59 do: [:i | ws, 99]. - 1 to: 41 do: [:i | ws, 100]. - - self addN1: vs. - self addN2: vs. - self addN3: vs. - self addN4: vs. - self addN5: vs. - self addN6: vs. - self addN7: vs. - self addN8: vs. - self addN9: vs. - self addN10: vs. - self addN11: vs. - self addN12: vs. - self addN13: vs. - self addN14: vs. - self addN15: vs. - self addN16: vs. - self addN17: vs. - self addN18: vs. - self addN19: vs. - self addN20: vs. - self addN21: vs. - self addN22: vs. - self addN23: vs. - self addN24: vs. - self addN25: vs. - - ^ self knapsack: 501 weights: ws values: vs - ) - - addN1: vs = ( - vs, 69, 58, 44, 85, 34, 76, 58, 23, 58, 21, 61, 83, 21, 92, 12, 33, 67, 8, 14, 28, 57, 47, 6, 72, 59. - vs, 3, 70, 49, 52, 52, 63, 35, 52, 72, 5, 84, 89, 55, 51, 85, 24, 80, 91, 92, 60, 25, 30, 90, 36, 8. - vs, 93, 41, 54, 48, 96, 72, 91, 42, 38, 47, 48, 39, 69, 84, 20, 71, 39, 95, 59, 31, 86, 20, 68, 51, 20. - vs, 66, 21, 56, 67, 71, 20, 13, 24, 90, 96, 62, 51, 45, 44, 99, 2, 8, 49, 24, 31, 83, 62, 60, 50, 37. - vs, 58, 46, 35, 69, 28, 36, 19, 62, 37, 95, 5, 66, 58, 3, 41, 11, 42, 91, 43, 8, 16, 59, 23, 39, 59. - vs, 79, 99, 69, 32, 3, 32, 28, 8, 44, 64, 68, 31, 57, 24, 63, 61, 13, 7, 88, 78, 43, 18, 25, 67, 65. - vs, 4, 90, 30, 6, 58, 19, 86, 6, 82, 46, 42, 69, 47, 26, 30, 51, 56, 20, 72, 39, 19, 68, 99, 17, 79. - vs, 15, 68, 53, 96, 76, 49, 35, 57, 61, 93, 63, 67, 2, 16, 7, 89, 57, 59, 16, 96, 21, 70, 17, 18, 83. - ^vs - ) - - addN2: vs = ( - vs, 89, 27, 40, 31, 69, 56, 64, 57, 91, 7, 99, 40, 50, 26, 41, 56, 27, 79, 67, 70, 13, 12, 33, 55, 65. - vs, 98, 32, 96, 63, 70, 89, 15, 81, 17, 60, 97, 42, 5, 76, 38, 35, 90, 7, 57, 47, 12, 42, 17, 49, 6. - vs, 61, 88, 82, 66, 73, 18, 37, 51, 91, 100, 37, 80, 100, 74, 44, 79, 82, 95, 48, 72, 39, 94, 88, 20, 10. - vs, 49, 98, 49, 74, 34, 8, 21, 90, 74, 5, 45, 86, 51, 19, 5, 34, 83, 82, 37, 54, 54, 16, 26, 14, 56. - vs, 67, 75, 24, 70, 62, 86, 42, 8, 36, 99, 75, 72, 20, 59, 4, 88, 52, 96, 76, 62, 26, 69, 82, 21, 17. - vs, 59, 95, 100, 42, 45, 64, 46, 76, 2, 38, 82, 59, 98, 84, 41, 59, 46, 2, 82, 91, 56, 92, 84, 11, 88. - vs, 29, 67, 15, 60, 29, 92, 68, 84, 88, 63, 22, 47, 71, 56, 31, 44, 100, 32, 18, 38, 48, 6, 43, 78, 12. - vs, 20, 66, 66, 3, 75, 94, 58, 93, 30, 2, 97, 41, 97, 84, 23, 68, 60, 88, 1, 55, 67, 97, 23, 93, 11. - ^vs - ) - - addN3: vs = ( - vs, 82, 22, 55, 34, 27, 48, 21, 73, 93, 69, 88, 9, 76, 91, 44, 80, 27, 77, 42, 37, 72, 2, 31, 84, 46. - vs, 10, 9, 21, 81, 79, 86, 30, 69, 38, 2, 32, 52, 19, 8, 45, 17, 27, 58, 70, 17, 71, 64, 85, 20, 43. - vs, 42, 49, 47, 69, 27, 77, 93, 77, 8, 49, 68, 81, 98, 30, 65, 97, 33, 92, 5, 48, 77, 75, 35, 15, 22. - vs, 54, 77, 86, 34, 74, 77, 85, 43, 73, 64, 22, 45, 40, 54, 22, 62, 98, 82, 99, 30, 70, 70, 15, 83, 43. - vs, 17, 21, 2, 82, 69, 15, 6, 29, 45, 42, 10, 33, 71, 57, 29, 25, 91, 54, 93, 98, 51, 38, 21, 16, 23. - vs, 68, 77, 51, 18, 13, 40, 55, 6, 21, 22, 70, 29, 69, 57, 59, 73, 11, 16, 56, 27, 87, 75, 82, 40, 61. - vs, 77, 12, 44, 7, 49, 73, 79, 66, 13, 65, 74, 83, 86, 19, 73, 20, 69, 91, 45, 99, 61, 5, 86, 73, 6. - vs, 93, 42, 36, 71, 1, 51, 96, 26, 59, 56, 100, 5, 81, 92, 77, 95, 60, 73, 82, 52, 30, 45, 35, 11, 85. - ^vs - ) - - addN4: vs = ( - vs, 81, 23, 81, 16, 47, 91, 28, 47, 64, 19, 15, 8, 38, 71, 34, 98, 78, 72, 28, 26, 83, 38, 96, 47, 6. - vs, 59, 26, 96, 98, 26, 56, 47, 54, 100, 39, 97, 98, 58, 96, 22, 19, 10, 43, 12, 38, 61, 49, 43, 19, 65. - vs, 48, 20, 90, 24, 66, 38, 93, 2, 8, 48, 71, 73, 46, 1, 75, 3, 54, 20, 29, 12, 92, 11, 40, 17, 42. - vs, 26, 85, 66, 99, 42, 42, 31, 66, 68, 28, 12, 95, 27, 17, 24, 20, 22, 55, 70, 59, 79, 100, 15, 28, 89. - vs, 65, 9, 95, 25, 90, 70, 16, 39, 40, 86, 19, 35, 27, 24, 41, 92, 52, 54, 9, 87, 7, 10, 60, 70, 16. - vs, 89, 100, 20, 97, 55, 93, 18, 72, 89, 73, 42, 90, 19, 76, 5, 8, 60, 8, 47, 66, 94, 88, 19, 70, 52. - vs, 34, 53, 24, 20, 46, 92, 100, 38, 65, 53, 12, 36, 71, 22, 5, 65, 86, 9, 22, 52, 37, 81, 88, 8, 5. - vs, 58, 49, 46, 30, 68, 92, 77, 27, 87, 57, 83, 55, 31, 69, 20, 25, 60, 19, 71, 20, 46, 33, 39, 79, 97. - ^vs - ) - - addN5: vs = ( - vs, 58, 96, 6, 29, 64, 34, 78, 59, 81, 81, 81, 89, 34, 76, 83, 62, 25, 15, 66, 64, 44, 13, 66, 21, 34. - vs, 88, 87, 9, 99, 21, 52, 29, 9, 57, 3, 75, 78, 73, 47, 40, 64, 34, 83, 39, 81, 26, 12, 61, 79, 72. - vs, 22, 61, 30, 45, 87, 60, 42, 60, 5, 73, 74, 24, 28, 18, 95, 89, 57, 69, 88, 56, 97, 68, 6, 34, 42. - vs, 62, 56, 40, 80, 50, 78, 77, 25, 33, 77, 84, 73, 56, 41, 94, 32, 78, 37, 85, 64, 26, 12, 6, 52, 12. - vs, 84, 36, 80, 19, 33, 35, 36, 67, 54, 13, 52, 65, 44, 72, 65, 8, 71, 90, 47, 16, 47, 78, 19, 32, 94. - vs, 83, 4, 38, 56, 2, 69, 73, 57, 53, 19, 82, 26, 52, 91, 27, 7, 26, 57, 75, 68, 9, 14, 99, 94, 94. - vs, 21, 29, 16, 43, 30, 18, 7, 29, 19, 4, 12, 58, 87, 77, 62, 59, 37, 5, 25, 42, 93, 15, 89, 31, 61. - vs, 72, 97, 56, 62, 24, 59, 34, 26, 32, 75, 86, 72, 68, 45, 15, 55, 1, 41, 66, 16, 49, 47, 81, 2, 61. - ^vs - ) - - addN6: vs = ( - vs, 25, 4, 71, 47, 80, 25, 3, 74, 97, 14, 8, 93, 94, 3, 29, 19, 17, 34, 44, 74, 44, 49, 74, 78, 39. - vs, 57, 18, 83, 71, 16, 7, 13, 100, 20, 68, 40, 61, 28, 50, 48, 57, 94, 98, 2, 58, 57, 83, 98, 77, 92. - vs, 32, 2, 41, 28, 13, 57, 2, 51, 52, 79, 71, 92, 84, 76, 54, 14, 11, 22, 26, 69, 22, 60, 97, 24, 83. - vs, 93, 97, 86, 26, 43, 86, 90, 31, 78, 25, 86, 26, 14, 66, 6, 11, 6, 36, 14, 13, 16, 8, 74, 59, 54. - vs, 57, 16, 59, 38, 25, 67, 18, 46, 13, 99, 91, 80, 100, 95, 17, 27, 23, 27, 100, 85, 26, 87, 52, 11, 71. - vs, 3, 61, 98, 61, 15, 19, 12, 53, 73, 74, 31, 64, 52, 82, 19, 87, 13, 59, 82, 17, 95, 96, 25, 48, 25. - vs, 3, 26, 58, 34, 82, 54, 50, 95, 90, 68, 60, 87, 75, 20, 4, 85, 1, 23, 83, 19, 41, 68, 49, 13, 60. - vs, 95, 5, 97, 32, 59, 99, 75, 90, 24, 69, 53, 61, 32, 15, 58, 40, 30, 80, 93, 78, 93, 93, 33, 68, 35. - ^vs - ) - - addN7: vs = ( - vs, 81, 49, 59, 82, 24, 48, 72, 75, 62, 30, 6, 49, 10, 20, 61, 3, 41, 18, 27, 82, 86, 59, 5, 77, 35. - vs, 87, 41, 74, 4, 21, 5, 28, 67, 96, 86, 55, 95, 49, 66, 21, 28, 3, 42, 54, 71, 80, 17, 11, 13, 76. - vs, 90, 35, 31, 15, 58, 70, 87, 31, 95, 54, 15, 89, 24, 33, 32, 4, 15, 63, 83, 96, 20, 51, 88, 85, 13. - vs, 39, 62, 9, 52, 38, 70, 43, 83, 6, 99, 35, 62, 8, 64, 1, 72, 18, 10, 48, 91, 15, 36, 91, 74, 34. - vs, 51, 61, 56, 36, 39, 46, 21, 82, 97, 21, 95, 79, 6, 37, 65, 54, 56, 64, 70, 7, 61, 98, 34, 75, 48. - vs, 37, 30, 23, 89, 31, 88, 46, 54, 67, 84, 60, 69, 33, 32, 53, 74, 77, 33, 80, 96, 95, 53, 27, 33, 26. - vs, 11, 10, 51, 98, 20, 8, 56, 13, 17, 15, 32, 53, 16, 36, 91, 59, 47, 10, 33, 28, 53, 82, 93, 10, 10. - vs, 80, 85, 99, 43, 32, 2, 13, 30, 86, 98, 74, 14, 50, 8, 56, 77, 33, 25, 15, 51, 38, 51, 36, 17, 27. - ^vs - ) - - addN8: vs = ( - vs, 56, 16, 6, 39, 3, 75, 32, 11, 91, 55, 86, 74, 16, 37, 16, 42, 86, 8, 54, 63, 58, 5, 36, 28, 14. - vs, 40, 62, 15, 20, 16, 31, 13, 15, 1, 54, 28, 58, 29, 79, 17, 2, 59, 41, 88, 74, 19, 74, 67, 42, 98. - vs, 79, 11, 91, 48, 3, 88, 17, 72, 56, 61, 21, 22, 76, 66, 17, 53, 14, 100, 75, 11, 35, 51, 51, 56, 23. - vs, 18, 4, 96, 65, 54, 76, 72, 3, 14, 94, 97, 47, 23, 39, 41, 9, 14, 63, 88, 61, 81, 50, 36, 8, 84. - vs, 81, 95, 16, 73, 20, 60, 78, 49, 23, 45, 21, 4, 100, 29, 29, 44, 7, 86, 43, 75, 58, 44, 70, 38, 70. - vs, 91, 30, 15, 72, 55, 89, 14, 93, 4, 4, 48, 92, 8, 25, 99, 71, 51, 28, 66, 51, 94, 50, 28, 93, 14. - vs, 55, 49, 71, 89, 21, 31, 16, 2, 52, 58, 38, 78, 45, 61, 50, 28, 95, 68, 42, 84, 63, 61, 28, 84, 20. - vs, 69, 8, 34, 26, 73, 95, 6, 89, 8, 63, 55, 90, 44, 33, 90, 8, 33, 18, 81, 96, 34, 22, 76, 98, 72. - ^vs - ) - - addN9: vs = ( - vs, 95, 51, 42, 66, 82, 81, 53, 89, 71, 55, 61, 47, 53, 7, 54, 84, 52, 100, 98, 19, 53, 40, 11, 12, 7. - vs, 1, 61, 58, 33, 27, 57, 19, 52, 71, 39, 70, 13, 1, 26, 6, 70, 47, 11, 61, 40, 50, 4, 7, 38, 60. - vs, 10, 95, 7, 52, 33, 32, 15, 91, 28, 98, 90, 94, 52, 1, 61, 62, 68, 78, 45, 14, 39, 3, 3, 86, 88. - vs, 54, 45, 30, 42, 59, 13, 88, 31, 76, 3, 29, 43, 9, 45, 38, 91, 54, 48, 32, 94, 18, 2, 18, 42, 79. - vs, 61, 98, 4, 72, 73, 67, 39, 1, 62, 17, 26, 81, 80, 32, 95, 18, 41, 92, 34, 43, 4, 31, 13, 88, 70. - vs, 15, 84, 57, 16, 63, 95, 11, 65, 27, 67, 75, 4, 24, 49, 40, 40, 11, 48, 54, 76, 71, 28, 24, 76, 3. - vs, 15, 35, 4, 94, 72, 17, 4, 48, 12, 71, 11, 96, 44, 86, 13, 57, 48, 57, 33, 75, 68, 23, 12, 19, 98. - vs, 61, 50, 35, 18, 12, 38, 33, 31, 86, 5, 79, 39, 70, 64, 50, 24, 63, 4, 33, 83, 95, 80, 37, 90, 40. - ^vs - ) - - addN10: vs = ( - vs, 69, 50, 37, 56, 72, 61, 30, 11, 73, 79, 76, 57, 19, 6, 64, 28, 32, 57, 59, 31, 56, 93, 65, 55, 66. - vs, 84, 68, 72, 40, 37, 96, 37, 80, 80, 58, 72, 50, 79, 47, 6, 65, 73, 25, 79, 100, 84, 84, 26, 75, 85. - vs, 91, 95, 96, 3, 98, 38, 1, 5, 21, 61, 50, 46, 86, 39, 9, 87, 40, 17, 75, 74, 78, 46, 26, 60, 63. - vs, 53, 98, 44, 7, 80, 9, 51, 22, 82, 74, 5, 87, 84, 80, 78, 27, 98, 63, 69, 63, 66, 76, 77, 92, 93. - vs, 27, 16, 28, 49, 20, 58, 31, 6, 25, 44, 81, 67, 73, 38, 18, 98, 85, 73, 39, 97, 81, 17, 97, 88, 67. - vs, 12, 33, 47, 16, 38, 83, 83, 8, 80, 95, 83, 33, 22, 16, 58, 5, 100, 83, 10, 53, 49, 37, 14, 92, 26. - vs, 85, 29, 88, 74, 8, 86, 49, 80, 14, 46, 77, 35, 33, 83, 69, 4, 99, 2, 22, 82, 92, 69, 50, 60, 34. - vs, 35, 23, 42, 71, 80, 13, 20, 98, 75, 3, 96, 86, 81, 60, 14, 18, 23, 40, 51, 48, 69, 95, 91, 54, 20. - ^vs - ) - - addN11: vs = ( - vs, 29, 12, 98, 27, 76, 37, 38, 88, 5, 75, 77, 97, 32, 58, 27, 74, 41, 78, 89, 36, 71, 2, 100, 58, 15. - vs, 26, 1, 81, 45, 57, 62, 58, 65, 49, 10, 61, 7, 65, 91, 75, 27, 98, 98, 5, 78, 69, 16, 8, 58, 11. - vs, 72, 16, 96, 67, 66, 45, 65, 42, 5, 15, 90, 32, 28, 35, 75, 78, 69, 75, 42, 80, 9, 36, 31, 38, 13. - vs, 62, 98, 56, 20, 1, 8, 99, 7, 9, 8, 87, 64, 22, 65, 59, 55, 67, 19, 47, 97, 34, 45, 81, 46, 16. - vs, 91, 17, 4, 55, 91, 58, 52, 41, 25, 45, 54, 68, 29, 15, 3, 47, 89, 21, 46, 22, 20, 69, 80, 51, 31. - vs, 67, 44, 78, 8, 48, 21, 10, 17, 8, 46, 39, 3, 1, 17, 66, 56, 46, 70, 47, 14, 9, 2, 65, 25, 77. - vs, 46, 97, 69, 41, 83, 75, 33, 5, 48, 19, 6, 5, 90, 80, 90, 28, 15, 94, 32, 56, 21, 1, 37, 52, 4. - vs, 96, 61, 32, 39, 56, 19, 19, 99, 65, 97, 64, 44, 22, 35, 74, 71, 53, 81, 63, 71, 81, 49, 58, 57, 72. - ^vs - ) - - addN12: vs = ( - vs, 84, 5, 55, 35, 51, 30, 48, 82, 46, 71, 36, 82, 61, 19, 82, 33, 33, 49, 81, 23, 65, 66, 11, 9, 46. - vs, 61, 44, 43, 74, 12, 47, 73, 52, 13, 21, 24, 93, 69, 47, 17, 45, 46, 50, 45, 32, 89, 60, 48, 94, 71. - vs, 47, 5, 38, 14, 45, 79, 67, 77, 86, 15, 49, 35, 15, 66, 85, 61, 8, 97, 72, 38, 14, 89, 24, 74, 59. - vs, 54, 25, 7, 61, 33, 6, 42, 34, 34, 99, 29, 92, 63, 61, 58, 83, 9, 51, 47, 76, 17, 5, 18, 94, 33. - vs, 25, 11, 84, 33, 46, 84, 88, 91, 81, 19, 60, 1, 1, 3, 1, 26, 37, 98, 56, 80, 76, 19, 36, 30, 82. - vs, 86, 39, 31, 79, 34, 92, 7, 15, 6, 45, 6, 56, 18, 54, 81, 28, 52, 52, 75, 42, 96, 51, 64, 44, 40. - vs, 58, 11, 83, 46, 61, 44, 98, 99, 58, 34, 14, 33, 5, 79, 30, 9, 1, 11, 59, 56, 46, 97, 1, 50, 30. - vs, 19, 61, 10, 76, 73, 8, 26, 38, 79, 98, 4, 2, 15, 64, 53, 56, 55, 53, 88, 3, 23, 30, 82, 97, 19. - ^vs - ) - - addN13: vs = ( - vs, 36, 5, 73, 5, 12, 10, 29, 15, 63, 66, 4, 19, 28, 5, 90, 72, 67, 27, 36, 4, 64, 58, 35, 86, 66. - vs, 9, 32, 51, 72, 23, 29, 13, 21, 48, 32, 58, 18, 22, 37, 96, 1, 48, 5, 81, 68, 84, 66, 53, 42, 98. - vs, 60, 29, 100, 13, 37, 72, 74, 58, 3, 20, 87, 60, 47, 50, 16, 13, 10, 25, 92, 55, 81, 55, 48, 72, 41. - vs, 50, 30, 24, 82, 16, 73, 75, 55, 31, 92, 63, 9, 9, 84, 68, 2, 61, 82, 21, 96, 92, 51, 44, 2, 69. - vs, 67, 55, 52, 45, 85, 57, 53, 55, 82, 81, 77, 91, 51, 6, 64, 16, 36, 62, 26, 3, 13, 50, 73, 51, 87. - vs, 4, 3, 75, 36, 57, 86, 87, 56, 41, 65, 46, 59, 71, 93, 5, 68, 32, 34, 54, 72, 62, 36, 70, 93, 60. - vs, 83, 10, 41, 32, 98, 16, 66, 16, 14, 12, 58, 61, 96, 90, 38, 28, 51, 62, 32, 55, 29, 37, 27, 99, 51. - vs, 90, 25, 69, 31, 40, 99, 75, 88, 43, 23, 46, 3, 18, 87, 80, 9, 23, 11, 87, 98, 56, 53, 100, 43, 66. - ^vs - ) - - addN14: vs = ( - vs, 20, 66, 97, 43, 99, 90, 88, 60, 11, 84, 1, 29, 11, 34, 35, 92, 23, 35, 25, 94, 73, 88, 23, 53, 79. - vs, 65, 85, 77, 22, 72, 48, 98, 16, 99, 82, 11, 22, 57, 79, 14, 52, 52, 93, 65, 57, 8, 4, 66, 70, 84. - vs, 66, 22, 88, 20, 36, 65, 80, 36, 28, 71, 32, 53, 63, 32, 10, 4, 68, 48, 24, 64, 69, 12, 32, 22, 34. - vs, 54, 23, 19, 32, 77, 29, 20, 53, 91, 15, 29, 6, 42, 99, 73, 27, 81, 76, 48, 35, 37, 62, 73, 40, 98. - vs, 6, 32, 64, 90, 35, 12, 31, 39, 89, 18, 26, 60, 89, 69, 61, 88, 29, 91, 40, 22, 92, 29, 90, 75, 60. - vs, 23, 16, 88, 4, 19, 19, 94, 39, 47, 26, 94, 84, 93, 100, 29, 46, 96, 27, 74, 41, 25, 55, 99, 40, 4. - vs, 24, 72, 97, 69, 37, 12, 94, 59, 49, 43, 100, 28, 94, 10, 24, 96, 33, 6, 56, 30, 94, 47, 70, 45, 21. - vs, 36, 35, 91, 71, 57, 30, 28, 98, 64, 15, 61, 84, 18, 13, 75, 83, 90, 58, 63, 19, 51, 84, 41, 22, 68. - ^vs - ) - - addN15: vs = ( - vs, 73, 51, 22, 24, 77, 59, 24, 61, 33, 85, 29, 25, 32, 79, 6, 41, 33, 42, 93, 10, 90, 6, 79, 4, 97. - vs, 68, 27, 21, 77, 33, 95, 9, 87, 1, 13, 91, 12, 59, 76, 44, 66, 11, 89, 48, 50, 77, 56, 42, 33, 84. - vs, 10, 57, 1, 75, 29, 85, 44, 62, 37, 71, 97, 62, 85, 42, 93, 34, 46, 99, 64, 71, 67, 62, 87, 4, 4. - vs, 67, 62, 50, 23, 50, 18, 6, 21, 71, 10, 54, 81, 79, 16, 3, 37, 57, 12, 5, 93, 97, 36, 58, 31, 14. - vs, 91, 62, 57, 34, 38, 11, 78, 93, 71, 69, 76, 77, 41, 63, 53, 67, 59, 63, 65, 45, 52, 71, 24, 36, 52. - vs, 23, 80, 62, 58, 74, 62, 85, 4, 100, 90, 52, 20, 62, 100, 84, 84, 96, 43, 25, 63, 39, 93, 24, 60, 73. - vs, 70, 37, 4, 53, 9, 88, 82, 14, 66, 44, 71, 98, 44, 85, 77, 12, 99, 24, 65, 7, 4, 22, 1, 71, 33. - vs, 62, 26, 92, 97, 39, 21, 84, 70, 22, 31, 22, 69, 76, 54, 92, 57, 30, 97, 86, 37, 80, 81, 24, 89, 99. - ^vs - ) - - addN16: vs = ( - vs, 48, 28, 73, 39, 30, 77, 47, 94, 13, 7, 59, 9, 59, 24, 12, 74, 67, 29, 46, 5, 97, 72, 89, 11, 79. - vs, 60, 71, 47, 19, 27, 72, 71, 23, 8, 53, 14, 25, 97, 41, 63, 83, 6, 83, 94, 83, 40, 81, 65, 31, 11. - vs, 43, 8, 69, 80, 33, 80, 98, 60, 7, 22, 91, 4, 23, 39, 79, 14, 47, 68, 1, 98, 62, 7, 36, 37, 89. - vs, 78, 45, 41, 96, 14, 24, 83, 17, 32, 34, 44, 36, 81, 25, 43, 95, 58, 58, 83, 25, 52, 90, 100, 80, 61. - vs, 84, 37, 8, 39, 36, 4, 73, 89, 90, 74, 53, 3, 17, 16, 9, 27, 95, 13, 21, 67, 77, 97, 33, 6, 70. - vs, 52, 94, 30, 79, 21, 93, 40, 73, 7, 97, 99, 20, 92, 72, 17, 53, 59, 60, 94, 44, 96, 76, 25, 2, 14. - vs, 4, 38, 26, 17, 78, 87, 16, 32, 80, 19, 35, 84, 69, 16, 13, 49, 75, 43, 55, 50, 97, 43, 87, 86, 92. - vs, 92, 76, 79, 74, 93, 47, 14, 80, 2, 81, 26, 82, 22, 87, 21, 10, 1, 67, 77, 33, 2, 23, 84, 56, 18. - ^vs - ) - - addN17: vs = ( - vs, 99, 33, 9, 82, 61, 5, 32, 48, 26, 93, 87, 98, 56, 56, 70, 34, 49, 34, 87, 17, 100, 36, 67, 24, 12. - vs, 30, 64, 71, 35, 14, 42, 45, 78, 93, 59, 2, 49, 23, 22, 86, 73, 40, 45, 82, 71, 20, 7, 28, 15, 10. - vs, 76, 51, 88, 59, 25, 40, 42, 82, 52, 6, 34, 49, 23, 9, 64, 41, 36, 38, 68, 47, 8, 26, 93, 32, 62. - vs, 49, 97, 20, 49, 11, 93, 39, 30, 8, 67, 54, 71, 22, 93, 38, 54, 26, 41, 100, 32, 80, 88, 10, 34, 16. - vs, 35, 81, 80, 75, 68, 14, 3, 94, 92, 37, 91, 98, 37, 83, 40, 35, 58, 51, 6, 76, 73, 69, 81, 81, 92. - vs, 59, 49, 33, 12, 61, 99, 75, 44, 23, 38, 91, 85, 92, 66, 15, 56, 93, 99, 90, 78, 89, 77, 78, 27, 38. - vs, 40, 25, 85, 7, 86, 82, 36, 90, 82, 98, 89, 56, 72, 26, 11, 94, 15, 15, 84, 59, 90, 14, 36, 51, 90. - vs, 82, 34, 63, 35, 58, 6, 75, 93, 54, 16, 90, 16, 56, 82, 95, 88, 29, 94, 57, 16, 48, 35, 90, 74, 55. - ^vs - ) - - addN18: vs = ( - vs, 34, 55, 81, 90, 74, 63, 28, 88, 72, 66, 66, 9, 85, 72, 18, 29, 17, 2, 43, 91, 39, 35, 41, 12, 82. - vs, 14, 22, 31, 30, 66, 4, 61, 65, 78, 25, 84, 50, 41, 66, 66, 98, 82, 100, 65, 82, 87, 40, 5, 88, 8. - vs, 27, 4, 30, 5, 39, 61, 33, 60, 2, 13, 55, 32, 85, 71, 53, 82, 23, 66, 36, 5, 41, 26, 31, 2, 28. - vs, 9, 95, 44, 8, 88, 87, 60, 55, 23, 78, 44, 81, 38, 99, 96, 63, 7, 3, 25, 20, 28, 34, 25, 60, 77. - vs, 71, 53, 7, 35, 73, 30, 57, 96, 19, 78, 69, 81, 96, 60, 71, 61, 72, 97, 77, 88, 58, 85, 34, 5, 88. - vs, 82, 91, 75, 76, 41, 21, 66, 75, 39, 21, 28, 39, 36, 43, 53, 45, 42, 43, 2, 91, 17, 61, 50, 17, 73. - vs, 87, 56, 93, 59, 53, 20, 87, 32, 21, 34, 5, 74, 66, 79, 48, 65, 49, 48, 57, 28, 33, 19, 91, 9, 32. - vs, 85, 80, 64, 85, 40, 64, 17, 33, 82, 64, 43, 61, 59, 98, 70, 53, 82, 22, 79, 28, 14, 97, 52, 2, 53. - ^vs - ) - - addN19: vs = ( - vs, 50, 6, 61, 24, 35, 9, 6, 76, 27, 32, 88, 98, 95, 31, 13, 9, 5, 7, 34, 76, 28, 73, 10, 72, 21. - vs, 56, 42, 74, 69, 35, 11, 23, 25, 20, 11, 6, 61, 83, 74, 13, 34, 36, 29, 23, 40, 20, 14, 82, 54, 84. - vs, 92, 81, 50, 82, 93, 12, 10, 98, 8, 66, 37, 67, 16, 22, 69, 39, 97, 98, 56, 28, 85, 52, 59, 92, 18. - vs, 48, 20, 55, 60, 32, 21, 99, 34, 74, 8, 86, 34, 54, 36, 33, 24, 65, 93, 30, 58, 38, 43, 55, 11, 55. - vs, 20, 27, 40, 86, 41, 9, 43, 76, 40, 38, 91, 28, 54, 91, 49, 72, 61, 5, 11, 21, 49, 44, 69, 90, 100. - vs, 81, 58, 22, 16, 36, 8, 16, 22, 86, 49, 90, 38, 97, 13, 55, 72, 20, 31, 55, 7, 81, 83, 98, 95, 26. - vs, 5, 100, 78, 98, 78, 31, 37, 46, 91, 28, 90, 65, 60, 14, 69, 64, 62, 53, 17, 54, 25, 37, 48, 76, 67. - vs, 77, 82, 55, 61, 35, 5, 29, 85, 76, 6, 23, 29, 61, 47, 3, 35, 1, 69, 23, 74, 35, 50, 46, 84, 66. - ^vs - ) - - addN20: vs = ( - vs, 18, 2, 64, 53, 10, 3, 10, 43, 49, 65, 50, 15, 1, 31, 19, 35, 46, 37, 87, 71, 37, 55, 61, 91, 49. - vs, 88, 14, 48, 93, 51, 97, 2, 1, 98, 27, 32, 4, 79, 85, 32, 59, 87, 58, 28, 62, 88, 100, 97, 98, 48. - vs, 18, 78, 40, 22, 17, 56, 61, 46, 3, 84, 67, 36, 73, 28, 50, 24, 81, 32, 68, 28, 45, 31, 58, 19, 61. - vs, 4, 39, 5, 92, 3, 78, 88, 93, 90, 34, 97, 97, 2, 6, 30, 19, 22, 1, 58, 61, 6, 50, 70, 13, 76. - vs, 18, 49, 38, 83, 61, 32, 20, 56, 60, 65, 92, 66, 67, 6, 36, 32, 89, 55, 38, 38, 44, 17, 15, 68, 69. - vs, 23, 71, 84, 14, 32, 20, 61, 77, 35, 78, 82, 11, 31, 37, 16, 31, 7, 57, 6, 50, 89, 95, 80, 80, 22. - vs, 83, 3, 63, 50, 44, 76, 15, 21, 75, 56, 92, 18, 29, 59, 78, 56, 86, 30, 84, 46, 29, 93, 50, 98, 86. - vs, 39, 4, 6, 52, 18, 16, 14, 83, 38, 83, 26, 47, 74, 70, 31, 82, 56, 96, 93, 81, 86, 14, 36, 99, 95. - ^vs - ) - - addN21: vs = ( - vs, 6, 46, 62, 74, 80, 84, 98, 24, 70, 35, 58, 39, 82, 67, 25, 61, 6, 99, 16, 67, 20, 66, 94, 84, 86. - vs, 36, 11, 19, 47, 71, 26, 18, 59, 9, 56, 35, 23, 57, 90, 13, 32, 69, 2, 23, 56, 23, 5, 43, 62, 64. - vs, 69, 38, 58, 85, 97, 53, 9, 52, 67, 46, 53, 35, 32, 97, 82, 5, 23, 58, 12, 7, 75, 91, 56, 65, 99. - vs, 63, 43, 37, 27, 82, 7, 37, 75, 60, 88, 36, 17, 92, 16, 96, 28, 67, 7, 68, 26, 28, 16, 75, 52, 88. - vs, 100, 42, 87, 83, 60, 64, 30, 10, 20, 72, 91, 52, 66, 83, 32, 79, 85, 60, 60, 44, 87, 90, 87, 10, 7. - vs, 95, 81, 55, 71, 62, 52, 56, 21, 18, 58, 63, 66, 35, 81, 97, 39, 56, 43, 79, 4, 20, 20, 78, 26, 89. - vs, 58, 36, 54, 21, 91, 54, 76, 93, 51, 11, 89, 33, 24, 80, 9, 77, 58, 92, 91, 45, 78, 40, 41, 30, 47. - vs, 96, 18, 100, 48, 47, 13, 64, 1, 95, 45, 23, 26, 69, 40, 42, 26, 29, 32, 8, 70, 80, 36, 99, 86, 16. - ^vs - ) - - addN22: vs = ( - vs, 12, 76, 83, 50, 99, 70, 48, 18, 12, 43, 42, 37, 62, 63, 80, 75, 80, 92, 10, 10, 30, 90, 47, 81, 97. - vs, 61, 81, 29, 35, 96, 94, 14, 11, 62, 9, 29, 23, 100, 16, 11, 72, 64, 93, 24, 64, 59, 5, 80, 45, 26. - vs, 19, 37, 72, 88, 36, 11, 59, 1, 36, 67, 7, 81, 41, 35, 37, 92, 47, 87, 62, 79, 22, 3, 50, 82, 26. - vs, 4, 30, 73, 41, 52, 9, 15, 54, 63, 37, 8, 1, 70, 46, 94, 92, 35, 85, 91, 17, 54, 32, 97, 59, 43. - vs, 34, 100, 62, 93, 21, 51, 78, 4, 94, 33, 33, 46, 38, 11, 93, 14, 12, 77, 90, 52, 19, 90, 22, 47, 55. - vs, 91, 74, 13, 41, 39, 54, 85, 69, 17, 73, 87, 76, 85, 74, 12, 51, 43, 41, 13, 45, 28, 82, 27, 90, 93. - vs, 2, 73, 69, 15, 30, 43, 93, 10, 73, 38, 3, 72, 21, 2, 30, 23, 43, 3, 11, 92, 22, 8, 54, 36, 22. - vs, 36, 65, 57, 69, 57, 56, 9, 12, 37, 16, 29, 71, 39, 98, 97, 12, 36, 66, 5, 90, 25, 86, 11, 87, 60. - ^vs - ) - - addN23: vs = ( - vs, 6, 28, 96, 96, 30, 14, 3, 60, 73, 65, 74, 19, 78, 2, 54, 24, 5, 66, 68, 27, 99, 34, 69, 81, 74. - vs, 91, 5, 8, 42, 75, 32, 13, 20, 25, 20, 30, 93, 86, 56, 24, 97, 51, 61, 4, 9, 25, 41, 57, 67, 52. - vs, 2, 28, 48, 14, 71, 23, 2, 100, 4, 10, 31, 60, 46, 75, 31, 59, 85, 61, 91, 54, 17, 83, 81, 59, 71. - vs, 93, 84, 96, 96, 12, 25, 33, 88, 29, 77, 33, 62, 30, 75, 48, 58, 21, 28, 76, 98, 63, 93, 47, 34, 8. - vs, 49, 48, 73, 22, 74, 69, 69, 30, 12, 4, 16, 51, 54, 95, 95, 7, 8, 83, 55, 10, 34, 100, 46, 73, 82. - vs, 85, 30, 30, 76, 99, 89, 35, 26, 45, 63, 52, 72, 90, 42, 91, 72, 7, 43, 69, 92, 4, 39, 2, 87, 56. - vs, 94, 99, 51, 29, 81, 60, 17, 34, 76, 10, 48, 29, 73, 63, 61, 2, 21, 15, 88, 84, 95, 17, 8, 76, 81. - vs, 37, 25, 70, 16, 97, 46, 4, 86, 61, 72, 16, 56, 54, 75, 24, 58, 29, 36, 82, 3, 74, 34, 12, 77, 20. - ^vs - ) - - addN24: vs = ( - vs, 41, 84, 52, 3, 66, 4, 7, 11, 53, 1, 41, 56, 72, 62, 54, 44, 21, 94, 92, 51, 97, 75, 47, 6, 45. - vs, 46, 82, 43, 66, 31, 7, 73, 62, 22, 41, 70, 65, 9, 44, 62, 42, 71, 30, 1, 40, 91, 9, 10, 85, 71. - vs, 35, 92, 16, 7, 76, 17, 85, 43, 13, 35, 28, 37, 10, 21, 50, 28, 91, 56, 29, 3, 100, 69, 14, 5, 44. - vs, 35, 35, 57, 88, 81, 55, 67, 80, 54, 65, 1, 73, 43, 89, 98, 32, 69, 84, 63, 19, 79, 28, 79, 68, 15. - vs, 9, 100, 87, 8, 57, 52, 67, 1, 38, 76, 98, 86, 85, 25, 51, 45, 89, 93, 85, 88, 63, 70, 22, 25, 64. - vs, 40, 39, 29, 63, 81, 43, 2, 33, 26, 81, 76, 86, 94, 52, 65, 27, 73, 88, 91, 75, 1, 79, 8, 93, 44. - vs, 82, 67, 1, 92, 62, 37, 74, 64, 36, 5, 70, 48, 76, 52, 46, 15, 89, 51, 87, 10, 24, 96, 57, 50, 72. - vs, 3, 39, 89, 9, 68, 2, 20, 28, 54, 11, 59, 77, 25, 61, 5, 93, 72, 8, 11, 47, 60, 68, 72, 37, 30. - ^vs - ) - - addN25: vs = ( - vs, 22, 8, 29, 88, 10, 70, 7, 95, 14, 77, 92, 87, 18, 34, 26, 35, 89, 79, 74, 66, 29, 94, 92, 40, 49. - vs, 93, 65, 62, 75, 43, 30, 45, 65, 93, 54, 1, 73, 63, 68, 35, 96, 84, 60, 8, 22, 42, 10, 49, 88, 9. - vs, 70, 29, 21, 47, 15, 42, 96, 23, 50, 52, 60, 75, 79, 76, 85, 67, 15, 31, 8, 5, 38, 92, 8, 50, 81. - vs, 93, 9, 67, 67, 57, 37, 85, 78, 31, 81, 79, 96, 50, 70, 88, 94, 40, 20, 30, 49, 48, 64, 78, 3, 86. - vs, 35, 89, 88, 31, 100, 32, 57, 2, 21, 86, 89, 47, 99, 46, 13, 38, 49, 55, 45, 6, 43, 66, 5, 32, 83. - vs, 51, 38, 31, 30, 51, 83, 83, 51, 2, 13, 23, 3, 13, 46, 69, 71, 4, 46, 39, 21, 32, 23, 25, 24, 1. - vs, 55, 56, 7, 46, 66, 20, 73, 49, 54, 30, 65, 47, 18, 98, 16, 84, 8, 44, 2, 9, 35, 85, 99, 7, 16. - vs, 80, 12, 74, 36, 24, 97, 25, 60, 37, 72, 34, 91, 33, 22, 89, 96, 9, 36, 37, 51, 45, 9, 78, 51, 62. - ^vs - ) - - verifyResult: result = ( - ^ self assert: 11966 equals: result + getWeights = ( + | weights prng | + weights := Vector new. + prng := Random new. + + 1 to: 100 do: [:w | | repetitions | + repetitions := prng next % 50 + 20. + repetitions timesRepeat: [ + weights append: w. + weights size = 5000 ifTrue: [ + ^ weights ] ] ]. + + [ weights size < 5000 ] whileTrue: [ + weights append: 100 ]. + + ^ weights + ) + + getRandomValues = ( + | values prng i | + values := Vector new. + prng := Random new. + + 5000 timesRepeat: [ + values append: prng next % 100 ]. + + ^ values + ) + + innerBenchmarkLoop: goal = ( + | ws vs result expectedResult eI | + ws := self getWeights. + vs := self getRandomValues. + + result := self knapsack: goal weights: ws values: vs. + 'result: ' print. result println. + + expectedResult := #(99 2226 3431 4289 4946 5520 6044 6530 7000 7435 7844 8244 8634 9018 + 9392 9751 10105 10453 10797 11133 11465 11793 12118 12438 12749 + 13056 13360 13659 13953 14242 14527 14805 15079 15348 15613 15875 + 16133 16388 16638 16887 17132). + eI := goal / 25 + 1. + + "Remember: this is a bit brittle, and while the `expectedResults` where generated by this code + there seem to be cases where the below doesn't hold. + So, not all problem sizes will validate, but seems good enough for now." + eI + 1 <= expectedResult length + ifTrue: [ + ^ result >= (expectedResult at: eI) and: [ result <= (expectedResult at: eI + 1) ] ] + ifFalse: [ + ^ result > expectedResult last ] ) knapsack: goal weights: w values: v = ( @@ -445,9 +58,9 @@ Knapsack = Benchmark ( m := Vector new. 1 to: 1 + w size do: [ :i | - m, Vector new. + m append: Vector new. 1 to: 1 + goal do: [ :j | - (m at: i), 0 ] ]. + (m at: i) append: 0 ] ]. 1 to: w size do: [ :i | 1 to: goal do: [ :j |