static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary, string puzzle) { var placer = new PuzzlePlacer(board, puzzle); var cts = new CancellationTokenSource(); var mre = new ManualResetEvent(false); ICrossBoard successFullBoard = null; foreach (var boardWithPuzzle in placer.GetAllPossiblePlacements(dictionary)) { //boardWithPuzzle.WriteTo(new StreamWriter(Console.OpenStandardOutput(), Console.OutputEncoding) { AutoFlush = true }); var gen = new CrossGenerator(dictionary, boardWithPuzzle); var t = Task.Factory.StartNew(() => { foreach (var solution in gen.Generate()) { successFullBoard = solution; cts.Cancel(); mre.Set(); break; //interested in the first one } }, cts.Token); if (cts.IsCancellationRequested) break; } mre.WaitOne(); return successFullBoard; }
static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary) { var gen = new CrossGenerator(dictionary, board); board.Preprocess(dictionary); return gen.Generate().FirstOrDefault(); }
static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary, string puzzle) { var placer = new PuzzlePlacer(board, puzzle); var cts = new CancellationTokenSource(); var mre = new ManualResetEvent(false); ICrossBoard?successFullBoard = null; foreach (var boardWithPuzzle in placer.GetAllPossiblePlacements(dictionary)) { //boardWithPuzzle.WriteTo(new StreamWriter(Console.OpenStandardOutput(), Console.OutputEncoding) { AutoFlush = true }); var gen = new CrossGenerator(dictionary, boardWithPuzzle); var t = Task.Factory.StartNew(() => { foreach (var solution in gen.Generate()) { successFullBoard = solution; cts.Cancel(); mre.Set(); break; //interested in the first one } }, cts.Token); if (cts.IsCancellationRequested) { break; } } mre.WaitOne(); return(successFullBoard !); }
static void SaveResultToFile(string outputFile, ICrossBoard resultBoard, ICrossDictionary dictionary) { Console.WriteLine("Solution has been found:"); using var writer = new StreamWriter(new FileStream(outputFile, FileMode.Create)); resultBoard.WriteTo(writer); resultBoard.WritePatternsTo(writer, dictionary); }
static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary) { var gen = new CrossGenerator(dictionary, board); board.Preprocess(dictionary); return(gen.Generate().FirstOrDefault()); }
static void CreateCross(ICrossBoard cb) { const int sizex = 11; const int sizey = 15; cb.SetBoardSize(sizex, sizey); for (int i = 0; i < sizey; i++) { cb.AddStartWord(0, i); } for (int i = 1; i < sizex; i++) { cb.AddStartWord(i, 0); } cb.AddStartWord(7, 1); cb.AddStartWord(4, 3); cb.AddStartWord(3, 4); cb.AddStartWord(6, 4); cb.AddStartWord(7, 5); cb.AddStartWord(4, 6); cb.AddStartWord(1, 7); cb.AddStartWord(5, 7); cb.AddStartWord(9, 7); cb.AddStartWord(10, 7); cb.AddStartWord(8, 8); cb.AddStartWord(3, 9); cb.AddStartWord(6, 9); cb.AddStartWord(4, 10); cb.AddStartWord(7, 10); cb.AddStartWord(8, 11); cb.AddStartWord(5, 12); cb.AddStartWord(6, 13); cb.AddStartWord(6, 14); cb.AddStartWord(10, 14); }
private static IEnumerable <ICrossBoard> GenerateCrossWords(ICrossBoard board, ICrossDictionary dictionary, string puzzle, CancellationToken cancellationToken) { if (puzzle != null) { var placer = new PuzzlePlacer(board, puzzle); foreach (var boardWithPuzzle in placer.GetAllPossiblePlacements(dictionary)) { cancellationToken.ThrowIfCancellationRequested(); var gen = new CrossGenerator(dictionary, boardWithPuzzle); // limit int generatedCount = 0; var generated = gen.Generate(); foreach (var solution in generated) { cancellationToken.ThrowIfCancellationRequested(); generatedCount++; if (generatedCount >= MAX_GENERATOR_COUNT) { break; } yield return(solution); } } } else { var gen = new CrossGenerator(dictionary, board); board.Preprocess(dictionary); var crosswords = gen.Generate(); // limit int generatedCount = 0; foreach (var resultBoard in crosswords) { cancellationToken.ThrowIfCancellationRequested(); generatedCount++; if (generatedCount >= MAX_GENERATOR_COUNT) { break; } yield return(resultBoard); } } }
public static async Task GenerateCrosswordsAsync(ICrossBoard board, ICrossDictionary dictionary, string puzzle, CancellationToken cancellationToken) { // Keep trying to until we can start HubConnection hubConnection = null; while (true) { hubConnection = new HubConnectionBuilder() .WithUrl("http://localhost:8000/crosswordsignalrhub") .ConfigureLogging(logging => { logging.SetMinimumLevel(LogLevel.Information); logging.AddConsole(); }) .Build(); try { await hubConnection.StartAsync(); break; } catch (Exception) { await Task.Delay(1000); } } try { var generated = GenerateCrossWords(board, dictionary, puzzle, cancellationToken); int generatedCount = 0; foreach (var curCrossword in generated) { generatedCount++; var cb = curCrossword as CrossBoard; var crossWordModel = cb.ToCrossWordModel(dictionary); crossWordModel.Title = "Generated crossword number " + generatedCount; await hubConnection.InvokeAsync("SendCrossword", "Client", crossWordModel, cancellationToken); // await Task.Delay(100); // this makes the generation slower, can be removed break; } } catch (OperationCanceledException) { // Cancel and timeout logic } await hubConnection.DisposeAsync(); }
static void SaveResultToFile(string outputFile, ICrossBoard resultBoard, ICrossDictionary dictionary) { Console.WriteLine("Solution has been found:"); using (var writer = new StreamWriter(new FileStream(outputFile, FileMode.Create))) { resultBoard.WriteTo(writer); resultBoard.WritePatternsTo(writer, dictionary); } }
public CrossGenerator(ICrossDictionary aDict, ICrossBoard aBoard) { _dict = aDict; _board = aBoard; }
public PuzzlePlacer(ICrossBoard board, string puzzle) { _board = board; _puzzle = puzzle; }
private CrossBoard GetCrossboard() { ICrossBoard board = null; // var template = GetRandomCrosswordTemplateFromDb(); CrosswordTemplate template = null; if (template != null) { board = new CrossBoard(); int cols = (int)template.Cols; int rows = (int)template.Rows; board.SetBoardSize(cols, rows); int n = 0; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { var val = template.Grid[n]; if (val == ".") { board.AddStartWord(col, row); } n += 1; } } // debug the generated template // using (StreamWriter writer = new StreamWriter("template.txt")) // { // board.WriteTemplateTo(writer); // } } else { var model = CrossBoardCreator.GetCrossWordModelFromUrl("http-random"); board = model.ToCrossBoard(); // add in database var newTemplate = new CrosswordTemplate() { Rows = model.Size.Rows, Cols = model.Size.Cols, Grid = model.Grid }; db.CrosswordTemplates.Add(newTemplate); db.SaveChanges(); } var gen = new CrossGenerator(dictionary, board); board.Preprocess(dictionary); var generated = gen.Generate().FirstOrDefault() as CrossBoard; return(generated); }