Ich spiele gerne Golf dc
, bin aber manchmal frustriert, weil ich dc
keine bitweisen Operationen habe.
Herausforderung
Geben Sie vier genannten Funktionen , die das Äquivalent der c bitweise Operationen implementieren &
, |
, ~
und ^
(bitweise AND, OR, NOT und XOR). Jede Funktion benötigt zwei Operanden ( ~
nur einen), bei denen es sich um mindestens 32-Bit-Ganzzahlen ohne Vorzeichen handelt. Jede Funktion gibt eine ganze Zahl ohne Vorzeichen mit derselben Bitbreite wie die Operanden zurück.
Beschränkung
Sie dürfen nur Operationen verwenden, die von unterstützt werden dc
. Diese sind:
+
-
*
/
Arithmetische Addition, Subtraktion, Multiplikation und Division~
modulo (oder divmod wenn deine Sprache es unterstützt)^
Potenzierung|
modulare Potenzierungv
Quadratwurzel>
>=
==
!=
<=
<
Standard-Gleichheits- / Ungleichheitsoperatoren>>
<<
Bit-Shift-Operatoren.dc
habe diese nicht, aber da sie in Bezug auf Division / Multiplikation durch Potenzen von 2 trivial implementiert sind, werde ich diese zulassen.
Kontrollstrukturen lassen dc
sich mit (rekursiven) Makros und (in) Gleichheitsoperationen ungeschickt aufbauen. Sie können die in Ihrer Sprache integrierten Kontrollstrukturen verwenden.
Sie können auch logische Operatoren verwenden &&
||
!
, obwohl diese in nicht direkt verfügbar sind dc
.
Sie müssen nicht die Bit - Operatoren verwenden &
, |
, ~
und ^
oder alle Funktionen , die sie triviale implementieren.
Außerdem dürfen Sie keine eingebauten Basisumwandlungsoperatoren oder -funktionen verwenden.
Bitte geben Sie auch ein Testprogramm oder ein Online-Compiler-Snippet an (nicht im Golf-Score enthalten), um Ihre Antwort zu überprüfen.
quelle
Antworten:
C 134
Der C-Präprozessor ist ziemlich lustig zu missbrauchen. Grundsätzlich ist dieser Makro definiert die Funktionen 3,
a
,o
, undx
, fürand
,or
undxor
sind. Der einzige Unterschied im Algorithmus für diese Operationen besteht in den Kriterien zum Setzen des Bits im Ergebnis.not
ist die Funktionn
.Tester-Programm (dauert lange, ich habe keine Zeit damit verbracht, es zu optimieren, aber es testet jeden möglichen Testfall, abgesehen von MAX_INT-bezogenen):
quelle
ised 76 Bytes
ised hat auch nicht bitweise Operationen - in der Regel ärgerlich, aber jetzt gern gesehen, weil wir wirklich brauchen , um sie umzusetzen.
Funktionen werden in nummerierten Speicherplätzen gespeichert (keine ausführlichen Namen).
Konvertierung von und nach Binär:
NICHT könnte sein,
@1{:$6::{1-$5::x}:}
aber es ist offensichtlich einfacher, nur zu subtrahieren:ODER:
UND:
XOR:
Dies würde uns auf 156 Bytes bringen (mit Zeilenumbrüchen und Semikolons). Ein Testcode wäre einfach (NICHT, ODER, UND, XOR nacheinander, gefunden unter den Namen $ 1, $ 2, $ 3, $ 4):
Aber natürlich sind ODER und NICHT alles, was wir wirklich brauchen, und die Dinge können vereinfacht werden:
Das sind 109 Zeichen. Wenn Zeilenumbrüche und Semikolons übersprungen werden und etwas mehr Golf gespielt wird, haben wir 76 Zeichen:
quelle
Nim
(537)(490)Nim Compiler 0.10.2
Ich habe nach einem Grund gesucht, um nim zu lernen, also können wir loslegen.
Für Code-Golf habe ich variable Parameter und implizite Renditen genutzt. Die variablen Parameter sind laut Dokumentation weniger stapeleffizient. Persönlich finde ich die impliziten Rückgaben schwerer zu lesen und würde sie wahrscheinlich nur in trivialen Verfahren verwenden.
Die Algorithmen sind einfach genug. Für alle Operationen außer NOT vergleichen wir jedes Bit und vergleichen sie manuell mit unserer erwarteten Wahrheitstabelle. Stellen Sie jedes Bit in unserer Ausgabevariable nach Bedarf ein. In Nim ist result der implizite Rückgabewert.
Ich war mir nicht sicher, ob wir das eingebaute ODER und UND verwenden dürfen, um zwei boolesche Bedingungen zu bestätigen, damit die notZero-Prozedur an ihre Stelle tritt.Immer noch auf der Suche nach einer besseren Methode ...
Hier ist die nicht gequetschte Version sowie ein vollständiger Testgurt, der auf Ihrem eigenen Computer ausgeführt werden kann.
Wenn Sie nur ein paar Eingaben ausführen möchten, finden Sie hier den Testfall lite .
quelle
CJam, 71 Bytes
Erläuterung
Testsuite
Dieser Code testet die Ausführung jeder meiner und / oder nicht und xor-Funktionen 100-mal mit gleichmäßig verteilten 64-Bit-Eingaben ohne Vorzeichen und vergleicht das Ergebnis mit dem Ergebnis des eingebauten Operators. Aufgrund der unbeabsichtigten Verwendung des eval-Operators ist dies recht langsam und kann mit dem Online-Dolmetscher bis zu einer Minute dauern. Aber wenn alles gut geht, sollte die Ausführung ohne Ausgabe enden, da alle gefundenen Unstimmigkeiten gedruckt werden.
quelle
JavaScript
294267Konnte mit den Vorschlägen von @ AlexA. Und @ kennytm ein paar Bytes mehr abschneiden.
Funktionen:
Beispiel:
Ausgabe:
quelle
for
und ersetzenfunction B(n,m,t)
mitB=(n,m,t)=>
. Ebenso für die anderen Funktionen.4*(1<<30)
für 4294967296 und-1>>>0
für 4294967295 verwenden. ② ist das hiervar
wirklich notwendig? ③ du könntest schreiben(n,m)=>B(n,m,'a')
anstatt(n,m)=>{return B(n,m,'a')}