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!

3 komentarze:

  1. Panie Humormatyku (z sadystyczną premedytacją używam wymierającego wołacza)!
    Miałem okazję zadać Tobie oraz Perlowi pracę słownikową, jednak w wyniku autorskiego majstrowania we wpisie, mój komentarz zanikł jak wołacz, a nawet bardziej. Jestem zły, bardzo zły i mam bardzo ostre kły! Trzeba będzie przebłagać lub przekupić, trudna rada w tej mierze...

    OdpowiedzUsuń
  2. Źle, niedobrze, ach, fatalnie. Niniejszym błagalnie zwracam się ku Ojcowskiej światłości, ach, ukój swą złość!

    OdpowiedzUsuń
  3. Kiedyś graliśmy w podobną grę słowną: chodziło o znalezienie najdłuższego słowa, gdzie wszystkie litery występują w porządku alfabetycznym...

    OdpowiedzUsuń