ruby – oslovení

Tak Kubo, třeba to ocení i někdo jiný.. Jak jsi psal e-mail, tak tady jsem ti napsal jednoduchý kód, jak udělat oslovení pro různá jména (křestní, česká)…

def osloveni(jmeno)
  predposledni_pismena = jmeno.downcase.reverse.slice(0,2).reverse
  # je-li posledni pismenko takove a takove, pridej jine osloveni
  osloveni = "o" if %w{ea ba na la ta ra ka}.include?(predposledni_pismena)
  osloveni = "i" if %w{as}.include?(predposledni_pismena)
  osloveni = "ku" if %w{ek}.include?(predposledni_pismena)
  osloveni = "+e" if %w{av tr ef ub in rt il ir an}.include?(predposledni_pismena)
  osloveni = "+i" if %w{as es ej os}.include?(predposledni_pismena)
  osloveni = "le" if %w{el al}.include?(predposledni_pismena)
  # zkratime o pocet znaku, pokud osloveni ma na prvni miste "+", nezkracujeme
  osloveni.length.times{jmeno.chop!} if osloveni && osloveni.slice(0,1).match(/[a-z]/i)
  # vypiseme osloveni
  "#{jmeno}#{osloveni.gsub(/[^a-z]/,'') if osloveni}".capitalize
end

a nějaký test:

%w{kuba jakub tomas franta zdenek frantisek
ladislav jarmila jitka petr vaclav josef jiri
ondrej ales petra andrea pavel lubos martin
robert vlastimil roman}.each{|jmeno| puts osloveni(jmeno)}

a výsledek?

Kubo
Jakube
Tomasi
Franto
Zdenku
Frantisku
Ladislave
Jarmilo
Jitko
Petre
Vaclave
Josefe
Jiri
Ondreji
Alesi
Petro
Andreo
Pavle
Lubosi
Martine
Roberte
Vlastimile
Romane

Tak. A jak to vlastně funguje?

  • řádek 2 – do proměnné “predposledni_pismena” si uložíme poslední dvě písmenka jména. A to tak, že jméno převedeme na malá písmena (downcase), otočíme (reverse), vybereme dvě písmena od prvního (slice) a opět otočíme.
  • řádek 4 až 9 – tuto proměnnou otestujeme, zda spadá do pole nadefinovaných posledních dvou písmen. Pole nám vytvoří příkaz “%w{}“, a jen metodou “include?” otestujeme, zda se proměnná nachází v tom poli hodnot – pak ji přiřadíme příslušný “konec” ke jménu
  • řádek 11 – jméno zkrátíme o tolik znaků, kolik obsahuje ta koncovka. Ale pozor – obsahuje-li koncovka na první pozici něco jiného než písmeno (např. “+”), pak jméno nekrátíme. Příkaz “chop” odmaže poslední písmeno z daného řetězce.
  • řádek 13 – jen spojíme jméno a danou koncovku (existuje-li) a uděláme první písmeno velké (capitalize)

Jasně, je tu hned několik věcí. Není to otestované pro všechna jména. Jen na ty, co jsem si vzpomněl :-) Pak to neumí diakritiku (dalo by se jistě udělat také). A možná by to šlo optimalizovat ještě víc – ale – však můžete napsat tipy do komentářů.

One thought on “ruby – oslovení

  1. Nazdarek tati, udělal jsem něco podobného.
    Je to tvořítko na Jedijská jména, je to napsaný v Ruby, dá se to spustit jenom přes Ruby, pokusim se to pro ostatní udělat i v C++, ale mam trochu problém s tim .slice v céčku, ale to je jedno, řiď se podle instrukcí a na konci ti to řekne jméno ;)
    Tady odkaz na ulozto, pokud to nepujde, tak rekni.

    Odkaz: http://www.uloz.to/6941870/jmeno-rb

Leave a Reply

Your email address will not be published. Required fields are marked *

3 × = 9