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
Str2Int - Auf wieviel Arten kommen wir zum Ergebnis
TEry
myCSharp.de - Member



Dabei seit:
Beiträge: 98

beantworten | zitieren | melden

jo schon dr4g0n76,
aber irgendwie bin ich ein wenig entäuscht, das zB. niemand Regex verwendet hat für die Typenprüfung. Auch das nichtandwenden der differsen Parse( String, NumberStyles, usw ...
für was ist den NumberStyles überhaupt vorhanden, wenn es keinen Sinn ergibt?

Ich finde ja die Lösungen manchmal echt "haarsträubend", manche genial. Aber hin und wieder hätte ich auch gern mal auf einen brauchbaren Happen gehofft.

Ich hoffe du verstehst meine Ansichten auch
Gruss und bleibt weiterhin wie ihr seid
// ich sag nicht mehr genial, sonst bricht hier noch der Grössenwahn aus )
TEry
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.920
Herkunft: Deutschland

beantworten | zitieren | melden

lol @TEry.

Alles klar. :-)
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
DarKlajid
myCSharp.de - Member



Dabei seit:
Beiträge: 386
Herkunft: Köln

beantworten | zitieren | melden

Weil Regex nicht die goldene Antwort auf alles sind. Und da sie dem Problem ueberhaupt nicht helfen koennen (immerhin konvertieren sie nix), kann man durch den Einbau von derartigen Expressions nur die Loesungen die hier stehen verschlimmbessern. Da lernst du auch nicht mehr von.
Ansonsten beginnt der Thread mit "Auf wieviel Arten..".. Da braucht es viele Beispiele.
Pound for pound, plutonium is about as toxic as caffeine when eaten.
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Naja Regex hilft schonmal ein paar auszusieben, die nicht konvertiert werden können. Und man kann damit auch negative Zahlen erkennen.

Einen Kurzen hab ich noch, dann reichts aber für heute:


public static int Str2Int( string text )
{
	using( DataTable t = new DataTable() )
	{
		return (int)t.Compute( text, null );
	}
}
e.f.q.

Aus Falschem folgt Beliebiges
private Nachricht | Beiträge des Benutzers
TEry
myCSharp.de - Member



Dabei seit:
Beiträge: 98

beantworten | zitieren | melden

Ich kann mich durchaus irren in der Annahme DarKlajid,

war bescheidener Ansicht, das über Regex ein schwerlich lesbarer Zahlencode, in passible Form gebracht werden könnten. Gebe jedoch gern meinen Irrtum zu.

Beharre ja auch nicht auf Regex, sondern frage mich ernsthaft, wofür Parse Parameter anbietet, die niemand braucht. Wahrscheinlich geben NumberStyles ja auch keinen Sinn. Nur frag ich mich, warum sie den noch integriert sind. Wahrscheinlich um der alten Tage willen und um der Erinnerung

Das es viele Beispiele gibt zu so einem Thread ist mir ja klar. Nur das man zum Absurden sich neigt ein warnehmbares Faktum, dass ich zu nennen wagte und hoffte, jemand hätte noch ein ernsthafte Lösungen die er auch gern vorzeigen würde. Ob aus dem Lehrbuch oder aus dem Hirn raus, ist mir eigentlich Wurst. Nur denke ich es hat wenig Sinn: Das Wasser fliesst aus vollen Rohren, nicht aufzuhalten seine Macht:

nur irrt ihr von dem Wege, und sag ichs: Ihr geht falsch, so mehrt ihr nurmehr eure Zauber.

Gruss vom Dichter, der ich gern geworden wäre
TEry
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo TEry,
Zitat
sondern frage mich ernsthaft, wofür Parse Parameter anbietet, die niemand braucht.
schau einfach in die Doku. Da ist alles sehr ausführlich und mit Beispielen beschrieben. Was will man mehr?

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



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Ach verdammt, hier noch die gewünschte Variante mit Regex:


public static int Str2Int( string text )
{
	const string pattern = @"(0)|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|(.)";

	int result = 0;
	int sign = 1;
	if( text.StartsWith( "-" ) )
	{
		text = text.Substring( 1 );
		sign = -1;
	}

	checked
	{
		MatchEvaluator eval = delegate( Match m )
		{
			for( int i = 1; i ≤ 10; ++i )
			{
				if( m.Groups[i].Success )
				{
					result *= 10;
					result += (i-1)*sign;
					return "";
				}
			}
			throw new FormatException();
		};
	
		Regex.Replace( text, pattern, eval );
	}

	return result;
}
e.f.q.

Aus Falschem folgt Beliebiges
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Traumzauberbaum,

Mist, ich hatte gerade damit angefangen. Du warst leider schneller. :-(

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



Dabei seit:
Beiträge: 386
Herkunft: Köln

beantworten | zitieren | melden

Zitat
Original von Traumzauberbaum
Ach verdammt, hier noch die gewünschte Variante mit Regex:


const string pattern = @"(0)|(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|(.)";

Ich hoffe dieses Pattern war absichtlich krude gewaehlt um in den WTF Kontext dieses Threads zu passen. Ansonsten waere die allein jetzt schon lustig..
Jedenfalls - auch damit lernt TEry keine regexp Hintergruende. ;)
Pound for pound, plutonium is about as toxic as caffeine when eaten.
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Was ist denn an dem Pattern schlecht?
Dann kann ich aus dem Index der Gruppe auf den gematchten Inhalt schließen


Hab mich eben an nem genetischen Algorithmus versucht:


private static Random rand = new Random();

private static double Fitness( int guess, string text )
{
	string guessText = guess.ToString( "d10" );

	if( guessText.Length > text.Length )
		text = new string( '0', guessText.Length - text.Length ) + text;
	
	int matches = 0;
	for( int i = 0; i < text.Length; ++i )
	{
		if( guessText[i] == text[i] )
		{
			++matches;
		}
	}

	double fitness = (double)matches / (double)text.Length;

	return fitness;
}

private static int Reproduce( int a, int b )
{
	int bigger = Math.Max( a, b );
	int smaller = Math.Min( a, b );

	int result = 0;

	while( bigger != 0 )
	{
		result *= 10;

		switch( rand.Next( 0, 5 ) )
		{
			case 0:
			case 1:
				result += bigger%10;
				break;

			case 2:
			case 3:
				result += smaller%10;
				break;

			default:
				result += rand.Next( 0, 10 );
				break;
		}

		bigger /= 10;
		smaller /= 10;
	}
	return result;
}

public static int Str2Int( string text )
{
	int[] generation = new int[4096];
	double[] fitness = new double[generation.Length];

	for( int i = 0; i < generation.Length; ++i )
	{
		generation[i] = rand.Next( -1, int.MaxValue ) + 1;
		fitness[i] = Fitness( generation[i], text );
	}

	List<int> newGeneration = new List<int>( generation.Length );
	double h;
	int a, b;

	for( int i = 0; i < 1000; ++i )
	{
		Array.Sort( fitness, generation );
		if( fitness[generation.Length - 1] == 1.0 )
			return generation[generation.Length - 1];

		for( int k = 1; k < generation.Length / 4; ++k )
			newGeneration.Add( generation[generation.Length-k] );
		
		while( newGeneration.Count < generation.Length )
		{
			h = rand.NextDouble();
			h *= h;
			h = Math.Round( h * (generation.Length - 1) ) + 1.0;
			a = generation[generation.Length - (int)h];

			h = rand.NextDouble();
			h *= h;
			h = Math.Round( h * (generation.Length - 1) ) + 1.0;
			b = generation[generation.Length - (int)h];

			newGeneration.Add( Reproduce( a, b ) );
		}

		generation = newGeneration.ToArray();
		newGeneration.Clear();
		for( int k = 0; k < generation.Length; ++k )
			fitness[k] = Fitness( generation[k], text );
	}

	return generation[generation.Length - 1];
}

Ich hab nicht wirklich Ahnung davon. Wäre also nett wenn jemand kommentieren könnte, ob das überhaupt etwas GA ähnliches ist

Erstaunlicherweise funktioniert das sogar recht gut. Für positive Zahlen wohlgemerkt.

EDIT: Noch einen Fehler behoben, jetzt überleben die Besten
e.f.q.

Aus Falschem folgt Beliebiges
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Traumzauberbaum,

ich habe es mir nur grob angeguckt. Grundsätzlich passt das schon. Allerdings fehlt ein wichtiges Element, nämlich die Mutationsrate.

Jedes Individuum sollte einen Wert haben, der angibt, wie groß die Mutationswahrscheinlichkeit ist. Die Mutationswahrscheinlichkeit sollte Teil des Gens sein und somit selbst der Mutation unterliegen. Dadurch wird die Mutationswahrscheinlichkeit selbst automatisch optimiert und das ist der Gag.

Wenn ein Individuum weit vom Optimum entfernt ist, ist die Wahrscheinlichkeit, dass ein stark mutierter Nachkomme wesentlich fitter ist größer, als wenn das Individuum schon nahe am Optimum ist. Bei Individuen, die nah am Optimum sind, ist bei einer hohen Mutationswahrscheinlichkeit, die Wahrscheinlichkeit groß ist, dass entferne Nachkommen deutlich weniger fit sind.

Dadurch, dass man die Mutationswahrscheinlichkeit zum Teil des Gens macht, wird sie auf einen für den jeweiligen Abstand günstigen Wert optimiert. Dadurch erreicht man, dass die Nachkommen große Schnitte machen, wenn sie weit vom Ziel entfernt sind und kleine, wenn sie dem Ziel nahe sind.

Dadurch wird der Optimierungsprozess in der Regel nicht nur deutlich(!) beschleunigt, sondern das Optimum wird auch stabiler erreicht.

Das alles gilt im Allgemeinen für große Suchräume mit vielen Dimensionen. Ob es im speziellen Fall mit dem kleinen Suchraum und den wenigen Dimensionen auch gilt, müsste man ausprobieren.

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



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Gut, ich wollte mir auch nicht zu viel Gedanken machen.
Hab eben grob die zwei Prinzipien eingebaut: Selektion und Kombination

Da mir für die Selektion auf die schnelle nichts cleveres eingefallen ist, hab ich einfach über das quadrat der Zufallszahl eine simple Verteilung genommen, die eher die "guten" Werte nimmt, aber auch mal bei den schlechten zuschlagen kann.
In die Reproduktion hab ich dann noch Mutation eingebaut (das bei default), um Pech bei der Initialisierung etwas zu kompensieren.

In den meisten Fällen klappts, manchmal kommt aber auch nichts gutes raus. War ja zu erwarten. Aber ich bin froh, dass es so weit wenigstens etwas funktioniert
e.f.q.

Aus Falschem folgt Beliebiges
private Nachricht | Beiträge des Benutzers
TEry
myCSharp.de - Member



Dabei seit:
Beiträge: 98

beantworten | zitieren | melden

Eigentlich dachte ich Regex zu verwenden um gewissen nicht in ein Integer-Wert passenden Strings wie zb. 4'000.00 oder 4-000-.00 zu bereinigen. Das in der Regex - Methode dann gleich noch eine Umwandlung stattfindet, ist allenfals lustig, oder kurios. Dazu bieten sich, nach der einer gewissen Bereinigung eines unleserlichen, oder schwer formatierten Strings, die Int.TryParse Mehode an, die über ihre verschiedenen Parameter, noch restliche Möglichkeiten durchgeht um den vielleicht immer noch unleserlichen String, doch noch in einen Integer zu klemptnern. Das ist zwar nicht gerade einfach, aber ich würde mal sagen, machbar. Wenn wir einfach mit Try Catch = geht nicht arbeiten, mag das zwar die billigste Lösung sein, aber ich denke ein Program sollte seinen Nutzer immer etwas entgegenkommen, indem es seine Eingabefehler nicht einfach mit einer Schellte: Sie haben einen ungültigen Wert eingegeben, sondern mit stillem Schweigen zu korrigieren versucht. Natürlich ratsam, dem Benutzer am Ende mitzuteilen:

Ich konne aus ihrer Eingabe, die sie echt undeutlich formuliert haben, die Zahl 4000.0 als Gleitkommazahl oder 4000 als Ganzzahl herauslesen. Welche Möglichkeit ist denn nun richtig? 4000.00 4000 oder wollen sie die Zahl neu und diesmal korrekt eingeben?
ps. wenn sie in Zukunft ihre Zahlen derart schwammig formulieren, könnten sie mir dann vielleicht ein Muster als Standard empfehlen, mit dem ich ihre Gekripsel ohne Nachfragen, verarbeiten und eintragen kann?

Nehmen wir mal der Benutzer tipt e10 ein. Aus der Tatsache, das e, keine Zahl ist, kann man schliessen, dass es sich um einen Tipfehler handelt. Da in der Nähe der Taste e die 3 und die 4 sind, heisst die Zahl also entweder 310 oder 410. Wobei aus der Nähe von 3 zu 1, mit 75% Wahrscheinlichkeit eine 3 richtig ist. Müsste das Program folgern können: Ich habe 310 erfasst, fals sie das Bestätigen drücken sie die Enter Taste, fals es sich um die Zahl 410 handelt, die "j" oder "J" Taste, und eine andere um ihre Eingabe zu wiederholen.

Also ist folgerichtig, das ein Program welches Strings in Integer umwandelt, aus der Nähe von gewissen Tasten zu Andern eine Wahrscheinlichkeit erstellt, um so eine möglichst schnelle Verarbeitung zu gewährleisten.

Ich würde also Vorschlagen: Erst die überprüfung der eingegebenen Zahlen und Buchstaben. Dann die Berichtigung. Danach die Bereinigung durch Regex und am Ende das Durchkämmen aller TryParse( unglücklicherString, mitEtlichenParameter
-> die verschiedenen Resultate an den Benutzer. Und wenn kein Resultat in Sicht:
Bitte geben Sie den Wert korrekt ein: ich kann ihr Gekribsel nicht lesen! Und glauben sie mir, ich hab mir alle Mühe dabei gegeben.
private Nachricht | Beiträge des Benutzers
DarKlajid
myCSharp.de - Member



Dabei seit:
Beiträge: 386
Herkunft: Köln

beantworten | zitieren | melden

Aehm - nein.
Erstens vergisst du mal wieder verschiedene Locales..
10'000 voellig korrekt in der Schweiz. 10.000 ist bei uns eine 5 stellige Ganzzahl und in den USA eine 10. 2,5 ist hier die Haelfte von 5 und wird in den USA ggf. als 2500 gelesen.
Eine Regexp hat hier immer noch keine Berechtigung.
Diese "Der Computer versucht meine Eingaben zu interpretieren" Idee finde ich reichlich pervers und daneben, ob ohne Nachfragen (lustig, wenn mein Onlinebanking raten wuerde was fuer Zahlen ich gemeint hab) oder mit.
Zu letzterem faellt wuerde ich, frei nach der wohl verhasstesten Pseudo-Computerhilfe folgendes schreiben wollen:
Zitat
Zitat Clippy:
Es sieht so aus als wuerdest du zuviel Energie auf die falsche Sache verwenden. Moechtest du:

[ ] eine Liste der lokalen Sportvereine
[ ] ein World of Warcraft Abo kaufen
[ ] einen Assistenten fuer Singleboersen starten

?

Sorry, couldn't resist. Und der Thread ist halt, unabhaengig von einigen fehlgeleiteten Versuchen, m.E. nach immer noch in keinster Weise ernst gemeint oder ernst zu nehmen..
Pound for pound, plutonium is about as toxic as caffeine when eaten.
private Nachricht | Beiträge des Benutzers
TEry
myCSharp.de - Member



Dabei seit:
Beiträge: 98

beantworten | zitieren | melden

Ich versteh jetzt nicht ganz. In der menschlichen Kommunikation gibt es ja auch Gelegenheiten, wegen greizten Stimmbändern, Restalk oder Müdigkeit, dass sich die Aussprache einer gewissen Zahl etwas schwammig anhört. Dann fragen wir doch auch: Du hast 200 gesagt, oder, wenn man aus einer Annäherung an das undeutlich Ausgesprochene eine Zahl heraushört. Damit macht man es dem undeutlichen Redner ja auch leichter, indem man die nächste Möglichkeit erwähnt.
So muss er nicht nochmals den ganzen Satz wiederholens sonder lediglich "Ja" sagen. Wieso ein Computer von der Nähe der Tasten zu Zahlen und der Angleichung an Regeln nicht in etwa, rückfragen könnte finde ich gar nicht so übel.
Wohl ist es ein Luxus, des Programmes. Aber ich dachte immer, das Programm sei für die Menschen gemacht. Doch die Programierer sind derart egozentrisch, das sie für ihr Program da sind und nie an die Benutzer denken, deren solches Entgegenkommen sicher äusserst wohl ankäme. Ein Programierer arbeite im Prinzip so sehr auf's Program fixiert, das er den Mensch, der es bedient in den Hintergrund rückt in der Art:
Na entweder der trifft nun die rechten Tasten, oder der kommt ne Flut von MessageBoxes entgegengeschleudert nach dem Moto, nicht mit mir!

ps. pervers ist hier nun wirklich übertrieben. Schliesslich gibt es auch Textverarbeitungsprograme die Fehler während des Eintippens korrigieren können!

Gruss TEry
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von herbivore
Dadurch wird die Mutationswahrscheinlichkeit selbst automatisch optimiert und das ist der Gag.

Schlag mich tot, aber ist der Hauptgrund für dieses Vorgehen nicht das Überwinden lokaler Maxima? Ist die Mutationsrate fest, kann es schnell passieren, dass die gesamte Population an solche Dingern kleben bleibt. Die anderen von dir beschriebenen Vorteile existieren natürlich auch.
private Nachricht | Beiträge des Benutzers
DarKlajid
myCSharp.de - Member



Dabei seit:
Beiträge: 386
Herkunft: Köln

beantworten | zitieren | melden

Zitat
Original von TEry
ps. pervers ist hier nun wirklich übertrieben. Schliesslich gibt es auch Textverarbeitungsprograme die Fehler während des Eintippens korrigieren können!
Pervers ist immer ein subjektives Attribut und natuerlich gebe ich nur meine eigene Meinung wieder, ohne Anspruch auf allgemeine Gueltigkeit. Das von dir hier angesprochene "Feature" (ich nehme an du meinst z.B. die Office Autokorrektur und vergleichbares) qualifiziert sich in meiner kleinen Welt durchaus fuer das Woertchen pervers, ja.
Aber da wir mehr und mehr von der lustigen Ausgangsfragestellung abkommen ziehe ich mich mit diesem Beitrag aus dem Thread zurueck.. ;)
Pound for pound, plutonium is about as toxic as caffeine when eaten.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo svenson,

lokale Maxima kann man auch dadurch überspringen, dass man die Mutationsrate groß genug wählt, sie muss nicht variabel sein. Im Gegenteil, durch die "Optimierung" der Mutationswahrscheinlichleit bliebt man eher an den lokalen Maxima hängen, weil sich die Mutationswahrscheinlichleit in der Nähe von (lokalen) Maxima meist verringert.


Hallo TEry,

(Auto)Korrektur bei Zahlen ist quatsch. Bei deinem e10 könnte auch 10^10 (1e10) gemeint sein. Wenn du mit der Nähe von Tasten argumentierst, dann kann man auch sagen, dass mit 146 auch 156 gemeint sein könnte, weil neben der 5 die 4 und 6 liegt, auf die man gerutscht sein kann, wobei die 4 wahrscheinlicher ist, weil man ja von der 1 kommt. Also stellt das Programm bei der Eingabe von 146 die Frage, ob damit vielleicht 156 gemeint sein könnte? Wohl kaum. Andersherum heißt das aber, dass ein Benutzer bei Zahleneingaben sowieso genau hingucken muss, damit er keinen Mist eingibt, weil eben der Computer kaum in der Lage ist zu entscheiden, ob eine gewünschte Zahl korrekt eingegeben wurde. Wenn er das aber tut, muss man keinen Aufwand in eine sowieso nicht praktikable (Auto)Korrektur stecken.

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



Dabei seit:
Beiträge: 98

beantworten | zitieren | melden

Ok ich geb nach. Ich könnte zwar noch Einwände erheben, aber gegen die Vernunft Einwände zu erheben, ist immer ein schwer Ding. Nur auf die parameter poche ich. Auch wenn das eine Spassbremse bedeutet Aber bei allem Unfug, der in diesem Thread an Unarten, wie man einen String in einen Integer umwandeln kann, dürfte doch ein wenig ernsthafte Suche nach Lösungen erlaubt sein. Wenn nicht, bin ich hier wirklich am falschen Ort Und verzieh mich schmollend zurück.

Glück auf Euch Allen
TEry
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo TEry,

ernsthafte Lösungen wurde doch - gerade am Anfang - genannt. Meine persönliche Meinung ist, wo immer es geht TryParse einsetzen.

herbivore
private Nachricht | Beiträge des Benutzers