Controllo codice fiscale

Sono un niubbo in ruby, che ne pensate della routine che ho scritto ?

Rispecchia lo spirito del linguaggio?

def check_codice_fiscale codice
return false if codice.size != 16
pari = “ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”
dispari=“BAKPLCQDREVOSFTGUHMINJWZYX10KPL2Q3R4VOS5T6U7M8N9WZYX”
codice = codice.upcase
s=0
15.times{|x| s += ((x & 1 != 0) ? pari : dispari).rindex(codice[x,1])
}
pari[(s % 26),1] == codice[15,1]
end

A mio giudizio forse il codice sarà migliorabile,

ma il linguaggio e’ incredibilmente fantastico!

Stefano

Il giorno 07/lug/06, alle ore 11:54, stefano sa ha scritto:

Sono un niubbo in ruby, che ne pensate della routine che ho scritto ?

Che è molto più agile della mia :frowning:

In compenso ho una bella verifica della partita IVA

def partita_iva?
if (size == 11)
s = ((0…4).map {|i| self[i * 2, 1].to_i}).inject {|x, y| x + y}
s += ((0…4).map {|i| (self[i * 2 + 1, 1].to_i * 2) % 9}).inject
{|x, y| x + y}
(s % 10) == 0 ? 0 : 10 - (s % 10) == self[10,1].to_i
else
false
end
end

Questa invece è la mia sciagurata verifica del codice fiscale:

def codice_fiscale?
if(size == 16)
tbl = {“0” => 1, “1” => 0, “2” => 5, “3” => 7, “4” => 9, “5” =>
13, “6” => 15, “7” => 17, “8” => 19, “9” => 21,
“A” => 1, “B” => 0, “C” => 5, “D” => 7, “E” => 9, “F” =>
13, “G” => 15, “H” => 17, “I” => 19, “J” => 21,
“K” => 2, “L” => 4, “M” => 18, “N” => 20, “O” => 11, “P”
=> 3, “Q” => 6, “R” => 8, “S” => 12, “T” => 14,
“U” => 16, “V” => 10, “W” => 22, “X” => 25, “Y” => 24,
“Z” => 23}
s = ((0…7).map {|i| tbl[self[i * 2, 1]]}).inject {|x, y| x + y}
s+= ((0…6).map do |i|
if self[i * 2 + 1, 1].to_i.to_s == self[i * 2 + 1, 1]
self[i * 2 + 1, 1].to_i
else
self[i * 2 + 1] - “A”[0]
end
end
).inject {|x, y| x + y}
(s % 26 + “A”[0]) == self[15]
else
false
end
end

c’è la parte dove usi il mdulo e l’& che non è molto leggibile.
estrarrei dei metodi tipo is_pari? is_dispari? in generale scompatterei
un
pò quella parte.

On 7/7/06, stefano sa [email protected] wrote:

s=0
15.times{|x| s += ((x & 1 != 0) ? pari : dispari).rindex(codice[x,1])
}
pari[(s % 26),1] == codice[15,1]
end


Chiaroscuro

Liquid Development: http://liquiddevelopment.blogspot.com/

— stefano sa [email protected] ha scritto:

Rispecchia lo spirito del linguaggio?

Io metterei pari e dispari come costanti al di fuori del metodo (PARI e DISPARI), oltretutto se le lasci all'interno vengono ricreate ogni volta. In teoria potresti usare #inject al posto di #times ed evitare la variabile s, ma imo non è più leggibile, son gusti.

Invece di x&1!=0 metterei un metodo #odd? dentro
Integer.

Ho il sospetto che
pari[(s % 26),1] == codice[15,1] possa funzionare
anche come
pari[s%26] == codice[15]
ma ancora non ho preso il caffè :slight_smile:

A mio giudizio forse il codice sarà migliorabile,

ma il linguaggio e’ incredibilmente fantastico!

benvenuto a bordo :slight_smile:

Chiacchiera con i tuoi amici in tempo reale!
Yahoo Search - Ricerca nel Web | Motore di Ricerca