Pergunta

Nas últimas duas semanas, li o livro Codificação de controle de erros: fundamentos e aplicativos Para aprender sobre a BCH (Bose, Chaudhuri, Hocquenghem), codifica uma função de programação júnior em uma empresa de telecomunicações.

Este livro aborda principalmente a matemática e a teoria por trás do assunto, mas estou lutando para implementar alguns dos conceitos; Principalmente obtendo o próximo n ADORES CODES.Eu tenho uma GUI (implementada através do NetBeans, para não postar o código como o arquivo é enorme) que passa um código para obter o próximo n números:

Gerar esses números é onde estou tendo problemas. Se eu pudesse passar por tudo isso dentro apenas do método de codificação, em vez de fazer loop através do uso da GUI, minha vida seria dez vezes mais fácil.

Isso está me deixando louco há dias há dias, pois é fácil gerar 0000000000 a partir da entrada, mas estou perdido para onde ir a partir daí com meu código. O que eu faço então para gerar o próximo número de trabalho?

Qualquer ajuda para gerar o código acima seria apreciada.

Foi útil?

Solução

(Big Edit ...) Brincando com o código um pouco mais isso parece funcionar:

import java.util.ArrayList;
import java.util.List;


public class Main
{
    public static void main(final String[] argv)
    {
        final int startValue;
        final int iterations;
        final List<String> list;

        startValue = Integer.parseInt(argv[0]);
        iterations = Integer.parseInt(argv[1]);
        list = encodeAll(startValue, iterations);
        System.out.println(list);
    }

    private static List<String> encodeAll(final int startValue, final int iterations)
    {
        final List<String> allEncodings;

        allEncodings = new ArrayList<String>();

        for(int i = 0; i < iterations; i++)
        {
            try
            {
                final int    value;
                final String str;
                final String encoding;

                value = i + startValue;
                str = String.format("%06d", value);
                encoding = encoding(str);
                allEncodings.add(encoding);
            }
            catch(final BadNumberException ex)
            {
                // do nothing
            }
        }

        return allEncodings;
    }

    public static String encoding(String str)
        throws BadNumberException
    {
        final int[]         digit;
        final StringBuilder s;

        digit = new int[10];

        for(int i = 0; i < 6; i++)
        {
            digit[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
        }

        digit[6] = ((4*digit[0])+(10*digit[1])+(9*digit[2])+(2*digit[3])+(digit[4])+(7*digit[5])) % 11;
        digit[7] = ((7*digit[0])+(8*digit[1])+(7*digit[2])+(digit[3])+(9*digit[4])+(6*digit[5])) % 11;
        digit[8] = ((9*digit[0])+(digit[1])+(7*digit[2])+(8*digit[3])+(7*digit[4])+(7*digit[5])) % 11;
        digit[9] = ((digit[0])+(2*digit[1])+(9*digit[2])+(10*digit[3])+(4*digit[4])+(digit[5])) % 11;

        // Insert Parity Checking method (Vandermonde Matrix)
        s = new StringBuilder();

        for(int i = 0; i < 9; i++)
        {
            s.append(Integer.toString(digit[i]));
        }

        if(digit[6] == 10 || digit[7] == 10 || digit[8] == 10 || digit[9] == 10)
        {
            throw new BadNumberException(str);
        }

        return (s.toString());
    }
}

class BadNumberException
    extends Exception
{
    public BadNumberException(final String str)
    {
        super(str + " cannot be encoded");
    }
}

Prefiro jogar a exceção em vez de devolver uma corda especial. Nesse caso, ignoro a exceção que normalmente diria ser uma prática ruim, mas, nesse caso, acho que é o que você deseja.

Outras dicas

Difícil dizer, se eu tive o seu problema, mas depois de ler sua pergunta várias vezes, talvez seja isso que você está procurando:

public List<String> encodeAll() {
  List<String> allEncodings = new ArrayList<String>();
  for (int i = 0; i < 1000000 ; i++) { 
    String encoding = encoding(Integer.toString(i));
    allEncodings.add(encoding);
  }
  return allEncodings;
}

Há uma falha na solução, os resultados do tooctaltring não são de 0. Se é isso que você quer, sugiro usar String.format("<something>", i) na chamada de codificação.

Atualizar

Para usá -lo em sua chamada atual, substitua uma chamada para codificar (String str) com a chamada para este método. Você receberá uma lista ordenada com todas as codificações.

Aasumi, você só estava interessado em valores octais - meu erro, agora acho que você apenas esqueceu a codificação do valor 000009 em seu exemplo e, assim, removeu o material octal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top