sobota, 17 marca 2012

Wymieranie nazwisk

Wierni fani bloga byli z pewnością zawiedzeni, bo moje chorowanie nie sprzyjało aktywności na tym polu. Powoli przestaję kaszleć i donoszę więc o odkryciu, którego dokonałem jako półtrup okutany w szlafrok dzięki inspiracji szanownego Szczudełka.
Zagadka brzmi tak:
Mamy jakiś stan początkowy populacji – ludzi o pewnych nazwiskach. Jak wiadomo, kiedy brak męskich nosicieli danego nazwiska, najczęściej ono ginie. Wspólnie ze Szczudełkiem postanowiliśmy zbadać, jak szybko giną nazwiska.
Skrypcik po doszlifowaniu wygląda następująco (Tu uwaga: jeśli widzisz w moim poście kod programu i nic Ci on nie mówi, śmiało omiń i czytaj dalej – w życiu nie trzeba być informatykiem)
#!/usr/bin/perl
use utf8;
use diagnostics -trace;
use strict;
use warnings FATAL => 'all';
use Data::Dumper;
use List::MoreUtils qw(uniq);
use feature qw(say);
use Math::CDF qw(qpois);

use constant PERCENTAGE_FATHERLESS => 5;
use constant FERTILITY_RATE => 2.0;

use constant MALE => 0;
use constant FEMALE => 1;

# liczba unikatowych nazwisk w populacji
sub names($) {
 my ($population) = @_;
 return scalar uniq map { $_->{surname} } @$population;
}

# losuj liczbę dzieci dla osobnika
# - wg rozkładu Poissona z wartością oczekiwaną
# równą podanej dzietności
sub get_children_number() {
 my $r = rand(1);
 my $res = qpois($r, FERTILITY_RATE);
 return $res ? int($res + 1) : 0;
}

# tworzy listę nowych dzieci o danym nazwisku,
# z losową płcią
sub get_new_children($) {
 my ($surname) = @_;
 my $res = [];
 my $children = get_children_number();
 for (1..$children) {
  push @$res, {
   surname => $surname,
   gender => int(rand(1) + 0.5)
  };
 }
 return $res;
}

# tworzy kolejne pokolenie na podstawie starego
sub evolve($) {
 my ($old_generation) = @_;
 my $new_generation = [];
 foreach my $person (@$old_generation) {
  my $fatherless = rand(100) < PERCENTAGE_FATHERLESS;
  next if $person->{gender} eq FEMALE && !$fatherless
   || $person->{gender} eq MALE && $fatherless;
  push @$new_generation, @{get_new_children($person->{surname})};
 }
 return $new_generation;
}

# drukowanie listy 10 najczęstszych nazwisk w populacji
sub charts_string($) {
 my ($population) = @_;
 my %surnames = ();
 foreach (@$population) {
  if (defined $surnames{$_->{surname}}) {
   $surnames{$_->{surname}}->{count}++;
  } else {
   $surnames{$_->{surname}} = {
    count => 1,
    surname => $_->{surname}
   };
  }
 }
 my @sorted = sort { $b->{count} <=> $a->{count} } values %surnames;
 return join '', map { "$_->{count} $_->{surname}\n" } @sorted[0..9];
}

srand();
binmode(STDOUT, ":utf8");

my $population = init_population();

print "Najczęstsze nazwiska przed:\n" . charts_string($population);
# 20 pokoleń lub do wymarcia prawie wszystkich
my $i = 0;
while (1) {
 my ($individuals, $names) = (scalar @$population, names($population));
 say "Pokolenie $i >> Osób: $individuals, nazwisk: $names";
 my $new_population = evolve($population);
 last if $i++ == 20 || scalar @$new_population <= 10;
 $population = $new_population;
}
print "Najczęstsze nazwiska po:\n" . charts_string($population);
Przyjęliśmy dzietność 2,0 (czyli dwa bachory na jedną panią – sporo więcej niż aktualnie w Polsce) i założenie, że ok. 5% ludzi ma nazwisko po matce. Jak się okazało, wyniki są bardzo, bardzo, bardzo zależne od początkowego stanu populacji, czyli funkcji init_population. Przed nami wyniki dla kolejnych możliwości.

Opcja 1

Populacja początkowa: 100 000 par, każde o innym nazwisku
Wynik:
Pokolenie 0 >> Osób: 200000, nazwisk: 100000
Pokolenie 1 >> Osób: 199004, nazwisk: 82665
Pokolenie 2 >> Osób: 198498, nazwisk: 55965
Pokolenie 3 >> Osób: 198805, nazwisk: 42820
Pokolenie 4 >> Osób: 199402, nazwisk: 34816
Pokolenie 5 >> Osób: 199798, nazwisk: 29327
Pokolenie 6 >> Osób: 199597, nazwisk: 25431
Pokolenie 7 >> Osób: 199586, nazwisk: 22518
Pokolenie 8 >> Osób: 199853, nazwisk: 20197
Pokolenie 9 >> Osób: 198873, nazwisk: 18243
Pokolenie 10 >> Osób: 199519, nazwisk: 16605
Pokolenie 11 >> Osób: 199869, nazwisk: 15298
Pokolenie 12 >> Osób: 200376, nazwisk: 14191
Pokolenie 13 >> Osób: 199882, nazwisk: 13299
Pokolenie 14 >> Osób: 199578, nazwisk: 12391
Pokolenie 15 >> Osób: 198772, nazwisk: 11642
Pokolenie 16 >> Osób: 199250, nazwisk: 11009
Pokolenie 17 >> Osób: 198838, nazwisk: 10397
Pokolenie 18 >> Osób: 198793, nazwisk: 9886
Pokolenie 19 >> Osób: 198159, nazwisk: 9420
Pokolenie 20 >> Osób: 198052, nazwisk: 8972
Najczęstsze nazwiska po:
226 Nazwisko90665
221 Nazwisko86549
200 Nazwisko77204
186 Nazwisko26968
181 Nazwisko49432
175 Nazwisko83747
169 Nazwisko34857
167 Nazwisko44717
163 Nazwisko85779
159 Nazwisko71347
Czyli: po 20 pokoleniach (ok. 450 latach) wyginęło 90% nazwisk, a największe rodziny rozrosły się do ponad 200 osób.

Opcja 2

Powyższe wyniki są ciekawe, ale mają mało wspólnego z rzeczywistością – trudno się dziwić, że nazwiska giną, jeśli na początku mamy tylko po jednym męskim przedstawicielu każdego z nich. Baza moikrewni.pl zawiera ponad 300 000 nazwisk. Skoro Polaków jest prawie 40 000 000, to można w dużym uproszczeniu przyjąć, że przypada średnio 120 osób na jedno nazwisko. Zatem nowe warunki początkowe to: nadal 200 000 osób, ale tylko 1667 nazwisk – każde noszone przez 120 osób (zaokrągleniami proszę się nie przejmować). Co się okazuje?
Pokolenie 0 >> Osób: 200000, nazwisk: 1667
Pokolenie 1 >> Osób: 200305, nazwisk: 1667
Pokolenie 2 >> Osób: 199561, nazwisk: 1667
Pokolenie 3 >> Osób: 199523, nazwisk: 1667
Pokolenie 4 >> Osób: 198580, nazwisk: 1667
Pokolenie 5 >> Osób: 199792, nazwisk: 1667
Pokolenie 6 >> Osób: 199599, nazwisk: 1667
Pokolenie 7 >> Osób: 199167, nazwisk: 1667
Pokolenie 8 >> Osób: 199406, nazwisk: 1667
Pokolenie 9 >> Osób: 198579, nazwisk: 1667
Pokolenie 10 >> Osób: 197933, nazwisk: 1667
Pokolenie 11 >> Osób: 197333, nazwisk: 1667
Pokolenie 12 >> Osób: 196019, nazwisk: 1667
Pokolenie 13 >> Osób: 195087, nazwisk: 1667
Pokolenie 14 >> Osób: 194913, nazwisk: 1667
Pokolenie 15 >> Osób: 194587, nazwisk: 1665
Pokolenie 16 >> Osób: 194146, nazwisk: 1665
Pokolenie 17 >> Osób: 193966, nazwisk: 1665
Pokolenie 18 >> Osób: 193047, nazwisk: 1664
Pokolenie 19 >> Osób: 193629, nazwisk: 1664
Pokolenie 20 >> Osób: 192437, nazwisk: 1660
Najczęstsze nazwiska po:
411 Nazwisko584
410 Nazwisko318
379 Nazwisko947
376 Nazwisko290
370 Nazwisko1209
354 Nazwisko1325
343 Nazwisko1086
327 Nazwisko99
323 Nazwisko296
316 Nazwisko1408
Okazuje się, że nazwiska w ogóle, ale to w ogóle nie giną! Pierwsze straty mamy dopiero po 15 pokoleniach. Przyczyna jest prosta – skoro każdy klan ma aż 120 osób, to musi minąć dużo czasu, żeby z 60 facetów zrobiło się 0.

Opcja 3

Trzeba trochę uprawdopodobnić obliczenia, żeby miały jakikolwiek sens. W internecie można znaleźć listę polskich nazwisk wraz z ich częstością. I teraz robi się to bardziej związane z rzeczywistością. Tworzymy nową funkcję do wczytywania populacji początkowej:
sub read_population($) {
 my ($file) = @_;
 my $population = [];
 open (FILE, "<:encoding(UTF-8)", $file);
 while (my ($number, $surname) = split(' ', <FILE>)) {
  $number /= 100;
  for (1..int($number + 0.5)) {
   push @$population, {
    surname => $surname,
    gender => int(rand(1) + 0.5)
   };
  }
 }
 close FILE;
 return $population;
}
Czyli: bierzemy każde nazwisko z listy, zmniejszamy jego liczbę wystąpień stukrotnie (żeby komputer się nie udławił) i wrzucamy do populacji początkowej. Oto wyniki:
Najczęstsze nazwiska przed:
2202 Nowak
1319 Kowalski
1044 Wiśniewski
929 Dąbrowski
894 Lewandowski
889 Wójcik
879 Kamiński
877 Kowalczyk
860 Zieliński
845 Szymański
Pokolenie 0 >> Osób: 345574, nazwisk: 63646
Pokolenie 1 >> Osób: 344980, nazwisk: 40700
Pokolenie 2 >> Osób: 345816, nazwisk: 32101
Pokolenie 3 >> Osób: 344508, nazwisk: 27010
Pokolenie 4 >> Osób: 345314, nazwisk: 23533
Pokolenie 5 >> Osób: 343806, nazwisk: 21005
Pokolenie 6 >> Osób: 343487, nazwisk: 19072
Pokolenie 7 >> Osób: 344805, nazwisk: 17547
Pokolenie 8 >> Osób: 344399, nazwisk: 16203
Pokolenie 9 >> Osób: 344761, nazwisk: 15127
Pokolenie 10 >> Osób: 344749, nazwisk: 14172
Pokolenie 11 >> Osób: 344073, nazwisk: 13367
Pokolenie 12 >> Osób: 343932, nazwisk: 12614
Pokolenie 13 >> Osób: 343487, nazwisk: 11976
Pokolenie 14 >> Osób: 343945, nazwisk: 11446
Pokolenie 15 >> Osób: 345201, nazwisk: 10925
Pokolenie 16 >> Osób: 345240, nazwisk: 10461
Pokolenie 17 >> Osób: 344585, nazwisk: 10029
Pokolenie 18 >> Osób: 345600, nazwisk: 9616
Pokolenie 19 >> Osób: 345595, nazwisk: 9255
Pokolenie 20 >> Osób: 344289, nazwisk: 8933
Najczęstsze nazwiska po:
2957 Nowak
1366 Kowalski
1144 Lewandowski
1039 Wiśniewski
1004 Kaczmarek
958 Kozłowski
958 Dąbrowski
957 Woźniak
935 Piotrowski
839 Wójcik
Populacja zrobiła się większa (345 000, czyli baza nazwisk wygląda na niezłą – stukrotnie więcej to prawie rzeczywista liczba ludności Polski, błędy mogą wynikać z zaokrągleń). I nazwiska giną! Giną w tempie strasznym, za 450 lat będzie ich tylko 9000, a Nowaków i Kowalskich zrobi się jeszcze więcej...

Wnioski

Tą chałupniczą metodą doszliśmy do smutnych wniosków – czyżby nasze bogate zasoby nazwisk były narażone na potworną destrukcję? Coś w tym na pewno jest. Jednak nie uwzględniłem tego, że przecież także powstają nowe nazwiska. Można je zmieniać, można łączyć, a przede wszystkim można wychodzić za obcokrajowców. Z drugiej strony w dzisiejszych czasach nazwiska już rzadko powstają wskutek pomyłek księdza czy urzędnika, jak jeszcze sto lat temu (np. moja prababcia urodziła się jako Sobotka, zmarła jako Sobótka). Jeśli ktoś ma pomysł, jak udoskonalić te zgrubne oszacowania – czekam na propozycje :)

sobota, 3 marca 2012

Li_wo, ojczyzno moja!

Natchniony dniem spędzonym wśród familii na głupich zabawach, zasiadam do komputera, aby wyobrazić sobie, co by się stało, gdyby Mickiewicz nie miał do dyspozycji głosek R i T (wybranych w sposób niedemokratyczny):
Żmudzi! Ojczyzno moja! podobnaś do bycia o siłach;
Ile cię należy cenić, ów jedynie ma w żyłach,
Co cię opuścił. Dziś piękność ciebie w całej ozdobie
Widzę i opisuję, bo żal mi we własnej osobie.
Panno błogosławiona, co pilnujesz osady z Jasnym Wzgórzem
I w Przejściu świecisz Kłującym! Co zamek z przedmurzem
Wybudowany przez Mendoga zabezpieczasz z jego ludem!
Jak mnie dziecko z niemocy wyciągnęłaś cudem,
(Gdy od płaczącej macierzy pod Panienki opiekę
Wydany, nieżywą podniosłem powiekę
I niebawem mogłem pieszo pod wejście do kościołów Panny
Iść za działające znów życie Bogu śpiewać Hosanny)
W ów sposób nas oddasz cudem na Ojczyzny łono
Póki co przenoś moją duszę opuszczoną
Do owych wzgórz leśnych, do owych łąk zielonych,
Wszędzie nad niebieskim Niemnem wypłaszczonych;
Do owych pól malowanych nasionem pomieszanym;
Wyzłacanych pszenicą, zbożem innym na błysk pomalowanym;
Gdzie lśniący żółcią świerzop, składnik blinów jak śnieg biały
Gdzie panieńskim pąsem dzięcielina płonie przez dzień cały,
A całość przepasana jakby pasem, miedzą
Zieloną, na niej z rzadka ciche owocowe drzewa siedzą.
Kto się podejmie Ody do młodości bez M i K?

czwartek, 1 marca 2012

Ekscytująca pisownia tytułów piosenek

Będzie nieinformatycznie i niepolonistycznie, choć wciąż lingwistycznie. Będzie o tym, że nikt na świecie nie potrafi prawidłowo zapisywać angielskich tytułów piosenek i albumów muzycznych. Konkretnie chodzi o pisownię wielkimi i małymi literami (à propos: wbrew powszechnemu mniemaniu duże i wielkie litery są równie dobre, za to błędne jest sformułowanie z małej/dużej litery). Reguły są cholernie precyzyjne, ale trudno je znaleźć. Najlepsze źródło, jakie znalazłem, to poradnik na MusicBrainz, ale gdyby ktoś podał namiary na coś bardziej oficjalnego, to poproszę. Do rzeczy zatem!
  • Zawsze dużą literą zaczynamy pierwsze i ostatnie słowo tytułu: Hang It Up, We Used to Wait.
  • Jeśli tytuł jest podzielony nawiasem, myślnikiem, znakiem zapytania, wykrzyknikiem etc., to powyższe tyczy się każdej części z osobna.
  • Wszystkie pozostałe słowa piszemy dużymi literami, chyba że są to:
    • rodzajniki a, an, the:
      • Love Don't Cost a Thing, This Is the Life
    • wprowadzenie do bezokolicznika to:
      • I Don't Want to Miss a Thing, Ready to Start
    • spójniki and, but, or, nor:
      • Boys and Girls, Hate It or Love It
    • przyimki o długości ≤3 liter: as, at, by, for, in, of, on, to, but, off, up i parę innych:
      • The Name of the Game, Breakfast at Tiffany's, Only If for a Night
    • z czteroliterowymi przyimkami różnie bywa, ale zazwyczaj też małe:
      • Just like This, City with No Children, Sounds from Nowheresville.
  • Most tricky: Powyższy punkt nie dotyczy wszelakich phrasal verbs, w których drugą część pisze się także dużą literą, dlatego: Bouncing Off Clouds, Hanging On Too Long.
  • Also tricky: Część spośród powyższych słówek bywa używana w charakterze innych części mowy, np. like jako lubić zawsze będzie dużą literą.
  • Najczęstsze krótkie słowa, które pisze się dużą literą: Be, Do, Am, Is, He, If, Me, My, No, So (czasami małą)Us, We, Can, Got, Had, Her, How, Let, Not, She, Too, Was, Who, You.
  • Jest co najmniej jeden wyjątek: Shine On You Crazy Diamond :)
Wszystko to tyczy się wyłącznie angielskiego. Polskie, francuskie i inne tytuły pisze się jak zwykłe zdania, wszystko poza pierwszym wyrazem i nazwami własnymi jest małe.
Powyższe reguły z różnym skutkiem są używane przez programy do dodawania tagów ID3. Najlepiej dbać o prawidłową pisownię przy zgrywaniu muzyki z płyty. Mnie się udało przez lata utrzymać porządek w swojej muzycznej kolekcji.
Brzmi wszystko skomplikowanie, ale wątpliwych przypadków jest bardzo mało i powyższe reguły w zupełności powinny wystarczyć.
A na koniec reklamuję facebookowe Przecinki w niewłaściwych, miejscach. O przecinkach też kiedyś będę przynudzał, ale to trzeba powoli dawkować. I dzięki powyższej stronie zachwycać się kreatywnością dziennikarzy!

poniedziałek, 27 lutego 2012

Przegląd znakomitych słów, odcinek 1

Od stu lat mam na swoim komputerze na pulpicie plik o nazwie Słówka, do którego nawet czasem coś zapisuję, ale raczej tego więcej nie czytam. A warto. Mam tam już niemałą kolekcję wyrazów, które lubię, których nie lubię lub które mnie czegoś nauczyły. W związku z tym prezentuję wnioski z małego wyimka pliku:
  • Jakże swojsko brzmiące słowo koszmar pochodzi z francuskiego cauchemar.
  • Prawidłowa forma to tylny, tylna, tylne, nie tylni, tylnia, tylnie. Kiedy następnym razem zachcesz wysiąść tylnimi drzwiami, przemyśl to dobrze!
  • Póki co jest obrzydliwym rusycyzmem i miło jest, kiedy zastąpi się to sformułowanie jakimś pięknym na razie lub tymczasem. Więcej na stronach bardzo ciekawego bloga.
  • Ciekawe jest słówko krzta, nad jego etymologią rozmyślają co poniektórzy, pewnie ktoś rozmyślania zakończył?
  • Za przeproszeniem. O losie słodki, jakżeż ja nie znoszę tego sformułowania. Jeśli chcesz przekląć – przeklnij, jeśli się wstydzisz i już przepraszasz – nie przeklinaj. Za każde użycie za przeproszeniem masz u mnie -1 punkt.
  • Słowo wyborny jest po prostu wyborne. Uwielbiam je. Jest wyborne.
  • Dopełniacz – kogo? czego? tchu. Mianownik – kto? co? dech.
  • Dopełniacz – kogo? czego? dżdżu. Mianownik – kto? co? deżdż. No, dzisiaj to deszcz. Kto zna inne takie piękne nieregularności?
  • Jako młody adept informatyki na pierwszym roku byłem zachwycony wyrazem spermutować.
  • Ludyczny to nie jest bardziej uczona forma słowa ludowy. Ludyczny to związany z bawieniem się, grami, zabawami, hulankami!
Tyle moich słownych wyznań na dzisiaj. A Wy macie swoje słowne fiksacje?

środa, 22 lutego 2012

Zabawy ze słownikiem, cz. 2

Po spółgłoskowych poszukiwaniach doszły mnie słuchy, że język polski ma fenomenalnego kandydata na zupełnego rekordzistę, jeśli chodzi o liczbę kolejnych spółgłosek, niestety nieistniejącego w słowniku. Jest to słowo kontrdrgnięcie – polecam spróbować wymówić. Google powiada, że nawet ktoś kiedyś tego słowa użył.
A teraz czas na nowy skrypcik przetwarzający słownik. Tym razem o niebo prostszy, bo rekord do zbadania o wiele banalniejszy. Postanowiłem poszukać słów, które mają najwięcej spółgłosek w stosunku do wszystkich liter (ignoruję słowa z samymi spółgłoskami, żeby nie zachwycić się takimi cudami jak w, z, hmm, pst).
#!/usr/bin/perl
use utf8;
use diagnostics -trace;
use strict;
use warnings FATAL => 'all';
use feature qw(say);

sub get_ratio($) {
 my ($word) = @_;
 my $consonants = grep { $_ !~ m/[aeiouyąęó]/ } map { substr($word, $_, 1) } 0 .. length($word) - 1;
 return $consonants / length($word);
}

binmode(STDOUT, ":utf8");
open (FILE, "<:encoding(UTF-8)", "slowa-pl.txt");
my $record = 0;
while (my $line = <FILE>) {
 $line =~ s/\r?\n//;
 my $result = get_ratio($line);
 say "$result: $line" and $record = $result if $result >= $record && $result < 1;
}
Wyniki nie mniej ciekawe niż poprzednio, bo mamy w naszym języku niebanalne słowa, dla których współczynnik spółgłoski/litery wynosi 8/9:
chrząszcz, chrzęszcz, przechrzt, schińszcz, schlaszcz, schluszcz, schłoszcz, szklarstw
Rekordzista samogłoskowy jest jeden: oiomie.
Tradycyjnie to samo zrobiłem dla innych języków.

  • Spółgłoskowce niemieckie: Borschtsch, Schmartsch, Schwintsch, Zschetzsch, plantschst, schnarchst, schrumpfst
  • Spółgłoskowce angielskie: strengths, tsktsking
  • Samogłoskowce są nudne, nic bardziej ekscytujące niż audio czy queue się nie znalazło.
Co w następnej edycji Zabaw ze słownikiem? O tym czytelnicy dowiedzą się już niebawem!

poniedziałek, 20 lutego 2012

Och, apostrofie! (apostrofa do apostrofu)

Droga Nadziejo Polskiej Informatyki! Szanowny Obiecujący Dziennikarzu! Wielmożny Umyśle Ścisły! Wiedz, że jeśli przeczytasz ten tekst, a mimo to nadal apostrofy będziesz w obcych wyrazach wsadzał gdzie popadnie, to ja – nadzieja polskiej informatyki, obiecujący dziennikarz i umysł ścisły (małymi literami) – będę Tobą gardził, pomiatał i uważał Cię za liczbę taką, za jaką Miller Ziobrę, a nawet Panasewicz adresata popularnej piosenki. Jeszcze jedno Facebook'a na Facebooku i usuwam ze znajomych.
Żarty żartami, ale pozwolę sobie na trochę przemądrzalstwa. Zasada w gruncie rzeczy jest prosta i mam nadzieję, że da się to od razu zrozumieć. Apostrof nie służy do odmieniania słów obcego pochodzenia, apostrof służy do zgrabnego połączenia końcówki fleksyjnej z wyrazem kończącym się niewymawianą literą. Oczywiście są wyjątki, ale poniższe wskazówki powinny wszystko wyjaśnić:

  1. Start: mam przed sobą w głowie odmieniony wyraz obcego pochodzenia, np. imię, nazwisko, nazwę firmy, produktu, języka programowania, miejscowości czy czegokolwiek innego.
  2. Jeśli zwyczajnie czytasz wszystkie litery końcówki wyrazu, to nie ma miejsca na żadne apostrofy. Sprawdzam Facebooka, Twittera, programuję w Perlu, w Pythonie, wspominam Jobsa, uwielbiam Gatesa, słucham Micka Jaggera. Żadnych apostrofów, bo końcówkę tylko doklejamy do wyrazu, w którym czytamy ostatnią literę. Z tejże przyczyny apostrofów nie będzie też przy neologizmach takich jak commitować, checkoutować, supportować. W ogóle staramy się mówić po polsku :)
  3. To samo, jeśli x zamieniamy na ks: Linuksa, a nie Linux'a, Linuks'a czy Linux-a.
  4. Jeśli ostatniej litery nie wymawiamy, to przy odmianie wstawiamy apostrof. Dlatego mamy Google'a, Apple'a, Office'a, Skype'a, Exchange'a, iPhone'a. Uwaga, to samo dotyczy narzędnika (z kim? z czym?) i piszemy: Google'em, Apple'em, Office'em, Skype'em, Exchange'em, iPhone'em. To jest pierwsza nieoczywista rzecz do zapamiętania.
    Tak samo jest i tu z czasownikami: update'ować, merge'ować.
    Czasem trudniej jest np. z francuskimi nazwiskami, zresztą nie każdy zna francuską wymowę. W każdym razie mówimy o Charles'u de Gaulle'u, choć o Charlesie Darwinie.
  5. Jeśli w miejscowniku (o kim? o czym?) i wołaczu powstają nam dziwne formy, to... używamy dziwnych form i nie wciskamy apostrofów. Niezależnie od tego, jak głupio wyglądają wyrazy takie jak Offisie, JavaScripcie, Joysie, trasie (to ostatnie od... trace). A ponieważ głupio wyglądają potwornie, to zmieniamy zdanie, żeby użyć innej formy.
  6. Przy odmianie skrótowców nie używamy apostrofów, tylko wstawiamy dywiz. Zatem nie IBM'a, tylko IBM-a, nie LaTeX'a, tylko LaTeX-a.
  7. Jak potraktować literkę y? Jeśli czytamy ją jako j, to apostrofu nie ma: Disneya, Rooneyowi. Jeśli jako i, to apostrof jest – i to jest mały wyjątek, w końcu literę się czyta, choć inaczej. Czyli Debussy'ego, Banksy'emu.
  8. A na koniec regułka, dzięki znajomości której możecie poczuć się ekspertami. Nazwiska węgierskie zakończone na y są zupełnie wyjątkowe, bo tutaj apostrofów nie ma. Na dodatek kombinacje gy, ny, ly czyta się jako dź, ń, j, więc odmiana jest dziwna: Gyurcsány (Dziurczań) – Gyurcsánya (Dziurczania), Nagy (Nodź) – Nagyowi (Nodziowi). W Tatrach jest schronisko Téryego, nie Téry'ego.
Wszystko jasne? Na pewno! Jeśli nie chce Ci się czytać wszystkiego, to wbij sobie do głowy tylko punkty 2, 4 i 6 :)
Jeśli wytrwałaś/-eś do tej pory, to w ramach chwili wytchnienia polecam jedyny na świecie retoromański zespół hiphopowy. Osób, które zrozumieją tekst tego utworu, jest mniej więcej tyle, co mieszkańców Pruszkowa.

piątek, 17 lutego 2012

Spółgłoskowe poszukiwania

Musi być trochę informatycznie :) Zaczynam cykl postów pt. Zabawy ze słownikiem. Na szczęście nawet jeśli nie znasz Perla, a także jeśli nie masz pojęcia o programowaniu, post ma szansę być ciekawy.
Ktoś kiedyś dawno temu (a na pewno przed zeszłorocznym wyjazdem na żagle) dał mi zagadkę: w jakim polskim słowie występuje najwięcej spółgłosek pod rząd? I to takich spółgłosek, z których każda odpowiada osobnej głosce? Rozwiązaniem miało być słowo bezwzględny. Postanowiłem to jednak zweryfikować. Troszkę zmieniłem założenie, wyszukałem po prostu słowo o największej liczbie spółgłosek, przy czym dwuznaki połączyłem w jedno. W celu wykonania eksperymentu potrzebne są:
  • lista słów w języku polskim (np. z SJP.pl)
  • umiejętność programowania
  • 30-45 minut.
Jak to z różnych powodów ostatnio bywa, użyłem magicznego języka, jakim jest Perl. Oryginalny skrypt poddałem małej obróbce, żeby jednak pozbyć się pojedynczych linijek o długości dwóch ekranów i żeby programista nieznający Perla zrozumiał, co się dzieje. Oto skrypt:
#!/usr/bin/perl

use utf8;
use diagnostics -trace;
use strict;
use warnings FATAL => 'all';
use feature qw(say);

sub get_type($$$) {
 my ($word, $diphthongs, $i) = @_;
 if (grep { $_->{index} eq $i } @$diphthongs) {
  return 'C' #pierwszy znak dwuznaku
 } elsif (grep { $_->{index} eq $i - 1 } @$diphthongs) {
  return 'X' #drugi znak dwuznaku
 } elsif (substr($word, $i, 1) =~ m/[aeiouyąęó]/) {
  return 'V' #samogłoska
 } else {
  return 'C' #spółgłoska
 }
}

sub longest_consonant_substring($) {
 my ($word) = @_;
 my @doubles = map { { two => substr($word, $_, 2), index => $_ } } 0 .. length($word) - 2;
 my @diphthongs = grep { $_->{two} =~ m/[scdr]z|d[żź]|ch/ } @doubles;
 my @types = grep { $_ ne 'X' } map { get_type($word, \@diphthongs, $_) } 0 .. length($word) - 1;
 my ($record, $current) = (0, 0);
 foreach (@types) {
  if ($_ eq 'C') {
   $current++;
   $record = $current if $current > $record;
  } else {
   $current = 0;
  }
 }
 return $record;
}

binmode(STDOUT, ":utf8");
open (FILE, "<:encoding(UTF-8)", "slowa-utf8.txt");
my $record = 0;
while (my $line = <FILE>) {
 $line =~ s/\n//;
 my $result = longest_consonant_substring($line);
 say "$result: $line" and $record = $result if $result >= $record;
}
Programik przez chwilę pomełł słownik i wypluł wynik, który potwierdził wynik zagadki, ale dał też wiele nowych ciekawych słów, w których występuje ciąg 5 kolejnych spółgłosek. Voilà, oto lista po ręcznym odfiltrowaniu innych form tych samych wyrazów i ewentualnych wyrazów pochodnych:
angstrem, bezwzględny, kontrchwyt, kontrplan, kontrprojekt, kontrpropaganda, kontrpropozycja, kontrpróba, kontrsztab, kontrświadczenie, nadskrwiański, najpstrokaciej, najwstrętniej, najwzględniej, nawarstwcie, odwarstwcie, postscriptum, pozezdrski, pyzdrski, rozwarstwcie, uwarstwcie, wielowarstwka
Potem przeszukałem jeszcze raz słownik, nie uwzględniając dwuznaków. Wynik: cztery słowa zawierają ciągi 7 kolejnych spółgłosek:
opierzchłszy, rozpierzchłszy, spierzchłszy, zmierzchłszy
Z kolei samotnym rekordzistą w liczbie kolejnych samogłosek (5) jest nieauerowski. Nie pytajcie o znaczenie :)
Język angielski jest jeszcze dziwniejszy. Rekordziści spółgłoskowi:
borschts, latchstring, tsktsking
Rekordziści samogłoskowi:
cooeeing, cooeying, miaouing, queueing 
Spółgłoski po niemiecku:
Borschtsch, Angstschrei, Harschschnee, Angstschweiß, Angstschwelle, Dirndlschmuck, Dirndlschnaps, Deutschschweiz, Grätschschritt, Gesichtsschmerz, Gesichtsschnitt, Welschschweizer, selbstschließend, selbstschmierend, selbstschreibend, Ehrfurchtsschauer, Gerichtsschreiber, Fastnachtsschlager, Gesichtsschlagader, Unterrichtsschritt, Geschichtsschreiber, Glückwunschschreiben, Unterrichtsschwester
Samogłoski po niemiecku:
Teeeier, zweieiig  
Czekam na propozycje kolejnych zabaw ze słownikiem!