Condividi:        

Sudoku: Perl to C to Java

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Anthony47, Triumph Of Steel, archimede

Postdi disgrazia » 17/11/05 21:04

Sono qui ;) purtroppo la mia esperienza con Visual Basic è pari a zero, non ti posso essere d'aiuto questa volta :(
disgrazia
Download Admin
 
Post: 708
Iscritto il: 08/07/02 22:16

Sponsor
 

Sudoku Excel

Postdi infinito1971 » 12/12/05 10:47

Ciao a tutti,
sto riguardando il codice VB che ho scritto e di cui non ho ancora portato a compimento il debug... :(
L'ho modificato in modo tale da poterlo inserire in Excel come codice di una macro... nella cella A1 metto il testo:
012504870040000000750016423504108730020050040003409500480005017000000000235701690

nella cella A2 inserisco come formula:
=Sudoku(A1)

Il codice della macro l'ho modificato come segue:
Codice: Seleziona tutto
' use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
' ==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
' $i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R

Private Function Sudoku(A As String) As String
    Dim t(10) As Integer
    Dim i As Integer, j As Integer
   
    For i = 0 To 80
        If Mid(A, i + 1, 1) = "0" Then
            For j = 0 To 9
                t(j) = 0
            Next
            For j = 0 To 80
                t(IIf(Int(j / 9) = Int(i / 9) Or Int(j Mod 9) = Int(i Mod 9) Or Int(j / 27) = Int(i / 27) And Int(j Mod 9 / 3) = Int(i Mod 9 / 3), Asc(Mid(A, j + 1, 1)) - 48, 0)) = 1
            Next
            For j = 1 To 9
                If t(j) = 0 Then
                    If i = 0 Then
                        A = Trim(Str(j)) & Right(A, 80)
                    ElseIf i = 80 Then
                        A = Left(A, 80) & Trim(Str(j))
                    Else
                        A = Left(A, i) & Trim(Str(j)) & Right(A, 80 - i)
                    End If
                    Call Sudoku(A)
                End If
            Next
            If i = 0 Then
                A = "0" & Right(A, 80)
            ElseIf i = 80 Then
                A = Left(A, 80) & "0"
            Else
                A = Left(A, i) & "0" & Right(A, 80 - i)
            End If
            Exit Function
        End If
    Next
    Sudoku = A
End Function

Qualcuno mi vuole aiutare a terminare l'opera iniziata?!? :roll:
Forza ragazzi, fatevi avanti e datemi una mano... ;)

Saluti,
infinito1971
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Sudoku Excel

Postdi infinito1971 » 13/12/05 12:15

Ciao a tutti,
modificando il codice precedente come segue, viene restituito un valore errato... :roll:
Codice: Seleziona tutto
' use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
' ==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
' $i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R

Dim i As Integer

Private Function Sudoku(A As String) As String
    Dim t(10) As Integer
    Dim j As Integer
   
    For i = 0 To 80
        If Mid(A, i + 1, 1) = "0" Then
            For j = 0 To 9
                t(j) = 0
            Next
            For j = 0 To 80
                t(IIf(Int(j / 9) = Int(i / 9) Or Int(j Mod 9) = Int(i Mod 9) Or Int(j / 27) = Int(i / 27) And Int(j Mod 9 / 3) = Int(i Mod 9 / 3), Asc(Mid(A, j + 1, 1)) - 48, 0)) = 1
            Next
            For j = 1 To 9
                If t(j) = 0 Then
                    If i = 0 Then
                        A = Trim(Str(j)) & Right(A, 80)
                    ElseIf i = 80 Then
                        A = Left(A, 80) & Trim(Str(j))
                    Else
                        A = Left(A, i) & Trim(Str(j)) & Right(A, 80 - i)
                    End If
                    Call Sudoku(A)
                End If
            Next
            If i = 0 Then
                A = "0" & Right(A, 80)
            ElseIf i = 80 Then
                A = Left(A, 80) & "0"
            Else
                A = Left(A, i) & "0" & Right(A, 80 - i)
            End If
            Exit Function
        End If
    Next
    Sudoku = A
    MsgBox A
End Function

Credo di essere vicino alla soluzione ma essendo la funzione ricorsiva è davvero complicato capire dov'è il problema... :(

Un saluto,
infinito1971
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Sudoku in VisualBasic per Excel

Postdi infinito1971 » 16/12/05 09:46

Ciao a tutti,
finalmente ce l'ho fatta!!! 8)
Con un pò di tempo a disposizione e dopo un attento debug, effettuando qualche modifica, sono riuscito a realizzare la versione funzionante in Visual Basic.
Riporto il codice di seguito e, come prossimo sviluppo, mi propongo di realizzarne una versione anche per i seguenti linguaggi: Java, C# e Visual Basic .NET.

Un saluto,
ininito1971



P.S. ho visto che il codice proposto non funziona con OpenOffice... sto cercando di capire il motivo... :roll:

Codice: Seleziona tutto
' use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
' ==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
' $i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R

Dim Soluzione As String

Private Function Sudoku(A As String) As String
    Dim t(10) As Integer
    Dim i As Integer, j As Integer
   
    For i = 0 To 80
        If Mid(A, i + 1, 1) = "0" Then
            For j = 0 To 9
                t(j) = 0
            Next
            For j = 0 To 80
                t(IIf(Int(j / 9) = Int(i / 9) Or Int(j Mod 9) = Int(i Mod 9) Or Int(j / 27) = Int(i / 27) And Int((j Mod 9) / 3) = Int((i Mod 9) / 3), Asc(Mid(A, j + 1, 1)) - 48, 0)) = 1
            Next
            For j = 1 To 9
                If t(j) = 0 Then
                    If i = 0 Then
                        A = Trim(Str(j)) & Right(A, 80)
                    ElseIf i = 80 Then
                        A = Left(A, 80) & Trim(Str(j))
                    Else
                        A = Left(A, i) & Trim(Str(j)) & Right(A, 80 - i)
                    End If
                    If Soluzione = "" Then
                        A = Sudoku(A)
                    End If
                End If
            Next
            If i = 0 Then
                A = "0" & Right(A, 80)
            ElseIf i = 80 Then
                A = Left(A, 80) & "0"
            Else
                A = Left(A, i) & "0" & Right(A, 80 - i)
            End If
            If Soluzione = "" Then
                Sudoku = A
            Else
                Sudoku = Soluzione
            End If
            Exit Function
        End If
    Next
    Soluzione = A
End Function
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Sudoku in c#

Postdi infinito1971 » 21/12/05 12:21

Ciao a tutti,
ecco, come promesso, una nuova conversione... :)
Questa volta ho provveduto a riscrivere il codice in c#
Riporto di seguito il codice! 8)

Un saluto,
infinito1971

Codice: Seleziona tutto
using System;

/*
use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
$i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R
*/

namespace Sudoku
{
   class MainClass
   {
      static char[] A = new char[80];
      
      static void R()
      {
         int[] t = new int[10];
            int i,j;

            for (i=0; i<81; i++)
               {
               if (A[i] == '0')
                  {
                     for (j=0; j<10; j++)
                           t[j]=0;
                     for (j=0; j<81; j++)
                  {
                        t[
                              j / 9 == i / 9
                             || j % 9 == i % 9
                             || j / 27 == i / 27 && j % 9 / 3 == i % 9 / 3
                             ? A[j] - 48
                              : 0] = 1;
                  }
                     for (j=1; j<10; j++)
                     {
                        if (t[j]==0)
                           {
                           A[i] = (char)(48 + j);
                              R();
                           }
                     }
                     A[i] = '0';
                     return;
                  }
               }
            Console.WriteLine(A);
      }

      public static void Main(string[] args)
      {   
         A = Console.ReadLine().ToCharArray();
         R();
      }
   }
}
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Postdi bammargera32 » 19/01/06 18:56

ciao....ho provato a far girare il file sudoku.c realizzato prima ma non riesco a farlo andare...mi potete dire xke?
bammargera32
Newbie
 
Post: 1
Iscritto il: 19/01/06 18:45

Compilazione Sudoku

Postdi infinito1971 » 20/01/06 09:59

Ciao bammargera32,
allora, la versione che devi prendere è quella datata 21/10/05 10:38 con oggetto: Versione Finale.
Per compilare il codice, se usi il compilatore Microsoft Visual C++, va bene così com'è, altrimenti se usi un compilatore C, devi togliere le prime 4 righe ed il codice inizierebbe con l'istruzione:
Codice: Seleziona tutto
#include <stdio.h>

Per provarlo, una volta compilato, lancia il comando:

Sudoku 012504870040000000750016423504108730020050040003409500480005017000000000235701690

Il risultato dovrebbe essere:

612534879349287165758916423594128736827653941163479582486395217971862354235741698

Se hai ancora difficoltà fammi sapere.

Saluti,
infinito1971
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Postdi mikecodadilupo » 03/11/07 18:02

ciao....ho provato il codice ma il mio compilatore dev-c++ non possiede la libreria stdafx.h

dove posso prenderla?? e una volta presa in quale cartella devo ricopiarla??

grazie mille
mikecodadilupo
Utente Junior
 
Post: 38
Iscritto il: 18/04/06 10:52

Postdi zello » 06/11/07 08:57

Ti ri-quoto infinito1971
Per compilare il codice, se usi il compilatore Microsoft Visual C++, va bene così com'è, altrimenti se usi un compilatore C, devi togliere le prime 4 righe ed il codice inizierebbe con l'istruzione:
Codice: Seleziona tutto
#include <stdio.h>


stdafx.h è un'inclusione del visual c++ - se ricordo bene, per gli header precompilati - che peraltro io tendo accuratamente ad evitare (un header non standard prima di tutti gli headers standard? Ottima pratica di programmazione. Aspetta che qualcuno ci piazzi dentro una ridefinizione di una macro standard, e vedi quanto tempo ci si mette a trovare l'errore).
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Sudoku in Java

Postdi infinito1971 » 08/11/07 12:17

Ciao a tutti,
visto che avete ripescato questo vecchio topic, ne approfitto per proporre anche la versione Java di tale programma, facendo notare quanto minime sono le differenze con la versione scritta in C#... ciò la dice lunga su quanto Microsoft abbia attinto da Java per la definizione di tale linguaggio!

Un saluto,
infinito1971

Codice: Seleziona tutto
/*
use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
$i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R
*/

public class Sudoku {

   static char[] A = new char[80];
   
   static void R()
   {
      int[] t = new int[10];
         int i,j;

         for (i=0; i<81; i++)
           {
            if (A[i] == '0')
              {
                 for (j=0; j<10; j++)
                       t[j]=0;
                 for (j=0; j<81; j++)
              {
                    t[
                          j / 9 == i / 9
                         || j % 9 == i % 9
                         || j / 27 == i / 27 && j % 9 / 3 == i % 9 / 3
                         ? A[j] - 48
                          : 0] = 1;
              }
                 for (j=1; j<10; j++)
                 {
                    if (t[j]==0)
                       {
                       A[i] = (char)(48 + j);
                          R();
                       }
                 }
                 A[i] = '0';
                 return;
              }
           }
         System.out.println(A);
   }

   public static void main(String[] args) {
      A=args[0].toCharArray();
      R();
   }
}
Questo business è binario: o sei 1 o sei 0, vivo o morto, non esistono secondi classificati!
Avatar utente
infinito1971
Utente Senior
 
Post: 532
Iscritto il: 01/08/02 21:22
Località: Napoli

Precedente

Torna a Programmazione


Topic correlati a "Sudoku: Perl to C to Java":

[Java] Stampare a video
Autore: karug64
Forum: Programmazione
Risposte: 1

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti