Übungsaufgabe für alle :: Nr. 5 - Hamming-Distanz

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

wunderkind

Betreff: Übungsaufgabe für alle :: Nr. 5 - Hamming-Distanz

BeitragFr, Jan 28, 2005 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nachdem ihr euch bei der letzten Aufgabe wieder sehr gut geschlagen habt, geht's jetzt auf in die nächste Runde. Die Aufgabe dieses Mal sollte nicht schwer sein. Es geht um das Errechnen der Hammingdistanz .

Aufgabe
Erstelle ein BB-Programm, welches zwischen zwei Integer-Zahlen die Hamming-Distanz berechnet, begrenzt auf die rechten 8 Bit. Was ist die Hamming-Distanz? Die Hamming-Distanz erhält man, wenn man die unterschiedlich gesetzten Bits zählt. Ein Beispiel:

Code: [AUSKLAPPEN]

a = 100101
b = 111001
    ------
    -XXX-- <-- unterschiedliche Bits mit X markiert


Die Hamming-Distanz zwischen unserem a und b ist also 3.

Wenn ihr euch ein wenig mit den Bit-Operatoren beschäftigt, dann solltet ihr die Aufgabe schnell lösen können.

Extra
Wem die Aufgabe zu einfach ist, der kann sich mit dieser Erweiterung beschäftigen.
  • Es dürfen beliebig viele Zahlen eingegeben werden, zwischen all denen...
  • ...die kleinste Hamming-Distanz festgestellt werden soll.

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

Eine Bitte
Wie immer die Bitte: Posted eure vollständigen Lösungen bitte nicht vor Sonnabend 08.01. 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.

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

Viel Erfolg!
  • Zuletzt bearbeitet von wunderkind am Mi, Feb 09, 2005 14:26, insgesamt einmal bearbeitet
 

zocker2150

BeitragFr, Jan 28, 2005 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo fertig - soll man dir das dann schicken oder einfach bis zum 04.02.05 warten?
 

David

BeitragSa, Jan 29, 2005 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Du sollst WARTEN... Steht doch da.

grüße

wunderkind

BeitragSa, Jan 29, 2005 9:55
Antworten mit Zitat
Benutzer-Profile anzeigen
zocker2150 hat Folgendes geschrieben:
Jo fertig - soll man dir das dann schicken oder einfach bis zum 04.02.05 warten?

Am besten du wartest noch. Sind ebend nicht alle so schnell wie du Wink.

Noch ein kleiner Nachtrag zur Hamming-Distanz an sich. Sie ist nicht der Bit-Abstand (oder Unterschied) zweier Variablen (in unserem Fall), sondern die Hamming-Distanz ist genau das was im Extra-Teil gefordert wird, nämlich der geringste, kleinste Abstand zwischen den Variablen und zwar zwischen allen. Ich hatte mich oben etwas ungeschickt ausgedrückt, ist aber sicher niemandem aufgefallen Wink.
 

David

BeitragSa, Jan 29, 2005 10:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Yor, aber insgesammt wars nichso wild, nich? Smile

Meine Executable: hier und dann aufgabe5.exe

grüße

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jan 29, 2005 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab da auch wieder was gemacht!
Ob ich das jetzt richtig verstanden habe weiß ich nicht!
Hier Die EXE
[BB2D | BB3D | BB+]
 

David

BeitragSa, Jan 29, 2005 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Scheint alles richtig zu sein...
Alternativ unterstützt du mehr als 8 Bit, sollte das so sein oder war das nur deine Idee? Man könnte es ja evtl. noch in die Aufgabe übernehmen.

Achja, den Extrateil... den machst du doch noch oder? Smile

grüße

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Jan 29, 2005 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den 8 Bit habe ich erst nachträglich eingebaut da ich das erst nicht mit drin hatte und es auf volle 32 Bit lief!
Habs nicht richtig durchgelesen!

Und der Extra Teil läst sich mit einem Windowfenster nicht so einfach realisieren mit Textfields, da die zahlenmenge ja variieren kann!
Im Textarea ginge das natürlich!

Übrigens...
So wie ich das verstanden habe sollen alle Zahlen mit allen anderen Zahlen verglichen werden und dabei der kleinste Unterschied angezeigt werden? Was ja bei verschiedenen Zahlen mindestens 1Bit wäre!
[BB2D | BB3D | BB+]
 

David

BeitragSa, Jan 29, 2005 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Genau, auser es handelt sich um eine Reihe gleicher Zahlen.

grüße

Suco-X

Betreff: .......

BeitragMo, Jan 31, 2005 5:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier meine Version.
BB habe ich leider schon vom PC runter, deshalb eine Bmax Version.
Ist ja nur Konsole.
http://www.sucox.art-fx.org/Bl...BySuco.exe
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Suco-X

Betreff: ......

BeitragFr, Feb 04, 2005 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

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


Zitat:

Eine Bitte
Wie immer die Bitte: Posted eure vollständigen Lösungen bitte nicht vor Sonnabend 08.01.




Hmm..???
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

David

BeitragFr, Feb 04, 2005 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Da der 8.01 schon vorbei ist nehm ich an, das heute gepostet werden darf!

grüße

Randall Flagg

BeitragFr, Feb 04, 2005 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ich glaub er meint 8.2
 

David

BeitragFr, Feb 04, 2005 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Sonnabend (Dienstag) der 08.02... *hehe* Ich glaube eher das dieser Text noch von der letzen Aufgabe kommt und einfach nicht richtig angepasst wurde.

Also, postet eure Lösungen! Wink

grüße

wunderkind

BeitragFr, Feb 04, 2005 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Verflixte Angewohnheit, Texte per Copy & Paste zu übernehmen. Also: Eure Lösungen sind von heute an gern im Quelltext gesehen. Sorry für den Fehler.
  • Zuletzt bearbeitet von wunderkind am Fr, Feb 04, 2005 17:46, insgesamt einmal bearbeitet
 

David

BeitragFr, Feb 04, 2005 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Gut, dann mach ich mal den Anfang:

Code: [AUSKLAPPEN]

Graphics 800, 600, 32, 2

; Typen

Type TNum
   Field num
End Type

; Hauptprogramm

Eingabe()
Print ""
Print "Die Hamming Distanz betraegt: " + HammingDist()

WaitKey
End

; Funktionsteil

; =======================
;
; Eingabe()
;

Function Eingabe()
   Repeat
      value$ = Input$( "Zahl eingeben mit 'End' wird die eingabe beendet " )
      
      If ( Int( value$ ) > 255 ) Then
         Print "Leider zu groß die Zahl (>255)"
      ElseIf ( value$ <> "End" )
         newNum.TNum = New TNum
         newNum\num = Int( value )
      End If
   Until value$ = "End"
End Function

; =======================
;
; HammingDist()
;

Function HammingDist$()
   Local result = 0
   Local tmpA.TNum, tmpB.TNum
   
    a.TNum = First TNum
   
   Repeat
      b.TNum = First TNum
      
      Repeat
          If ( a <> b )
             tmp = BitDist( a\num, b\num )

            If ( tmp < result Or result = 0 ) Then
               tmpA = a
               tmpB = b
               result = tmp
            End If
         EndIf
         
         b = After b
      Until b = Null
      
      a = After a
   Until a = Null
   
   Return result + ", zwischen " + tmpA\num + " und " + tmpB\num;
End Function

; =======================
;
; BitDist()
;

Function BitDist( val1, val2 )
    Local cnt    = 0
   Local i      = 1
   
   val3 = val1 Xor val2
   
   While i < 256
      If ( val3 And i ) Then cnt = cnt + 1
      
      i = i * 2
   Wend
   
   Return cnt
End Function


grüße
 

zocker2150

BeitragSa, Feb 05, 2005 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok meine Variablen sind sch**** aber es geht ja ums Prinzip ^^

Code: [AUSKLAPPEN]
Graphics 640,300,32,0
SetBuffer BackBuffer()

Type ZahlType
   Field dez%
   Field dual$
   Field id%
End Type

Type ErgType
   Field Bezug$
   Field Bit%
End Type


Global vari.ZahlType
Global Ergebnis.ErgType
Global Count% = 0

   
; Eingabe
Repeat   

   tmp3% = Input("Bitte geben sie eine Zahl zwischen 0 und 255, wenn sie aufhören möchten -1: ")
   If tmp3% > 0 And tmp3% < 255 Then Eingabe(tmp3%)
   
Until tmp3% = -1

; Rechnung
If First ZahlType <> Null
   Local f = 0
   
   For v.ZahlType = Each ZahlType
      f = f + 1
      For vari.ZahlType = Each ZahlType
         
         If v <> vari And vari\id% >= f Then
            Ergebnis.ErgType    = New ErgType
             Ergebnis\Bezug$    = v\id% + " und " + vari\id%
             Ergebnis\Bit%       = 0
          
            For j = 8 To 1 Step - 1
               If ( Mid$(v\dual$,j,1) Xor Mid$(vari\dual$,j,1) ) = 1 Then Ergebnis\Bit% = Ergebnis\Bit% + 1
            Next
            
         End If
         
      Next
   Next
   
End If
   
; Hauptschleife
Repeat
   
   Cls   
   Local k = 20
   Local min_distanz% = 10
   Local min_bezug$
   j = 0
   
   ; Ausgabe
   If First ErgType <> Null
      For Ergebnis.ErgType = Each ErgType
         
         k = k + 20
         If min_distanz > Ergebnis\Bit% Then
            min_distanz    = Ergebnis\Bit%
            min_bezug$       = Ergebnis\Bezug$
         End If
         
         Text 20,20, " Bezug:           Hamming-Distanz "
         Text 20,k,  Ergebnis\Bezug$ + "               " + Ergebnis\Bit%
      
      Next
      
      Text 20,k+30, "Kleinste Hamming-Distanz: (" + min_bezug$ + ") mit " + min_distanz% + " Bit(s)"
      Text 20,k+40, "------------------------------------------------"
                     

   End If
   
   Flip
   
Until KeyHit(1)
End

Function Eingabe(x%)

   Count% = Count% + 1
   
   vari.ZahlType    = New ZahlType
    vari\dez%      = x%
    vari\dual$    = dez_dual$(vari\dez%)
    vari\id%       = Count%

   Return Count%
End Function


Function dez_dual$(x%)
   Local tmp$ = ""

   
   For j = 1 To 8
      tmp$ = x% Mod 2 + tmp$ : x% = x% / 2
   Next
   
   Return tmp$
End Function
 

feider

ehemals "Decelion"

BeitragSa, Feb 05, 2005 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Wann kommt die nächste?

wunderkind

BeitragSa, Feb 05, 2005 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@Wammerl
Sobald ich Zeit finde ein vernünftiges Thema zu suchen. Spätestens nächste Woche.

Interessante Umsetzungen übrigens. Sehr schön.

Ich gestehe, ich habe keine Lösung programmiert, aber ich hätte das zum Beispiel wie folgt umgesetzt: per XOR erhält man einen Wert, der aus den gesuchten gesetzten Bits gebildet wird. Der Einfachheit halber hätte ich eine Tabelle genommen, in der steht, wieviele Bits für den jeweiligen Wert gesetzt sind. Also etwa so:

Code: [AUSKLAPPEN]
distance = value1 xor value2
distance = bit_table(distance)


Die Tabelle hätte man natürlich erst erstellen müssen.

Also, die nächste Aufgabe kommt ganz sicher.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSa, Feb 05, 2005 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab da 2 Versionen gemacht:
Hier die erste einfache Berechnung mit GuiCode: [AUSKLAPPEN]
Const MAXDEZ = 12
Win1 = CreateWindow ("Aufgabe 5 (c)Rallimen",339,216,182,164,Desktop (),3)
TF1 = CreateTextField (63 ,24,100,20,Win1,0)
SetGadgetText TF1,"0"
SetGadgetLayout TF1,1,1,1,0
TF2 = CreateTextField (63 ,59,100,20,Win1,0)
SetGadgetText TF2,"0"
SetGadgetLayout TF2,1,1,1,0
Label1 = CreateLabel ("Zahl 1:",5,28,40,20,Win1,0)
SetGadgetLayout Label1,1,0,1,0
Label2 = CreateLabel ("Zahl 2:",5,63,40,20,Win1,0)
SetGadgetLayout Label2,1,0,1,0
Label3 = CreateLabel ("Ergebnis:",6,100,45,20,Win1,0)
SetGadgetLayout Label3,1,0,1,0
TF3 = CreateTextField (63 ,96,100,20,Win1,0)
SetGadgetText TF3,"0"
SetGadgetLayout TF3,1,1,1,0
Global CheckBox1 = CreateButton ("8 Bit",63,3,100,20,Win1,2)
SetButtonState CheckBox1,1
SetGadgetLayout CheckBox1,1,0,1,0
ActivateGadget Win1
Repeat
    Ergebnis = WaitEvent ()
    Select Ergebnis
     Case $803 End
     Case $401
        Select EventSource ()
         Case TF1
            Checkdez (TF1)
            SetGadgetText (TF3,Berechnung (TF1,TF2) )
         Case TF2
            Checkdez (TF2)
            SetGadgetText (TF3,Berechnung (TF1,TF2) )
         Case TF3
            SetGadgetText (TF3,Berechnung (TF1,TF2) )
         Case CheckBox1
            Checkdez (TF1)
            Checkdez (TF2)
            SetGadgetText (TF3,Berechnung (TF1,TF2) )
        End Select
     Default
    End Select
Forever

Function Berechnung (TF1,TF2)
    Zahl1 = TextFieldText (TF1)
    Zahl2 = TextFieldText (TF2)
    Ergebnis = Zahl1 Xor Zahl2
    BinZahl$ = Bin (Ergebnis)
   
    For i = 1 To Len (BinZahl)
        If Mid (BinZahl,i,1) = "1" Then Untersch = Untersch + 1
    Next
   
    Return Untersch
End Function

Function CheckDez$ (Textzeile)
    Zahlen$ = TextFieldText (Textzeile)
    zeichen = Len (Zahlen$)
   
    While x < zeichen
        x = x + 1
        dummy$ = Mid (Zahlen$,x,1)
        If x = MAXDEZ Then Exit
       
        Select dummy$
         Case "0"
            If x <> 1 Then Ausgabe$ = Ausgabe$ + dummy
         Case "1","2","3","4","5","6","7","8","9"
            Ausgabe$ = Ausgabe$ + dummy
        End Select
    Wend
    If ButtonState ( CheckBox1) Then
        Zahl = Ausgabe$
        If Zahl > $FF Then Ausgabe$ = $ff
    End If
    If Ausgabe$ = "" Then Ausgabe$ = "0"
    SetGadgetText Textzeile,Ausgabe$
End Function


und die 2. nur als KonsoleCode: [AUSKLAPPEN]
Type Integer Field Bits End Type
Print "Nur Enter ohne Eingabe  berechnet die Werte"
Repeat;input
    A$ = Input ("Zahl eingeben (0 - 255) ")
        If a$ = "" Then
            Print ""
            dummy$= Berechne ()
            Print "Der kleinste Unterschied ist " + Left(dummy$,Instr(dummy$,"!")-1)
            Print "Der groesste Unterschied ist " + Mid(dummy$,Instr(dummy$,"!")+1)
            WaitKey ()
            End
         Else
            Byte = A$
            If a$ = "0" Or (Byte > 0 And  Byte <= 255) Then
                x.Integer = New Integer
                x\Bits = Byte
             Else
                Print "Falsche Eingabe"
            End If
        End If
Forever


Function Berechne$ ()
    Max = 8 :Min = 0
    For x.Integer = Each Integer
        y.Integer = After x
        While y.Integer <> Null
            ;Berechnen Werte
            dummy = x\Bits Xor y\Bits
            For i = 0 To 7
                If dummy And 2^i Then dd = dd + 1
            Next
            If Min < dd Then Min = dd
            If Max > dd Then Max = dd
            dd = 0
            y.Integer = After y
        Wend
    Next
    Return Max+"!"+Min
End Function
[BB2D | BB3D | BB+]

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group