Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4093

beantworten | zitieren | melden

Oder der alte XOR-Trick:


a ^= b;
b ^= a;
a ^= b;

P.S. Die Kurzform


a^=b^=a^=b;
scheint unter C# so nicht zu funktionieren (aber in C und C++).
private Nachricht | Beiträge des Benutzers
Robin0
myCSharp.de - Member



Dabei seit:
Beiträge: 213

beantworten | zitieren | melden

Moderationshinweis von herbivore (02.03.2014 - 11:13:04):

Achtung: Durch den weiter unten genannten Messfehler stimmen die Ergebnisse und Schlussfolgerungen nicht. Noch weiter unten finden sich plausible Messergebnisse.


Ich hab das ganze mal auf die performance getestet, und "Aratar" war am schnellsten mit der lösung, somit ist er der Gewinner :).

(Das gilt natürlich nur wenn die beiden zahlen zusammengenommen nicht größer als 32bit sind.
In dem Fall sind die anderen Lösungen besser)[Hatte ich aber in der aufgabe nicht berüksichtigt]


EDIT:
Siehe Th69, habe die falsche funktion genommen um die geschwindigkeit zu testen.
/EDIT
Test:


            int a = 15;
            int b = 20;

            for (int i = 0; i < 100000000; i++)
            {
                a = a + b;
                b = a - b;
                a = a - b;

            }

            Console.WriteLine(System.Environment.TickCount);
            Console.Read();
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Robin0 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4093

beantworten | zitieren | melden

Hallo Robin0,

ich hoffe mal, daß du nicht die Environment.TickCount-Eigenschaft zur Zeitmessung benutzt hast (zumindestens nicht den absoluten Wert), denn
Zitat von "MSDN"
Environment.TickCount-Eigenschaft

Ruft die Anzahl der Millisekunden ab, die seit dem Systemstart verstrichen sind.
Verwende besser die Stopwatch-Klasse (vor jeder neuen Zeitmessung aber dann wieder stopwatch.Reset() aufrufen, falls du mehrere Zeitmessungen nacheinander mit der selben Stopwatch-Instanz durchführst!).
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

beantworten | zitieren | melden

Zitat von zommi

a = b + 0*(b=a)

Schau dir mal das Konstrukt im Reflector an und staune was der Compiler daraus macht. 8o

Oder ist das etwas absicht? :evil:

Noch lustiger ist was sich der C# Parser daraus bastelt. Erst wenn man sich die IL direkt anschaut wird klar was der Compiler daraus macht.


PS:

Meine Ergebnisse:
(Gemessen mit Stopwatch)

Methode Aratar:
106 ms

Methode DerKleineTomy:
64 ms

Methode zommi:
64 ms

Methode dr4g0n76:
64 ms

Methode Th69:
96 ms
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Scavanger am .

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

Moderationshinweis von herbivore (08.10.2013 - 08:40:26):

Damit nicht jeder selber den Reflector anwerfen muss: a = b + 0*(b=a); wird angezeigt als


b = a;
a = b;

was dazu führen würde, das anschließend in beiden Variablen der Wert von a stehen würde. Erst im IL-Code sieht man, dass die Lade- und Speicheroperationen so verzahnt sind, dass die Werte tatsächlich vertauscht werden:

ldloc.1 
ldloc.0 
stloc.1 
stloc.0

ldloc.i: Fügt den Wert der lokale Variable mit dem Index i oben auf dem Auswertungsstapel hinzu.

stloc.i: Holt den aktuellen Wert von der obersten Position des Auswertungsstapels und speichert ihn in der lokalen Variablen mit dem Index i.

Damit ist die Lösung (trotz der falschen Anzeige im Reflector) ziemlich cool, und sie hat auch kein (potenzielles) Problem mit einem mathematischen Überlauf, wie die anderen Lösungen, die auf Addition und Subtraktion oder Multiplikation und Division basieren.

private Nachricht | Beiträge des Benutzers
Robin0
myCSharp.de - Member



Dabei seit:
Beiträge: 213

beantworten | zitieren | melden

@Th69

ups, mein fehler :D, ich wusste nichmehr genau wie die eigenschaft heißt die prüft wieviele millisecunden das programm schon laeuft und hab anscheinend die falsche genomen.

Aratar war trotzdem der erste.
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (15.10.2013 - 09:02:35):

Das Programmierspiel ist wieder frei. Jeder der möchte, kann eine neue Aufgabe stellen.

dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

Auf Herbivores Hinweis, stelle ich eine neue Aufgabe:

Vorneweg:
Ich denke die Aufgabe müsste in 50 Zeilen Code gelöst werden können.


Es geht darum, die Properties eines Objektes ALLE auszugeben und zwar derart:

Nehmen wir an, wir haben die folgenden Klassen (nicht als Text,
sondern wirklich im Visual Studio - vom Code aus benutz- und zugreifbar.

Bsp.:



EDIT: In class Book Fields durch Properties ersetzt

   public class Book
    {
        private int pages = -1;

        public Book(int pages)
        {
            this.pages = pages;
        }

        public string Title { get; set; }
        public int ReleaseYear { get; set; }
        public Author Author { get; set; }
        
        public int GetPages()
        {
            return pages;
        }
    }
	
	public class Author
       {
           public string FirstName { get; set; }
           public string LastName { get; set; }
           public string FancyName { get; set; }
           public string Name { get { return FirstName +" "+ LastName;} }
           public Biography Bio { get; set; }
       }
	
	public class Biography
        {
            public string Name { get; set; }
         }
	

Eine Methode ist zu schreiben, die folgendes ausgibt:

Wie der Aufrufende die Properties, bzw. Methoden aufrufen muss, um an den entsprechenden Wert bzw. Call zu kommen.
Dabei muss es egal sein, ob die Properties/Methoden/Fields mit "Get" oder "get_" anfangen, d.h. aus GetPages wird Pages,
ebenso werden die Klammern, wie z.B. bei GetPages() weggelassen, d.h. nur der reine Name und Punkte werden angegeben.
Das ganze muss auch noch dann funktionieren, wenn die Objektstruktur noch weiter erweitert wird.

Es wird immer der "Vollqualifizierte" Aufrufpfad ausgegeben.

Stichwort:

MemberInfo

Die Aufgabe darf rekursiv und iterativ gelöst werden.

Bsp. für eine korrekte Lösungsausgabe:

Book
Book.Title
Book.ReleaseYear
Book.Author
Book.Author.FirstName
Book.Author.LastName
Book.Author.FancyName
Book.Author.Name
Book.Author.Bio
Book.Author.Bio.Name
Book.Pages


Da in jeder Zeile sowieso Book vorkommt,
gilt auch, das Objekt kann weggelassen werden:

Ebenfalls korrekt:

Title
ReleaseYear
Author
Author.FirstName
Author.LastName
Author.FancyName
Author.Bio
Author.Bio.Name
Pages


Wenn also z.B. Bio später noch ein Unterobjekt mit

Bio.WeitereEbene.Entity1
Bio.WeitereEbene.Entity2


bekommen würde,

müsste die Ausgabe zusätzlich noch:

Author.Bio.WeitereEbene
Author.Bio.WeitereEbene.Entity1
Author.Bio.WeitereEbene.Entity2


enthalten.

Alles klar? Sonst bitte nachfragen.
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 698
Herkunft: OWL

beantworten | zitieren | melden

Hi dr4g0n76,
darf Author.Bio nicht ausgegeben werden, weil es nur ein einziges Element enthält oder wurde es in der korrekten Lösungsausgabe vergessen?
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

@Pinki: Hatte ich vergessen, habe ich ergänzt.

Es gilt für alles was aufrufbar ist. Danke für den Hinweis. :
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2354

beantworten | zitieren | melden

Hallo,

meine Lösung sieht wie folgt aus:


static string GetMembers(Type type)
{
	string sMemberInfos = string.Empty;
	foreach (string sMember in GetMembers(type, string.Empty))
		sMemberInfos += String.Concat(sMember, Environment.NewLine);
}

static List<string> GetMembers(Type type, string sMemberCallPath)
{
	// list to temporary hold the callpaths
	List<string> callPaths = new List<string>();

	if (sMemberCallPath != string.Empty)
		sMemberCallPath += ".";

	// filter all types of namespace System
	if (type.FullName.StartsWith("System"))
		return new List<string>();
			
	MemberInfo[] members = type.GetMembers();

	foreach (MemberInfo member in members)
	{
		switch (member.MemberType)
		{
			case MemberTypes.Field:
				FieldInfo finfo = member as FieldInfo;
				if(!callPaths.Contains(String.Concat(sMemberCallPath,finfo.Name)))
					callPaths.Add(String.Concat(sMemberCallPath,finfo.Name));
				if (finfo.IsPublic)
					callPaths.AddRange(GetMembers(finfo.FieldType, String.Concat(sMemberCallPath, member.Name)));
				break;
			case MemberTypes.Property:
				PropertyInfo pinfo = member as PropertyInfo;
				if (!callPaths.Contains(String.Concat(sMemberCallPath, pinfo.Name)))
					callPaths.Add(String.Concat(sMemberCallPath, pinfo.Name));
					callPaths.AddRange(GetMembers(pinfo.PropertyType, String.Concat(sMemberCallPath, member.Name)));
				break;
			case MemberTypes.Method:
				string sMemberName = member.Name;
				if (member.Name.StartsWith("Get") || member.Name.StartsWith("Set"))
					sMemberName = member.Name.Remove(0, 3);
				else if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_"))
					sMemberName = member.Name.Remove(0, 4);
				if(!callPaths.Contains(String.Concat(sMemberCallPath, sMemberName)))
					callPaths.Add(String.Concat(sMemberCallPath, sMemberName));
				break;
		}
	}

	callPaths.Sort();

	return callPaths; ;
}
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von inflames2k am .
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

@inflames2k:


  string sMemberInfos = string.Empty;
    foreach (string sMember in sMemberInfos )
        sMemberInfos += String.Concat(sMember, Environment.NewLine);

Das lässt sich nicht übersetzen, wie ist das gemeint?


  string sMemberInfos = string.Empty;
    foreach (string sMember in sMemberInfos )

EDIT: kann mir ja was denken, nur wie Du es wirklich gemeint hast, da gibt es mehrere Möglichkeiten.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2354

beantworten | zitieren | melden

Ja war mein Fehler, hatte ich jedoch korrigiert. - Aber ich seh, da fehlt dennoch noch etwas.

Die korrigierte Variante noch einmal:


static string GetMembers(Type type)
{
    string sMemberInfos = string.Empty;
    foreach (string sMember in GetMembers(type, string.Empty))
        sMemberInfos += String.Concat(sMember, Environment.NewLine);

   return sMemberInfos;
}

static List<string> GetMembers(Type type, string sMemberCallPath)
{
    // list to temporary hold the callpaths
    List<string> callPaths = new List<string>();

    if (sMemberCallPath != string.Empty)
        sMemberCallPath += ".";

    // filter all types of namespace System
    if (type.FullName.StartsWith("System"))
        return new List<string>();

    MemberInfo[] members = type.GetMembers();

    foreach (MemberInfo member in members)
    {
        switch (member.MemberType)
        {
            case MemberTypes.Field:
                FieldInfo finfo = member as FieldInfo;
                if(!callPaths.Contains(String.Concat(sMemberCallPath,finfo.Name)))
                    callPaths.Add(String.Concat(sMemberCallPath,finfo.Name));
                if (finfo.IsPublic)
                    callPaths.AddRange(GetMembers(finfo.FieldType, String.Concat(sMemberCallPath, member.Name)));
                break;
            case MemberTypes.Property:
                PropertyInfo pinfo = member as PropertyInfo;
                if (!callPaths.Contains(String.Concat(sMemberCallPath, pinfo.Name)))
                    callPaths.Add(String.Concat(sMemberCallPath, pinfo.Name));
                    callPaths.AddRange(GetMembers(pinfo.PropertyType, String.Concat(sMemberCallPath, member.Name)));
                break;
            case MemberTypes.Method:
                string sMemberName = member.Name;
                if (member.Name.StartsWith("Get") || member.Name.StartsWith("Set"))
                    sMemberName = member.Name.Remove(0, 3);
                else if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_"))
                    sMemberName = member.Name.Remove(0, 4);
                if(!callPaths.Contains(String.Concat(sMemberCallPath, sMemberName)))
                    callPaths.Add(String.Concat(sMemberCallPath, sMemberName));
                break;
        }
    }

    callPaths.Sort();

    return callPaths; ;
}
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

@inflames2k:

Ich sehe die Aufgabe als gelöst an,
für die entsprechenden Entities im vorgegebenen Modell wurde alles ausgegeben wie erwartet.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2354

beantworten | zitieren | melden

Da mir auf die schnelle keine Frage einfällt, geb ich die nächste Frage für alle anderen frei. ;)
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
ProGamer
myCSharp.de - Member



Dabei seit:
Beiträge: 691
Herkunft: NRW

beantworten | zitieren | melden

Hallo zusammen

Im Anhang befindet sich eine geheime Nachricht. Wie lautet sie?

Als Info noch:
  • Die grafik ist selbsterstellt (Per Code natürlich)
  • Mein Code ist 16 zeilen Lang (ohne Optimierungen)
  • Die Grafik wurde nicht in Schwarz/Weiss bzw. Graustufen konvertiert



Wenn noch Infos fehlen oder etwas unklar ist, einfach melden.

Viel Spass!
Attachments
MfG
ProGamer
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von ProGamer
Im Anhang befindet sich eine geheime Nachricht. Wie lautet sie?
"HELLO WORLD". Sieht man aber quasi schon :) Und validiert mit der Pipette aus Paint.NET und der ASCII-Tabelle.

Was willst du als Lösung? Nur die Nachricht? Code, der die Nachricht dekodiert? Oder den Ursprungscode, der das Bild erzeugt?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dN!3L am .
private Nachricht | Beiträge des Benutzers
ProGamer
myCSharp.de - Member



Dabei seit:
Beiträge: 691
Herkunft: NRW

beantworten | zitieren | melden

Zitat
Nur die Nachricht?
hast du schon gesagt.
Zitat
Code, der die Nachricht dekodiert? Oder den Ursprungscode, der das Bild erzeugt?
Wenns geht beides, ansonsten poste ich meinen Code ;-)

hmm, war wohl zu einfach was? XD
wie auch immer du bist dran.


EDIT:

Da leider noch kein Code gepostet wurde, werde ich natürlich meinen nicht vorenthalten.
(Die 16 Zeilen Code bezogen sich auf das auslesen (der gesamte Code ist nicht Optimiert!))


	public class Program
	{
		private const string Path = @"C:\Temp\SecretMessage.jpg";

		static void Main( string[] args )
		{
			CreateBitmap(Path, 32, new char[] { 'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D' });

			Console.WriteLine(ReadBitmap(Path, 32));

			Console.ReadKey();
		}


		private static void CreateBitmap( string path, int pixelHeightAndWidth, char[] message )
		{
			var tmpBitmapWidth = message.Length * pixelHeightAndWidth;
			var tmpBitmapHeight = pixelHeightAndWidth;

			using ( var bmp = new Bitmap( tmpBitmapWidth, tmpBitmapHeight ) )
			{
				var tmpOffsetWidth = 0;
				foreach ( var t in message )
				{
					for ( var x = tmpOffsetWidth; x < ( tmpOffsetWidth + pixelHeightAndWidth ); x++ )
					{
						for ( var y = 0; y < tmpBitmapHeight; y++ )
						{
							var tmpColor = Color.FromArgb( 255, t, t, t );
							bmp.SetPixel( x, y, tmpColor );
						}

					}
					tmpOffsetWidth += pixelHeightAndWidth;
				}
				bmp.Save( path );
			}
		}

		private static string ReadBitmap( string path, int pixelHeightAndWidth )
		{
			var tmpRes = new StringBuilder();

			using (var FS = new FileStream(path, FileMode.Open,FileAccess.Read,FileShare.Read))
			{
				using ( var bmp = new Bitmap( FS ) )
				{
					for ( int x = 0; x < bmp.Width; x += pixelHeightAndWidth )
					{
						tmpRes.Append((char)bmp.GetPixel(x, 1).R);
					}
				}
			}

			return tmpRes.ToString();
		}
	}
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ProGamer am .
MfG
ProGamer
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

beantworten | zitieren | melden

Mist zu langsam.... X(

Aber deine Encode Methode ist doch arg umständlich...

Hier ausser Konkurrenz meine in 8 Zeilen:


static Bitmap Encode(int height, string message)
{
    int width = message.Length * height;
    Bitmap bitmap = new Bitmap(width, height);
    using (Graphics g = Graphics.FromImage(bitmap))
    {
        for (int i = 0, j = 0; i < width; i += height, j++)
            g.FillRectangle(new SolidBrush(Color.FromArgb(255, message[j], message[j], message[j])), new Rectangle(i, 0, height, height));
    }
    return bitmap;
}

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Dann die neue Aufgabe:
Der folgende Code (sic!)...
[csharp]
using System;

static class Program
{
	static void Main()
	{
		var limit = 10;
		limit = "five";
		for (var x=0;x<limit;x++)
		{
			Console.WriteLine(x);
			Console.WriteLine("The current value of x is {0}",x);
		}
	}
}
[/csharp]
...soll folgende Ausgabe erzeugen:
[frame]
[FONT]0
The current value of x is zero
1
The current value of x is one
2
The current value of x is two
3
The current value of x is three
4
The current value of x is four[/FONT]

Wie geht das? [/frame]
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von dN!3L am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7548
Herkunft: Waidring

beantworten | zitieren | melden

Hallo dN!3L,

mit Roslyn Code daraus erstellen mit dem es funktioniert. Also einen Typen verwenden, indem implizite Casts von int und string möglich sind und ToString entsprechend überschrieben ist.

Gut dass du nur gefragt "wie" das geht, und nicht "wie genau", denn das weiß ich nicht ;-)

mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

Ist das auch Absicht:


var limit = 10;
limit = "five";
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von dr4g0n76
Ist das auch Absicht
Das ist alles Absicht. :)
Kompiliert auch mit dem ganz normalen C#-Compiler.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Hallo

Kompiliert bei mir nicht:
Fehler
Cannot implicitly convert type 'string' to 'int'

In Zeile:


limit = "five";

"soll", also eine Änderung machen, dann läuft es meinst du.

Gruss Peter
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Peter Bucher am .
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Hallo zusammen,

der Code der Main-Methode von oben (ich habe noch die Methoden- und Klassendefinition hinzugefügt) soll nicht geändert werden. Code außerhalb der Main-Methode hinzuzufügen ist erlaubt.
So für sich allein kompiliert der Code auch nicht - was ist also nötig, damit der Code erstens kompiliert und zweitens die gewünschte Ausgabe liefert?
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

I present... class var :D

using System;

static class Program
{
    static void Main()
    {
        var limit = 10;
        limit = "five";
        for (var x=0;x<limit;x++)
        {
            Console.WriteLine(x);
            Console.WriteLine("The current value of x is {0}",x);
        }
    }
}

// new code here

class var
{
    static string[] words = { "zero", "one", "two", "three", "four", "five"};
    int val {get; set;}
    public static implicit operator var(int n){ return new var(){val=n}; }
    public static implicit operator var(string s) { return Array.IndexOf(words, s); }
    public static implicit operator int(var v) { return v.val; }
    public static bool operator <(var a, var b) { return a.val < b.val; }
    public static bool operator >(var a, var b){ return b < a; }
    public static var operator ++(var v) { v.val++; return v; }
    override public string ToString() { return words[val]; }
}
Herrlich, dass so etwas funktioniert :-)
(getestet unter OSX mit Mono)

beste Grüße
zommi
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
DerKleineTomy
myCSharp.de - Member



Dabei seit:
Beiträge: 106

beantworten | zitieren | melden

Super Aufgabe. Ohne in eine bestimmte Definition in der C# Spezifikation zu gucken, hätte ich wohl etwas länger daran geknabbert :). Die Lösung poste ich allerdings nicht, da ich zu einem keine Aufgabe habe und zum anderen den Spaß an der Aufgabe nicht vermasseln möchte :)

Edit: Da war jemand mit der Lösung etwas schneller.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von DerKleineTomy am .
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von zommi
I present... class var :D
Genau! Der Trick ist, dass var eine Klasse ist. Die Möglichkeit, verschiedene Typen zuweisen zu können, bekommt man dann durch implizite Operatoren. Und das Verhalten bei Console.WriteLine ebenso (plus Hilfe von der Overload Resolution).
Siehe auch Jon Skeet: Abusing C# on Vimeo. zommi ist dran
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Hier meine neue Aufgabe:
Welches 3-buchstabige ASCII-Wort beginnt mit der 787471. Binärstelle des Nachkomma-Anteils von Pi? [COLOR]
(Also ab dem 787471. Bit bei Pi, wenn man Pi im binären System aufschreibt)

Wegen Nachfrage noch einmal umschrieben:
Pi_10 = 3,141592653...
Pi_2 = 11,00100100001...

Die 6te dezimale Nachkommastelle ist eine 2.
Die 6te binäre Nachkommastelle ist eine 1.

Fasse nun die binären Nachkommstellen beginnend ab 787471. bis einschließlich 787494. als ASCII-Zeichenfolge auf. (Das sind 24 Bits, also 3 Bytes)[/COLOR]

beste Grüße
zommi

//Prüf-Möglichkeit:
Wenn man 1 Million Mal MD5 auf das gesuchte Wort anwendet (also auch immer wieder MD5 auf den resultierenden ASCII-Hash-String selbst), ergibt sich:
182C3950020DBE5969AF859ADF93BBD4


//Hinweis: Mit "Wort" meine ich ganz abstrakt 3 Buchstaben. Ist nicht unbedingt ein Wort im Wörterbuch-Sinne
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Weil mir die folgende Aufgabe auch noch sehr gefiel, und vielleicht den weniger Formel-affinen besser gefällt, hier noch eine Alternativ-Aufgabe, die sich aus Implementierungsfrage zu Uri, HttpUrl und HttpServer ergab:
Gegeben sei eine HTTP-URL.
Extrahiere die Subdomain(s), Basis-Domain und die Domain-Endung.

[pre]http://www.mycsharp.de                                => (www) (mycsharp) (de)
http://de.wikipedia.org/wiki/Uniform_Resource_Locator => (de) (wikipedia) (org)
http://google.co.uk/                                  => () (google) (co.uk)
http://de.mail.yahoo.com/                             => (de.mail) (yahoo) (com)
...[/pre]


Die Alte (obigen) Aufgabe läuft auch weiter. Ihr könnt euch aussuchen, welche ihr bearbeiten wollt.
Zu der Pi-Aufgabe noch ein Tipp: "Bailey-Borwein-Plouffe". Mein zugehöriges Programm ist unter 50 Codezeilen, also machbar ;)

Beste Grüße
zommi
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

beantworten | zitieren | melden

Hmm..

Zur Pi Aufgabe:

Ich glaube die Lösung ist:

"mib" 8) 8)

Code folgt, das ist nur "manuell" ermittelt. :evil:

Bin mir aber nicht sicher, da ich bei MD5 ins Schleudern komme.

Brechnest du die MD5 Summe 1 Mio mal jeweils vom HEX-String oder direkt vom Byte-Array? ?(

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Wie hast du es manuell gemacht?
Zitat von Scavanger
Brechnest du die MD5 Summe 1 Mio mal jeweils vom HEX-String oder direkt vom Byte-Array? verwirrt

Ein einzelnes MD5-Hashing sieht bei mir so aus:
String -> ASCII Byte-Array -> MD5 Byte-Array -> String mit großbuchstaben HEX-Werten (ohne Bindestriche oder so)

Und das eben jetzt mehrfach.

beste Grüße
zommi
private Nachricht | Beiträge des Benutzers