terça-feira, 5 de agosto de 2008

TopCoder -> Pratice Room -> SRMs -> SRM 144 DIV 1

Problem Statement

Let's say you have a binary string such as the following:
011100011
One way to encrypt this string is to add to each digit the sum of its adjacent digits. For example, the above string would become:
123210122
In particular, if P is the original string, and Q is the encrypted string, then Q[i] = P[i-1] + P[i] + P[i+1] for all digit positions i. Characters off the left and right edges of the string are treated as zeroes.
An encrypted string given to you in this format can be decoded as follows (using 123210122 as an example):
Assume P[0] = 0.
Because Q[0] = P[0] + P[1] = 0 + P[1] = 1, we know that P[1] = 1.
Because Q[1] = P[0] + P[1] + P[2] = 0 + 1 + P[2] = 2, we know that P[2] = 1.
Because Q[2] = P[1] + P[2] + P[3] = 1 + 1 + P[3] = 3, we know that P[3] = 1.
Repeating these steps gives us P[4] = 0, P[5] = 0, P[6] = 0, P[7] = 1, and P[8] = 1.
We check our work by noting that Q[8] = P[7] + P[8] = 1 + 1 = 2. Since this equation works out, we are finished, and we have recovered one possible original string.
Now we repeat the process, assuming the opposite about P[0]:
Assume P[0] = 1.
Because Q[0] = P[0] + P[1] = 1 + P[1] = 0, we know that P[1] = 0.
Because Q[1] = P[0] + P[1] + P[2] = 1 + 0 + P[2] = 2, we know that P[2] = 1.
Now note that Q[2] = P[1] + P[2] + P[3] = 0 + 1 + P[3] = 3, which leads us to the conclusion that P[3] = 2.

However, this violates the fact that each character in the original string must be '0' or '1'. Therefore, there exists no such original string P where the first digit is '1'.
Note that this algorithm produces at most two decodings for any given encrypted string. There can never be more than one possible way to decode a string once the first binary digit is set.
Given a String message, containing the encrypted string, return a String[] with exactly two elements. The first element should contain the decrypted string assuming the first character is '0'; the second element should assume the first character is '1'. If one of the tests fails, return the string "NONE" in its place. For the above example, you should return {"011100011", "NONE"}.
Definition

Class:
BinaryCode
Method:
decode
Parameters:
String
Returns:
String[]
Method signature:
String[] decode(String message)
(be sure your method is public)


Constraints
-
message will contain between 1 and 50 characters, inclusive.
-
Each character in message will be either '0', '1', '2', or '3'.
Examples
0)


"123210122"
Returns: { "011100011", "NONE" }
The example from above.
1)


"11"
Returns: { "01", "10" }
We know that one of the digits must be '1', and the other must be '0'. We return both cases.
2)


"22111"
Returns: { "NONE", "11001" }
Since the first digit of the encrypted string is '2', the first two digits of the original string must be '1'. Our test fails when we try to assume that P[0] = 0.
3)


"123210120"
Returns: { "NONE", "NONE" }
This is the same as the first example, but the rightmost digit has been changed to something inconsistent with the rest of the original string. No solutions are possible.
4)


"3"
Returns: { "NONE", "NONE" }

5)


"12221112222221112221111111112221111"
Returns:
{ "01101001101101001101001001001101001",
"10110010110110010110010010010110010" }

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.


Minha Solução:

public class BinaryCode {

/**
* @param args the command line arguments
*/


public String[] decode(String td){ // tb = numero em decimal

int td_elementos = td.length();
int p[] = new int[td_elementos+1];
int f = td_elementos;
String answer[] = new String[2];
for(int t = 0; t< n_ok =" 0;" i =" 0;" i ="=" 1 =""> p[1] = q[0] - 0
{
p[i+1] = td.charAt(i) - p[i];
p[i+1] -= 48;
if(p[i+1] > 1 || p[i+1] <> 1 || p[i+1] < s =" new" i =" 0;"> 1) { n_ok++; }
s.append(p[i]);
}
if(n_ok > 0){
answer[t] = new String("NONE");
}
else {
answer[t] = new String(s);
}
}
return answer;
}

}

segunda-feira, 21 de abril de 2008

Classe URLget...

import java.net.Socket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.lang.Byte;

public class URLget
{
private String endereco_ip;
private String trad;
private String host_name;
private String enviado;
private String recebido;
private Socket conexao;
private OutputStream send_conexao; // enviar para a socket;
private InputStream receveid_conexao; // o que a socket retornar;

public URLget(String ip, String host)
{
try
{
conexao = new Socket(ip, 80);
}

catch(UnknownHostException exception)
{
System.out.println("Erro ao tentar conectar-se a socket");
}

catch(IOException exception)
{
System.out.println("Erro ao tentar escrever p/ a socket(1)");
}

}

public void WriteToSocket(String enviado)
{
this.enviado = enviado;
try
{
send_conexao = conexao.getOutputStream();
send_conexao.write(enviado.getBytes());

}
catch(IOException exception)
{
System.out.println("Erro ao tentar escrever p/ a socket(2)");
}

}

public String RecivedFromSocket()
{
byte recebidos2[] = new byte[100000];
try
{
receveid_conexao = conexao.getInputStream();
receveid_conexao.read(recebidos2);
trad = new String(recebidos2);
}
catch(IOException exception)
{
System.out.println("Erro ao tentar ler dados recebidos socket(3.1)");
}
return trad;
}
}

terça-feira, 8 de abril de 2008

Código-fonte do aplicativo.

Segue logo abaixo o código fonte que havia comentado. Como da pra perceber não usei nenhum recurso "extra" da linguagem orientada a objeto, criei uma socket e usei alguns métodos da sua da classe Socket, sem implementações ou coisa do tipo. O que resta agora é acessar a API do Java 5.0 e analisar as classes que usei nesse programinha de redes.

import java.net.Socket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.lang.Byte;

public class sockets {

public static void main(String args[])
{
InputStream recived;
byte recivedbytes[] = new byte[1000000];
byte a[] = new byte[10];
try
{
Socket website = new Socket("IP AQUI", 80);
if(website.isConnected()){
System.out.println("Conexão ok");
}
OutputStream solicitar;

solicitar = website.getOutputStream();
String sol = new String("GET / HTTP/1.1\nHost: www.endhost.com.br\n\n\r");
System.out.println(sol);
try {
a = sol.getBytes();
solicitar.write(a);
}
catch (IOException e)
{
System.out.println("problema na requisição");
}

recived = website.getInputStream();
recived.read(recivedbytes);

String traducao = new String(recivedbytes);

System.out.println(traducao);


}
catch (UnknownHostException exception)
{
System.out.println("Deu problema1");
}
catch (IOException exception)
{
System.out.println("Deu problema2");
}

}
}

próximo post: Detalhar as classes que foram usadas na construção esse meu primeiro programinha usando Socket.

segunda-feira, 7 de abril de 2008

Aplicativo "simples" utilizando a classe Socket no Java.

Entendo que de acordo com o esperado esse post já deveria ter os primeiros passos de como "lidar" com a classe Socket em Java e talvez já lançando algumas linhas "básicas" do aplicativo que pretendo apresentar. Isso não foi possível por um pequeno e clássico problema que podemos chamar de tempo, acabei tendo alguns contratempos. Peço desculpas e espero sinceramente que meu próximo post já seja apresentando a classe Socket de Java.

domingo, 6 de abril de 2008

Usando Sockets no Java

Em breve postarei um dos meus primeiros aplicativos em java que se encaixam na categoria de Redes. Acho interessante relatar aqui todos os possíveis problemas e as suas respectivas soluções. Não gosto de postar simplesmente o código fonte com alguns comentários mas, relatar também todos os problemas que tive até obter um resultado final satisfatório. Resumindo, relatar todos os processos do desenvolvimento, por mais simples que seja.

Vivo finaliza aquisição 53,9% do capital da Telemig Celular

Segundo a Telefônica, uma das controladoras da Vivo, o negócio foi finalizado pelo preço de 1,16 bilhão de reais.

Por Redação do COMPUTERWORLD

A Vivo, operadora de celulares controlada por Portugal Telecom (PT) e pela espanhola Telefónica, concluiu a aquisição de 53,9% do capital e de 4,27% das ações preferenciais da Telemig Celular Participações, informou a Telefónica.

Em nota divulgada pela Comissão de Mercado de Valores da Espanha, a Telefónica diz que o preço total da aquisição foi 1,163 bilhão de reais.

Adicionalmente, informa a Telefónica, e de acordo com a legislação brasileira do mercado de valores, a Vivo lançará agora uma oferta pública de aquisição (OPA) sobre a totalidade das ações com direito a voto da Telemig, a um preço por ação "igual a 80% do preço" de compra dos títulos negociados.

Com SDK, iPhone agita o mercado móvel e sai na frente de concorrentes

Para o blogueiro Tom Yager, o kit de desenvolvimento de software da Apple para o iPhone e o iPod Touch deixa para trás a Nokia, Microsoft e Adobe.
Por Infoworld, EUA
14 de março de 2008 - 17h35

Oito meses atrás, a Apple não aparecia no espaço móvel. Hoje, de acordo com a própria empresa, o iPhone é o segundo smartphone mais popular do mercado, perdendo apenas para o BlackBerry.
Durante o lançamento do aparelho, foi exatamente isso o que Steve Jobs disse que estava por vir.
O que ele admitiu não ter previsto foi a reação do mercado à falta de um SDK – kit de desenvolvimento de software – que daria suporte à produtos de terceiros complementares ao iPhone.
A plataforma da Apple é hoje a única sem um suporte customizado para aplicativos, e isso bloqueou a entrada da empresa em um terreno em que a RIM nada de braçada. Isto também desestimulou os desenvolvedores Mac que puseram a marca no mapa e a mantiveram lá com aplicações nativas.No próximo mês de junho, a Apple deve corrigir o erro. A Apple vai começar a oferecer seu SDK para o iPhone e será que isso vai gerar a mais simples, melhor documentada e mais rica experiência para desenvolvedores de aplicativos móveis?
Eu venho desenvolvendo aplicativos extenaivamente com as plataformas Symbian, Windows Mobile e BlackBerry. O iPhone deixa todos eles para trás, me fazendo rir de quem decidiu que o desenvolvimento de aplicativos móveis tem que ser difícil. Aqui vai um conselho: se você é novo na área, o iPhone ou o iPod Touch são ótimos para começar.
Não posso fazer justiça ao SDK do iPhone em um post, mas eu posso citar alguns pontos. Para começar, os desenvolvedores não precisam usar Objective-C, C ou C++ para escrever software para o iPhone. A Apple adicionou a única coisa que eu tinha certeza que ela não adicionaria ao browser do aparelho – o Safari – pavimentando o caminho para aplicativos desenvolvidos em JavaScript, HTML e CSS que rodam mesmo quando a rede não está disponível.
Mais que isso, o JavaScript do iPhone não força os programadores a usar arquivos de texto ou XML. Ele usa o SQL, completo com transações. A Apple também colocou algo de flash no GUI do Safari com suporte embutido para SVG (Scalable Vector Graphics) e animações, automáticas e explícitas. A empresa também fornece código de aplicações Web que imitam o GUI nativo do aparelho, permitindo que a aplicação possa rodar em toda a tela, sem deixar sinal de que está rodando no browser. O suporte offline do iPhone é tão robusto, que o vejo sendo portado para desktops no futuro.
Do lado nativo, nós sabemos agora que o sistema operacional do iPhone é baseado no OS X 10.5, a.k.a. Leopard, e que a Apple contou com desenvolvedores Mac. Suas habilidades, e seu conhecimento do código, foram movidos para o aparelho móvel. Na verdade, há tantas similaridades entre o Mac e o iPhone , que muito da aprendizagem do código para o aparelho está em se familiarizar com o que não pode ser feito.Por exemplo, as mesmas facilidades de apresentação, como o OpenGL e Quartz, estão presentes nos dois equipamentos, mas o OpenGL do iPhone é uma versão reduzida do OpenGL ES (Embedded Systems) e o Quartz é limitado a gráficos 2-D. Mas é bom usar a palavra “limitado” com cuidado quando se fala sobre o SDK do iPhone. O Quartz pode ser 2-D, mas ainda pode baixar, exibir, escalar, anotar e salvar arquivos PDF. Seu telefone ou mp3 player fazem isso?
As aplicações nativas do iPhone têm acesso às APIs do padrão POSIX C e outros como soquetes Berkeley para comunicação TCP/IP. Todos os códigos de terceiros rodam em uma sandbox, o que significa que o sistema operacional exerce forte controle sobre seu acesso ao sistema de ligações, portas TCP, arquivos e outros recursos. Você não pode escrever um aplicativo que dependa de arquivos de outros aplicativos. Você não pode desenvolver uma caixa de e-mail customizada ou um servidor Telnet que usem as portas padrão TCP, independente de o iPhone as estar utilizando.
Claro, não há caminho entre a sandbox e qualquer equipamento interno que você possa utilizar para mudar o telefone para uma operadora diferente. A sandbox é robusta o suficiente para enfrentar qualquer hacker, e a Apple a desenvolveu para permitir que qualquer aplicativo possa ser rastreado até seu criador. O metodo escolhido para registrar e certificar aplicações vai gerar polêmica, mas os usuários precisam saber que vão utilizar seus aparelhos em completa segurança.
Eu vou deixá-los com dois detalhes que colocam o iPhone próximo dos melhores desenvolvedores: o display multitoque e o acelerômetro. Ambos são acessíveis em código nativo, como o JavaScript. Gesto complexos de toque, como pinçar, circular e arrastar são enviados ao software como eventos que vão além dos básico toque. Para fazer o teclado aparecer, você não precisa pedir por isso, você simplesmente move o foco para um arquivo de texto.
O acelerômetro foi desenvolvido para levar a Apple onde o Mac nunca esteve no mercado de games. O iPhone pode sentir orientações e movimentos em espaços 3-D. Quando você se move, ou qualquer outra coisa acontece com seu iPhone ou iPod Touch, um aplicativo pode saber sobre isso. As possibilidades são infinitas e podem-se ver no futuro sérias utilizações para este sensor 3-D. Ele é um controle intuitivo para processos complexos que hoje requerem dos operadores que esqueçam a natural percepção humana em 3-D em favor de controles 2-D, como botões, switches, mouse e joysticks.

sábado, 5 de abril de 2008

E aí? O que acharam?!


Espero que tenham gostado da "logo" que fiz para o site. Não tem sombra nem todos aqueles efeitos que estamos acostumados a ver em outros site mas, foi feita de coração no nosso tão amado e antigo Paint! =]


sexta-feira, 4 de abril de 2008

Programa Students to Business – S2B

O Programa Students to Business – S2B - é uma iniciativa da Microsoft, através dos Centros de Inovação no Brasil, da parceria com diversas instituições de ensino e Governos.

O objetivo do programa é desenvolver nos estudantes competências e habilidades em áreas específicas de TI, aproximando-os do mercado de trabalho. Para isso, o programa prevê treinamento e capacitação para estudantes do ensino médio, técnico, de graduação e pós-graduação em conteúdos conceituais e tecnologias Microsoft, específicas para a área de desenvolvimento de software e de infra-estrutura de TI. Com esta proposta, o programa S2B cria oportunidades para estudantes, instituições de ensino e empresas.

Nesta edição, o programa S2B acontecerá simultaneamente em 12 estados do país: Bahia, Ceará, Espírito Santo, Goiás, Minas Gerais, Pará, Paraná, Pernambuco, Rio Grande do Sul, Rio de Janeiro, Santa Catarina e São Paulo, além do Distrito Federal.


Interessados, para maiores informações visitem: http://proform.msdnbrasil.tempsite.ws/public/Default.aspx

quinta-feira, 3 de abril de 2008

Codificação de Huffman

Origem: Wikipédia, a enciclopédia livre.


A codificação de Huffman é um método de compressão que usa as probabilidades de ocorrência dos símbolos no conjunto de dados a ser comprimido para determinar códigos de tamanho variável para cada símbolo. Ele foi desenvolvido em 1952 por David A. Huffman que era, na época, estudante de doutorado no MIT, e foi publicado no artigo "A Method for the Construction of Minimum-Redundancy Codes".

Uma árvore binária completa, chamada de árvore de Huffman é construída recursivamente a partir da junção dos dois símbolos de menor probabilidade, que são então somados em símbolos auxiliares e estes símbolos auxiliares recolocados no conjunto de símbolos. O processo termina quando todos os símbolos foram unidos em símbolos auxiliares, formando uma árvore binária. A árvore é então percorrida, atribuindo-se valores binários de 1 ou 0 para cada aresta, e os códigos são gerados a partir desse percurso.

A codificação de Huffman tem desempenho ótimo quando as probabilidades dos símbolos são potências negativas de dois (2 − 1,2 − 2,...). A codificação gerada tem também a garantia de ser não ambígua, pois nenhum código pode ser o prefixo de outro código.

quarta-feira, 2 de abril de 2008

Transformada de Fourier

A Transformada de Fourier, baptizada em homenagem a Jean-Baptiste Joseph Fourier, é uma transformada integral que expressa uma função em termos de funções de base sinusoidal, i.e., como soma ou integral de funções sinusoidais multiplicadas por coeficientes ("amplitudes"). Existem diversas variações directamente relacionadas desta transformada, dependendo do tipo de função a transformar. A Transformada de Fourier pode ser vista como um caso particular da Transformada Z.

Fonte: Wikipédia - A enciclopédia livre. [ http://pt.wikipedia.org ]

sexta-feira, 11 de janeiro de 2008

Fluxograma de um Busca Binária


Imagem: http://pt.wikipedia.org/