codice:
import java.util.Arrays;
import java.io.*;
class CalcolaCodice{
private static final char [] vocali = {'a','e','i','o','u'};
private static final char [] consonanti = {'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z'};
private static final char [] lettereMesi = {'a','b','c','d','e','h','l','m','p','r','s','t'};
private static final int [] controlloDispari = {1,0,5,7,9,13,15,17,19,21,1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23};
private static final int [] controlloPari = {0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
private static final char [] controlloCaratteri = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
private static final char [] alfabeto = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
public static String calcola (String cognome , String nome , int giorno , int mese , int anno , char sesso , String comuneNascita) {
StringBuilder sb= new StringBuilder ();
//COGNOME
int lettereCognome=3;
char carattere;
for(int i=0;i<cognome.length() && lettereCognome>0 ; i++){
carattere=cognome.charAt(i);
if(Arrays.binarySearch (consonanti , carattere)>=0){
sb.append(carattere);
lettereCognome--;
}
}
if(lettereCognome>0){
for (int i=0;i<cognome.length() && lettereCognome>0 ; i++){
carattere = cognome.charAt (i);
if(Arrays.binarySearch (vocali , carattere)>=0){
sb.append(carattere);
lettereCognome--;
}
}
}
if (lettereCognome>0){
for(int i=0;i<lettereCognome;i++){
sb.append ('x');
}
}
//NOME
int lettereNome=3;
int lunghezzaNome = nome.length ();
if(numeroConsonanti (nome)>=4){
int successione=1;
for(int i=0;i<nome.length() && lettereNome>0 ;i++){
if(Arrays.binarySearch (consonanti , nome.charAt (i))>=0){
if(successione!=2){
sb.append (nome.charAt(i));
lettereNome--;
successione++;
}else{
successione++;
}
}
}
}else{
for(int i=0;i<nome.length() && lettereNome>0;i++){
if(Arrays.binarySearch (consonanti , nome.charAt (i))>=0){
sb.append(nome.charAt(i));
lettereNome--;
}
}
if(lettereNome>0){
for(int i=0;i<nome.length() && lettereNome>0 ;i++){
if(Arrays.binarySearch (vocali , nome.charAt(i))>=0){
sb.append(nome.charAt(i));
lettereNome--;
}
}
if(lettereNome>0){
for(int i=0;i<lettereNome;i++){
sb.append('x');
}
}
}
}
//DATA NASCITA E SESSO
sb.append ((anno+"").substring(2)); //ANNO
sb.append (lettereMesi [mese-1]); //MESE
String gg=null;
//SESSO E GIORNO
if(sesso=='f'){
gg=(giorno+40)+"";
}else if(sesso=='m'){
gg= (giorno<10) ? "0"+giorno : giorno+"";
}
sb.append(gg);
//COMUNE NASCITA
String s=read ("CODICICATASTALI.txt","UTF-8").replaceAll("\n","\t");
String [] array=s.split("\t");
String stringa=array [ricercaSequenziale (array , comuneNascita) + 1];
sb.append(stringa);
//CODICE DI CONTROLLO
int somma=0;
String temporanea=sb.toString();
for(int i=0;i<temporanea.length()-1;i++){
if(i%2==1){
//PARI
somma+=controlloPari [ricercaSequenziale (controlloCaratteri , temporanea.charAt(i))];
}else{
//DISPARI
somma+=controlloDispari [ricercaSequenziale (controlloCaratteri , temporanea.charAt(i))];
}
}
sb.append( alfabeto [somma%26]);
return sb.toString().toUpperCase();
}
private static int numeroConsonanti (String stringa) {
int numero=0;
for(int i=0;i<stringa.length();i++){
if(Arrays.binarySearch (consonanti , stringa.charAt(i))>=0){
numero++;
}
}
return numero;
}
private static int ricercaSequenziale (String [] arr , String chiave){
for(int i=0;i<arr.length;i++){
if(arr [i].equals(chiave)){
return i;
}
}
return -1;
}
private static int ricercaSequenziale (char [] arr , char chiave) {
for(int i=0;i<arr.length;i++){
if(arr [i]==chiave){
return i;
}
}
return -1;
}
public static String read(String fileName,String charSet){
BufferedReader buffRead=null;
StringBuilder strBuff=new StringBuilder();
try{
buffRead=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),charSet));
String str;
while((str=buffRead.readLine())!=null){
strBuff.append(str+"\r\n");
}
buffRead.close();
}catch(Exception e){
e.printStackTrace();
}
return strBuff.toString();
}
public static void main (String [] args) {
System.out.println(calcola ("rossi","antonio",25,05,1989,'m',"catanzaro"));
//DOVREBBE ESSERE RSSNTN89E25C352T
//MA INVECE STAMPA TSSNTN89E25C352
}
}