Meine Lösung für die Soduku Aufgabe. Ich hoffe sie ist ungefähr dem genehm was du wolltest. Ich hab sie mit drei verschiedenen Sudokus verschiedener Schwierigkeitsgrade getestet und sie lieferte immer (ein) richtiges bzw das richtige Ergebnis in unter 300ms(Kann beim Deuggen abweichen). Bei der Eingabe von einem Sudoku, welches(wie bei meiner Lösung standartmäßig) mit Nullen gefüllt ist braucht sie 12 ms um eine oft im Internet als Beispielsudoku gesehene Lösung zu produzieren(ausprobieren;)). Die Klasse Sudoku wurde dabei Immutable gehalten(für die verwendete Rekursion recht praktisch:))
Zu sagen ist, dass man darauf achten sollte immer nur Mehrdimensionale Array mit wenigstens 9*9 Zahlen zu übergeben, anderes wird nicht abgefangen. Der restliche Code sollte nicht zu schnell zusammenbrechen(auch wenn bestimmte Teile nicht oft getestet wurde, da sie letztenendes nicht für die Gesamtlösung verwendet werden). Die entscheidenden Methoden sind die unteren 6(bis 9) welche auch ein wenig kommentiert sind(eher spärlich). Zu sagen ist, das eigentlich alles Null-basiert ist. Der Rest findet sich beim durschauen.
Benutzung:
class Program
{
static void Main(string[] args)
{
Sudoku s = new Sudoku(
new int[9, 9] {
{0,8,0,4,0,0,2,0,9},
{0,5,9,0,8,0,0,0,3},
{0,0,0,0,0,9,0,0,7},
{8,2,0,0,1,0,0,0,0},
{5,0,0,0,7,0,0,0,6},
{0,0,0,0,4,0,0,2,5},
{3,0,0,7,0,0,0,0,0},
{9,0,0,0,2,0,3,7,0},
{7,0,5,0,0,8,0,9,0}}
);
/*Sudoku s = new Sudoku(
new int[9, 9] {
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0}}
);*/
s.drawToConsole();
Sudoku solution = new Sudoku();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
solution = s.findSolution();
stopWatch.Stop();
Console.WriteLine("Zeit: " + stopWatch.ElapsedMilliseconds + "ms");
solution.drawToConsole();
Console.ReadLine();
}
}
Eigentlicher Code:
class Sudoku
{
private int[,] m_content;
public Sudoku()
{
m_content = new int[9, 9];
for (int row = 0; row < 9; row++)
{
for (int column = 0; column < 9; column++)
{
m_content[row, column] = 0;
}
}
}
public Sudoku(int[,] content)
{
m_content = new int[9, 9];
for (int row = 0; row < 9; row++)
{
for (int column = 0; column < 9; column++)
{
m_content[row, column] = content[row, column];
}
}
}
public void drawToConsole()
{
for (int row = 0; row < 9; row++)
{
if (row % 3 == 0)
{
Console.WriteLine("-------------");
}
for (int column = 0; column < 9; column++)
{
if (column % 3 == 0) Console.Write("|");
Console.Write(m_content[row, column]);
}
Console.WriteLine("|");
}
Console.WriteLine("-------------");
}
public int[,] toArray()
{
return m_content;
}
private bool isRowValid(int row)
{
List<int> numbers = new List<int>();
for (int column = 0; column < 9; column++)
{
if (numbers.Contains(m_content[row, column]))
{
return false;
}
else if (m_content[row, column] != 0)
{
numbers.Add(m_content[row, column]);
}
}
return true;
}
private bool isColumnValid(int column)
{
List<int> numbers = new List<int>();
for (int row = 0; row < 9; row++)
{
if (numbers.Contains(m_content[row, column]))
{
return false;
}
else if (m_content[row, column] != 0)
{
numbers.Add(m_content[row, column]);
}
}
return true;
}
/// <summary>
/// Zero based!
/// </summary>
/// <param name="box">Box numbers from top-left to bottom right in each row from left to right</param>
/// <returns></returns>
private bool isBoxValid(int box)
{
List<int> numbers = new List<int>();
int boxRow = box ≤ 2 ? 0 : box ≤ 5 ? 1 : 2;
int boxColumn = box % 3;
for (int row = boxRow * 3; row < boxRow * 3 + 3; row++)
{
for (int column = boxColumn * 3; column < boxColumn * 3 + 3; column++)
{
if (numbers.Contains(m_content[row, column]))
{
return false;
}
else if (m_content[row, column] != 0)
{
numbers.Add(m_content[row, column]);
}
}
}
return true;
}
public bool isValid()
{
for (int i = 0; i < 9; i++)
{
if (!(isRowValid(i) && isColumnValid(i) && isBoxValid(i)))
{
Console.WriteLine((!isRowValid(i) ? "Row " : "") + (!isColumnValid(i) ? "Column " : "") + (!isBoxValid(i) ? "Box " : "") + i.ToString());
return false;
}
}
return true;
}
private bool isNumberValidAt(int row, int column, int value)
{
Sudoku s = insertNumberAt(row, column, value);
int box = (row < 3 ? 0 : (row < 6 ? 1 : 2)) * 3 + (column < 3 ? 0 : (column < 6 ? 1 : 2));
return s.isRowValid(row) && s.isColumnValid(column) && s.isBoxValid(box);
}
private List<int> getValidNumbersAt(int row, int column)
{
List<int> validNumbers = new List<int>();
Sudoku s;
for (int i = 1; i ≤ 9; i++)
{
s = insertNumberAt(row, column, i);
int box = (row < 3 ? 0 : (row < 6 ? 1 : 2)) * 3 + (column < 3 ? 0 : (column < 6 ? 1 : 2));
if (s.isRowValid(row) && s.isColumnValid(column) && s.isBoxValid(box))
{
validNumbers.Add(i);
}
}
return validNumbers;
}
public Sudoku insertNumberAt(int row, int column, int value)
{
int[,] newContent = m_content;
newContent[row, column] = value;
return new Sudoku(newContent);
}
public Sudoku findSolution()
{
// If the incoming Sudoku is already wrong dont jump into the solution algorithm
if (isValid())
{
Sudoku s = findSolution(0, 0);
return s == null ? new Sudoku() : s;
}
else
{
return new Sudoku();
}
}
private Sudoku findSolution(int row, int column)
{
// If ready...
if (row == 9)
return this;
// If row changed
if (column == 9)
column = 0;
if (m_content[row, column] == 0)
{
foreach (int i in getValidNumbersAt(row, column))
{
// Check next field
Sudoku s = (insertNumberAt(row, column, i).findSolution(column + 1 == 9 ? row + 1 : row, column + 1));
// If something comes back the solution was found!
if (s != null) return s;
}
return null;
}
else
{
return new Sudoku(m_content).findSolution(column + 1 == 9 ? row + 1 : row, column + 1);
}
}
}
ich bin zZ auf der Suche nach(auszugsweisem) Code für eine TextBox. Da ich derzeit, schulisch bedingt, an einer solchen arbeite wollte ich mir einige Ideen holen bin jedoch über die gängigen Mittel(Forumsuche, Google, Codeproject) nicht fündig geworden...
Ist einem von euch ein solcher offener Quellcode bekannt oder gibt es sowas nur von Microsoft etc. die sich in Schweigen hüllen?
Hey,
edit: zu lahm Zum Problem:
Ich meine, man muss doch eigentlich eine Textdatei angeben und Thunderbird akzeptiert meines Wissens auch nichts anderes an der Stelle, wo man den Pfad zur Signatur eingeben kann. Und das erklärt glaube ich auch dein Problem. Du hast doch an der Stelle wo eine Text-Datei hingehört deine *.exe Datei hingesetzt oder? Thunderbird liest die einfach mit nem StreamReader oder sonstewas aus und bekommt einen sinnlosen Haufen Zeichen. Und das "This programm..." usw. gehört einfach in den Programm Header(von allen Programmen?) rein. Das is schon uralt, hier z.B ein Auszug aus einem meiner Programme:
MZ ÿÿ ¸ @ € º ´ Í!¸LÍ!This program cannot be run in DOS mode.
sieht dumm aus oder? Is aber genau der gleiche Anfang wie bei dir, nur komisch formatiert im Notepad++ siehts genauso aus.
Zur Lösung:
Wäre es denn nicht einfacher, wenn du deine Signaturen nur dann erneuerst wenn es wirklich nötig ist? Lies doch meinetwegen jede Stunde einmal aus oder schick automatisch an die anderen Standorte ne Mail wenn sich was ändert
Es muß doch eine Möglichkeit geben, daß man auch irgendwie eine Art Array oder so von Windows zurückbekommt, in dem die Koordinaten des zuletzt gezeichneten Graphikobjekts drinstehen.
Ich denke das ist nicht sinnvoll; überleg mal wie viel auf deinem Bildschirm gezeichnet werden muss, da würde es schwierig das zu bekommen was du gezeichnet hast. Läuft wie gesagt Methodenintern. Das einfachst ist wohl deine eigenen Methoden für diese Zwecke zu schreiben.
Zitat
es gibt diese Fälle für sphärische Linsen. Da wird dann getrickst mit der einfachen Linsengleichung oder es werden die Schnittpunkte von Strahl und Kreis berechnet. Ne ne, das will ich nicht, das ist zu billig.
Ziel ist ein Programm, in dem es beliebig viele beliebig parametriesierte Linsen gibt
Vielleicht solltest du erst einmal sphärischen Linsen versuchen. Das hab ich auch einmal gemacht. Nja war nich so berauschend ich finds nur grad nich. Dann stellt sich mir die Frage wie willst du denn deine Asphärischen Linsen beschreiben?
ich suche nach einer Möglichkeit zu überprüfen wann eine CD/DVD/USB-Stick/Speicherkarte usw. eingesteckt/eingelegt wurde bzw. wieder entfernt wurde. Ist einem von euch ein solches Event bekannt?
Mir erscheint es zu aufwändig und zu lastig die ganze zeit zu überprüfen ob denn nun eine CD oder ähnliches drinne liegt oder nicht und falls sich was ändert etwas zu tun. Kennt eventuell jemand eine bessere Lösung mit dem sich das ganze realisieren lässt?
Ziel ist die Realisierung eines sich öffnenden Fensters mit Optionen ähnlich dem Windows Popup welches bei Geräteerkennung kommt.
@markus111:
Man muss soweit ich weiß Youtube Partner sein um Videos hochzuladen die länger als 10 Minuten sind. Dafür muss man natürlich auch Auflagen erfüllen, soweit ich weiß gibts dann auch ne Gewinnbeteiligung an den Werbeeinnahmen.
@eigentliches Topic:
Es gab mal einen Vergleich verschiedener Video Platformen in einer nicht allzu alten c't. Ziemlich sicher. Entweder war es Ende letztes oder Anfang dieses Jahr
Ich glaube nach kurzer Suche war es folgender:
c't 22/2009, S. 124
Außerdem meine ich zu wissen das man bei sevenload und Clipfish unbegrenzt lange Videos(aber nicht große! max. etwa 2GB) hochladen kann.
das man weitestgehend auf Singleton verzichten kann
wollte nur mal ergänzen das es keinesfalls sinnlos ist das Pattern zu benutzen(bzw. sinnvoll darauf zu verzichten) man sollte es nur nicht übertreiben und nach anderen Lösungen suchen. Hier muss man aber wieder auf ein gutes Aufwand/Ergebnis Verhältnis achten.
Aber eig wollte ich fragen:
Warum sind denn statische Klassen
Zitat
C#-proprietär
Sie begegnen einem doch in etlichen Programmiersprachen wieder?
Also unsortiert und ohne Rangfolge mein lieblingsapps(hauptsächlich games aber auch utilyties):
-PapiJump plus (ich weiß nich ob Doodle Jump besser is^^ ich find beide iO)
-JellyCar (lustig für kurze Pausen)
-Pi Cubed (Taschenrechner, wenn man sich dran gewöhnt hat sehr mächtig)
-DoodleJump (tja das App schlechthin)
-Trace (tolles App, gute Ideen, leider zu kurz, sonst sehr schön auch grafisch)
-24 in one Gamebox(is zwar eig. sinnlos von Spielen her aber für 25ct immer mehr Spiele, fast monatlich 2)
-Archers (für 2 spieler)
-FallingBalls (für zwischendurch)
-PHYZIOS std (wenn man mal Zeit hat zum spielen)
-CubeRunner (auch sehr lustiges Endlosspiel in 3D)
-FlightControl (ziemlich taktisches Spiel bei dem man Flugzeuge landen muss)
-Shazam (Ich hab es lange vermisst, funktioniert auch mit den iTouch Mikrofonkopfhörern, super die Musikerkennung)
-Jungle Crash (man muss ein Flugzeug landen welches seitwärts fliegt und immer mehr absinkt, leider zu kurz)
-Die Siedler (Der Klassiker)
-Ganstar (Im GTA Style aber weitaus besser als GTA Chinatown allein wegen der Ansichten)
-Peggle (Leider sehr unbekannt, fesselt aber, is ein wenig im Flipperstyle nur das man 10 anstatt einem Ball hat um jedes Ziel einmal zu treffen)
-MotoX Mayham (Sehr lustig um die Tilt Steuerung zu nutzen, zu kurz aber die Level spielt man immer wieder um Rekorde zu brechen)
-Plants vs. Zombies (Mein Lieblings Tower Defense Spiel)
-TM Zero (Tower Defens in 3D)
-QuickGraph (Fuktionsplotter auch 3D)
Die sind teilweise kostenlos teilweise kostenpflichtig aber nur 2 oder so richtig teuer(sprich 5€)
enttäuscht bin ich von diesen hier:
-IceAge
-GTA Chinatown Wars(wie oben angedeutet)
-FinalFantasy (ich habe mir von dem Klassiker echt mehr erhofft)
nja aber lässt sich doch halbwegs schnell etwa so realisieren oder?
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.Lines.Length > 5)
{
int selectionstart = textBox1.SelectionStart;
int firstlinelength = textBox1.Lines[0].Length;
// Textlänge der ersten Zeile entfernen + die beiden steuerzeichen '\r' und '\n'
textBox1.Text = textBox1.Text.Remove(0, firstlinelength + 2);
//Caret wieder an seine alte Position setzen
textBox1.SelectionStart = selectionstart - firstlinelength;
}
}
nullzurückliefert. Sprich keine Instanz. Warum kann ich dir nicht sagen tut mir Leid, damit kenne ich mich nicht aus. Das könntest du immer abfangen(z.B. mit einem kurzen if) ob denn überhaupt eine Instanz existiert sprich das ganzen ungleich null ist. Ich denke es liegt einfach daran das die Version einfach nicht bekannt ist/ausgelesen werden kann(bei mir funktioniert nur das auslesen von Product-.-).
Ich selber bin seit einem halben Jahr Besitzer eines AcerTravelMate 5730G. Genau das Modell was ich damals für rund 850€ gekauft habe finde ich irgendwie nich mehr aber dieses hier ist vergleichbar: notebooksbilliger - TM5730-662G25N
Die Unterschiede zu meinem:
-schlechtere Grafikkarte(is ja kein Kriterium für dich)
-schlechterer Prozessor(2,2GHz anstatt 2,2 GHz)
-Double Layer DVD anstatt normal
-dafür isses halt auch 250€ billiger als meins^^
Du wirst jedoch nochmal suchen müssen da dieses Modell kein HDMI besitzt meines hier schon!
Ich bin mit dem Notebook voll zufrieden. Es ist super Verarbeitet und auch gut wartbar(Ich hatte am Anfang ein kleines Staubproblem am Lüfter allerdings lässt sich der ganze Spass super reinigen). Das Display ist gut, auch zur Arbeit im Freien oder in der Sonne obwohl ich darauf lieber verzichte. Der Lüfter ist angenehm leise. Betriebssystem wäre Windows 7 vorinst. Ich selber benutze auch hauptsächlich Win7 aber per Dual Boot auch OpenSUSE(Gnome). Leider hat Ubuntu keinen Treiber für die Graka zur Verfügung, deahalb SUSE. Einziges Manko wäre hier, das SUSE nicht mit der Power-Regulierung der GraKa klar kommt und den Lüfter nur schlecht trimmt.
Vergleich:
-Leerlauf Win7 Akkulaufzeit~2 1/2Std. - 3Std.
-Leerlauf SUSE Akkulaufzeit~1Std. - 1 1/2Std.
-Volllast Win7 Akkulaufzeit~1Std.
-Vollast SUSE Akkulaufzeit~1Std.
Das einzige was SUSE trimmt is das Display was ja gerade nicht sinnvoll ist wenn man unterwegs ist. Leider ein bisschen schade. Wie es sich mit Fedora verhält weiß ich nicht, würde es aber testen wenn du dich für ein ähnliches Modell entscheiden tätest. Allerdings müsste ich dies in näherer Zukunft wissen da ich plane mein System neuaufzulegen, da könnte ich es schnell probieren(Ich bin mir nich sicher aber SUSE basiert glaub auf Slackware während Fedora von RedHat kommt oder?).
Als Alternative, welche ich mal austesten würde ( Am besten ist nunmal noch testen ) wäre die Logitech Cordless Click! Plus Optical Mouse.
Ich besitze die seit (hmm mal raten) 5-6 Jahren und eine Akku Ladung hält rund 1 Woche (immer noch, wenn man konsequent ist und die Maus erst lädt wenn die meckert).
es ging doch um die darkfield technologie. Ich kann mir nicht vorstellen, dass normale optische mäuse das können, sonst gäbe es ja keinen verwendungszweck dafür.
Warum nicht doch in ein gutes mauspad investieren? Die sehen teilweise echt schick aus(und gibts auch in viele farbenbzw. könnte mir sogar vorstellen das man sich iwo eigen mauspads kreieren kann). Wäre vermutlich günstiger und du bist nicht unbedingt auf darkfield technologie angewiesen. Zudem sind mauspads zum arbeiten teilweise komfortabler
EDIT: also meine Logitech RX1500 funktioniert nich auf galsplatten(bzw sie reagiert so gut wie nicht und wenn dochh dann nur stockend
nja wie gesagt die Auflösung packen mindenstens zwei von den drei anschlüssen locker und vga bei ausreichend guter signalqualität
Zitat
was du beschreibst, kann man in meinen Augen heute mit Fug und Recht als Mindestanforderung ansehen. Gibt es überhaupt noch aktuelle Grafikkarten, die das nicht können?
dem würde ich nicht unbedingt zustimmen. ATI gibt an "Ready for 1080p" und das is ja genau das was du willst, aber ich denke das bezieht sich nicht unbedingt auf 2 bildschirme oder? Die Grafikkarte ist ja als absolutes LoW-End vorgestellt wurden.