Głuchy Telefon #
Gra “Głuchy Telefon” polega na tym, że gracze ustawiają się w linii i przekazują sobie wiadomość od jednej osoby do drugiej, co zazwyczaj skutkuje zabawnym zniekształceniem oryginalnej wiadomości, gdy trafia ona do ostatniego gracza.
Napisz program, który symuluje grę w Głuchy Telefon, wykorzystując kolejki komunikatów POSIX.
Program uruchamia się z trzema parametrami P
, T₁
, T₂
, gdzie 0 ≤ P ≤ 100
oraz 100 ≤ T₁ < T₂ ≤ 6000
.
Po uruchomieniu nazwy dzieci uczestniczących w grze są wprowadzane (każda w nowej linii) na standardowe wejście.
Wpisanie polecenia start "Very long sentence to pass"
rozpoczyna grę. Koordynator (główny proces) przekazuje podane zdanie w niezmienionej formie pierwszemu dziecku (w kolejności, w jakiej dołączyły do gry). Każde słowo jest wysyłane w osobnej wiadomości.
Po zakończeniu gry koordynator wyświetla wynik, a wszystkie procesy zostają zakończone.
Kolejka komunikatów może przechowywać jednocześnie tylko 2 słowa (wiadomości).
Można założyć, że maksymalna długość jednej linii standardowego wejścia wynosi 255 znaków.
Uwaga: Program powinien obsługiwać wiele instancji bez kolizji nazw kolejek i konfliktów w działaniu!
Etapy: #
Główny proces (koordynator gry) poprawnie tworzy nowe procesy na podstawie podanych nazw dzieci i oczekuje na ich zakończenie.
- Nie ma określonego limitu (poza zasobami systemowymi) liczby dzieci biorących udział w grze.
- Aby rozpocząć grę, musi być co najmniej jedno dziecko. Każde dziecko zna tylko swoje imię i PID dziecka, od którego odbiera wiadomości. W przypadku pierwszego dziecka jest to PID koordynatora.
- Dziecko wyświetla komunikat
[{PID}] {name} has joined the game!
, czeka losowy czas pomiędzyT₁
aT₂
, a następnie kończy działanie, wyświetlając komunikat[{PID}] {name} has left the game!
.
Dziecko, po dołączeniu do gry, tworzy nową kolejkę nazwaną
"sop_cwg_{PID}"
.- Dziecko zna tylko PID poprzedniego dziecka – to informuje je, z której kolejki ma odbierać wiadomości.
- Wpisanie
start {message_to_pass}
rozpoczyna przekazywanie wiadomości słowo po słowie do pierwszego dziecka. - Tylko pierwsze dziecko otrzymuje wiadomość od koordynatora na tym etapie.
- Po odebraniu słowa, dziecko wyświetla je na standardowym wyjściu:
[{PID}] {name} got the message: '{word}'
.
Słowa są przekazywane między dziećmi, a następnie wracają do koordynatora.
- Dla każdej litery w słowie istnieje
P%
szansa, że zostanie ona zmieniona na losową literę alfabetu łacińskiego. - Koordynator wyświetla odebraną wiadomość na standardowym wyjściu. Wszystkie użyte zasoby są prawidłowo zwalniane.
- Dla każdej litery w słowie istnieje
Po otrzymaniu sygnału
SIGINT
wszystkie dzieci opuszczają grę.- Koordynator wyświetla część wiadomości, którą już otrzymał, i wychodzi.
- Można użyć limitu czasowego na odbiór wiadomości, aby uniknąć zakleszczenia w tym etapie.
Przykładowe Wejście (example_input.txt
):
#
Anna
Frank
Simon
Katie
Tom
Matt
start "Systemy operacyjne 1 i 2 to moje ulubione kursy podczas studiów; nauczyłem się tutaj wielu ciekawych rzeczy!"
Oczekiwane Wyjście: #
./sop-cwg-stage4 2 250 500 < example_input.txt
Chinese Whispers Game
Provide child name or type start to begin the game!
[29406] Anna has joined the game!
[29407] Frank has joined the game!
[29408] Simon has joined the game!
[29409] Katie has joined the game!
[29410] Tom has joined the game!
[29411] Matt has joined the game!
Game has started with 6 childrens!
Passing "Operating Systems 1 and 2 are my favorite courses during my studies; I have learned a lot of fun stuff here!" to the first child!
Passing word "Operating"
Passing word "Systems"
Passing word "1"
[29406] Anna got message: Operating
Passing word "and"
[29406] Anna got message: Systems
Passing word "2"
[29407] Frank got message: Operating
Passing word "are"
[29406] Anna got message: 1
[29407] Frank got message: Systems
[29408] Simon got message: Operating
Passing word "my"
[29407] Frank got message: 1
[29406] Anna got message: and
[29408] Simon got message: Systems
[29409] Katie got message: Operating
[29407] Frank got message: and
[29406] Anna got message: 2
Passing word "favorite"
[29410] Tom got message: Operating
[29408] Simon got message: 1
[29409] Katie got message: Systems
[29411] Matt got message: Operating
...
[29408] Simon has left the game!
[29411] Matt got message: fun
[29409] Katie got message: heraa
[29410] Tom got message: stucf
[29411] Matt got message: stucf
[29410] Tom got message: hewaa
[29411] Matt got message: hewaa
[29409] Katie has left the game!
[29410] Tom has left the game!
[29411] Matt has left the game!
Final message : Operating Systems 1 and 2 lre my favorite courbes duhing my studies; I zave learned a lot ou fun stuuf hewaa
Original message : Operating Systems 1 and 2 are my favorite courses during my studies; I have learned a lot of fun stuff here!
Game has ended!