I’m with stupid

Hin und wieder kommt man in die Situation, dass man eigentlich was anderes machen sollte, und – schwupps – hat man wieder etwas völlig anderes programmiert, das die Menschheit einen weiteren kleinen Schritt voran bringt. Bei mir war es mal wieder soweit.

I’m with stupid ist ein Spiel, das man auch gut in Internetforen spielen kann. Die Regeln sind simpel:

Da Rulez1

In jeder Runde stellt die Spielleitung eine bestimmte Anzahl Fragen. Die Mitspielerinnen und Mitspieler geben nun geheim ihre Antworten ab.

Haben alle ihre Antworten abgegeben, so wird ausgezählt: Jede Antwort ist genau so viele Punkte wert, wie oft sie insgesamt abgegeben wurde – unabhängig davon, ob sie wahr ist. Ein Beispiel:

Frage: Welcher ist der größte Kontinent?
Antworten: 5x Afrika, 3x Asien, 1x Antarktis, 1x Pangäa.

Wer ‚Afrika‘ geantwortet hat, bekommt also 5 Punkte gutgeschrieben, wer ‚Asien geantwortet hat 3 Punkte, ‚Antarktis‘ und ‚Pangäa‘ geben je 1 Punkt.

Die Punkte werden addiert und somit ein Rundensieger bzw. eine Rundensiegerin ermittelt (halt wer in der Runde die höchste Punktzahl hat, is klar).

Wer am Ende des Spiels die meisten Punkte hat, gewinnt.

Natürlich sagt vor Ende einer Runde niemand, was er/sie geantwortet hat, um die Spannung nicht zu zerstören. Bei ähnlichen Antworten (z. B. ‚Holland’/’Niederlande‘) entscheidet die Spielleitung in ihrer allgütigen Weisheit, ob die Antworten zusammengefasst oder als unterschiedlich behandelt werden.

Das Problem

Wie man sich leicht vor Augen führen kann, ist die manuelle Auswertung mordsaufwändig: Für jede Person die mitspielt müssen die Antworten zur Berechnung der Punktzahlen zunächst mitgezählt werden, dann die Punktzahlen für jede Antwort errechnet und anschließend rückwärts die errechneten Punktzahlen für jede Antwort den entsprechenden Mitspielerinnen und Mitspielern gutgeschrieben werden. Bei X Personen bedeutet eine Änderung von einem einzigen Wert schlimmstenfalls die Anpassung von O(X) weiteren Werten. Vor Rundenschluss schon mal Teilergebnisse berechnen ist also auch nicht sinnvoll.

Lässt sich das Ganze automatisieren? Okay, das war eine rhetorische Frage. Eine kurze Recherche förderte leider keine fertigen out-of-the-box-I’m-with-stupid-Auswertungslösungen zu Tage. Doch die Problemstellung hatte mich gepackt, ein bedienbares Programm musste her.

Die Lösung

I’m with stupid schreit förmlich nach einer Datenbankanwendung mit Aggregatsfunktionen und Gruppierung (COUNT(), SUM() und GROUP BY) – SQL ist schon was tolles. 6 Datenbanktabellen ein bisschen PHP drumrum, und fertig ist die Multiuser-Multigame-I’m-with-stupid-Umgebung für die faule Spielleitung. Es folgen ein paar Screenshots. Geplant ist, das noch irgendwie öffentlich spielbar zugänglich zu machen, dazu muss ich allerdings noch austüfteln, auf welchem Server unter welcher Domain das laufen soll.

Nach dem Login wird man von einer Übersicht über alle eigenen Spiele begrüßt. Mehrere Personen können gleichzeitig mehrere Spiele leiten.

Nach dem Login wird man von einer Übersicht aller eigenen Spiele begrüßt. Mehrere Personen können gleichzeitig mehrere eigene Spiele leiten.

Hier lassen sich Spieler anlegen und löschen

Hier lassen sich Spieler anlegen und löschen. Die Rundenverwaltung ist übrigens in jedem Menü verfügbar.

Das Kernstück der Anwendung. Hier lassen sich für die Mitspielerinnen und Mitspieler die Antworten eintragen, sobald sie eintreffen. Eine Autovervollständigung hilft dabei, bereits vorhandene ähnliche Antworten zu erkennen.

Das Kernstück der Anwendung. Hier lassen sich für die Mitspielerinnen und Mitspieler die Antworten eintragen, sobald sie eintreffen. Eine Autovervollständigung hilft dabei, bereits vorhandene ähnliche Antworten zu erkennen.

Die Fragen lassen sich im entsprechenden Menüpunkt erstellen und notfalls wieder löschen.

Die Fragen lassen sich im entsprechenden Menüpunkt erstellen und notfalls wieder löschen.

Eine Übersicht über alle Antworten gibt es im Menü 'Antworten verwalten'.

Eine Übersicht über alle Antworten gibt es im Menü ‚Antworten verwalten‘.

Was vor allem interessiert, sind natürlich die Ergebnisse. Hier haben wir Runden-...

Was vor allem interessiert, sind natürlich die Ergebnisse. Hier haben wir Runden-…

... und Gesamtpunktzahl im Angebot. Die Punkte werden immer frisch aus der Datenbank berechnet. Die Liste mit den Runden- und Gesamtplatzierungen lässt sich einfach herauskopieren.

… und Gesamtpunktzahl im Angebot. Die Punkte werden immer frisch aus der Datenbank berechnet. Die Liste mit den Runden- und Gesamtplatzierungen lässt sich einfach herauskopieren.

Detaillierte Rundenübersichten gibt es auch noch.

Detaillierte Rundenübersichten gibt es auch noch.

Die Entwicklung war schon spaßig. Das Ganze gibt es bereits im Quellcode auf GitHub, allerdings ist da eigentlich noch ein Refactoring nötig. Aber hey, es läuft 😉

Update: Natürlich will man auch wissen, wie viele Punkte die Antworten gebracht haben…

Die Punkteverteilung kann direkt mit leichter BBCode-Formatierung in beispielsweise einen Forenbeitrag kopiert werden.

Die Punkteverteilung kann direkt mit leichter BBCode-Formatierung in beispielsweise einen Forenbeitrag kopiert werden.

Update, 13.09.2013: Unter http://hscmi.de/iws/ kann man sich das ganze nun auch live und in Farbe ansehen.

  1. Ich wollte das schon immer mal schreiben!

Zahlen malen

In ungefähr genau einer Woche ist es wieder soweit: Wer in Bonn studiert und den Semesterbeitrag noch nicht überwiesen hat, sieht entweder Verspätungsgebühren oder gar die Exmatrikulation auf sich zukommen.

Für das Wintersemester 2013/14 sprechen wir hier von 248,32 €. Das sind wieder einmal ein paar Euros mehr als im letzten Semester, was nun daran liegt, dass das Studiticket leider nicht billiger wird.

Wer sich dafür interessiert, wie sich dieser Betrag zusammensetzt, wird in der „Beitragsordnung der Studierendenschaft der Rheinischen Friedrich-Wilhelms-Universität Bonn in der Fassung der Beitragsordnung vom 23. Juli 2013“ (Link) fündig. Dazu kommt lediglich noch der Beitrag für das Studentenwerk in Höhe von 77 €.

Doch auch wer sich nicht dafür interessiert, sollte zumindest einen groben Überblick darüber haben, wofür er/sie jedes Semester so viel Geld ausgibt. Kleine Tabelle gefällig?

AStA 10,50 €
stud. Sozialeinrichtungen 0,66 €
Hilfsfonds 0,01 €
Studiticket-Rückerstattung 0,85 €
Fachschaften 1,75 €
Studierendensport 0,85 €
VRS-Ticket 112,70 €
NRW-Ticket 44,00 €1
Studentenwerk 77,00 €
Summe 248,32 €

Hässlich? Ja. Übersichtlich? Nein. Das muss doch irgendwie besser gehen. Vielleicht lässt sich das ja grafisch cool darstellen?

Fett! Lass uns ein Diagramm malen!

Der Klassiker ist das Balkendiagramm:

balkendiagramm

Wie Sie sehen, sehen Sie nichts. Also schon, die drei fetten Balken rechts, aber die Mitte ist unlesbar.

Kreisdiagramme sind eh viel cooler!

Der Witz an unseren Zahlen ist, dass wir hier von einigen großen und vielen kleinen Beträgen reden. Unser Kreisdiagramm sieht entsprechend aufschlussreich aus:

kreisdiagramm

Jo, also die Tickets machen mehr als die Hälfte aus und das Studentenwerk ist auch ein dicker Brocken. Der AStA-Beitrag ist noch erkennbar. Aber abdrucken würde so etwas hoffentlich niemand.

Aber es gibt doch noch…

Statt jetzt hier mit Flächen-, Blasen- und Netzdiagramm weiter zu machen, die uns genauso wenig weiterhelfen, verfolgen wir einen etwas anderen Ansatz: Flächen statt Längen. Eine Treemap sollte eigentlich perfekt sein – werfen wir mal Google Docs an und gucken, was dabei herauskommt.

treemap

Öhm…. besser als vorhin ist es wenigstens. Die meisten kleinen Beträge sind zumindest als farbige Fläche erkennbar. Dennoch besteht zweifelsfrei Verbesserungspotenzial.

Einen Versuch wagen wir noch! Diesmal mit viel Handarbeit in Inkscape:

Semesterbeitrag-2Oh yeah \o/
Ein Quadrat kostet 50 ct, und selbst der eine Cent für den Hilfsfonds ist noch erkennbar. Wir sind so begeistert, dass wir die Grafik umgehend in die neue Erstsemester-BAStA packen.

Das Geheimnis des Erfolgs ist offensichtlich die Kombination aus Balkendiagramm und Treemap: Die Grundstruktur besteht aus Balken, die aber unterschiedlich breit sind, so dass wir letztendlich breite hohe und schmale niedrige Balken vor uns haben. Dieses Meisterwerk könnte man jetzt auf Poster drucken und überall in der Uni aufhängen – leider ändern sich die Zahlen nächstes Semester bereits wieder. Nach oben, versteht sich.

Nachtrag: Hups, Fußnote vergessen.

  1. Wer sich jetzt denkt „Hey, wenn das NRW-Ticket so billig ist, dann verzichten wir doch auf das VRS-Ticket und sparen ganz viel Geld“, den muss ich enttäuschen: Das NRW-Ticket gibt’s nur als „Add-On“ auf das VRS-Ticket drauf.

Wie rechnet der Wahl-O-Mat?

Vor den letzten Wahlen war der Wahl-O-Mat der Bundeszentrale für politische Bildung (bpb) immer ein nettes Spielzeug. Was mich aber schon immer gestört hat: Nirgends lässt sich die Information finden, nach welchem System der Wahl-O-Mat die Ähnlichkeitsberechnung vornimmt. Nur bei den angezeigten Balkendiagrammen findet sich in Form eines Tooltips ein Hinweis darauf, dass das alles irgendwie auf einem Punktesystem basiert.

Durch hartnäckiges Reverse-Engineering kann ich nun hier the one and only Punktesystem des Wahl-O-Mat der bpb präsentieren:

Die Antworten der Testperson (das bist du) werden mit den vorgegebenen Antworten der Parteien abgeglichen.

  • Stimmt die Antwort überein, werden der Partei 2 Punkte gutgeschrieben;
  • Weicht die Antwort leicht ab (Zustimmung/Neutral oder Neutral/Ablehnung), wird der Partei 1 Punkt gutgeschrieben;
  • Sind die Antworten entgegengesetzt, gibt es keine Punkte für die Partei;
  • (Vermutung, da Situation sehr unwahrscheinlich:) Hat eine Partei eine Frage nicht beantwortet, gibt es ebenfalls keinen Punkt.

Eine Frage, die die Testperson übersprungen hat, wird nicht gewertet. Entsprechend gibt es dann insgesamt weniger Punkte zu erreichen.

Eine Frage, die doppelt gewichtet werden soll, wird doppelt gewichtet, das heißt, für sie wird die doppelte Punktzahl gutgeschrieben (0/2/4). Entsprechend gibt es insgesamt mehr Punkte zu erreichen.

Wer am Ende die meisten Punkte hat, gewinnt, und darf in der Übersicht ganz links stehen.

So einfach ist das. Hätte man auch selber draufkommen können.