-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAdditionSet.java
119 lines (94 loc) · 3.93 KB
/
AdditionSet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import java.util.*;
public class AdditionSet extends NumberSet {
public AdditionSet(int dimension) {
super(dimension);
}
//Precondition: answer >= 5 && answer <= maximum.
public int[] initiateSet(int num, int answer, int minimum) {
if (num <= 2)
return null;
final int maximum = num * 5;
int[] list = new int[num];
//Create an ArrayList that contains available numbers.
ArrayList<Integer> availableList = new ArrayList<Integer>();
for (int i = minimum; i <= maximum; i++)
availableList.add(i);
ArrayList<Integer> unavailableList = new ArrayList<Integer>();
//Select the correct answer.
list[0] = removeElement(answer, availableList);
unavailableList.add(list[0]);
//Select one of the addends.
int addend = (int)(Math.random() * (answer - minimum * 2 + 1)) + minimum;
while (addend * 2 == answer)
addend = (int)(Math.random() * (answer - minimum * 2 + 1)) + minimum;
list[1] = removeElement(addend, availableList);
unavailableList.add(list[1]);
//Select the other addend.
list[2] = removeElement(answer - addend, availableList);
unavailableList.add(list[2]);
int dif = Math.abs(list[1] - list[2]);
if (dif > 1 && !unavailableList.contains(dif)) {
removeElement(dif, availableList);
unavailableList.add(dif);
}
int sum1 = list[0] + list[1];
int sum2 = list[0] + list[2];
if (sum1 <= maximum && !unavailableList.contains(sum1)) {
removeElement(sum1, availableList);
unavailableList.add(sum1);
}
if (sum2 <= maximum && !unavailableList.contains(sum2)) {
removeElement(sum2, availableList);
unavailableList.add(sum2);
}
//Select the other random answers.
for (int i = 3; i < num; i++) {
int index = (int)(Math.random() * availableList.size());
list[i] = availableList.get(index);
unavailableList.add(removeElement(list[i], availableList));
removeInstances(list[i], list, availableList, unavailableList);
}
shuffle(list);
return list;
}
public int[][] initiateNumbers(int num) {
int answer = (int)(Math.random() * (num * 5 - 10)) + 11;
//The array last stands for the last round of Kakooma numbers.
int[] last = new int[num];
int[][] nums = new int[num][num];
last = initiateSet(num, answer, 5);
for (int i = 0; i < last.length; i++)
setAnswer(i, last[i]);
setAnswer(last.length, answer);
for (int i = 0; i < num; i++) {
nums[i] = initiateSet(num, last[i], 2);
}
return nums;
}
public void removeInstances(int value, int[] list, ArrayList<Integer> availableList, ArrayList<Integer> unavailableList) {
for (int i = 0; i < list.length; i++) {
//autoboxing
int num1 = removeElement(value + list[i], availableList);
if (num1 != -1)
unavailableList.add(num1);
int num2 = removeElement(Math.abs(list[i] - value), availableList);
if (num2 != -1)
unavailableList.add(num2);
}
}
public static void main(String[] args) {
System.out.println();
System.out.println();
for (int k = 0; k < 5; k++) {
AdditionSet adbadb = new AdditionSet(6);
for (int[] i : adbadb.getNumbers()) {
for (int j : i) {
System.out.print(j + " ");
}
System.out.println();
}
System.out.println();
}
System.out.println();
}
}