A quem quiser. Com fontes, compilado com o Harbour 3.2.
Algumas descobertas interessantes (criação de DBF em memória RAM, por exemplo), uso intensivo de matrizes, um vetusto "text to file... endtext", apenas um @...get nos programas todos e mouse, clique direito, clique esquerdo, duplo direito, duplo direito, em todo lugar (quem nunca comeu mel... sabe como é, rs...). F1 é help em qualquer lugar.
Um recurso "escondido", quem quiser se arriscar: o sistema escolhe automaticamente os candidatos de cada casa vazia baseando-se na verificação por linha, coluna e grupo. Assim, se há uma casa com o o número "9", por exemplo, o sistema retira das casas na mesma linha, coluna e grupo o "9". F12 na tela de jogar ("escondido" e não documentado) chama uma rotina que verifica se há duas (e apenas duas) casas com os mesmos dois candidatos na mesma linha, coluna ou grupo, e retira de outras casas - desde que ainda vazias - esses dois números da relação de candidatos candidatos. Com pouquinho esforço importa para os DBFs jogos prontos de revistas, jornais, etc... E ainda auxilia na criação de novos jogos.
Em Português do Brasil mas dá para traduzir os TXTs. "cria.txt", "imptxt.txt", "joga.txt" e "notas.txt" (helps) e "sudolang.txt" (mensagens do sistema).
Sudoku
Moderador: Moderadores
Sudoku
Atualização:
"F5: Reiniciar o jogo" não estava zerando o rollback.dbf, o arquivo que guarda cada jogada para se precisar voltar com Ctrl-Z.
Efeito nefasto: Era possível voltar jogadas num jogo sem nenhuma casa preenchida.
Se alguém tiver algum comentário...
E quem quiser claro que pode mudar o que quiser nos fontes. Fico à disposição.
"F5: Reiniciar o jogo" não estava zerando o rollback.dbf, o arquivo que guarda cada jogada para se precisar voltar com Ctrl-Z.
Efeito nefasto: Era possível voltar jogadas num jogo sem nenhuma casa preenchida.
Se alguém tiver algum comentário...
E quem quiser claro que pode mudar o que quiser nos fontes. Fico à disposição.
Sudoku
Nova atualização:
A rotina que calcula os candidatos nas casas "vazias" ("CALCAND()" no arquivo PROCESSA.PRG") não estava sendo chamada desde a carga dos DBFs, e só era chamada depois de feita a primeira jogada. Isso fazia com que antes da primeira jogada, os candidatos das casas vazias estivessem errados (havia candidatos a mais). Foram alterados os programas "JOGAR.PRG" e "CRIAR.PRG".
A rotina que mostra quantos números de cada número já tem no tabuleiro, e quantos ainda faltam ("FALTEM()" no "TELAS.PRG") também foi revista. Agora na relação dos faltantes ("Simbolos pendentes", tanto na tela de jogar quanto na de criar), um número que já tenha sido usado 9 vezes, não aparece como "Faltam 0 do número n". Agora não aparece nada sobre esse número na relação de faltantes. Ou seja, na relação de faltantes aparecem apenas os que faltam mesmo.
Quem quiser atualizar-se...
Agradeço a quem já "catou" o programa.
E se alguém quiser comentar algo, fico mais agradecido ainda.
A rotina que calcula os candidatos nas casas "vazias" ("CALCAND()" no arquivo PROCESSA.PRG") não estava sendo chamada desde a carga dos DBFs, e só era chamada depois de feita a primeira jogada. Isso fazia com que antes da primeira jogada, os candidatos das casas vazias estivessem errados (havia candidatos a mais). Foram alterados os programas "JOGAR.PRG" e "CRIAR.PRG".
A rotina que mostra quantos números de cada número já tem no tabuleiro, e quantos ainda faltam ("FALTEM()" no "TELAS.PRG") também foi revista. Agora na relação dos faltantes ("Simbolos pendentes", tanto na tela de jogar quanto na de criar), um número que já tenha sido usado 9 vezes, não aparece como "Faltam 0 do número n". Agora não aparece nada sobre esse número na relação de faltantes. Ou seja, na relação de faltantes aparecem apenas os que faltam mesmo.
Quem quiser atualizar-se...
Agradeço a quem já "catou" o programa.
E se alguém quiser comentar algo, fico mais agradecido ainda.
-
Claudio Soto
- Colaborador

- Mensagens: 566
- Registrado em: 27 Ago 2012 12:31
- Localização: Uruguay
- Contato:
Sudoku
Solo como curiosidad cualquier Sudoku se puede crear o resolver fácilmente con programación matemática:
http://www.hmgforum.com/viewtopic.php?f ... 38&#p10324
http://www.hmgforum.com/viewtopic.php?f ... 38&#p10324
Sudoku
Muito interessante esse método matemático, Dr. Soto!
Tomei a liberdade de incorporar à fonte dessa brincadeira que esyou fazendo ("PRIMJOGO.PRG") os 10 primeiros exemplos concedidos por Rathinagiri a você tomando também o cuidado de dar ao Sr. e a seu colaborador os devidos créditos. São exemplos muito bons e estimulantes, com dificuldade crescente entre eles, mas posso retirá-los se assim o Sr desejar.
Quanto ao método matemático, comecei a dar uma olhada hoje (eu não conhecia nem o LINGO nem o MPL/CPLEX) e a mim me pareceram modelos muito complexos.
A array, a que chamo de "casas{}", contempla em uma linha para cada casa (cell), 9 colunas:
1 - flag
2 - número fixo ou "pista", o número dado como orientação para descoberta dos outros
3 - números candidatos
4 - a linha da casa (de A a I, convertidos em números, de 1 a 9, para facilitar nas verreduras for...next)
5 - a coluna da casa (de 1 a 9)
6 - o grupo (ou região) da casa (de 1 a 9)
7 - a posição da casa no grupo (de 1 a 9)
8 - a linha da casa na tela do programa (de 3 a 19, em passos de 2)
9 - a coluna da casa na tela do programa (de 5 a 37 em passos de 4)
Isto está no fonte "CASAS.PRG", função "CRIACASAS()".
A coluna "flag" serve tanto para indicar se a casa é fixa quanto se deve assumir cor destacada no caso de haver coincidência de conteúdo entre ela e uma outra casa na mesma linha, coluna ou grupo.
O método que uso para apurar as casas "vazias", por enquanto são dois (e ambos do chamado "brute-force algorith"):
1 - retirar de casas [n][3] os candidatos já colocados na mesma linha, coluna ou grupo dessa casa
2 - em havendo 2 (e apenas 2) casas na mesma linha, coluna ou grupo com exatamente os mesmos 2 (e apenas 2) candidatos, retirar das outras 7 casas[n][3], se houverem, esses dois números.
Quem faz isso são duas funções do "PROCESSA.PRG": "calcand()" trata do método 1 acima, e "tiradois()", do 2, através de for...next, do uso da macrosubstituição (&) e da função "ascan()".
Estou agora trabalhando em métodos que envolvem comparações entre 3 casas... se numa mesma linha (coluna ou grupo) há 3 casas com exatamente os mesmos 3 candidatos, esses 3 números serão retirados do rol de candidatos das demais 6 casa da mesma linha (coluna ou grupo). Vamos ver...
Por ora, agradeço sua contribuição e parabenizo-o pela aplicação inusitada da LP no Sudoku.
Um abraço!
Alterações: contribuições do Dr. Claudio Soto ("PRIMJOGO.PRG") e pequenas correções (por exemplo, foi retirada a mudança automática de casa após a digitação de valor à ela, como se fossem, as casas, uma sequência de "@...get"s, na tela de criação de novos jogos. Agora o cursor permanece na casa preenchida.)
Uma questão a quem está tendo a gentileza de xeretar esse "Sudoku": quando se preenche uma casa vazia com um número que já consta da mesa linha, coluna ou grupo, o programa "denuncia" a duplicidade destacando-a em cores. Mas só mantém o destaque até a próxima jogada, assumindo que se o usuário quer mesmo manter a duplicidade, tudo bem... da mesma forma como se faz no jogo em papel. Na jogada seguinte o programa retira tais cores-destaque dessas casas. Seria interessante manter as casas em duplicidade destacadas até que a duplicidade fosse resolvida? Ou ainda, que se pudesse escolher, como se escolhe "Verimode" ou a impossibilidade de alterar casas-pista, se se deseja jogar mantendo esse destaque ou não.
Grato!
Tomei a liberdade de incorporar à fonte dessa brincadeira que esyou fazendo ("PRIMJOGO.PRG") os 10 primeiros exemplos concedidos por Rathinagiri a você tomando também o cuidado de dar ao Sr. e a seu colaborador os devidos créditos. São exemplos muito bons e estimulantes, com dificuldade crescente entre eles, mas posso retirá-los se assim o Sr desejar.
Quanto ao método matemático, comecei a dar uma olhada hoje (eu não conhecia nem o LINGO nem o MPL/CPLEX) e a mim me pareceram modelos muito complexos.
A array, a que chamo de "casas{}", contempla em uma linha para cada casa (cell), 9 colunas:
1 - flag
2 - número fixo ou "pista", o número dado como orientação para descoberta dos outros
3 - números candidatos
4 - a linha da casa (de A a I, convertidos em números, de 1 a 9, para facilitar nas verreduras for...next)
5 - a coluna da casa (de 1 a 9)
6 - o grupo (ou região) da casa (de 1 a 9)
7 - a posição da casa no grupo (de 1 a 9)
8 - a linha da casa na tela do programa (de 3 a 19, em passos de 2)
9 - a coluna da casa na tela do programa (de 5 a 37 em passos de 4)
Isto está no fonte "CASAS.PRG", função "CRIACASAS()".
A coluna "flag" serve tanto para indicar se a casa é fixa quanto se deve assumir cor destacada no caso de haver coincidência de conteúdo entre ela e uma outra casa na mesma linha, coluna ou grupo.
O método que uso para apurar as casas "vazias", por enquanto são dois (e ambos do chamado "brute-force algorith"):
1 - retirar de casas [n][3] os candidatos já colocados na mesma linha, coluna ou grupo dessa casa
2 - em havendo 2 (e apenas 2) casas na mesma linha, coluna ou grupo com exatamente os mesmos 2 (e apenas 2) candidatos, retirar das outras 7 casas[n][3], se houverem, esses dois números.
Quem faz isso são duas funções do "PROCESSA.PRG": "calcand()" trata do método 1 acima, e "tiradois()", do 2, através de for...next, do uso da macrosubstituição (&) e da função "ascan()".
Estou agora trabalhando em métodos que envolvem comparações entre 3 casas... se numa mesma linha (coluna ou grupo) há 3 casas com exatamente os mesmos 3 candidatos, esses 3 números serão retirados do rol de candidatos das demais 6 casa da mesma linha (coluna ou grupo). Vamos ver...
Por ora, agradeço sua contribuição e parabenizo-o pela aplicação inusitada da LP no Sudoku.
Um abraço!
Alterações: contribuições do Dr. Claudio Soto ("PRIMJOGO.PRG") e pequenas correções (por exemplo, foi retirada a mudança automática de casa após a digitação de valor à ela, como se fossem, as casas, uma sequência de "@...get"s, na tela de criação de novos jogos. Agora o cursor permanece na casa preenchida.)
Uma questão a quem está tendo a gentileza de xeretar esse "Sudoku": quando se preenche uma casa vazia com um número que já consta da mesa linha, coluna ou grupo, o programa "denuncia" a duplicidade destacando-a em cores. Mas só mantém o destaque até a próxima jogada, assumindo que se o usuário quer mesmo manter a duplicidade, tudo bem... da mesma forma como se faz no jogo em papel. Na jogada seguinte o programa retira tais cores-destaque dessas casas. Seria interessante manter as casas em duplicidade destacadas até que a duplicidade fosse resolvida? Ou ainda, que se pudesse escolher, como se escolhe "Verimode" ou a impossibilidade de alterar casas-pista, se se deseja jogar mantendo esse destaque ou não.
Grato!
