none
Anagramas

    Question

  • Olá pessoal, boa tarde.

    Estou sem o que fazer, tive uma ideia, só que estou com dificuldades para executa-la. Pensei em uma aplicação no estilo de anagramas, onde eu consiga obter diversas formas da mesma palavra, por exemplo:

    Se no meu textbox eu digitar: "123", quero que me mostre as possibilidades de mistura entre elas:

    "123";
    "213"; 
    "321";
    "132"; 
    "231";
    "312";

    Alguem conhece algum algoritmo ou função para fazer esse embaralhamento? É possível fazer?

    Até, abraços.


    Luige C. Salvi (17) | 9224-9335 Web Designer Júnior Microsoft .NET Developer Júnior OPS® Comunicação e Comércio Eletrônico

    Wednesday, February 22, 2012 7:35 PM

Answers

  • Ok.. aqui o mesmo codigo no VB

    Public Class Form1
    
        
    
        '
        ' Created by SharpDevelop.
        ' User: TriW
        ' Date: 2012-02-23
        ' Time: 09:01
        ' 
        ' To change this template use Tools | Options | Coding | Edit Standard Headers.
        '
    
        Private anagramas As New List(Of String)()
        Public Sub New()
            Me.InitializeComponent()
        End Sub
        
        Private Sub Button1Click(sender As Object, e As EventArgs) Handles Button1.Click
            anagramas.Clear()
            Anagrama(TextBox1.Text)
            TextBox2.Text = ""
    
            For Each anagrama__1 As [String] In anagramas
                TextBox2.Text += anagrama__1 & vbCr & vbLf
            Next
        End Sub
    
        ' cria todos os anagramas da palavra envia em STR
        Public Sub Anagrama(Str As String)
            Anagrama(Str, Str.Length)
        End Sub
    
        ' Metodo recuricivo de permutaçoes circulares
        Public Sub Anagrama(ByRef Str As String, Lg As Integer)
            If Lg = 1 Then
                If Not anagramas.Contains(Str) Then
                    anagramas.Add(Str)
                End If
            Else
                Dim strTmp As String = Str
                For i As Integer = 0 To Lg - 1
                    strTmp = strTmp.Substring(1, Lg - 1) & strTmp(0) & strTmp.Substring(Lg)
                    Anagrama(strTmp, Lg - 1)
                Next
            End If
        End Sub
    
    End Class
    
    
    
    
    

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    Thursday, February 23, 2012 2:20 PM

All replies

  • se a pergunta foi mesmo "se é possivel fazer", sim, é possivel.

    se a pergunta foi "como é que faz", aí terá de quebrar cuca mesmo

    Wednesday, February 22, 2012 7:39 PM
  • Veja este codigo:

    // cria todos os anagramas da palavra envia em STR
    public void Anagramme(string Str) { Anagramme(ref Str,Str.Length); } // Metodo recuricivo de permutaçoes circulares public void Anagramme(ref string Str, int Lg) { if (Lg==1) Console.WriteLine(Str); else { string strTmp=Str;
      for (int i=0;i<Lg;i++)
          {
              strTmp=strTmp.Substring(1,Lg-1) + strTmp[0] + strTmp.Substring(Lg);
              Anagramme(ref strTmp ,Lg-1);
          }
      }
    }

    fonte:http://www.csharpfr.com/codes/ANAGRAMME-MOT_18096.aspx (sim.. em frances)

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée




    Wednesday, February 22, 2012 7:52 PM
  • Amigo segue um exemplo de como fazer isso..

    ****************************************************aspx**********************************************************

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BuscarTabelaCarregarGrid.aspx.cs" Inherits="BuscarTabelaCarregarGrid" %>


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:TextBox ID="TextBox2" runat="server" Height="74px" Width="433px"></asp:TextBox>
            <br />
        </div>
        </form>
    </body>
    </html>

    **************************************************************aspx.cs*********************************************

       

    using System;
    using System.Data;


    public partial class BuscarTabelaCarregarGrid : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack == true)
            {
                Anagramme(TextBox1.Text);
            }
            else
            {
                Anagramme(TextBox1.Text);
            }


        }

     public void recuricivo(ref string teste2, int tamanho)
        {
            if (tamanho == 1)
                Console.WriteLine(teste2);
            else
            {
                string recebe = teste2;
                for (int i = 0; i < tamanho; i++)
                {
                    recebe = recebe.Substring(1, tamanho - 1) + recebe[0] + recebe.Substring(tamanho);
                    recuricivo(ref recebe, tamanho - 1);
                    TextBox2.Text += recebe.ToString() + ";";
                }
            }
        }
    }



    Caso a resposta tenha ajudado favor marcar como respondida.

    • Proposed as answer by Renan Buzzi Thursday, February 23, 2012 3:59 PM
    • Unproposed as answer by Luige César Salvi Thursday, February 23, 2012 8:42 PM
    Wednesday, February 22, 2012 8:29 PM
  • Pessoal, não deu certo, tanto um quanto o outro código não funciona bem, ele está repetindo os resultados, umas duas vezes

    Imagem:

    


    Luige C. Salvi (17) | 9224-9335 Web Designer Júnior Microsoft .NET Developer Júnior OPS® Comunicação e Comércio Eletrônico

    Wednesday, February 22, 2012 9:13 PM
  • Faça assim:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication7
    {
        public partial class Form1 : Form
        {
            List<string> anagramas = new List<string>();
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                anagramas.Clear();
                Anagrama(textBox1.Text);
                textBox2.Text="";
                
                foreach (String anagrama in anagramas)
                    textBox2.Text += anagrama +"\r\n";
            }
    
            // cria todos os anagramas da palavra envia em STR
            public void Anagrama(string Str)
            {
                Anagrama(ref Str, Str.Length);
            }
    
            // Metodo recuricivo de permutaçoes circulares
            public void Anagrama(ref string Str, int Lg)
            {
                if (Lg == 1)
                {
                    if (!anagramas.Contains(Str))
                        anagramas.Add(Str);
                }
                else
                {
                    string strTmp = Str;
                    for (int i = 0; i < Lg; i++)
                    {
                        strTmp = strTmp.Substring(1, Lg - 1) + strTmp[0] + strTmp.Substring(Lg);
                        Anagrama(ref strTmp, Lg - 1);
                    }
                }
            }
    
        }
    }</string></string>

    resultado:

    para 12

    21
    12

    para 123

    321
    231
    132
    312
    213
    123

    para banana

    ananab
    naanab
    aannab
    nanaab
    annaab
    nnaaab
    aananb
    naaanb
    anaanb
    aaannb
    banana
    abnana
    nbaana
    bnaana
    anbana
    nabana
    abanna
    baanna
    aabnna
    anabna
    naabna
    aanbna
    nbanaa
    bnanaa
    anbnaa
    nabnaa
    bannaa
    abnnaa
    nnbaaa
    bnnaaa
    nbnaaa
    annbaa
    nanbaa
    nnabaa
    ananba
    naanba
    aannba
    nanaba
    annaba
    nnaaba
    abanan
    baanan
    aabnan
    nabaan
    anbaan
    bnaaan
    nbaaan
    abnaan
    banaan
    anaban
    naaban
    aanban
    aabann
    baaann
    abaann
    aaabnn
    anaabn
    naaabn
    aanabn
    aaanbn

    O metodo verifica se tem duplicaçoes e as exclui o que pode estar potencialmente errado, visto que "banana" tem  anagramas validos iguais, exemplo, vou numerar as letras: n1 representa o primeiro n e n2 o segundo.. mesma coisa para a1,a2 e a3

    ba1n1a2n2a3 

    entao o "banana" é  anagrama valido de "banana" 

    ba2n2a3n1a1,  ba3n2a1n1a2,  ba2n1a2n2a3, etc..

    Lembre-se anagramas sao permutaçoes simples com repetiçao, que é exatamente n!, ou seja, se sua palavra tem 2 letras =2 se tem 6, entao sao 720 anagramas..e a ocisa piora quanto maior o numero de letras...

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    Wednesday, February 22, 2012 9:39 PM
  • Me desculpa William, mas o código está em C#, estou fazendo em VB.NET, até tentei adaptar, convertendo, mas fica inconsistente e não funciona corretamente. Obrigado.


    Luige C. Salvi (17) | 9224-9335 Web Designer Júnior Microsoft .NET Developer Júnior OPS® Comunicação e Comércio Eletrônico

    Thursday, February 23, 2012 1:26 AM
  • Ok.. aqui o mesmo codigo no VB

    Public Class Form1
    
        
    
        '
        ' Created by SharpDevelop.
        ' User: TriW
        ' Date: 2012-02-23
        ' Time: 09:01
        ' 
        ' To change this template use Tools | Options | Coding | Edit Standard Headers.
        '
    
        Private anagramas As New List(Of String)()
        Public Sub New()
            Me.InitializeComponent()
        End Sub
        
        Private Sub Button1Click(sender As Object, e As EventArgs) Handles Button1.Click
            anagramas.Clear()
            Anagrama(TextBox1.Text)
            TextBox2.Text = ""
    
            For Each anagrama__1 As [String] In anagramas
                TextBox2.Text += anagrama__1 & vbCr & vbLf
            Next
        End Sub
    
        ' cria todos os anagramas da palavra envia em STR
        Public Sub Anagrama(Str As String)
            Anagrama(Str, Str.Length)
        End Sub
    
        ' Metodo recuricivo de permutaçoes circulares
        Public Sub Anagrama(ByRef Str As String, Lg As Integer)
            If Lg = 1 Then
                If Not anagramas.Contains(Str) Then
                    anagramas.Add(Str)
                End If
            Else
                Dim strTmp As String = Str
                For i As Integer = 0 To Lg - 1
                    strTmp = strTmp.Substring(1, Lg - 1) & strTmp(0) & strTmp.Substring(Lg)
                    Anagrama(strTmp, Lg - 1)
                Next
            End If
        End Sub
    
    End Class
    
    
    
    
    

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    Thursday, February 23, 2012 2:20 PM
  • Amigo segue um exemplo de como fazer isso..

    ****************************************************aspx**********************************************************

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BuscarTabelaCarregarGrid.aspx.cs" Inherits="BuscarTabelaCarregarGrid" %>


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:TextBox ID="TextBox2" runat="server" Height="74px" Width="433px"></asp:TextBox>
            <br />
        </div>
        </form>
    </body>
    </html>

    **************************************************************aspx.cs*********************************************

       

    using System;
    using System.Data;


    public partial class BuscarTabelaCarregarGrid : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack == true)
            {
                Anagramme(TextBox1.Text);
            }
            else
            {
                Anagramme(TextBox1.Text);
            }


        }

     public void recuricivo(ref string teste2, int tamanho)
        {
            if (tamanho == 1)
                Console.WriteLine(teste2);
            else
            {
                string recebe = teste2;
                for (int i = 0; i < tamanho; i++)
                {
                    recebe = recebe.Substring(1, tamanho - 1) + recebe[0] + recebe.Substring(tamanho);
                    recuricivo(ref recebe, tamanho - 1);
                    TextBox2.Text += recebe.ToString() + ";";
                }
            }
        }
    }



    Caso a resposta tenha ajudado favor marcar como respondida.

     O resultado para 123 

    fica

    321;231;231;132;312;312;213;123;123; com esse metodo acima..

    Qualquer duvida pergunta ai.


    Caso a resposta tenha ajudado favor marcar como respondida.

    Thursday, February 23, 2012 4:04 PM
  • Cara, não funciona, obtive esse mesmo código quando usei um site para conversão de linguagem, daquele código que postou anteriormente. Teste ai para você ver. Mesmo assim valeu.

    Luige C. Salvi (17) | 9224-9335 Web Designer Júnior Microsoft .NET Developer Júnior OPS® Comunicação e Comércio Eletrônico

    Thursday, February 23, 2012 8:42 PM
  • Testei.. funciona.. olha o screenshot:

    Que erro dá?

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    Thursday, February 23, 2012 8:51 PM
  • Caro William, muitissimo obrigado mesmo. Deu certo agora!

    Abraços.


    Luige C. Salvi (17) | 9224-9335 Web Designer Júnior Microsoft .NET Developer Júnior OPS® Comunicação e Comércio Eletrônico

    Friday, February 24, 2012 12:32 AM