Übungsaufgabe für alle :: Nr. 7 - Arrays und Zufall

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

wunderkind

Betreff: Übungsaufgabe für alle :: Nr. 7 - Arrays und Zufall

BeitragSo, Jul 31, 2005 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach langer Pause geht's weiter. In der letzten Aufgabe ging es um das Parsen eines Strings. Heute gibt es eine kleine Aufgabe rund um das Thema Arrays und Zufall.

Aufgabe
Erstelle ein BB-Programm, welches ein 20 x 16 (Breite x Höhe) Feld erzeugt und mit Ziffern zwischen 0 und 9 füllt. Dabei sind folgende Vorgaben zu beachten:

  • Der Benutzer darf Startkoordinaten eingeben, die sich innerhalb des Feldes befinden.
  • An der Startkoordinate wird im Feld die Ziffer 9 eingetragen.
  • Jetzt geht's los: um die Startkoordinate herum werden ebenfalls alle Felder gefüllt. Dabei dürfen die Unterschiede benachbarter Felder nur um 1 kleiner sein als 9. Also ist sie 8 oder 9. 9 ist die größte Ziffer. 10 darf also nicht eingetragen werden.
  • Ob die Ziffer kleiner, gleich oder größer ist, soll für jeden Eintrag per Zufall festgelegt werden.
  • Nachdem alle Felder um die Startkoordinate gefüllt sind, wird mit dem angrenzenden Feldern genauso verfahren.


So könnte das Ergebnis dann zum Beispiel so aussehen (Fehler nicht ausgeschlossen):

Code: [AUSKLAPPEN]

5   6   6   6   6   7   7   7   6   6   6   6
5   6   7   7   7   7   8   7   7   7   7   6
5   5   6   6   6   6   7   8   8   8   7   6
5   5   6   6   6   7   8   9   9   8   7   7
6   6   6   7   7   8   8   8   9   8   8   7
6   7   7   7   8   8   9   9   8   8   8   7
6   7   7   8   8   9   9   9   8   7   8   7
6   6   7   8   9   9   8   8   8   7   7   7
5   6   7   8   8   8   7   8   7   7   6   7
5   6   7   7   7   7   7   7   7   6   6   6
5   6   6   7   7   7   7   6   6   6   5   6
5   6   7   6   6   6   6   6   5   5   5   6
6   6   6   6   6   6   5   5   5   4   5   5


Hier noch die schwierigere Variante der Aufgabe:
Als wenn der Teil oben noch nicht genug wäre, kommt's jetzt noch dicker! Im schwierigeren Teil der Aufgabe soll nach dem ersten Durchlauf immer vier Felder addiert werden, daraus der Mittelwert gebildet werden (geteil durch 4) und das Ergebnis in ein neues Array eingetragen werden. Dabei muss nicht mehr darauf geachtet werden, dass der Unterschied zu benachbarten Feldern nicht größer als 1 ist.


Ich hoffe, ich habe nichts vergessen.

Zum Lösen der Aufgabe habt ihr eine Woche Zeit (bis zum 07.08.).

Eine Bitte
Wie immer die Bitte: Posted eure vollständigen Lösungen bitte nicht vor Sonntag 07.08. damit alle eine Chance haben, selbstständig ihre Lösung zu finden. Fragen und Teillösungen sind natürlich wieder willkommen, damit jeder hier etwas lernen kann. Fertige Programme könnt ihr selbstverständlich als .exe jederzeit zum Download bereitstellen. Habt ihr keine Webspace, dann schickt sie mir: wunderkind @ seelenradio.de

Die vergangenen Übungsaufgaben findet ihr hier:
Aufgabe Nr. 1 : Logische Operatoren
Aufgabe Nr. 2 : Menüstruktur unter Verwendung von Types
Aufgabe Nr. 3 : Umwandlung von Zahlen zwischen Binär-, Dezimal- und Hexadezimalsystem
Aufgabe Nr. 4 : Rekursion
Aufgabe Nr. 5 : Hamming-Distanz
Aufgabe Nr. 6 : Strings parsen (interpretieren)

Viel Erfolg!
  • Zuletzt bearbeitet von wunderkind am Do, Aug 11, 2005 23:45, insgesamt einmal bearbeitet

Alfadur

BeitragDi, Aug 02, 2005 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab mich mal rangewagt...

wenn ich wirklich auch größere werte zulasse, sprich +rand(-1,1) kommt folgendes raus :

user posted image

wenn ich nur +rand(-1,0) zulasse sieht es mehr nach deinem beispiel aus, dann kommt sowas dabei raus :

user posted image

weiß nich obs erlaubt war, aber ich hab types auch benutzen müssen. aber ein array auch ... also ... äh beides. types waren ja nich verboten oder?

zur zweiten aufgabe hab ich noch ne frage...
angenommen ich hab ein array
1 2 3 2
2 2 2 2
3 2 1 1
3 2 2 2
und ich soll jetzt immer vier stück zusammen rechnen ... dann nehm ich ja als erstes
1 2
2 2
also oben die linke ecke. mach ich dann weiter mit
2 3
2 2
also den zähler um eins verrücken, oder mache ich weiter mit
3 2
2 2
also zähler um 2 verrücken. anders gesagt, fliesen einmal schon berechnete werte nochmal in eine andere berechnung ein oder nicht? wird aus einem 20x16 array dann ein 10x8 array oder eher 19x15?!

edit : wenns funktioniert funktionierts. manchmal hängt er sich aber noch auf, kann mir auch denken woran es liegt...

dafür kann man damit lustige bilder machen, zb sowas...

user posted image
A Cray is the only computer that runs an endless loop in less than four hours.

wunderkind

BeitragDi, Aug 02, 2005 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr schön. Du bist der Erste, wie du siehst Wink.

Nein, Types sind nicht verboten. Da sich die Übung um Arrays dreht, sollte eines im Code vorkommen, in dem das Feld abgelegt ist.

Beim ersten Beispiel wundert es mich, dass die Werte scheinbar alle mindest 7 sind und darüber. Kleiner 7 kommt nicht vor.

Vielleicht sollte die Startkoordinate des Überblicks wegen noch farblich hervorgehoben werden.

Das Bild ist schick.

Alfadur

BeitragMi, Aug 03, 2005 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
juhu, erster .-)

beim ersten wird eben +rand(-1,1) gemacht, deswegen hält sich das wohl immer die waage und bleibt mehr oder weniger gleich ...
vermutlich ist meine herangehensweise eh nich so hundertpro das gelbe vom ei, weil er sich manchmal aufhängt... liegt wohl daran das manchmal 2 felder nebeneinander sind die er nicht verbinden kann... denke evtl bei gelegenheit nochmal drüber nach ...

und was mein problem mit der zweiten frage angeht, hast du dazu nochwas zu sagen!? siehe erstes post ...
A Cray is the only computer that runs an endless loop in less than four hours.

wunderkind

BeitragMi, Aug 03, 2005 9:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bei mir sähe eine Zufallsverteilung auf Rand-Grundlage etwa so aus:

Code: [AUSKLAPPEN]
Const WERTMAX = 9
Const WERTMIN = 0

Global Wert% = 9
Global I%
Global Zufall%

SeedRnd(MilliSecs())

For I = 0 To 15
   Zufall = Rand(-1,1)
   If (Wert + Zufall <= WERTMAX) And (Wert + Zufall >= WERTMIN) Then Wert = Wert + Zufall
   Print(Wert)
Next

WaitKey()

End


Die Ergebnisse reichen dabei quer durchs Spektrum. Allerdings ist mir nach mehreren Durchgängen aufgefallen, dass tatsächlich öfters eine Verteilung ähnlich deinem Screenshot ausgegeben wird.

wunderkind

BeitragMi, Aug 03, 2005 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~

Gerade bemerke ich, dass wir die letzten Übungsaufgaben immer in der Beginners-Corner hatten. Deshalb wird auch diese dorthin verschoben. *leise davonschleich* Wink

Alfadur

BeitragMi, Aug 03, 2005 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
und meine frage zur zweiten aufgabe?
verstehe auch nich warum das so schwierig sein soll, schwieriger als der erste teil bestimmt nicht.... Smile
A Cray is the only computer that runs an endless loop in less than four hours.

wunderkind

BeitragDo, Aug 04, 2005 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Entschuldige, deine Frage zum zweiten Teil der Aufgabe habe ich übersehen. Mehrfach Neutral.

Die Schrittweite beträgt zwei: Es wird immer ein solcher Viererblock genommen und daraus die Quersumme gebildet. Der Block hat also eine Kantenlänge von 2. Das Ergebnis des Ganzen sollte ein Feld sein, welches genau halb so groß ist, wie das erste Ausgangsfeld, also 5x4. Wir gehen einfach mal davon aus, dass die Höhe und Breite so angegeben werden, dass sie ein Vielfaches von 2 sind Wink.

Alfadur

BeitragDo, Aug 04, 2005 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
aber das ist doch total einfach... zumindest sehr sehr viel einfacher als der erste teil ... außer ich denke beim ersten teil viel zu kompliziert....werds heute abend machen...
A Cray is the only computer that runs an endless loop in less than four hours.

Kabelbinder

Sieger des WM-Contest 2006

BeitragDo, Aug 04, 2005 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Ist es auch verboten, dass sich Felder, die sich nur in einem Punkt berühren
etwa so:
Code: [AUSKLAPPEN]

,----,
|    |
'----|----,
     |    |
     '----'


einen Unteschied von mehr als 1 haben?

Ich hab dashier herausbekommen:

Zitat:
345654543333444333321
345654554444554444321
334565445555654554321
234556555666555654321
123455666676666543210
123456677777765432100
123345567888765432100
123445667898765432110
123455677898765432101
233456667888765432100
223455678777765432110
234455677666766543210
233456766555665543210
223456655444555443211
123455545454444433210
123454444444333432210
123443433333322332110


An einigen Stellen haben halt noch Felder, die sich so schräg gegenüber stehen einen größeren Unterschied als 1 Sad .
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

wunderkind

BeitragDo, Aug 04, 2005 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@Kabelbinder
Jepp, das ist verboten. Alle umgebenden Felder dürfen im Wert nicht mehr als 1 Differenz haben.

Alfadur

BeitragDo, Aug 04, 2005 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
angenommen ich hab
9 8
8 9 ...
da kommt ja beim zusammenrechnen ne 8.5 raus, soll das dann auf oder ab oder mathematisch, also aufgerundet werden? oder ists egal?


edit : apropos, hab gerade was ausprobiert...

was ergibt denn

Code: [AUSKLAPPEN]
print int(8.5)


bei euch?
müßte nicht 9 dabei rauskommen, wenn ich mich richtig an den matheunterricht erinnere...? bei mir kommt immer 8 raus, erst bei 8.6 kommt ne 9 raus...
A Cray is the only computer that runs an endless loop in less than four hours.

wunderkind

BeitragFr, Aug 05, 2005 8:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hätte jetzt auch getippt, dass bei x.5 aufgerundet wird.

Zu deiner Frage: Wir einigen uns einfach auf abrunden.

Alfadur

BeitragFr, Aug 05, 2005 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, bin bis montag nich da, deswegen hier die exe...
funktioniert wie gesagt nicht hundertpro, aber ... 99.27% solltens schon sein ...

http://www.blitz-pasting.net/i...amp;id=105
A Cray is the only computer that runs an endless loop in less than four hours.

wunderkind

BeitragMo, Aug 08, 2005 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Alfadur,

scheinbar bist du der einzige, den es zum Lösen der Aufgabe reizte. Vielleicht war die Aufgabe auch ein wenig zu schwer Wink.

Ich würde mich freuen, wenn du noch deinen Sourcecode zur Verfügung stellen könntest.

Alfadur

BeitragMo, Aug 08, 2005 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
das isser. funktioniert wie gesagt nicht 100%, vorallem wenn man die feldgröße erhöht... vielleicht ist mein system auch viel zu kompliziert gedacht und es geht einfacher, stell doch mal dein system vor, wie hast du es denn gemacht?
wenn durchblickungsschwierigkeiten gibt, dann kann ich ja mal noch ein paar kommentare einstreuen...
aber vom prinzip her werden von der startkoordinate die felder drumherum betrachtet, ein wert ausgewürfelt und dann alle felder drumherum überprüft ob der wert in der toleranz -1,1 ist, wenn die differenz größer ist wird neu gerandomized...wenn ein wert gefunden wurde der das erfüllt, dann wird ein neuer type eintrag erstellt und das geht immer so weiter, bis die ganze type liste abgearbeitet wurde...

BlitzBasic: [AUSKLAPPEN]

SeedRnd MilliSecs()

Const maxx=20
Const maxy=16

Type tfeld
Field x
Field y
Field wert
End Type

startx=Input(\"Start X (1-\"+maxx+\") : \")
starty=Input(\"Start Y (1-\"+maxy+\") : \")
modus=Input(\"Modus ( 0 = rand(-1,0) / 1 = rand(-1,1) ) : \")
startx=startx-1
starty=starty-1

If startx<0 Or starty<0 Or startx>=maxx Or starty>=maxy Or modus<0 Or modus>1 Then Print \"Auch DU, mein Sohn, mußt dich an Regeln halten!!!\":FlushKeys():WaitKey():End

Dim arr(maxx-1,maxy-1)

create_feld(startx,starty,9)

For feld.Tfeld=Each Tfeld
For x=feld\x-1 To feld\x+1
For y=feld\y-1 To feld\y+1
If x>=0 And y>=0 And x<maxx And y<maxy Then
If arr(x,y)=0 Then
count=0
Repeat
count=count+1
wert=feld\wert+Rand(-1,modus)
If wert>9 Then wert=9
If wert<0 Then wert=0
found=False
For xx=x-1 To x+1
For yy=y-1 To y+1
If xx>=0 And yy>=0 And xx<maxx And yy<maxy Then
If arr(xx,yy)<>0 Then
If Abs(arr(xx,yy)-wert)>1 Then found=True
End If
End If
Next
Next
If count>100 Then
DebugLog \"tried 100 times, giving up... failure somewhere...\"
found=False
End If
Until found=False
create_feld(x,y,wert)
End If
End If
Next
Next
Delete feld
Next

Print:Print \"Ergebnis \":Print

For y=0 To maxy-1
s$=\"\"
For x=0 To maxx-1
s$=s$+arr(x,y)+\" \"
Next
Print s$
Next

Print:Print \"Taste drücken -> Aufgabe 2\"
FlushKeys()
WaitKey()
Cls
Locate 0,0
Print \"Ergebnis \":Print
Dim arr2(maxx/2-1,maxy/2-1)
For x=0 To maxx-1 Step 2
For y=0 To maxy-1 Step 2
wert=Int(Float(arr(x,y)+arr(x+1,y)+arr(x,y+1)+arr(x+1,y+1))/4)
arr2((x+2)/2-1,(y+2)/2-1)=wert
Next
Next

For y=0 To maxy/2-1
s$=\"\"
For x=0 To maxx/2-1
s$=s$+arr2(x,y)+\" \"
Next
Print s$
Next

Print:Print \"Das wars ... Prost\"

FlushKeys()
WaitKey()
End

Function create_feld.Tfeld(x,y,wert)
feld.Tfeld=New Tfeld
feld\x=x
feld\y=y
feld\wert=wert
arr(x,y)=wert
Return feld
End Function
A Cray is the only computer that runs an endless loop in less than four hours.

Alfadur

BeitragDo, Aug 11, 2005 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
na, hat keiner ne meinung dazu?

@wunderkind, ich würde gerne deinen ansatz sehen ...
A Cray is the only computer that runs an endless loop in less than four hours.

wunderkind

BeitragDo, Aug 11, 2005 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@Alfadur
Das Wunderkind hat keinen Ansatz umgesetz. Es hatte sich darauf verlassen, dass genügend andere an der Aufgabe teilnehmen Wink. Nah, mir fehlt einfach die Zeit und Geduld...zur Zeit. Ich gelobe Besserung und werde bei der nächsten Aufgabe wieder eine eigene Lösung anbieten.

Alfadur

BeitragFr, Aug 12, 2005 1:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ahja ok Smile fast hab ichs gedacht.... Smile das ding is aber das ich auch noch was lernen will und weil das so ne aufgabe war wo ich eigentlich noch niiiie drüber nachgedacht hatte, dachte ich, das mir da vielleicht noch jemand zeigen könnte was man anders/besser machen könnte, oder ob der ansatz vielleicht vollkommen unsinnig war ... aber die aufgabe fand ich gut ... werd mir die nächste auf jedenfall anschauen... wäre cool wenn du hier nen link zur neuen aufgabe setzen könntest, weil ich sowas auch gerne mal übersehe...
A Cray is the only computer that runs an endless loop in less than four hours.

Ctuchik

BeitragFr, Aug 12, 2005 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
so habe auch mal was gemacht, damit Wunderkind nicht frustiert aufhört solche Aufgaben zu stellen Smile
Code: [AUSKLAPPEN]
Graphics 800,600,0,2
Dim feld(20,16)
Global weight# = 0.0 ;Minimaler Wert ist -0.49, nach oben offen, aber mehr als 5.0 wenig sinnvoll)

sx = Input("Start X: ")
sy = Input("Start Y: ")

feld(sx,sy) = 9

For number = 9 To 2 Step -1
  .jump
  For xx=0 To 19
    For yy=0 To 15
      If feld(xx,yy) = number
        rep = False
        If yy < 15
          If feld(xx,yy+1) = 0 Then feld(xx,yy+1) = number - WRand(weight#) : rep = True
        End If
        If yy > 0
          If feld(xx,yy-1) = 0 Then feld(xx,yy-1) = number - WRand(weight#) : rep = True
        End If
        If xx < 19
          If feld(xx+1,yy) = 0 Then feld(xx+1,yy) = number - WRand(weight#) : rep = True
        End If
        If xx > 0       
          If feld(xx-1,yy) = 0 Then feld(xx-1,yy) = number - WRand(weight#) : rep = True
           End If         
        If rep Then Goto jump
      End If
    Next
  Next
Next

For xx=0 To 19
  For yy=0 To 15
    If feld(xx,yy) = 0 Then feld(xx,yy) = 1
  Next
Next

For xx=0 To 19
  For yy=0 To 15
    Color 0,25*feld(xx,yy),0
    Rect 45+xx*30,45+yy*20,30,20
    Color 255,255,255
    Text 50+xx*30,50+yy*20,feld(xx,yy)
  Next
Next

WaitKey()
End

Function WRand(w#)
  Return Sgn(Int(Rnd(0,1+w#)))
End Function


Ihr könnt mir dem Wert weight in Zeile 3 experimentieren, viel Spaß! ^^

MfG Ctuchik
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group