Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Operation Silberkonfetti

Diskussion: Operation Silberkonfetti im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Operation Silberkonfetti. Vorgeschichte     Nach dem dieser Plan HaboDown - Denial of Service erfolgreich vereitelt worden war, möchten die ...

Antwort
Alt 11.11.08, 18:09   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard Operation Silberkonfetti


Operation Silberkonfetti.

Vorgeschichte   

Nach dem dieser Plan HaboDown - Denial of Service erfolgreich vereitelt worden war, möchten die KIs des Habo Teams eine andere
Taktik anwenden, um die Weltherrschaft an sich zu reißen: zu diesem Zweck wurde ein ENP (Elektromagnetischer Neuronen Programmierer) entwickelt, der mittels spezieller EM Impulse das Unterbewustsein auf "HABO-DIENER" umprogrammiert. ENPs sind klein (0.12 Gramm) und beziehen ihre Energie aus einer chemischen Reaktion, die (durch richtige Beschichtung) auch gleichzeitig die richtigen Impulse liefern. Allerdings gibt es mehrere Nachteile:
- sie sind sehr teuer und Aufwändig in der Herstellung
- die Ladung reicht nur für 10 Sekunden Betrieb
- der Kopf der Zielperson darf nicht weiter als 50cm entfernt sein
- ein Effekt konnte bei den Versuchspersonen nur dann erzielt
werden, wenn diese mit mindestens 3 ENPs innerhalb von 60 Sekunden in Kontakt kamen - sonst scheiterte die Programmierung (abgesehen davon, dass die Person eine unerklärliche Phobie gegen moderne, unkontrollierte Kommunikationsnezte entwickelte). Selbstverständlich braucht es für die Dauerfestigung der Umprogrammierung die Nähe des Kometen C/2007 N3 (dies ist am 24.02.09 gegeben!) - sonst verblasst die Programmierung innerhalb von 2 Wochen.
Nun haben die KIs beschlossen, ENPs als Silberkonfetti zu tarnen und auf eine solche Veranstaltung zu schmuggeln:
http://www.bundestag.de/aktuell/pres...pm_080130.html
(die aktuelle findet am 19.02.09 statt). Zum Zeitpunkt X wird Silberkonfetti von der Decke regnen und gefügige HABO-Diener erschaffen!

Da die ENPs wie erwähnt sehr teuer in der Herstellung sind, wurde entschieden, dass es ausreicht, 70% der Teilnehmer umzuprogrammieren und nur die dafür nötige Anzahl an Sendern herzustellen.

Der Widerstand hat Verbündete unter den Lieferanten und wird versuchen den Anschlag verhindern - allerdings müssen die Helfer wissen, nach welchen Packeten (Gewichtsmerkmal, denn reinschauen ist aus nachvollziehbaren Gründen nicht drin) sie Ausschau halten sollen. Hier wird Deine Hilfe benötigt!

Kurzfassung: es sollte ermittelt werden, wieviele ENP-"Sender" in einem Raum verteilt werden müssen, so dass 70% aller Anwesenden mit mindestens 3 Sendern in Kontakt kommen. Dabei sollte versucht werden, mit möglichst wenig Sendern auszukommen.

Bekannt:
Veranstaltungsraum: 50*80m
Teilnehmer: ~500 Personen

Sender:
Wirkungsradius: 0.5m
Gewicht: 0.12 Gramm
mindestens 3 müssen auf eine Person einwirken.
Ziel: 70% Quote

Maßstabeinheit: 10cm (sowohl bei Personen wie auch Senderverteilung) als Mindesteinheit in der Simulation reichen vollkommen aus.

Schreibe ein Programm, welches den Vorgang (mehrmals) simuliert und so die nötige Anzahl der Sender ermittelt. Gib das Gesamtgewicht der Sender aus.
Es wäre gut, wenn Dein Programm nebenbei ein paar statistische Werte ausgibt (und nicht nur das Ergebniss).
Visualisierung ist optional.

Vorschlag: gehe so vor, dass Du zuerst zufällig 500 Besucher im Raum verteilst (vereinfachte Darstellung: Personen als Punkte, Gruppenkuscheln sollte aber nach Möglichkeit vermieden werden).
Verteile dann zufällig N Sender im Raum und berechne anschließend die Quote.
Führe den Vorgang mehrmals (>=10 mal) durch und bilde den Durchschnitt.
Dies ist nun die Quote für N Sender.
Erhöhe/Erniedrige die Anzahl der Sender und wiederhole den Test, bis der Wert sich bei 70% einpendelt.


Tipp: starte mit einer sinnvollen Anzahl der Sender (also nicht unbedingt mit 1 ), außerdem kann man sich dem geeigneten Wert mit immer kleiner werdenen Schritten nähern (also nicht Stumpf um 1 erhöhen/erniedrigen).

Schwierigkeit ist dabei nach oben offen - je mehr Versuche man laufen lässt, desto aussagekräfiger sind die einzelnen Durchschnittswerte. Das gleiche gilt auch für die Maßeinheit. Personen halten auch einen Mindestabstand ein (bedingt durch die Körpergröße). Da stößt man bei einer naiven Umsetzung schnell an die Grenzen des Rechners und wird optimieren müssen, sofern man mehr als 100 Versuche pro Senderanzahl simulieren möchte
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 11.11.08, 21:33   #2 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

Ich hab jetzt mal angenommen, dass sich die Personen nicht näher als 0,50m kommen (was wohl der normalen Sprechdistanz entspricht, vllt auch etwas mehr).
Dann noch etwas, wäre es nicht einfacher, das Silberkonfetti zu zählen, bis 70% (350 "infizierte") erreicht sind? (wenn nicht, kann man es trotzdem noch zur Optimierung nehmen um dann mit einer simulation mit n konfetti für alle n' <= n zu haben...)
lagalopex ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 11.11.08, 21:50   #3 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard

Zitat:
Original von lagalopex
Ich hab jetzt mal angenommen, dass sich die Personen nicht näher als 0,50m kommen (was wohl der normalen Sprechdistanz entspricht, vllt auch etwas mehr).
Dann noch etwas, wäre es nicht einfacher, das Silberkonfetti zu zählen, bis 70% (350 "infizierte") erreicht sind?
Kann man natürlich machen - sollte eigentlich eher ein Vorschlag sein (habe es jetzt im Text entsprechend umformuliert).

Zitat:
also bei 12kg minimum... ich komm auf 22kg
so besser (neue Gewichtswerte) ?
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 11.11.08, 22:03   #4 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von CDW
Zitat:
Original von lagalopex
Ich hab jetzt mal angenommen, dass sich die Personen nicht näher als 0,50m kommen (was wohl der normalen Sprechdistanz entspricht, vllt auch etwas mehr).
Dann noch etwas, wäre es nicht einfacher, das Silberkonfetti zu zählen, bis 70% (350 "infizierte") erreicht sind?
Kann man natürlich machen - sollte eigentlich eher ein Vorschlag sein (habe es jetzt im Text entsprechend umformuliert).

Zitat:
also bei 12kg minimum... ich komm auf 22kg
so besser (neue Gewichtswerte) ?
Jup, viel besser

Dann wäre meine lösung also legal

...   
Bei mir pendelt sich das nach ein paar tausend simulationen bei etwa 18 tausend ein. aber noch mit recht starken schwankungen... 18004 bis 18021...
EDIT: 18013 sieht jetzt recht konstant aus ;)
Code:
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <vector>

using namespace std;

class enp
{
	bool put_person(int x, int y)
	{
		const int r = 5;
		int minx = (x - r > 0)? x - r : 0, maxx = (x + r < 800)? x + r : 799, miny = (y - r > 0)? y - r : 0, maxy = (y + r < 500)? y + r : 499;
		for (int a = minx; a <= maxx; ++a)
			for (int b = miny; b <= maxy ; ++b)
				if ((b - y)*(b - y) + (a - x)*(a - x) <= r*r && map[a][b] != -1)
					return false;
		map[x][y] = 0;
		return true;
	}
	int incpos(int x, int y)
	{
		const int r = 5;
		int c = 0, minx = (x - r > 0)? x - r : 0, maxx = (x + r < 800)? x + r : 799, miny = (y - r > 0)? y - r : 0, maxy = (y + r < 500)? y + r : 499;
		for (int a = minx; a <= maxx; ++a)
			for (int b = miny; b <= maxy ; ++b)
				if ((b - y)*(b - y) + (a - x)*(a - x) <= r*r && map[a][b] >= 0)
					if (++map[a][b] == 3)
						c++;
		return c;
	}
	void place_people()
	{
		map = vector<vector<int> >(800, vector<int>(500, -1));
		for (int i = 0; i < 500; )
			if (put_person(rand() % 800, rand() % 500))
				i++;
	}
	vector<vector<int> > map;
public:
	void simul(int max = 20000)
	{
		vector<int> inf(max, 0);

		for (int a = 1; ; ++a) {
			place_people();
			int c = 0;
			for (int n = 0; n < max; ++n)
				inf[n] += (c += incpos(rand() % 800, rand() % 500));
			int i = 0;
			while (inf[i] < a*350 && i < max) ++i;
			if (inf[i] != a*350)
				cout << "( " << i << " , " << i+1 << " )";
			else {
				cout << "[ " << i << " , ";
				while (inf[i] == a*350 && i < max) ++i;
				cout << i - 1 << " ]";
			}
			cout << " over " << a << " simulations" << endl;
		}
	}
};


int main()
{
	srand(time(0));
	class enp a;
	a.simul();
}
Nicht gerade schön... aber es funktioniert X(


EDIT: Hab ja den Code ganz vergessen
lagalopex ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Operation Silberkonfetti
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Interrupted operation.... S?b! Die Problemzone 8 01.11.08 01:32
map für Operation Flashpoint crusaderv83 Games 2 23.03.07 17:53
operation flashpoint zeck Games 3 11.12.05 20:52
OPERAtion Diplom Virologin Umfragen 2 15.03.05 15:44
Encrypting Operation Flashpoint ID blackwidow Cryptography & Encryption 18 17.06.04 14:24


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61