VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Evo malo izmenjene verzije, sa komentarima.
Kôd:
p Hash[secrets.map{|secret|
words = secret.split ' ' # niz reci u secret frazi
[secret, dict.permutation(words.length).find{|perm| # za sve kombinacije reci iste duzine kao secret fraza
match = [words, perm]
#=>[["x8z", "yz67zx", "5y", "x4", "y352z"], ["the", "secret", "is", "to", "smile"]]
next unless match.map{|e| e.map(&:length)}.inject(&:==) # eliminisemo sve koje nemaju iste duzine reci kao secret fraza
chars = match.map{|e| e.join.chars.to_a} # sada ih posmatramo samo kao nizove karaktera
#=>[["x", "8", "z", "y", "z", "6", "7", "z", "x", "5", "y", "x", "4", "y", "3", "5", "2", "z"], ["t", "h", "e", "s", "e", "c", "r", "e", "t", "i", "s", "t", "o", "s", "m", "i", "l", "e"]]
next unless chars.map{|e| e.uniq.length}.inject(&:==) # eliminisemo sve koji nemaju isti broj razlicitih slova
pairs = chars.inject(&:zip) # parovi slova na istim pozicijama
#=>[["x", "t"], ["8", "h"], ["z", "e"], ["y", "s"], ["z", "e"], ["6", "c"], ["7", "r"], ["z", "e"], ["x", "t"], ["5", "i"], ["y", "s"], ["x", "t"], ["4", "o"], ["y", "s"], ["3", "m"], ["5", "i"], ["2", "l"], ["z", "e"]]
Hash[pairs] == Hash[pairs.map(&:reverse)].invert # ovo je malo trickish, videti u tekstu
}.join(' ')]
}]
Poslednja provera pravi dve hashmape, jednu od karaktera sifra -> original, drugu od karaktera original -> sifra, pa "obrne" ovu drugu i uporedi je sa prvom. Da ima nekih neslaganja, neki parovi se ne bi poklapali.
|