Vrienden van vrienden

Six degrees of separation is het idee dat alle mensen zes of minder sociale verbindingen van elkaar verwijderd zijn. Dit betekent dat men schat dat er steeds een ketting van "een vriend van een vriend" -koppelingen kan worden gemaakt om twee mensen in maximaal zes stappen met elkaar te verbinden. Het idee werd oorspronkelijk geopperd door Frigyes Karinthy in 1929 en werd gepopulariseerd in een gelijknamig toneelstuk uit 1990 geschreven door John Guare.

Er zijn verschillende onderzoeken uitgevoerd, zoals het 'kleine-wereld'-experiment van Milgram, om deze verbondenheid empirisch te meten. De uitdrukking "six degrees of separation" wordt vaak gebruikt als synoniem voor het idee van het fenomeen "kleine wereld".

In 2001 probeerde Duncan Watts, professor aan de Columbia University, het experiment van Milgram op het internet na te bootsen, waarbij hij een e-mailbericht gebruikte als het "pakket" dat moest worden bezorgd, met 48.000 afzenders en 19 doelen (in 157 landen). Watts ontdekte dat het gemiddelde (hoewel niet maximale) aantal tussenpersonen rond de zes was. Een studie uit 2007 door Jure Leskovec en Eric Horvitz onderzocht een dataset met instant messages die bestond uit 30 miljard gesprekken tussen 240 miljoen mensen. Ze vonden de gemiddelde padlengte onder Microsoft Messenger-gebruikers 6. Bakhshandeh heeft dit ook onderzocht door de mate van scheiding tussen twee gebruikers in sociale netwerken zoals Twitter te bestuderen. Met nieuwe zoektechnieken hebben ze de gemiddelde afstand tussen de gebruikers van Twitter gezocht. Hun optimale algoritme vindt een gemiddelde mate van scheiding van 3,43 tussen twee willekeurige Twitter-gebruikers. Dus in deze tijden van verbondenheid via sociale media zijn zes stappen mogelijk al teveel.

Om dergelijke analyses te kunnen doen, is het dus van belang om vrienden van vrienden te kunnen identificeren. Stel dat je een groep van 6 mensen onderzoekt waar sommigen vrienden zijn maar niet noodzakelijk allemaal. Dan kunnen we dit als volgt in een schema voorstellen (voor het gemak stellen we elke persoon voor met een cijfer van 1 tot 6, in plaats van een naam):

 12 345 6
1 *    
2* * **
3 * *  
4  *   
5 *    
6 *    

Hierbij wordt enkel een * in een vakje geplaatst indien de beide personen vrienden zijn, in de andere gevallen blijft het vakje leeg. In dit gezelschap kunnen we dus afleiden dat persoon 1 en persoon 3 vrienden van vrienden zijn. Immers persoon 1 is bevriend met persoon 2 en persoon 2 is op zijn beurt bevriend met persoon 3. Met andere woorden tussen persoon 1 en 3 zitten '2 degrees of seperation'. We willen een overzicht maken van alle vrienden van vrienden in deze groep ('2 degrees of seperation' van elkaar).

Programma

Schrijf zelf een programma dat eerst het aantal mensen in de groep inleest. Vervolgens leest het programma een schema dat aangeeft welke mensen vrienden zijn van elkaar. Dit schema bestaat uit meerdere lijnen, waarbij de rijen en de kolommen de verschillende personen in het gezelschap voorstellen. Voor het gemak worden de mensen ook hier genummerd vanaf 1. Verder staat er een * in dit schema indien de persoon op die rij en die kolom vrienden zijn. In het andere geval staat er een spatie.

Het programma bepaalt vervolgens welke personen vrienden zijn van elkaar, en plaatst dit op het scherm. Daarna zoekt het programma wie vrienden van vrienden zijn en plaatst deze ook op het scherm.
Let wel: als persoon 1 een vriend is van persoon 2, dan zal persoon 2 ook een vriend zijn van persoon 1. Dit vriendenkoppel komt echter maar 1 keer voor in de oplijsting. We lijsten de koppels op zo'n manier op, zodat het eerste cijfer altijd kleiner is dan het 2 cijfer, en zodat de tweede cijfers vervolgens ook van klein naar groot geordend zijn. Idem bij de vrienden van vrienden.

Tip:

Om de gegevens op die manier te sorteren kan je gebruik maken van de sorted()-functie in Python. Dit is een heel krachtige functie die veel verschillende soorten objecten - zoals list, 2-dimensonale lists, dictionaries, ... - kan sorteren, en daarbij telkens een nieuw gesorteerd object aanmaakt.
Als je bv de vrienden-van-vrienden-paren in een 2-dimensionale list L1 stopt dan zal L2 = sorted(L1) jou een 2-dimensionale list geven die op de correcte manier gesorteerd is (eerste cijfers van klein naar groot en vervolgens de tweede cijfer ook van klein naar groot)

Voorbeeld

Input

De gebruiker geeft het aantal mensen in de groep op, gevolg door een schema van spaties en sterren die aangeven welke personen vrienden zijn van elkaar:

6
 *    
* * **
 * *  
  *   
 *    
 *    

Ouput

Eerst wordt opgelijst welke personen vrienden zijn (in 2 kolommen met een spatie tussen), daarna volgen de vrienden van vrienden:

Vrienden
1 2
2 3
2 5
2 6
3 4
Vrienden van vrienden
1 3
1 5
1 6
2 4
3 5
3 6
5 6