Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[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.

Schmetterlinge

Diskussion: Schmetterlinge im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Da ich nun Mod in diesem Forum bin will ich auch gleich mal eine Aufgabe stellen. Ihr findet sie ...

Antwort
Alt 20.06.03, 02:03   #1 (permalink)
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard Schmetterlinge

Anzeige

Da ich nun Mod in diesem Forum bin will ich auch gleich mal eine Aufgabe stellen.

Ihr findet sie hier: http://www.soinf.ch/tasks/Butterflies/desc.de.html

Kurz zusammengefasst:
Es geht darum ein Programm zu schreiben, das ein Bild eines Schmetterlings dargestellt durch Einsen (1) und Nullen (0) aus einer Datei liest und feststellt, ob der Schmetterling symmetrisch ist.
Zu beachten ist, dass der Schmetterling nicht im Bild zentriert sein muss.

Sollte nicht allzu schwer sein, ich werde dann bei Gelegenheit auch meine Lösung posten.
mfg
Nornagest

Nornagest ist offline   Mit Zitat antworten
Alt 22.06.03, 18:52   #2 (permalink)
Themenstarter
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard

Na los Leute!
Ich weiß doch, dass ihr das könnt, also macht mit!
Nornagest ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 29.06.03, 21:36   #3 (permalink)
Themenstarter
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard

Manno, jetz hab ich hier drei eigene Posts hintereinander...
aber hier ist mein Code:
Code:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>


using namespace std;

int main()
{
	ifstream in;
	in.open("in.txt",ios_base::in);
	vector<string> vec;
	vector<string>::iterator it;
	string buffer;
	int b, h,i;
	in>>b>>h;
	int left=b,
		right=0;
	cout<<b<<" "<<h<<"\n";

	while(in>>buffer)
	{
		vec.push_back(buffer);
		cout<<buffer;
		i=0;
		char tmp=buffer[i];
		bool info=false;
		while(tmp=='0' && i<b)
		{
			i++;
			tmp=buffer[i];
		}
		if(i<left)
			left=i;
		i=b-1;
		tmp=buffer[i];
		while(tmp=='0' && i>0)
		{
			i--;
			tmp=buffer[i];
		}
		if(i>right)
			right=i;
	}
	cout<<left<<" "<<right<<"\n";
	in.close();
	
	bool exit=false;
	it=vec.begin();
	while(it!=vec.end())
	{
		buffer=*it;
		it++;
		//cout<<buffer;
		int r=right, l=left;
		while(r>l && exit==false)
		{
			if(buffer[r] != buffer[l])
				exit=true;
			r--;
			l++;
		}
	}
	if(exit==true)
		cout<<"Der Schmetterling ist nicht symmetrisch!\n";
	else
		cout<<"Der Schmetterling ist symmetrisch!\n";
	return 0;
}
Ich vertraue natürlich darauf, dass hier trotzdem noch weitere Lösungen eintreffen.
mfg
Nornagest
Nornagest ist offline   Mit Zitat antworten
Alt 29.06.03, 22:31   #4 (permalink)
Member of Honour
 
Benutzerbild von Golgotha
 
Registriert seit: 29.10.01
Golgotha Leistung: Z3
Likes: 8
Standard

Hm.
Und jetzt zeigst Du mir, wo das Lindenblatt ist, auf gut deutsch
Du kommentierst dein Listing mal:

1.) Den Algo, wie du das Bild bearbeitest
2.) Schritt für Schritt, wie Du das Problem gelöst hast.

Ich möchte nämlich herausbekommen, ob Du nur abgeschrieben hast
oder Du wirklich hinter deinem Proggy stehst.
In Ordnung?

Golgotha
__________________
Man sieht nur mit dem Herzen gut.
Wirklich relevante informationren sind für's Auge unsichtbar!
Golgotha ist offline   Mit Zitat antworten
Alt 29.06.03, 22:50   #5 (permalink)
Themenstarter
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard

Also erstmal, ohne anmaßend wirken zu wollen, bitte achte auf deinen Tonfall.
Und bitte unterstell mir nicht einfach irgendwo Code zu klauen, wenn ich fremden Code verwende weise ich ausdrücklich darauf hin.
Vorsicht, das kratzt an meinem Ehrgefühl!

aber ich tu dir natürlich den Gefallen, weil du so nett fragst...

Das Programm öffnet die Datei und liest zuerst Zeilenlänge und -anzahl aus.
Dann liest es die einzelnen Zeilen der Datei und schreibt sie in einen Vector.
Dabei wird gleich überprüft wieviele Spalten links und rechts weggelassen werden können (damit der Schmetterling dann zentriert ist) indem überprüft wird wo die erste Eins kommt (einmal von links und einmal von rechts).

Nachdem wir die Daten so aufbereitet haben überprüfen wir die einzelnen Elemente (Strings) des Vektor auf Symmetrie. Hierbei lassen wir natürlich die vorher rausgefundene Anzahl von Spalten außer acht.
Symmetrieprüfung:
äußerst linkes und äußerst rechtes Zeichen wird verglichen, wenn sie identisch sind, nehmen wir das jeweils nächste Zeichen, bis die Mitte erreicht ist, oder eine Asymetrie festgestellt wurde.


Ich hoffe du bist mit mir zu frieden.
Nornagest ist offline   Mit Zitat antworten
Alt 29.06.03, 23:27   #6 (permalink)
Member of Honour
 
Benutzerbild von Golgotha
 
Registriert seit: 29.10.01
Golgotha Leistung: Z3
Likes: 8
Lightbulb

Hey, Nornagest,

Zitat:
Also erstmal, ohne anmaßend wirken zu wollen, bitte achte auf deinen Tonfall.
Und bitte unterstell mir nicht einfach irgendwo Code zu klauen, wenn ich fremden Code verwende weise ich ausdrücklich darauf hin.
Hi, genau dies hab ich gemerkt, der Code ist nicht geklaut.
Deshalb frage ich ja nach. Deshalb hab' ich mir Deinen Code genau angesehen.
entschuldige bitte meinen Tonfall, aber es ist meine Absicht genau
Dich zu provozieren!

Zitat:
Vorsicht, das kratzt an meinem Ehrgefühl!
Wie weit habe ich jetzt Dein Ehrgefühl verletzt?
Wie weit darf ich noch gehen? *gg*

Zitat:
Ich hoffe du bist mit mir zu frieden.
Absolut.

Wie weit kannst Du den Code auf Geschwindigkeit optimieren?
Versuchst Du es bitte einmal?
Für mich?

Danke!
Golgotha
__________________
Man sieht nur mit dem Herzen gut.
Wirklich relevante informationren sind für's Auge unsichtbar!
Golgotha ist offline   Mit Zitat antworten
Alt 29.06.03, 23:44   #7 (permalink)
Themenstarter
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard

Was willst du denn damit?
Und warum versuchst dus nicht mal selber?

Zitat:
Wie weit habe ich jetzt Dein Ehrgefühl verletzt?
Wie weit darf ich noch gehen? *gg*
Viel weiter solltest du nicht gehen!
Nornagest ist offline   Mit Zitat antworten
Alt 03.07.03, 00:47   #8 (permalink)
 
Registriert seit: 27.01.02
JoBbE Leistung: Facit NTK
Likes: 0
Standard

ARRRRRR
endlich hab ich meins fertig ;P
Nornagest kann ganz schön triezen wenn er will hrrhrr
trotzdem viiielen dank an ihn fürs motiviern & helfen.
ne gute lebende referenz isser



Code:
/* checks a butterfly on symmetry
** written by Jobbe
** thx goes out to NORNAGEST
*/

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int StartSpaces(string strLine)
{
	for(int i = 0; i < (int)strLine.length()-1; i++)
	{
		if( strLine[i] != ' ')
			return i;
	}
	return 0;
}

// lose spaces at the beginning 
// and in the end of the string
string LoseSpaces(string strwSpaces)
{
	string strBuf, strNoSpace;
	bool noStart = true;
	
	// beginning
	for(int i = StartSpaces(strwSpaces); i<(int)(strwSpaces.length()); i++)
		strBuf += strwSpaces[i];

	// end 
	for(int i = (strBuf.length()-1); i >= 0; i--)
	{	
		if( strBuf[i] != (' ') )
			noStart = false;
		if(!noStart)
			strNoSpace += strBuf[i];
	}

	return strNoSpace;
}

int GetSymCenter(string strLine)
{
	string myLine;
	myLine = LoseSpaces(strLine);

	return StartSpaces(strLine) + (int)((myLine.length()+1)/2);
}
				
bool AnalyseLine(string strLine, int sCenter)
{
	string myLine;
	myLine = LoseSpaces(strLine);

	// compare the current center to sCenter
	int curCenter = StartSpaces(strLine) + (int)((myLine.length()+1)/2);
	if( curCenter != sCenter)
		return false;

	// check for odd charcount
	if( myLine.length()%2 == 0 )
		return false;

	// now check for symmetry
	for( int i = 0; i < sCenter-1; i++)
		if( myLine[i] != myLine[myLine.length()-i-1] )
			return false;

	return true;
}

int main(int argc, char *argv[])

{
	// variables
	char strcBuf[256];
	string strBuf;
	int sCenter = -1;
	bool bSym = true;
	ifstream myFile;
	
	// check commandline options
	if(argc < 2) 
		cout << "Syntax: Schmetterlinge <Datei>\n";
	else
	{	
		cout << "Versuche, '" << argv[1] << "' zu oeffnen...\n\n";
		myFile.open(argv[1]);	
		
		// check file
		if(!myFile.is_open())
			cout << "Oeffnen fehlgeschlagen.\n";
		else
		{
			// file output and analysis
			while( myFile.getline(strcBuf, 256))
			{
				// convert to string
				strBuf = strcBuf;

				// line output
				cout << strBuf;

				// get symmetry center
				if(sCenter == -1)
					sCenter = GetSymCenter(strBuf);
				
				// analyse line
				if(!AnalyseLine(strBuf, sCenter))
				{
					cout << " |=> keine Symmetrie";
					bSym = false;
				}
				
				// looks better :)
				cout << "\n";
			}
			
			// we need to clean up
			myFile.close();
			
			cout << "\n";

			if(bSym)
				cout << "Der Schmetterling ist symmetrisch!\n";	
			else
				cout << "Der Schmetterling ist asymmetrisch!\n";				
		}
	}
	return (0);
}

als testdateien kann man z.b. diese hier benutzen

symmetrisch:
Code:
     1         1
   00000     00000  
  000 000 1 000 000
  00000001110000000
    0000011100000
     00001110000
    0000011100000
  0000000 1 0000000
000 0000     0000 000
00   00       00   00
 00 00         00 00
  000           000
   1             1
asymmetrisch:
Code:
     1         1
   00000     00000  
  000 000 1 0001000
  00000001110000000
    0000011100000
      0001110000
    0000011100000
  0000000 1 0000000
 000 0000     0000 000
00   00       00   00
 00 00         00 00
  000           000
   1             1

JoBbE ist offline   Mit Zitat antworten
Alt 07.07.03, 10:04   #9 (permalink)
 
Registriert seit: 26.09.02
Crux Leistung: Facit NTK
Likes: 0
Standard

Hi Leute...

Zwar ist das nicht von mir, aber passt ganz zum thema dazu.

Link

MfG

Crux
Crux ist offline   Mit Zitat antworten
Alt 04.05.04, 15:04   #10 (permalink)
 
Registriert seit: 04.05.04
Luzifer84 Leistung: Facit NTK
Luzifer84 eine Nachricht über ICQ schicken
Likes: 0
Unhappy symmetrie bei diagonaler achse

hi leutz,

hab die aufgabe eben mal überflogen und fand sie ganz nett, doch würde mich interessieren ob auch jemand ne lösung fände für ne diagonale symmetrieachse?

sobald ich aus dem prüfungsstress raus bin, denk ich mal ne runde drüber nach. bis dahin geh ich mich nochmal mit endlichen automaten beschäftigen.

cu

ps: fällt jemandem ne tolle prüfungsaufgabe zu bäumen ein?
Luzifer84 ist offline   Mit Zitat antworten
Alt 04.05.04, 17:11   #11 (permalink)
Themenstarter
 
Registriert seit: 02.10.01
Nornagest Leistung: Facit NTK
Likes: 0
Standard

diagonal:
Also dann muss das ganze ja ein Quadrat sein (oder ein Drachenviereck...) und dann sollte das auch kein großes Problem sein, du zählst diagonal durch, die Überprüfung läuft im Grunde genauso.
Man ließt erst das ganze "Bild" ein (zweidimensionaler array/Vektor) und dann überprüft man.

zu Bäumen:
schau mal in die Labyrinth Aufgabe, wenn man das mit Bäumen löst kann das ne schöne Aufgabe sein
Labyrinth

mfg
Nornagest
Nornagest ist offline   Mit Zitat antworten
Alt 04.05.04, 22:25   #12 (permalink)
 
Registriert seit: 04.05.04
Luzifer84 Leistung: Facit NTK
Luzifer84 eine Nachricht über ICQ schicken
Likes: 0
Standard

das mit dem laby klingt ganz spannend, ist aber wohl bis zur prüfung morgen als kleine übung nicht mehr zu schaffen ;-)

bezüglich des schmetterlings war ich wohl mal wieder mathematisch zu unpräzise. ich meinte natürlich keine exakte diagonale. die positionen wären reichlich einfach zu vergleichen. suchte eher nen algorhytmus für ne schiefe achse... das würde die sache sicher interessanter gestalten.

mfg
Luzifer84 ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Schmetterlinge
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
Schmetterlinge als natürliche LED-Anzeigen non Science & Fiction 5 21.11.05 13:54


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