diff --git a/src/main/java/Board.java b/src/main/java/Board.java new file mode 100644 index 0000000..8787a77 --- /dev/null +++ b/src/main/java/Board.java @@ -0,0 +1,58 @@ +import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class Board { + + final List digits; + + public Board(List digits) { + this.digits = digits; + } + + public Stream> rows() { + return IntStream.range(0, 9).boxed() + .map(this::row); + } + + Stream row(int row) { + return IntStream.range(0, 9).boxed() + .map(column -> digit(row, column)); + } + + public Stream> columns() { + return IntStream.range(0, 9).boxed() + .map(this::column); + } + + Stream column(int column) { + return IntStream.range(0, 9).boxed() + .map(row -> digit(row, column)); + } + + Stream> squares() { + return IntStream.range(0, 3).boxed() + .flatMap(this::squares); + } + + private Stream> squares(int squareRow) { + return IntStream.range(0, 3).boxed() + .map(squareColumn -> square(squareRow, squareColumn)); + } + + private Stream square(int squareRow, int squareColumn) { + return IntStream.range(squareRow*3, squareRow*3+3).boxed() + .flatMap(row -> squareDigitsInRow(row, squareColumn)); + } + + Stream squareDigitsInRow(int row, int squareColumn) { + return IntStream.range(squareColumn*3, squareColumn*3+3).boxed() + .map(column -> digit(row, column)); + } + + String digit(int row, int column) { + int idx = row * 9 + column; + return digits.get(idx); + } + +} diff --git a/src/main/java/Solution.java b/src/main/java/Solution.java index 5615be4..e09c879 100644 --- a/src/main/java/Solution.java +++ b/src/main/java/Solution.java @@ -1,20 +1,21 @@ -import java.util.*; -import java.io.*; -import java.math.*; +import java.util.List; +import java.util.Scanner; +import java.util.Spliterator; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; /** - * Template code to help you parse the standard input - * according to the problem statement. - **/ + * Solution involving a Sukdoku Board, a SudokuVerifier, plus some Stream processing. +**/ class Solution { public static void main( String[] args ) { Scanner in = new Scanner( System.in ); - // read values with in.next...() methods - - // code your solution here - - // Write result with System.out.println() - System.out.println( "value" ); + Spliterator spliterator = ((Iterable) () -> in).spliterator(); + List digits = (List) StreamSupport.stream(spliterator, false) + .collect(Collectors.toList()); + Board board = new Board(digits); + SudokuVerifier verifier = new SudokuVerifier(); + System.out.println(verifier.isSolved(board)); } } diff --git a/src/main/java/SudokuVerifier.java b/src/main/java/SudokuVerifier.java new file mode 100644 index 0000000..cd4a101 --- /dev/null +++ b/src/main/java/SudokuVerifier.java @@ -0,0 +1,19 @@ +import java.util.stream.Stream; + +public class SudokuVerifier { + + public boolean isSolved(Board board) { + return digitStreams(board) + .allMatch(this::isSolved); + } + + Stream> digitStreams(Board board) { + return Stream.of(board.rows(), board.columns(), board.squares()) + .flatMap(s -> s); + } + + boolean isSolved(Stream digitStream) { + return digitStream.distinct().count() == 9; + } + +}