[Wettbewerb] Zweielementige boolesche Algebra

      [Wettbewerb] Zweielementige boolesche Algebra

      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.:

      AutoIt-Quellcode

      1. $A = True
      2. $B = False
      3. $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

      AutoIt-Quellcode

      1. #include-once
      2. Func _Wire_Create()
      3. Return False
      4. EndFunc
      5. Func _Wire_Power(ByRef $Wire, $Power='On')
      6. Switch $Power
      7. Case 'On', 1
      8. $Wire = True
      9. Case 'Off', 0
      10. $Wire = False
      11. Case Else
      12. SetError(1)
      13. $Wire = False
      14. EndSwitch
      15. EndFunc
      16. Func _Wire_Value(ByRef $Wire)
      17. Return Int($Wire)
      18. EndFunc
      19. Func _Wire_NOT(ByRef $Input, ByRef $Output)
      20. $Output = (Not $Input)
      21. EndFunc
      22. Func _Wire_Connect(ByRef $Input1, ByRef $Input2, ByRef $Output)
      23. $Output = ($Input1 Or $Input2)
      24. EndFunc
      25. Func _Wire_FromInteger($Integer, ByRef $Wires, $Length = 32)
      26. $Integer = Int(Abs($Integer))
      27. Local $Binary, $i
      28. Do
      29. $Binary = Mod($Integer, 2) & $Binary
      30. $Integer = Int($Integer / 2)
      31. Until $Integer = 0
      32. For $i = StringLen($Binary)+1 To $Length Step 1
      33. $Binary = '0' & $Binary
      34. Next
      35. $Binary = StringRight($Binary, $Length)
      36. $Binary = StringSplit($Binary, '', 2)
      37. Dim $Wires[$Length]
      38. For $i = 1 To $Length Step 1
      39. $Wires[$i-1] = ($Binary[$Length-$i]==1)
      40. Next
      41. EndFunc
      42. Func _Wire_ToInteger($Wires)
      43. If (Not IsArray($Wires)) Then
      44. $Wires = StringSplit($Wires, '|', 2)
      45. EndIf
      46. Local $Binary = '', $Integer = 0, $i
      47. For $i = 0 To UBound($Wires)-1 Step 1
      48. $Binary = Int($Wires[$i]) & $Binary
      49. Next
      50. $Binary = StringSplit($Binary, '')
      51. For $i = 1 To $Binary[0] Step 1
      52. $Integer += $Binary[$i] * 2^($Binary[0]-$i)
      53. Next
      54. Return $Integer
      55. 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...
      Dateien
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „James1337“ ()

      Nette Idee.
      Erinnert mich an meine Kindheit. Ich hatte im zarten Alter von 12 Jahren einen "Elektronik"-Bausatz bekommen. Das Teil bestand aus 8 "Registern" (das waren Plastikstäbe, die man vor oder zurück schieben konnte und die dabei jeweils Kontakte nach oben oder unten verbanden) die in einer Plastikplatte mit lauter Steckkontakten waren, die man mit Drahtbrücken verbinden konnte. Der generierte Zustand (On/Off) wurde in einer Lampe über dem Register angezeigt. Damit habe ich damals sogar eine Steuerung für meine Modelleisenbahn 'gestöpselt'. Und das ist genau das, was mit diesen Gattern geschieht: Zustände miteinander verknüpfen.
      Wer damit nicht vertraut ist, das Thema aber interessant findet, sollte sich zwingend vorher mal einige solcher Schaltungen anschauen und auch versuchen nachzuvollziehen, was dort passiert. Ohne dieses Verständnis kommt man sonst nicht weit. ;)
      Sucht mal nach Datenblättern für primitive Schaltkreise, da sollten passende Dokumentationen zu finden sein.
      Ob ich mitmache, weiß ich noch nicht. Das erste Quartal ist bei mir immer zeitmäßig etwas eng. Schaun' mer mal.

      General Kaboom schrieb:

      Also du schlägst einen Taschenrechner vor aber es darf auch was anderes sein richtig?
      Natürlich, ich hab' das nur erwähnt, falls jemandem spontan nichts sinnvolles einfällt.

      General Kaboom schrieb:

      Aber ich fänds jetzt unfair, wenn du bereits ein Programm geschrieben hättest hoffe fas hast du nicht (nur um die Schummelmöglichkeit auszuschliessen)?
      Ich habe heute mal angefangen, bin aber noch sehr weit von einem funktionierenden Taschenrechner entfernt.
      (Nur weil ich dieses Thema gewählt habe, heißt das ja nicht, dass ich Ahnung davon habe.)

      Ich persönlich bin bis jetzt mal so vorgegangen:
      Als erstes braucht man natürlich außer dem NOT-Gate noch Andere (z.B. AND, XOR), die kann man sich aber relativ leicht durch logisches Denken basteln (ich habs ohne Internet geschafft, aber mit Google findet man sowas garantiert leichter heraus).
      So, und weiter bin ich bis jetzt auch noch nicht gekommen...

      MfG, James
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      tkausl schrieb:

      Interessante Idee...

      Kennst du Minecraft?
      Dort bauen auch Freaks mit Redstone Taschenrechner, CPU's, Ram, ...
      Ist im prinzip das gleiche.
      Hast ein Kabel (Redstone), und "NOT"-Gates. Mehr nicht.

      Dann kannst du dir garantiert auch denken, wodurch Carsten8 mich auf diese Idee gebracht hat. :D
      Aber ich selbst spiele kein Minecraft.
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „James1337“ ()

      @James:
      Ich habe mal ein wenig mit den Fuktionen gespielt.
      Den Sinn von ..Attach() verstehe ich nicht ganz. Laut Beschreibung sollte bei 2 mit Attach verbundenen Kabeln, Kabel1 immer On sein, wenn Kabel1 oder Kabel2 On ist. (Also ein OR-Gatter) Das ist aber nicht der Fall. Kabel1 und Kabel2 halten ihre Werte unabhängig voneinander, sie lassen sich auch unabhängig ändern.
      @BugFix: Ich verstehe jetzt nicht so ganz was du meinst.
      Also ja, der Sinn von Attach ist, zwei Kabel zu einem zusammenzuführen und ja, es ist ein OR-Gatter.
      Aber wieso ist das jetzt nicht der Fall?
      Die Werte lassen sich unabhängig ändern, aber auch nur, bis die zwei Kabel verbunden sind.

      Könntest du bitte nochmal erklären, was der Fehler in der Funktion ist?


      MfG, James
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat
      Das ist mir etwas zu kompliziert ;D ich bräuchte einführung :D
      I hacked 127.0.0.1
      Meine Werke:
      Alkane Rechner | Minecraft Server Helper | CD Lade



      Ihr Könnt mich unterstützen



      Meine Pcs:


      Spoiler anzeigen


      Lappi:

      Toschiba L50019R

      Intel T4300 @2* 2,2 Ghz

      4gig ddr3 ram

      500gig Festplatte

      15,3 Zoll

      fast ethernet 100 mbits

      dvd-rom 24x

      Pc:

      IBM NETVISTA M41

      Intel pentium4 @2,53 Ghz

      1 gig ddr2 sdram Ram

      40gig Festplatte + 2*1TB USB Festplatte

      15Zoll Röhre <3

      fast ethernet 100mbits + gigabit ethernet 1gps

      cdrom 52x

      floppy

      @BugFix Ich versteh' dich immer noch nicht so ganz, nach Attach ist auf Kabel2 immer kein Strom, da es ja sozusagen nicht mehr existiert. Wenn du es trotzdem weiterverwenden willst, musst du davor eben Detach benutzen.

      @chip Ich habe auch nicht wirklich Ahnung von dem Ganzen, deshalb habe ich ja auch so viel Zeit gegeben.
      Und da ja jeder abstimmen soll, ist das auch völlig unnötig...
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „James1337“ ()

      @james ich kenne mich mit Redstone super aus =D , aber die Funktionen von autoit versteh ich noch niccht so ganz =D
      I hacked 127.0.0.1
      Meine Werke:
      Alkane Rechner | Minecraft Server Helper | CD Lade



      Ihr Könnt mich unterstützen



      Meine Pcs:


      Spoiler anzeigen


      Lappi:

      Toschiba L50019R

      Intel T4300 @2* 2,2 Ghz

      4gig ddr3 ram

      500gig Festplatte

      15,3 Zoll

      fast ethernet 100 mbits

      dvd-rom 24x

      Pc:

      IBM NETVISTA M41

      Intel pentium4 @2,53 Ghz

      1 gig ddr2 sdram Ram

      40gig Festplatte + 2*1TB USB Festplatte

      15Zoll Röhre <3

      fast ethernet 100mbits + gigabit ethernet 1gps

      cdrom 52x

      floppy

      Jeahaha schrieb:

      @james ich kenne mich mit Redstone super aus =D , aber die Funktionen von autoit versteh ich noch niccht so ganz =D

      Um so besser:
      Also, bei Redstone hast du ja deine Kabel, die du wo auch immer verlegst.
      In meiner UDF erstellst du einfach ein Kabel mit

      AutoIt-Quellcode

      1. $Kabel = _Wire_Create()
      (Da wir hier nicht graphisch arbeiten, musst du dir um Sachen wie Platz, Repeater und ähnliches keine Sorgen machen.

      Wenn in Minecraft 2 (oder mehrere) Kabel nebeneinander liegen, sind sie automatisch verbunden. In diesem Fall brauchst du dafür _Wire_Attach. Z.B.:

      AutoIt-Quellcode

      1. $Kabel1 = _Wire_Create()
      2. $Kabel2 = _Wire_Create()
      3. _Wire_Power($Kabel2, 'On')
      4. _Wire_Attach($Kabel1, $Kabel2, $Kabel)
      $Kabel hat dadurch Strom, weil $Kabel1 oder $Kabel2 Strom hatte.
      Bei den meisten Gates wird nur das erste Kabel verändert, das zweite wird dann auf "Off" gesetzt. Falls du aber ein Kabel mehrmals verwenden willst/musst, spaltest du es vorher mit _Wire_Detach($Kabel1, $Kabel2) in $Kabel1 und $Kabel2 auf (welche dann beide den gleichen Wert haben).

      Bei Redstone ist eine Fackel ein NOT-Gate, in AutoIt machst du dafür einfach

      AutoIt-Quellcode

      1. _Wire_NOT($Kabel1, $Ausgabe)


      Jetzt brauchst du nur noch die anderen Gates, die machst du dann einfach so:

      AutoIt-Quellcode

      1. Func _Wire_AND(ByRef $Input1, ByRef $Input2, ByRef $Output)
      2. ; hier dann die Ganzen NOT-Gates und Verbindungen
      3. EndFunc


      MfG, James
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „James1337“ ()

      Ich werd mal Gucken Danke
      I hacked 127.0.0.1
      Meine Werke:
      Alkane Rechner | Minecraft Server Helper | CD Lade



      Ihr Könnt mich unterstützen



      Meine Pcs:


      Spoiler anzeigen


      Lappi:

      Toschiba L50019R

      Intel T4300 @2* 2,2 Ghz

      4gig ddr3 ram

      500gig Festplatte

      15,3 Zoll

      fast ethernet 100 mbits

      dvd-rom 24x

      Pc:

      IBM NETVISTA M41

      Intel pentium4 @2,53 Ghz

      1 gig ddr2 sdram Ram

      40gig Festplatte + 2*1TB USB Festplatte

      15Zoll Röhre <3

      fast ethernet 100mbits + gigabit ethernet 1gps

      cdrom 52x

      floppy

      Wenn, dann aber richtig. Das heißt FromInteger, ToInteger und so weiter muss raus. Alles was du hast ist NOT. Das reicht für alles andere. For, If und so weiter braucht man hier nicht, das lässt sich alles mittels Not-Gates realisieren. Für Inputs und Outputs lassen sich beispielsweise Checkboxen verwenden, die grundsätzlich auch nur zwei Zustände haben (aus -> 0 und an -> 1).

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Carsten8“ ()

      Schön dich auch mal wieder im Forum zu "sehen", Carsten.

      Bei binärem Input hast du recht, aber für einen Rechner ist dezimaler Input vielleicht doch eher angebracht.
      Des weiteren würde es mich interessieren, wie du If mit NOT-Gates realisieren würdest.

      MfG, James C.
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat
      Einen dezimalen Input zu verwenden wird in der Tat kompliziert, aber nicht unmöglich.
      Ich experimentiere gerade mit AutoIt. Alles was man braucht ist in der Tat "Not" und "BitOR". BitOR dient hierbei zur Verbindung zweier Kabel.
      Ein AND-Gate würde dabei wie folgt aussehen:

      AutoIt-Quellcode

      1. $a = False
      2. $b = False
      3. $c = Not BitOR(Not $a, Not $b)

      $a und $b stellen die beiden Inputs dar, $c ist das Ergebnis. Wenn $a und $b an sind, ist $c an. Auf diese Weise realisierst du dann dein If (je nachdem, was du machen willst).
      Ok, dann hast du mich falsch verstanden.
      Ein AND-Gate habe ich schon, ich meinte ein If-Ersatz, bei dem du kein If mehr verwenden musst.
      Sonst könnte ich das ja einfach so machen:

      AutoIt-Quellcode

      1. If $Wire1 Then ...


      PS: Ich bin der Meinung, dass du mit den momentan vorhandenen Funktionen (mal abgesehen von To und FromInteger) unmöglich dezimalen Input verarbeiten kannst. Außerdem würde das die Verwirrung bei allen noch erheblich steigern.
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „James1337“ ()

      [OT]
      Ich finde es nach wie vor verwirrend, mit "Kabeln" zu arbeiten. Besser nachvollziehbar ist es, wenn man die Gatter z.B. als Objekte darstellt mit den Eigenschaften Pegel an IN und OUT und den Verweis auf verknüpfte andere Gatter. Ich hab das mal mit AutoItObject realisiert. Vielleicht mache ich da noch einen Simulator draus.
      [/OT]

      Carsten8 schrieb:

      Ich bin trotzdem der Meinung, man sollte den ganzen Wettbewerb (wenn's schon um Elektronik bzw. Kabel geht) auf Not und Or beschänken. Alles andere hat (wie ich finde) kaum etwas mit dem Thema zu tun, sorry.
      Ich hab das gestern mal auf die schnelle geändert, siehe Post #1.

      BugFix schrieb:

      Ich finde es nach wie vor verwirrend, mit "Kabeln" zu arbeiten.
      Dabei war der Hintergedanke eigentlich, dass es dadurch leichter verständlich wird, naja, wie schon gesagt, ich hab das Prinzip mal überarbeitet.

      chip schrieb:

      Wollte schon länger mal einen Simulator bauen mit dem man Schaltungen mit Wiederständen ect. bauen und simulieren kann.
      Ich kanns kaum noch erwarten diesen Simulator hier im Forum zu sehen... :)

      MfG, James
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „James1337“ ()

      Nur mal so interessehalber, wer nimmt den an dem Wettbewerb teil?
      "Possible? Anything is possible. Practical? I'm doubtful. Demonstrable? That can be debated. Easy? Hell no."

      AutoIt Version: 3.3.9.5 | SciTE Version: 2.28 (SciTE Lite)

      IRC: irc.afterworkchat.com #minxomat
    autoit.de Webutation