Пример #1
22
 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;
 }
Пример #2
5
 static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary)
 {
     var gen = new CrossGenerator(dictionary, board);
     board.Preprocess(dictionary);
     return gen.Generate().FirstOrDefault();
 }
Пример #3
0
        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 !);
        }
Пример #4
0
 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);
 }
Пример #5
0
        static ICrossBoard GenerateFirstCrossWord(ICrossBoard board, ICrossDictionary dictionary)
        {
            var gen = new CrossGenerator(dictionary, board);

            board.Preprocess(dictionary);
            return(gen.Generate().FirstOrDefault());
        }
Пример #6
0
 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);
 }
Пример #7
0
        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);
        }
Пример #8
0
        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);
                }
            }
        }
Пример #9
0
        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();
        }
Пример #10
0
 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);
     }
 }
Пример #11
0
 public CrossGenerator(ICrossDictionary aDict, ICrossBoard aBoard)
 {
     _dict  = aDict;
     _board = aBoard;
 }
Пример #12
0
 public PuzzlePlacer(ICrossBoard board, string puzzle)
 {
     _board  = board;
     _puzzle = puzzle;
 }
Пример #13
0
 public CrossGenerator(ICrossDictionary aDict, ICrossBoard aBoard)
 {
     _dict = aDict;
     _board = aBoard;
 }
Пример #14
0
        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);
        }
Пример #15
0
 public PuzzlePlacer(ICrossBoard board, string puzzle)
 {
     _board = board;
     _puzzle = puzzle;
 }