The Triumph Economy and other solutions

“Remember that you are mortal”

It was the sole goal of the Roman Auriga slaves to repeat those words for the commanders celebrated by the Roman Triumph so that they don’t start equating themselves with gods.

The triumph was the absolute pinnacle of achievement and the goal of any ambitious Roman Citizen. For a day, the whole Roman Empire celebrated your contributions to the empire’s power, wealth, and safety. You were the most important person for that day, and your descendants would look up to that moment when spending time in Lararium – the household shrine.

In Rome, money was only a tool to fund armies and conquests, not a goal in itself. Roman Empire was a Triumph-based economy, in which noblemen worked hard and gave everything to the empire.

I am really fond of the idea of money.

Specifically, rolling in it.

Money is infinitely composable – you can sell three goats and exchange it for half a cow, 2 weeks of work, or help with turning your grain into flour. This composability has enabled billions of us to somewhat work together on creating the modern world. As Yuval Noah Harari points out in Sapiens:

Money is the only trust system created by humans that can bridge almost any cultural gap, and that does not discriminate on the basis of religion, gender, race, age, or sexual orientation. Thanks to money, even people who don’t know each other and don’t trust each other can nevertheless cooperate effectively.

As much as I want to roll in a bathtub full of twenty-dollar bills, I have to admit that amassing money has become a bit of a problem. Wealth disparities are widely publicized, with Jeff Bezos earning 3 average American yearly salaries every minute, and [insert another wealth disparity example here].

But what is an ambitious and effective person to do? Amassing money, fame, and power is celebrated and presented as a worthy goal since high school (especially for boys). Young adults are full of energy, grit, and determination. There are hungry for greatness, but we offer them Netflix, collecting sneakers, and amassing a fortune instead.

What if we brought back the triumph economy?

A triumph for crushing your enemies, a triumph for curing cancer, a triumph for solving social media addiction, a triumph for emission-free energy sources, a triumph for solving supply chain problems… Money and power would again be only the tools meant to help humanity, not divide it.

What would you throw a triumph for?

Think like an engineer

The chat between Tim Ferriss and James Dyson is such a spectacular ride and validation for any engineer. You can feel the sheer joy of a breakthrough, of making somebody’s day a tiny bit better by technology.

Dyson’s big break was making a vacuum cleaner that does not clog from dust. It took 3 years and 5,127 prototypes because he was convinced people to spend a lot of time annoyed at their vacuums. He was right, and the only one who cared enough to solve the problem.

“Whenever I look at anything, I wonder how it works and then I wonder how it could work better. Could I make it better”

Now, James Dyson is releasing a new book, and creating a University, because he thinks engineers can solve the problems at hand:

Partly because I just wish there were more engineers, I just wish that more young people would find engineering fascinating interesting and worthwhile. And I think it’s particularly true now because everybody is talking about global warming and what he’s talking about using fewer resources, recycle ability and all these sort of things using less energy less water and its engineers that can make that happen

Couldn’t agree more – listen to the conversation between Dyson and Ferriss here.

Can you create your own country?

Continuing the topic of unorthodox solutions to the problems of today, Scott Alexander (of Slate Star Codex fame) wrote a prospectus on Prospera – an experimental city-state growing in Honduras.

The idea behind charter cities is: Shenzhen, Dubai, Hong Kong, Singapore, and the rest of the rich world aren’t rich because their citizens are morally superior to those of their poorer neighbors. They’re rich because they have better legal systems, less corruption, stronger rule of law, and more competent administrators.

Prospera and other experimental communities can try out unorthodox legal and governance systems to better face the modern challenges. The experimental country created in 1776 dominated all the previous powers, so maybe it can happen again?

The interconnected mess of it all

Monism

“The Heart of the Andes” by Frederic Edwin Church aimed to present the interconnectedness of the ecosystem, with everything interacting with everything else.

While reading “The Invention of Nature” (a book I’ll definitely reference later), I stumbled upon the concept of Monism.

In a Monistic worldview, there is no difference between organic and inorganic life because they are deeply connected. There is no hard boundary between humans and animals because we’re all part of nature. There is no division into different drawers of sciences just because of some obscure taxonomy. Monism stands in opposition to Dualism, first popularized by Plato, and later embedded in the western culture.

The perils of dismantling the world into even smaller parts and declaring them separate sciences seems to underline many of my talking points. While studying Computer Science and Psychology simultaneously, I couldn’t help but notice how interconnected and similar those seemingly disparate areas can be, but how ignorant experts are to anything outside their precious labels.

The last 2 years (!) of the pandemic have shown how dangerous this mindset can be. Organizations like CDC, FDA, WHO, US Army, and countless other acronym holders did everything according to their own procedures. Still, it ended as an utter fiasco costing millions of lives because everyone focused on their own little slice of reality and missed the big picture.

Samuel Coleridge (a British poet) called the early 1800s an ‘epoch of division and separation,’ of fragmentation and the loss of unity. He was lamenting the loss of what he called the ‘connective powers of the understanding.’ He had no idea.

I’ll read up on Monism some more and report back the findings to you.

Deliberate work

In “Your lifestyle has already been designed,” David takes a closer look at the default workforce lifestyle, observing that it definitely is not aimed at helping the little guy:

For the economy to be “healthy”, America has to remain unhealthy. Healthy, happy people don’t feel like they need much they don’t already have, and that means they don’t buy a lot of junk, don’t need to be entertained as much, and they don’t end up watching a lot of commercials.

He also makes an excellent point about the 8-hour workdays:

But the 8-hour workday is too profitable for big business, not because of the amount of work people get done in eight hours (the average office worker gets less than three hours of actual work done in 8 hours) but because it makes for such a purchase-happy public. Keeping free time scarce means people pay a lot more for convenience, gratification, and any other relief they can buy. It keeps them watching television, and its commercials. It keeps them unambitious outside of work.

But it all has to be worth it in the end, right? Few decades of slogging through, and you’ll be able to retire happily! Philip, who has reached the Nirvana of early retirement, is documenting his “struggles”:

Americans cannot imagine stopping work before they’ve either (1) purchased everything that they could conceivably want, or (2) collapsed from physical exhaustion

He recommends shifting the mindset before retirement because jumping from worker mentality straight to empty days can be more than a little disorienting:

Suppose that you are retired. At this point, your one job is the pursuit of happiness. If you are not happy, therefore you are a failure at your job and in your life. But how can you be happy 24/7?

Retirement forces you to stop thinking that it is your job that holds you back. For most people the depressing truth is that they aren’t that organized, disciplined, or motivated.

“Worried Denizen” argues that Leisure is the end in itself, and we have to learn to “waste it”:

In the long run, wasted time is indistinguishable from time well spent.

The only viable strategy to make the most out of your time is to make sure that it’s fun

Climate Tales to inspire

Companies like Heimdal are working carbon-negative cement – it means that they suck out CO2 to produce the material, in opposition to the traditional manner, which is a huge contributor to climate change.

Concrete is responsible for 8% of global CO2 emissions. Cement is usually made from mined limestone, which is one of the largest natural stores of carbon dioxide. Using that to make cement is a bit like burning oil. The world is addicted to concrete, so this problem is not going away. We make synthetic limestone using atmospheric CO2, such that when it is used to make cement, the process is carbon neutral.

This essay is a fantastic resource on the economics and chemistry of carbon-negative concrete.

PS: Yes, this issue of my newsletter is sent late. We are finally on the road, giving our RV a spin, and so far – so good!

Programowanie współbieżne

W systemie działa serwer i pewna liczba procesów. Każdy proces jest albo ugodowy albo neutralny albo marudny. Typ procesu podaje się przy jego uruchomieniu w linii poleceń: proces u, proces n lub proces m

Proces w pętli nieskończonej:

wykonuje własne sprawy, czyli po prostu usypia na losowy czas --- od 1 do 10 sekund,
następnie wypisuje na standardowy strumień diagnostyczny komunikat "Proces %d, czekam na zasób.n", zgłasza się do serwera i czeka, aż serwer przydzieli mu zasoby,
otrzymuje od serwera informacje o typie przydzielonego zasobu,
korzysta z zasobu --- wypisuje na standardowy strumień diagnostyczny komunikat o typie otrzymanego zasobu: "Proces %d, otrzymalem zasób %d.n" i pracuje z zasobem, czyli usypia na losowy czas --- od 1 do 10 sekund
wypisuje na standardowy strumień diagnostyczny komunikat "Proces %d, skonczylemn" i oddaje zasób serwerowi.
Wszystkie komunikaty są w formacie stosowanym w fprintf i mają zawierać PID procesu. Poza tym procesy nie wypisują żadnych innych komunikatów.
Zarządzaniem procesami i zasobami zajmuje się serwer. Zarządza on zasobami dwóch typów: lepszym i gorszym. Jest on wywoływany z dwoma parametrami: N - oznaczającym liczbę dostępnych zasobów lepszych, M - oznaczającym liczbę dostępnych zasobów gorszych. Serwer komunikuje się z procesami za pomocą kolejki (lub kolejek) komunikatów. W pierwszej kolejności odbiera on komunikaty o zwrocie zasobów, które obsługuje sam. W następnej kolejności odbiera komunikaty z prośbą o przydzielenie zasobu. Po odbiorze takiego komunikatu serwer tworzy wątek odpowiedzialny za obsługę tego żądania i ponownie oczekuje na zlecenia od procesów.

Wątek odpowiedzialny za obsługę żądań działa w następujący sposób:

jeżeli żądanie pochodzi od procesu marudnego, wątek oczekuje aż będzie dostępny przynajmniej jeden egzemplarz zasobu lepszego, po czym wysyła do procesu komunikat z informacją o przydzieleniu mu zasobu i kończy się,
jeżeli żądanie pochodzi od procesu neutralnego, wątek oczekuje aż będzie dostępny przynajmniej jeden egzemplarz zasobu dowolnego typu (preferując jednak o ile to możliwe zasoby lepsze), po czym wysyła do procesu komunikat z informacją o typie przydzielonego zasobu i kończy się,
jeżeli żądanie pochodzi od procesu ugodowego, wątek oczekuje aż będzie dostępny przynajmniej jeden egzemplarz zasobu dowolnego typu (bez żadnych preferencji), po czym wysyła do procesu komunikat z informacją o typie przydzielonego zasobu i kończy się.
Zaimplementuj opisany powyżej schemat. Rozwiązanie powinno:

zawierać co najmniej dwa pliki wykonywalne: serwer oraz proces,
wykorzystywać do komunikacji między serwerem a procesami kolejki komunikatów IPC,
wykorzystywać do synchronizacji wątków muteksy i zmienne warunkowe,
dbać o to, aby przerwanie działania serwera za pomocą CTRl+C nie zostawiało po sobie żadnych niezwolnionych zasobów IPC,
zawierać prostą obsługę błędów - wystarczy, że proces wykryjący błąd zakończy się.
Wszystkie pliki źródłowe oraz Makefile należy spakować do jednego pliku i wysłać go jako załącznik na adres mengel@mimuw.edu.pl do dnia 14 czerwca 2010, godz. 23:59. Każdy rozpoczęty tydzień spóźnienia skutkuje ,,premią'' w wysokości -2pkt.

A oto rozwiązanie:

Continue reading “Programowanie współbieżne”

Systemy Rozproszone Zad 2

Szczerze mówiąc, nie pamiętam treści tego zadania.
Coś z przekazywaniem żetonu i MPI…

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;


//Taka funkcja do dzielenia.

int main(int argc, char *argv[])
{
	FILE *f;					//Plik konfiguracyjny
	char znak;					//znaki wczytywane z wejsica
    vector Wysylam; 		//Odbiorcy
    vector Odbieram;		//Wysylajacy do mnie
	vector Wypisanie;		//Do wypisania zetonow
    int MojeId;					//Moje id zwrocone przez MPI
	int wynik;					//Do czytania pliku
	int size;					//MPI
    char bufor[1024];			//Bufor
	string tmp="";				//Tymczasowa zmeinna do czytania liczb
	int tmp_1;					//Liczba do tokenów
	int tmp_2;					//Druga liczba do tokenów
    string Wiadomosc=""; 		//Przesyłana wiadomosc
    string WypiszMnie=""; 		//Ja.
	
	//Harce z MPI
    MPI_Status s;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &MojeId);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    int id_tag = 500; 


	MojeId+=1;
	
	//WypiszMnie
	std::stringstream ss;
	ss <='0')&&(znak0)&&(tmp.size()>0))
			{
		
				//Podział tokenu.
				tmp_2=atoi(tmp.c_str());
				tmp="";
								
				if(tmp_1==MojeId)
				{
					//Dodajemy do listy wysylam
					Wysylam.push_back(tmp_2);
				}
				else if(tmp_2==MojeId)
				{
					//Dodajemy do listy odbieram
					Odbieram.push_back(tmp_1);
				}
				
				tmp_2=0;
				
				if(znak=='n')
				{
					//zerujemy.
					tmp_1=0;
				}
			}
		}
		wynik = fscanf(f,"%c", &znak);
	}
	fclose(f);
	
	//No dobrze. Wczytane.

	//Nasluchujemy.
        for(unsigned int i=0; i0)
		{
			//Przeysłamy dalej.
			char *Komunikacik=new char[Wiadomosc.length()+1];
		    strcpy(Komunikacik,Wiadomosc.c_str());
		
			for(unsigned int i=0; i<Wysylam.size(); i++)
			{
				MPI_Send(Komunikacik, Wiadomosc.length()+1, MPI_CHAR, Wysylam[i] - 1, id_tag, MPI_COMM_WORLD);
			}    
    	}
	    else
        {
			//A teraz wypiszemy:
			tmp="";
			tmp_1=0;
			
			//Dzielimy na tokeny:
			for(unsigned int i=0;i='0')&&(Wiadomosc[i]0)
					{
						tmp_1=atoi(tmp.c_str());
						Wypisanie.push_back(tmp_1);
						tmp="";
						tmp_1=0;
					}
				}
			}
			
			//Sortujemy:
			sort (Wypisanie.begin(), Wypisanie.end());

			//Wypisujemy:
			cout << WypiszMnie << ": {";
			tmp_1=0;
			for(unsigned int i=0;i<Wypisanie.size();i++)
			{
				if(Wypisanie[i]!=tmp_1)//Powtórzenia
				{
					cout << (Wypisanie[i]) <<" ";
					tmp_1=Wypisanie[i];
				}
			}
			cout<<"}"<<endl;

		}
    MPI_Finalize(); 
    return 0;
}

Gra Rycerze

Wraz z Pawłem Malinowskim i Rafałem Todorskim napisaliśmy super-extra grę rycerze!

Oczywiście, pomysł jest zadaniem zaliczeniowym:

I. Wstęp.
Za siedmioma górami, za siedmioma lasami starożytne królestwo nawiedził wielki i potężny Kamienny Smok. Wiele szkód uczynił: podpalał lasy i chłopskie chaty, porywał owce i dzieci (powiadano, że trafiały potem na jego stół). Wielu śmiałków próbowało już zgładzić potwora, żadnemu jednak nie udało się dotąd dotrzeć do jego legowiska, gdyż droga doń wiodła przez Labirynt. Niezwyczajny był to Labirynt – pełno w nim bezdennych przepaści, dziwnych, wybuchających miejsc i magii. Próbowano już wyburzać mury – ale po pewnym czasie odrastały jak przebiśniegi; zamurowywano przepaście, ale po pewnym czasie cegły rozsypywały się w proch. Aż wreszcie przybyła drużyna słynnych pięciu bohaterów pod twoim dowództwem aby zmierzyć się z Niebezpieczeństwem. Dla okolicznych mieszkańców po raz pierwszy zaświecił promień nadziei.

Continue reading “Gra Rycerze”

Czy można robić poważne badania przez internet?

Jak wszyscy może i wiemy, albo może i nie wiemy, badania psychologiczne to poważna sprawa.
Wiele czynników może wpływać na zakłócanie naszych zmiennych badawczych i staramy się je eliminować.
Ciężko pracujemy, by warunki były takie same we wszystkich grupach badawczych, by wszystko było przeprowadzone profesjonalnie.

Oprócz warunków badania jednak, istotną sprawą jest dobór osób do badania. Ważne, by przekrój próby odzwierciedlał przekrój populacji, by wyniki naszego badania dało się przełożyć na całą populację.

W troszkę innym temacie: fajnie by było robić badania przez internet

Czemu?

  • TANIEJ
  • Szybciej
  • Nie trzeba ręcznie przepisywać wyników do komputera
  • TANIEJ
  • Szybciej 🙂

A jednak mimo takich wspaniałych zalet, takich badań się nie przeprowadza. Ba!, mówi się że nie wolno tego robić!

Czemu?

  • Specyficzna grupa osób badanych
  • Specyficzne warunki badania – każdy ma inne warunki w domu, nie możemy ujednolicić

A więc

A więc wpadłem na pomysł, że warto by było raz na zawsze odpowiedzieć, na to frapujące pytanie, Czy można przeprowadzać badania psychologiczne przez internet?
Jak zamierzam to zrobić?

  1. Zamierzam wybrać kilka klasycznych badań, których wyniki są znane
  2. Zamierzam znaleźć sposób na przeprowadzenie ich w internecie
  3. Zamierzam przeprowadzić te badania
  4. Zamierzam porównać wyniki z przeprowadzonymi wcześniej w realu odpowiednikami
  5. Jeśli wyniki będą takie same, to MAMY ODPOWIEDŹ!

Poniższą prezentację przygotowałem w ramach jakiegośtam przedmiotu by wyjaśnić o co chodzi w tym pomyśle:

Lab Wpółbieżny i obiektowy zadanie 2

Drugie zadanie z labu współbieżnego i obiektowego wygląda tak:


Napisz program kalkulator, który pozwala wczytywać wyrażenia arytmetyczne ze zmiennymi i wyliczać ich wartości. Wyrażenia mogą być dowolnie rozbudowane, choć składają się tylko z czterech podstawowych działań arytmetycznych. Zmienne i wyrażenia są typu całkowitego. Nazwy zmiennych składają się tylko z liter. Dane użytkownik podaje ze standardowego wejścia. Wyrażenia postaci % oznaczają odwołanie do wyrażenia wcześniej zdefiniowanego (jeśli numer jest = bieżącemu numerowi takie wyrażenie jest błędne, należy wypisać użytkownikowi komunikat o błędzie,
tak samo jak w przypadku dzielenia przez 0).

Przykład konwersacji z programem (liczby na początku wierszy i znak ">" wyświetla sam program, tekst pogrubiony pochodzi od użytkownika):

1>x=9
2>x = -3
3>y=4
4>x+y*2/3
x+y*2/3 = -1
5>zz+zz
zz+zz = NIEOZNACZONE
6>%5+%5
(zz+zz)+(zz+zz) = NIEOZNACZONE
7>%6/%6
((zz+zz)+(zz+zz))/((zz+zz)+(zz+zz)) = NIEOZNACZONE
8>zz=1
9>%7
((zz+zz)+(zz+zz))/((zz+zz)+(zz+zz)) = 1
10>x=0
11>%4
x+y*2/3 = 2
12>1/x
1/x = BŁĄD
13>zz=5
14>zz
zz=5
15>%8
zz=5
16>
Koniec działania programu.

Jakich wzorców projektowych użyjesz w swoim rozwiązaniu?

A oto rozwiązanie:
Rany! Ale to zadanie było męczące!
Kalkulator

Lab HTML i JAVA, zadanie 4

Trzecie zadanie z nowego przedmiotu, Laboratorium HTML i Java brzmiało następująco:

Napisz aplet, który zdefiniuje własną obsługę kliknięć myszy i w reakcji na każde z nich będzie rysował na ekranie wielokąt o bokach wyznaczonych przez punkty kliknięcia. Możesz skorzystać z klasy Polygon.

A oto rozwiązanie:
Zadanie 4

Struktury Danych

Ze struktur danych dostaliśmy wyobraźcie sobie do napisania program! Kto by pomyślał?

Oto treść:

Motel
Dost˛epna pami˛e´ c: 64MB.
Profesor Makary wybiera si˛e na zimowy urlop na narty. Poniewa˙ z droga z domu profesora do górskiego kurortu jest daleka,
profesor liczy si˛e z konieczno´ sci ˛a podzielenia jej na dwa dzienne etapy, z noclegiem w przydro˙ znym motelu. Podró˙ ze go m˛ecz ˛a,
wi˛ec tras˛e i miejsce na nocleg chce wybra´ c tak, ˙ zeby oba fragmenty drogi nie były zbyt długie. Dokładniej, chciałby, aby dłu˙ zszy
z dwóch dziennych etapów był mo˙ zliwie najkrótszy.
Pomó˙ z profesorowi zaplanowa´ c tras˛e dojazdu, pisz ˛ac program, który obliczy najmniejsz ˛a mo˙ zliw ˛a długo´ s´ c dłu˙ zszego etapu.
UWAGA: Mo˙ ze si˛e zdarzy´ c, ˙ ze w optymalnym rozwi ˛azaniu który´ s z etapów ma długo´ s´ c 0 (czyli w rzeczywisto´ sci cała trasa
zostanie przebyta w jednym etapie).
Wej´ scie
W pierwszym wierszu znajduj ˛a si˛e dwie liczby całkowite n i m (2 ? n ? 50000, 1 ? m ? 1000000). Pierwsza z nich oznacza
liczb˛e punktów stanowi ˛acych potencjalne miejsca postoju, ponumerowanych od 0 do n?1 (punkt numer 0 to dom profesora,
punkt n?1 to kurort, a pozostałe to motele). Druga to liczba odcinków dróg ł ˛acz ˛acych punkty. Ka˙ zdy z kolejnych m wierszy
zawiera trzy liczby całkowite a, b, c, gdzie 0?a,b<n, a 6=b, 0?c?10000. Liczby a i b oznaczaj ˛a punkty na drogach, za´ s c to
długo´ s´ c odcinka drogi prowadz ˛acego bezpo´ srednio od a do b. (UWAGA: długo´ sci odcinków dróg od a do b i od b do a nie musz ˛a
by´ c równe; w szczególno´ sci który´ s z nich mo˙ ze wcale nie istnie´ c). Liczby w ka˙ zdym wierszu s ˛a pooddzielane pojedynczymi
spacjami.
Wyj´ scie
W jedynym wierszu standardowego wyj´ scia nale˙ zy wypisa´ c najmniejsz ˛a mo˙ zliw ˛a długo´ s´ c dłu˙ zszego z dwóch etapów drogi z
domu profesora do kurortu.
Przykład
Dla danych wej´ sciowych:
4 5
0 1 1
0 2 4
1 2 2
1 3 4
2 3 3
poprawnym wynikiem jest:
3
Wyja´ snienie do przykładu. Optymalna trasa to: 0?1?2 (I etap); 2?3 (II etap)

A oto rozwiązanie:
Jakoś działa, z większy naciskiem na JAKOŚ niż na DZIAŁA
Zadanie

Lab HTML i JAVA zadanie 3

Trzecie zadanie z nowego przedmiotu, Laboratorium HTML i Java brzmiało następująco:

Napisz w Javie program do analizy utworów literackich mistrzów pióra.

Program ma wczytać ze standardowego wejścia plik tekstowy (w zamyśle utwór jednego z wieszczów, na przykład pobrany z internetu), policzyć częstości występowania w nim poszczególnych słów i wypisać na standardowe wyjście n najczęściej występujących wyrazów wraz z liczbą wystąpień każdego z nich. Liczbę n należy pobrać z wiersza poleceń. Program wypisując słowo powinien podać jego formę (chodzi o użycie wielkich i małych liter, a nie o formę gramatyczną) najczęściej występującą w tekście.

Ponadto w kodzie źródłowym programu, w pliku z główną klasą należy zamieścić komentarz podający dla n=8 wynik działania programu dla tekstu "Pana Tadeusza" (tekst ten jest zamieszczony w Moodle'u).

Uwagi:

    * Każde słowo należy wypisać w osobnym wierszu.
    * Po każdym wypisanym słowie należy po spacji podać liczbę jego wystąpień.
    * Słowa należy wypisać wg malejącej kolejności wystąpień w tekście (czyli jako pierwsze słowo należy podać to, które występuje najczęściej).
    * Jeśli kilka słów ma tę samą częstość wystąpień, to ich wzajemna kolejność wypisywania jest obojętna.
    * Jeśli jakiś utwór zawierałby mniej niż n różnych słów, to należy wypisać tyle słów, ile w utworze znaleziono.
    * Przy liczeniu liczb wystąpień słów należy utożsamiać małe i wielkie litery (tzn. w tekście "Ale, ale, ale!" uznajemy, że słowo "ale" wystąpiło 3 razy).
    * Przy wypisywaniu słów należy podać najczęściej występującą w tekście ich formę (tzn. dla tekstu "Ale, ale, ale!" należy wypisać postać "ale". Jeśli kilka postaci słowa występujących najczęściej ma jednakową liczbę wystąpień, można wybrać dowolną z nich (tzn. dla tekstu "Ale, ale!" można wypisać albo "Ale" albo "ale").
    * Należy uwzględniać polskie litery (tzn. w napisie "Liście" jest jedno słowo składające się z sześciu znaków).

Wskazówki:

    * Należy skorzystać z kolekcji.
    * Należy używać kolekcji uogólnionych (generic), a nie surowych (raw).
    * Do odczytywanie słów wygodnie użyć klasy Scanner. Do pobierania samych słów (tzn. bez kropek, przecinków itp.) z polskimi literami można użyć operacji
         skaner.useDelimiter("[^a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]+");

A oto rozwiązanie:
Zadanie 3