Carsten8 hat mich neulich daran erinnert, was man mit NOT- und OR-Gates alles bauen kann.
Deshalb habe ich diesen Wettbewerb gestartet, um zu sehen, was ihr aus diesen sehr begrenzten Möglichkeiten alles machen könnt.
!!! Achtung! Ich habe alles hier nochmal überarbeitet, was aber zur Folge hat, dass die Funktionen leichter verständlich sind und der Code der anderen Gates (AND, XOR, ...) kürzer wird. !!!
Die Hauptänderung besteht darin, das die Funktionen nicht mehr die Inputs ändern, sondern eigene Outputs benutzen.
Das Ziel
Ein funktionierendes, möglichst sinnvolles Skript (z.B. einen Rechner) zu schreiben.
Die Regeln
Wie schon oben erwähnt, dreht sich bei diesem Wettbewerb alles um NOT- und OR-Gates.
Ihr habt jetzt zwei Möglichkeiten:
1) Ihr definiert eure Variablen und arbeitet dann nurnoch mit NOT und OR; z.B.:
$A = True
$B = False
$C = (Not ((Not $A) Or (Not $B)))
2) Ihr könnt natürlich auch folgende sinnlose UDF benutzen, die aber im Grunde genau das Gleiche macht:
Wire.au3
#include-once
[/autoit] [autoit][/autoit] [autoit]Func _Wire_Create()
Return False
EndFunc
Func _Wire_Power(ByRef $Wire, $Power='On')
Switch $Power
Case 'On', 1
$Wire = True
Case 'Off', 0
$Wire = False
Case Else
SetError(1)
$Wire = False
EndSwitch
EndFunc
Func _Wire_Value(ByRef $Wire)
Return Int($Wire)
EndFunc
Func _Wire_NOT(ByRef $Input, ByRef $Output)
$Output = (Not $Input)
EndFunc
Func _Wire_Connect(ByRef $Input1, ByRef $Input2, ByRef $Output)
$Output = ($Input1 Or $Input2)
EndFunc
Func _Wire_FromInteger($Integer, ByRef $Wires, $Length = 32)
$Integer = Int(Abs($Integer))
Local $Binary, $i
Do
$Binary = Mod($Integer, 2) & $Binary
$Integer = Int($Integer / 2)
Until $Integer = 0
For $i = StringLen($Binary)+1 To $Length Step 1
$Binary = '0' & $Binary
Next
$Binary = StringRight($Binary, $Length)
$Binary = StringSplit($Binary, '', 2)
Dim $Wires[$Length]
For $i = 1 To $Length Step 1
$Wires[$i-1] = ($Binary[$Length-$i]==1)
Next
EndFunc
Func _Wire_ToInteger($Wires)
If (Not IsArray($Wires)) Then
$Wires = StringSplit($Wires, '|', 2)
EndIf
Local $Binary = '', $Integer = 0, $i
For $i = 0 To UBound($Wires)-1 Step 1
$Binary = Int($Wires[$i]) & $Binary
Next
$Binary = StringSplit($Binary, '')
For $i = 1 To $Binary[0] Step 1
$Integer += $Binary[$i] * 2^($Binary[0]-$i)
Next
Return $Integer
EndFunc
Des weiteren könnt ihr auch InputBox, MsgBox, ConsoleWrite und GUIs für Ein- und Ausgaben benutzen. Außerdem dürft ihr Funktionen definieren, um eueren Code kürzer und übersichtlicher zu machen.
Das Hauptproblem bestand gestern darin, dass ich die Funktionen _Wire_FromInteger und _Wire_ToInteger hinzugefügt habe, damit das Ganze um einiges einfacher wird. Aber wie Carsten schon sagte, hat das nichts mehr mit dem eigentlichen Thema zu tun.
Deshalb würde ich sagen: Wer diese Funktionen verwenden will, kann dies gerne tun, und wer die Daten selbst unter Berücksichtigung der Regeln umwandeln will, um so besser.
Der Wettbewerb endet vorerst am 31. Dezember 2012.
Dann postet einfach jeder seinen Code und sagt, welches Skript er am besten findet. Der mit den meisten Stimmen gewinnt dann.
(Denkt bei eurer Bewertung bitte daran, dass es schwieriger ist, die Daten umzuwandeln ohne die zwei oben beschriebenen Funktionen zu benutzen.
MfG, James C.
PS: Im Anhang mal ein Bild meiner momentanen Ausgabe der einzelnen Bits, nur falls jemand (wie ich gestern) denkt, das sei nicht möglich...