BPS #10: Zufällige Anordnung - Auswertung

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #10: Zufällige Anordnung - Auswertung

BeitragSo, Jul 24, 2011 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer hat eine Lösung gefunden, wem ist eine gute Idee gekommen?

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In zwei Wochen, wird die Musterlösung nach editiert und die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:

BlitzMax: [AUSKLAPPEN]
SuperStrict
'* Zufall ohne Doupletten

'* Fenster zum Anzeigen:
Graphics(256, 256)
'* Der Zufallssamen wird mit der Laufzeit des Computers initialisiert
'* damit werden bei jedem Programmstart andere Zahlen generiert.
SeedRnd(MilliSecs())

'* 3x3 Feld (mit Zahlen 1-9 zu befüllen)
Local Feld:Int[3, 3]

Local x:Int, y:Int, Nummern_Liste:String = ""
'* Alle Felder werden von oben nach unten...
For y = 0 Until 3
'* ...und von rechts nach links durchgegangen.
For x = 0 Until 3
'* Jetzt wird der folgende Vorgang wiederholt:
Repeat
'* Ein zufallszahl wird generiert
Feld[x, y] = Rand(1, 9)
'* Wenn die Zufallszahl nicht im String enthalten ist,
'* wird die Schleife verlassen
Until Instr(Nummern_Liste, Feld[x, y]) = 0
'* Die Zufallszahl wird dem String hinzugefügt.
Nummern_Liste:+Feld[x, y]
Next
Next
'* Alle Felder wurden abgearbeitet

'* Anzeige der Felder:
For y = 0 Until 3
For x = 0 Until 3
DrawText(Feld[x, y], 64 + x * 64, 64 + y * 64)
Next
Next

'* Diese Methode kann man offensichtlich nicht für beliebige Werte verwenden!
'* Würde man Zahlen von z.B. 1-11 generieren, würde "1" im String "11" enthalten sein.
'* Natürlich lassen sich Zahlen durch Symbole für Beginn und Ende Trennen;
'* "'1'" wird nicht im String "'11'" gefunden!

Flip(0)
WaitKey()
End
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am So, Aug 07, 2011 17:48, insgesamt einmal bearbeitet

Ana

BeitragSo, Jul 24, 2011 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab mich entschieden erstmal alle Werte in eine Doppeltverkettete Liste zu packen und dann einen zufälligen Wert der maximal die Kettenlänge ist durch die Liste zu wandern und dann das Element ins Array zu übertragen. Natürlich hätte ich auch TList verwenden können, schien mir dann aber doch zu einfach und kurz die Aufgabe, zumal ich mich vom Lernen abhalten wollte Wink

Hier der Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict
SeedRnd MilliSecs()
Type AnaLink
Field Value:Int
Field NextLink:AnaLink
Field LastLink:Analink

Method GetLast:AnaLink()
If NextLink = Null
Return Self
Else
Return NextLink.Getlast()
EndIf
End Method

Method GetCounted:Analink(c:Int)
If c = 0
Return Self
Else
Return nextlink.getCounted(c-1)
EndIf
End Method

Method Remove()
If lastlink <> Null
lastlink.nextlink = nextlink
EndIf
If nextlink <> Null
nextlink.lastlink = lastlink
EndIf

If first = Self Then first = nextlink
End Method

End Type

Global First:Analink = New Analink
First.Value = 1
Local Link:Analink

For Local i:Int = 2 To 9
link = New Analink
link.value = i
link.lastlink = first.getlast()
link.lastlink.NextLink = link

Next

Local Array:Int[,] = New Int[3,3]

For Local i:Int = 0 To 8
Local r:Int = Rand(0,8 - i)
link = first.getCounted(r)
array[i/3,i Mod 3] = link.value
link.remove()
Next
For Local i:Int = 0 To 2
Print Array[0,i] + " " + Array[1,i] + " " + Array[2,i]
Next

CheckArray(Array)


Function CheckArray(Array:Int[,])
Local Boolean:Byte = True
For Local i:Int = 0 To 7
For Local j:Int = i+1 To 8
If array[i/3,i Mod 3] = array[j/3,j Mod 3] Then boolean = False
Next
Next
If Boolean = True Then
Print "Das Array ist gültig"
Else
Print "Ein Fehler ist aufgetretten!"
EndIf
End Function
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

FireballFlame

BeitragMo, Jul 25, 2011 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mach aus Langeweile auch mal mit Razz

Gleicher Ansatz wie bei Ana, aber deutlich anderer Code.
Erst werden eine Liste mit den Zahlen 1 bis 9 und ein leeres Array erstellt. Dann wird eine zufällige Zahl aus der Liste gelöscht und ins Array gesteckt, und zwar so oft bis das Array voll ist.
Funktioniert auch mit anderen Zahlen und mit beliebig großen Arrays, wenn man will.

BlitzMax: [AUSKLAPPEN]

SuperStrict
Framework BRL.Random
Import BRL.LinkedList
Import BRL.StandardIO



SeedRnd MilliSecs()



PrintArray FillArrayRandomly(New Int[3,3],TList.FromArray([[1],[2],[3],[4],[5],[6],[7],[8],[9]]))
' ^ erstellt ein 3x3-Array und eine Liste mit den Zahlen von 1 bis 9
' (jede Zahl steckt nochmal in einem eigenen Array, da Listen nur Objekte enthalten können)
Input ""
End








Function FillArrayRandomly:Int[,](Array:Int[,],Numbers:TList) ' füllt ein 2-dimensionales Int-Array mit den Zahlen
' aus einer Liste; die Liste wird dabei geleert
For Local y:Int = 0 Until Array.Dimensions()[1]
For Local x:Int = 0 Until Array.Dimensions()[0]
Local elementindex:Int = Rand(Numbers.Count())-1 ' zufälliges Listenelement wird gewählt...
Local element:Int[] = Int[](Numbers.ValueAtIndex(elementindex))
Array[x,y] = element[0] ' ...in das Array gesteckt...
Numbers.Remove element ' ...und aus der Liste entfernt
Next
Next

Return Array
End Function



Function PrintArray(Array:Int[,]) ' gibt ein 2-dimensionales Int-Array mit Print aus
For Local y:Int = 0 Until Array.Dimensions()[1]
Local line:String = ""
For Local x:Int = 0 Until Array.Dimensions()[0]
line :+ "~t"+Array[x,y]
Next
Print line[1..]
Next
End Function
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group