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

![]() |
wunderkindBetreff: Übungsaufgabe für alle :: Nr. 5 - Hamming-Distanz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jo fertig - soll man dir das dann schicken oder einfach bis zum 04.02.05 warten? | ||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Du sollst WARTEN... Steht doch da. grüße |
||
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() |
||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Yor, aber insgesammt wars nichso wild, nich? ![]() Meine Executable: hier und dann aufgabe5.exe grüße |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab da auch wieder was gemacht!
Ob ich das jetzt richtig verstanden habe weiß ich nicht! Hier Die EXE |
||
[BB2D | BB3D | BB+]
|
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? ![]() grüße |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Genau, auser es handelt sich um eine Reihe gleicher Zahlen. grüße |
||
![]() |
Suco-XBetreff: ....... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Da der 8.01 schon vorbei ist nehm ich an, das heute gepostet werden darf! grüße |
||
![]() |
Randall Flagg |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich glaub er meint 8.2 | ||
David |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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! ![]() grüße |
||
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wann kommt die nächste? | ||
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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+]
|
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group