Tag Archive: c#


Esta é uma solução em C# para o problema PRIME 1 no SPOJ que consiste em calcular todos os números primos dentro de certos intervalos (mais info. http://spoj.pl/problems/PRIME1).Resolvi com um crivo de erastótenes levemente modificado, já com primos tabelados até 31627 (menor inteiro que é >= raiz quadrada de 1.000.000.000), já pulando os números pares e checando na tabela só até a raiz de N, para cada N no intervalo passado ao programa. Ainda há uma tentativa de paralelizar a operação, mas que não surtiu efeito no SPOJ, provavelmente o sistema deles roda a aplicação em uma CPU somente. Tentei procurar o mínimo possível na net de forma a botar a cuca pra funfar, a única coisa que utilizei da internet foi o teoreminha da raiz quadrada de N. O próximo passo será tentar acelerar o cálculo utilizando testes estatísticos de primalidade, mas para isso precisarei implementar um modulozinho de matemática de precisão arbitrária, o que já é mtos outros posts 😉 Execução no SPOJ levou 2,75 segundos e 25MB de memória. (A maior parte da memória é o runtime, gordo, que usa.)

Continue lendo

Anúncios

Se você estiver programando uma aplicação que use os vários IPs disponíveis na máquina para sair, seja usando as facilidades da classe ServicePoint, ou com Socket.Bind(), ou com alguma outra biblioteca por exemplo a LibCurl, e não estiver funcionando legal, é interessante isolar se o problema é com as configurações de sua rede ou na aplicação em si.

Screenshot

Screenshot do TestadorIPs

TestadorIPs é um aplicativo para testar isto. Muito simples e com apenas 421 linhas de código, interface gráfica feita em Gtk# (testado apenas no Mono), funcionando tanto no Windows quanto no Linux, e comprovada a eficácia através do sniffer Wireshark. Para a troca do IP utilizado nas conexões de saída são utilizadas as facilidades do BindIPEndPointDelegate da classe ServicePoint, do próprio Framework; as conexões são feitas utilizando a classe WebClient e para atestar o IP utilizado para sair, utilizado o site http://www.meuip.com.br. Baixe e na pasta correspondente a seu sistema operacional, rode o executável TestadorIPs.exe. Para rodar no Windows é necessário ter instalado as bibliotecas do Gtk# 2.12 (http://ftp.novell.com/pub/mono/gtk-sharp/gtk-sharp-2.12.10.win32.msi) .

Binários e código-fonte (compilado no Mono 2.6.7, solução do MonoDevelop 2.4): http://db.tt/xBCaeSF

O .NET já tem embutido uma facilidade para compressão de dados com algoritmo Deflate e Gzip. Neste exemplo mostrarei como compactar e descompactar dados com Deflate, mas com GzipStream o processo é o mesmo.

A princípio parece complicado realizar essa compactação utilizando streams, mas na realidade é bem simples. O DeflateStream é um wrapper stream, ele envolve um outro stream que é onde os dados serão salvos; você grava os dados no DeflateStream, o DeflateStream grava compactado no stream de destino. Para descompactar, o processo é o inverso, você lê do DeflateStream, e o DeflateStream lê do stream de origem realizando a descompactação on-the-fly.

Para exemplificar o processo, deixo aqui dois métodos, um que realiza a compactação de um array de bytes através do DeflateStream e do MemoryStream, e um que faz a descompactação.

private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read(buffer, 0, buffer.Length);
if (read <= 0) return;
output.Write(buffer, 0, read);
}
}

public static byte[] Compactar(byte[] arrayOrigem)
{
byte[] arrayComprimido;
using (MemoryStream origem = new MemoryStream(arrayOrigem, false))
{
using (MemoryStream destino = new MemoryStream())
{
using (DeflateStream compress = new DeflateStream(destino, CompressionMode.Compress))
{
CopyStream(origem, compress);
}
arrayComprimido = destino.ToArray();
}
}
return arrayComprimido;
}

public static byte[] Descompactar(byte[] arrayOrigem)
{
byte[] arrayDescomprimido;
using (MemoryStream origem = new MemoryStream(arrayOrigem, false))
{
using (MemoryStream destino = new MemoryStream())
{
using (DeflateStream decompress = new DeflateStream(origem, CompressionMode.Decompress))
{
CopyStream(decompress, destino);
}
arrayDescomprimido = destino.ToArray();
}
}
return arrayDescomprimido;
}

Pegando seu IP externo em C#

Às vezes você precisa saber qual IP sua aplicação está usando para sair para a internet, principalmente quando uma máquina tem vários IPs.
Este métodozinho foguete usa o site www.meuip.com.br para pegar seu IP de saída:

public static string PegarIPExterno()
        {
            System.Net.WebClient t = new System.Net.WebClient();
            string meuip = t.DownloadString("http://meuip.datahouse.com.br");
            return meuip
                .Substring(
                meuip.IndexOf("o Meu IP? ") + "o Meu IP? ".Length,
                meuip.IndexOf("</title>") - meuip.IndexOf("o Meu IP? ")
                - "o Meu IP? ".Length);
        }

Calculando MD5 sums em C#

O .NET já tem embutido um hasher MD5, mas ele gera array de bytes, e não aquela string hexadecimal bonitinha (ex. 7285a29ee745d94a6335d0d986438bad).

Segue então uma classezinha foguete que faz isso:

public static class CalculadoraHash

{

public static string CalcularMD5 (string caminho)

{

FileStream fs = new System.IO.FileInfo (caminho).OpenRead ();

try

{

MD5 md5 = new MD5CryptoServiceProvider ();

// Constrói a string final convertendo cada byte para hex

// e colocando numa string

string resultado = "";

foreach (byte b in md5.ComputeHash (fs)) {

resultado += b.ToString ("x2");

}

return resultado;

}

finally

{

fs.Close ();

}

}

}