terça-feira, 6 de janeiro de 2009

O Pequeno Príncipe


Quem já leu, releia e quem não leu, tá na hora de ler.
Boa leitura!

terça-feira, 2 de setembro de 2008

SCJP - Job Tips

It's a good idea to initialize all your variables, even if you're assigning them
with the default value. Your code will be easier to read; programmers who
have to maintain your code (after you win the lottery and move to Tahiti) will
be grateful.

Source: SUN CERTIFIED PROGRAMMER FOR JAVA 5.0

quinta-feira, 14 de agosto de 2008

"Cara" do meu "gerador" de cpf


Em breve irei disponibilizar o código fonte para download. Não vou simplesmente copiar e colar o código fonte no blog porque fica muito desorganizado. Fiquei de solucionar esse problema porém ainda não foi solucionado. Ah, vale ressaltar que a usei o Netbeans para organizar esse layout! =]

DV do CPF(cadastro de pessoa física)

Algoritmo:

Nessa e nas próximas duas lições, veremos o uso do VBA para solucionar um exemplo prático. Vamos criar uma função personalizada, chamada ValidaCPF. Em seguida usaremos essa função para fazer o cálculo do DV de um conjunto de CPFs:

Importante: O algoritmo de cálculo do DV de CPFs e CNPJs é de domínio público, já tendo sido publicado no diário oficial da união e em diversas revistas de informática, de circulação nacional.

Nessa lição explicarei como funciona o cálculo do DV do CPF.

Como calcular o DV do CPF

Para entender o algoritmo de cálculo do CPF vamos utilizar um exemplo prático.

Considere o seguinte CPF (sem o DV): 333.444.555

Posição

1

2

3

4

5

6

7

8

9

Número

3

3

3

4

4

4

5

5

5

Começamos a multiplicar os dígitos do CPF, a partir da posição 9, ou seja, de trás para frente, por 2, 3, 4, 5 e assim por diante, conforme indicado na tabela a seguir:

Posição

1

2

3

4

5

6

7

8

9

Número

3

3

3

4

4

4

5

5

5

Multiplica por:

10

9

8

7

6

5

4

3

2

Resultado

30

27

24

28

24

20

20

15

10

Somo os resultados obtidos na quarta linha da tabela anterior:

Soma1 = 30+27+24+28+24+20+20+15+10

Soma1 = 198

Faço a divisão desta soma por 11 e determino o resto da divisão:

198/11 Resulta em uma divisão exata, com resto 0

Regra: Quando o resto é zero ou um, o DV é 0.

Quando o resto é diferente de zero ou um, o DV é
obtido fazendo-se: 11-resto

Neste caso como o resto foi zero, o primeiro DV é zero:

DV1=0

O DV1 calculado passa a fazer parte do CPF, conforme indicado pela tabela a seguir:

Posição

1

2

3

4

5

6

7

8

9

10

Número

3

3

3

4

4

4

5

5

5

0

Agora repetimos o processo anterior, porém já considerando o DV1 como parte integrante do CPF, conforme indicado pela tabela a seguir:

Posição

1

2

3

4

5

6

7

8

9

10

Número

3

3

3

4

4

4

5

5

5

0

Multiplica por:

11

10

9

8

7

6

5

4

3

2

Resultado

33

30

27

32

28

24

25

20

15

0

Somo os resultados obtidos na quarta linha da tabela anterior:

Soma2 = 33+30+27+32+28+24+25+20+15+0

Soma1 = 234

Faço a divisão desta soma por 11 e determino o resto da divisão:

234/11 Resulta em (21), com resto 3

Regra: Quando o resto é zero ou um , o DV é 0.

Quando o resto é diferente de zero ou um, o DV é

obtido fazendo-se: 11-resto

Neste caso como o resto foi 3, o segundo DV é :

DV2 = 11 - 3

DV2 = 8

Com isso o CPF, já com os dois DVs fica conforme indicado na tabela a seguir:

Posição

1

2

3

4

5

6

7

8

9

10

11

Número

3

3

3

4

4

4

5

5

5

0

8

Ou seja: 333.444.555-08

Os algoritmos para cálculo dos DVs do CNPJ são praticamente iguais. A única diferença é a quantidade de dígitos do CNPJ é diferente do CPF.

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< 2; t++){
int n_ok = 0;
for(int i = 0; i < td_elementos; i++) // só para o caso de p[0] == 0;
{
p[0] = t;
if(i == 0) // Q[0] = P[0] + P[1] = 0 + P[1] = 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] < 0) {
n_ok++;
}
}
else { //Q[2] = P[1] + P[2] + P[3] = 1 + 1 + P[3] = 3, we know that P[3] = 1. / p[3] = q[2] - (p[1] + p[2])
p[i+1] = td.charAt(i) - (p[i-1] + p[i]);
p[i+1] -= 48;

if(p[i+1] > 1 || p[i+1] < 0) {
n_ok++;
}
}

}
StringBuffer s = new StringBuffer();
for(int i = 0; i< p.length-1; i++)
{
// System.out.printf("%d", p[i]);
if(p[i] > 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, 4 de agosto de 2008

TopCoder...


Uma utilidade pra o meu blog. Observar o meu possivel progresso(ou regresso) no desenvolvimento dos algoritmos para solucionar os problemas propostos pelo TopCoder.

segunda-feira, 7 de abril de 2008

WiMAX será algo grande, com ou sem Sprint, diz Motorola

O serviço Xohm está bastante atrasado em relação à agenda original, mas o show deve continuar, de acordo com a fabricante.

Por IDG News Service, EUA

O suporte financeiro para o novo serviço de WiMAX de alta velocidade sem fio, o Xohm, da Sprint Nextel, ainda pode ser questionado, mas a Motorola continua enxergando um mercado forte para a nova tecnologia, com ou sem a operadora.

“Seja com o suporte da Sprint ou sem ele, o WiMAX é um caminho sem volta”, diz Daniel Moloney, presidente da área de mobilidade doméstica e de redes da Motorola, divisão responsável pelos produtos WiMAX. “Existe um grande mercado global para essa tecnologia”, avalia.

A Motorola fabrica os produtos que a Sprint está implementando em seus testes e lançamentos do Xohm, e já provê os equipamentos para o desenvolvimento do serviço em outros países.

Moloney disse estar ciente dos esforços da Sprint para atrair investimentos de 1,5 bilhão de dólares ou mais pelas empresas de cabo na iniciativa Xohm, que deve custar 5 bilhões de dólares ao todo. Mas Moloney disse não estar por dentro dos detalhes sobre o andamento dessas negociações, nem os motivos pelos quais nenhum tipo de acerto foi concluído até a última segunda-feira (31), data limite imposta pela Sprint para as companhias de cabo envolvidas.