Random Latin squares: Difference between revisions
Content deleted Content added
Line 729: | Line 729: | ||
4 2 3 1 5 0 |
4 2 3 1 5 0 |
||
</pre> |
</pre> |
||
=={{header|Java}}== |
|||
{{trans|Kotlin}} |
|||
<lang java>import java.util.ArrayList; |
|||
import java.util.Collections; |
|||
import java.util.Iterator; |
|||
import java.util.List; |
|||
import java.util.Objects; |
|||
public class RandomLatinSquares { |
|||
private static void printSquare(List<List<Integer>> latin) { |
|||
for (List<Integer> row : latin) { |
|||
Iterator<Integer> it = row.iterator(); |
|||
System.out.print("["); |
|||
if (it.hasNext()) { |
|||
Integer col = it.next(); |
|||
System.out.print(col); |
|||
} |
|||
while (it.hasNext()) { |
|||
Integer col = it.next(); |
|||
System.out.print(", "); |
|||
System.out.print(col); |
|||
} |
|||
System.out.println("]"); |
|||
} |
|||
System.out.println(); |
|||
} |
|||
private static void latinSquare(int n) { |
|||
if (n <= 0) { |
|||
System.out.println("[]"); |
|||
return; |
|||
} |
|||
List<List<Integer>> latin = new ArrayList<>(n); |
|||
for (int i = 0; i < n; ++i) { |
|||
List<Integer> inner = new ArrayList<>(n); |
|||
for (int j = 0; j < n; ++j) { |
|||
inner.add(j); |
|||
} |
|||
latin.add(inner); |
|||
} |
|||
// first row |
|||
Collections.shuffle(latin.get(0)); |
|||
// middle row(s) |
|||
for (int i = 1; i < n - 1; ++i) { |
|||
boolean shuffled = false; |
|||
shuffling: |
|||
while (!shuffled) { |
|||
Collections.shuffle(latin.get(i)); |
|||
for (int k = 0; k < i; ++k) { |
|||
for (int j = 0; j < n; ++j) { |
|||
if (Objects.equals(latin.get(k).get(j), latin.get(i).get(j))) { |
|||
continue shuffling; |
|||
} |
|||
} |
|||
} |
|||
shuffled = true; |
|||
} |
|||
} |
|||
// last row |
|||
for (int j = 0; j < n; ++j) { |
|||
List<Boolean> used = new ArrayList<>(n); |
|||
for (int i = 0; i < n; ++i) { |
|||
used.add(false); |
|||
} |
|||
for (int i = 0; i < n - 1; ++i) { |
|||
used.set(latin.get(i).get(j), true); |
|||
} |
|||
for (int k = 0; k < n; ++k) { |
|||
if (!used.get(k)) { |
|||
latin.get(n - 1).set(j, k); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
printSquare(latin); |
|||
} |
|||
public static void main(String[] args) { |
|||
latinSquare(5); |
|||
latinSquare(5); |
|||
latinSquare(10); |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre>[1, 3, 4, 0, 2] |
|||
[4, 0, 2, 1, 3] |
|||
[0, 2, 1, 3, 4] |
|||
[2, 1, 3, 4, 0] |
|||
[3, 4, 0, 2, 1] |
|||
[4, 2, 1, 3, 0] |
|||
[2, 1, 3, 0, 4] |
|||
[0, 3, 2, 4, 1] |
|||
[3, 4, 0, 1, 2] |
|||
[1, 0, 4, 2, 3] |
|||
[8, 7, 9, 0, 1, 2, 6, 5, 4, 3] |
|||
[4, 6, 3, 8, 0, 5, 2, 9, 1, 7] |
|||
[2, 1, 0, 4, 8, 9, 7, 3, 5, 6] |
|||
[6, 4, 8, 1, 9, 7, 3, 0, 2, 5] |
|||
[7, 9, 2, 6, 5, 3, 4, 8, 0, 1] |
|||
[9, 5, 1, 3, 2, 6, 8, 4, 7, 0] |
|||
[5, 0, 4, 9, 6, 8, 1, 7, 3, 2] |
|||
[3, 8, 5, 2, 7, 1, 0, 6, 9, 4] |
|||
[1, 3, 6, 7, 4, 0, 5, 2, 8, 9] |
|||
[0, 2, 7, 5, 3, 4, 9, 1, 6, 8]</pre> |
|||
=={{header|Javascript}}== |
=={{header|Javascript}}== |