Dies ist eine CMC (Chat Mini Challenge), die ich vor einiger Zeit in unserem Chatraum The Ninteenth Byte gepostet habe.
Die Herausforderung
Gehen Sie bei einer positiven Ganzzahl x
in Abhängigkeit von den letzten 2 Bits von x
wie folgt vor:
x & 3 == 0: 0
x & 3 == 1: x + x
x & 3 == 2: x * x
x & 3 == 3: x ^ x (exponentiation)
Input-Output
Single Integer -> Single Integer
In der Ausgabe ist ein abschließender Zeilenumbruch zulässig. Kein anderes Leerzeichen ist zulässig.
Testfälle
input output
1 2
2 4
3 27
4 0
5 10
6 36
7 823543
8 0
9 18
10 100
11 285311670611
12 0
Dies ist eine Code-Golf- Herausforderung, also gewinnt der kürzeste Code!
0
seinx + 2
, wie es den anderenx * 2
gehtx ^ 2
, undx ^^ 2
(Tetration)? : Px ^ x
)? 32-Bit reicht für Testfälle bereits nicht aus11
und 64-Bit reicht für Testfälle nicht aus19
.Antworten:
Gelee , 8 Bytes
Probieren Sie es online!
Wie es funktioniert
Beachten Sie zunächst, dass
x&3
entsprichtx%4
, wo%
Modulo ist. Da Jelly dann modular indexing (a[n] == a[n+len(a)]
) verwendet, müssen wir uns damit nicht einmal befassen.Dann:
x%4==0
, returnx_x
(Subtraktion) (aus Konsistenzgründen);x%4==1
, kehre zurückx+x
;x%4==2
, returnx×x
(Multiplikation);x%4==3
, returnx*x
(Potenzierung)Beachten Sie, dass Jelly die 1-Indexierung verwendet, sodass die Subtraktion
"_"
an das Ende verschoben wird.quelle
wc --bytes
).Python , 30 Bytes
Probieren Sie es online!
quelle
CJam , 12 Bytes
Probieren Sie es online!
Erläuterung
Führt je nach
x
dem Wert von mod 4 eine der folgenden Operationen aus (mod 4 entspricht AND 3).quelle
Mathematica 25 Bytes
4 Bytes gespart dank @MartinEnder
quelle
Pyth, 8 Bytes
Dolmetscher
quelle
v
anstelle von verwenden.v
..v
kann nicht darauf zugreifenQ
... Anscheinend habe ich mich in Pyth geärgert. +1 für dich.v
was lokalen Geltungsbereich hat,.v
nur einen Ausdruck auswertet."0y*^
könnte das sein"-+*^
.Ruby , 26 Bytes
Probieren Sie es online!
quelle
PHP, 37 Bytes
Online Version
PHP, 47 Bytes
Online Version
BC Math Funktionen
quelle
Haskell,
2827 BytesProbieren Sie es online!
Edit: Danke an @ Ørjan Johansen für 1 Byte.
quelle
cycle
.JavaScript, 24 Byte
Probieren Sie es online!
quelle
C, 63 oder 62 Bytes
-1 Byte, wenn Makros erlaubt sind, vorausgesetzt, es
x
handelt sich nicht um einen Ausdruck wie3+5
(da dies den Vorrang verfälschen würde):quelle
cast to incomplete array type "int[]" is not allowed
Compiler sagteerror C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
; EBENFALLS! wo ist int f (int x)? Code ist tatsächlich mindestens 8 Byte länger; es ist auch sehr langsam und ineffizient, da es alles auswertet - nicht wiederholen IRL)(int[])
Syntax für diese Situation. 2)f(x)
ist völlig legal C89. Ich habe den Standard nicht angegeben. 3) Hier geht es um die Codegröße, nicht um die Effizienz. Und 4) Wenn Sie bevormunden, verwenden Sie mindestens einen echten Compiler und / oder überprüfen Sie Ihre Fakten.Java 7, 75 Bytes
Obwohl es nach den Regeln gültig
long
ist, 64-Bit ist, schlägt es für die Exponentiationstestfälle von19^19
und darüber fehl . Um das zu beheben, können wir einenBigDecimal
Ansatz verwenden:148146 BytesErklärung (des BigDecimal-Ansatzes):
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
x86-Assembler, Intel-Syntax, 192 Byte
Beispiel gibt vor, die schnellste Arbeitsgeschwindigkeit zu haben. Is ist ein Programm oder Programmteil, das die Fastcall-Konvention verwendet. Es nimmt die Eingangsvariable
x
in registereax
an und gibt das Ergebnis auch in zurückeax
. Die Grundidee ist, keine bedingten Sprünge zu verwenden, wie in einigen Beispielen hier. Es ist auch nicht alles auszuwerten (wie in C-Beispiel mit Arrays), sondern ein Array von Zeigern zu Funktionen zu verwenden und schnellere bedingungslose Sprünge (jmp / call) als optimiertes "C language switch () - case .." - Analog. Diese Technik kann auch in Finita-Automaten wie Prozessoremulatoren, Executoren usw. nützlich sein.Upd: Verwenden Sie für x64 "r" in Registernamen anstelle von "e" (z. B.
rax
anstelle voneax
,rcx
anstelle vonecx
). Die Größe wird nicht geändert und es werden 64-Bit-Wörter ohne Vorzeichen verwendet.quelle
C #, 39 Bytes
Erläuterung
Beachten Sie, dass:
(xx, x + x, x * x, x ^ x) == (0, 2, x, x ^ (x-1)) * x
Die Lösung erstellt ein Array, indiziert es und multipliziert das Ergebnis mit
x
:Alternative Versionen:
(39B, alle im Array durchgeführten Multiplikationen
x%4
ersetzenx&3
)(39B, wie bei @ MetaColon, jedoch
x%2*2*x
ersetztx*x%4<1?0:2
)quelle
Eigentlich 12 Bytes
Probieren Sie es online!
Erläuterung:
quelle
05AB1E , 10 Bytes
Verwendet die 05AB1E- Codierung. Probieren Sie es online!
quelle
J , 14 Bytes
Probieren Sie es online!
quelle
(4&|{-,+,*,^)~
funktioniert auch, aber es ist die gleiche Anzahl von Bytes aufgrund von Parens, obwohl es etwas offensichtlicher ist, was es tut.Oase , 25 Bytes
Probieren Sie es online!
Wie es funktioniert
Beachten Sie, dass
x&3
entsprichtx%4
, wo%
Modulo ist.Oasis ist eine stapelbasierte Sprache, in der jedes Zeichen ein Befehl ist.
quelle
Cubix , 29 Bytes
Probieren Sie es online!
Erklärung wird in Kürze hinzugefügt ...
quelle
C #, 42 Bytes
Eigentlich ist es normales C #, aber da Sie es nicht als ganzes Programm ausführen können und es in das interaktive Programm eingeben müssen, können Sie es auch als interaktives C # bezeichnen .
Erklärung :
Ich kann nicht sagen, ob es sich um die kürzeste Variante handelt. Vorschläge sind willkommen.
quelle
x
nicht definiert ist. Das macht dies zu einem Ausschnitt, nicht zu einem vollständigen Programm.x
Mittel“ , dass Sie werden gegebenx
durch einen Standard - Eingabeverfahren ( das heißt, die Funktion oder das Programm).PHP, 36 Bytes
quelle
dc, 27
Ich hatte noch nie die Gelegenheit, Arrays in dc zu verwenden:
Probieren Sie es online aus .
quelle
Groovy, 26 Bytes
Probieren Sie es online!
quelle
C 115 Bytes
Beispiel ist eine Funktion
int f(int x)
Es gibt vor, die schnellste Arbeitsgeschwindigkeit zu haben, da es die CPU davon abhält, bedingte Sprünge auszuführen. Und das ist nur der richtige Weg zur Geschwindigkeitsoptimierung für diese Aufgabe. Es wird auch versucht, nicht alles auszuwerten, wie im Beispiel von Array C,
return(int[]){0,x+x,x*x,pow(x,x)}[x%4];
sondern Array von Zeigern zu Funktonen sinnvoll zu verwenden, um mit viel schnellerer Adressarithmetik bedingungslose Sprünge (jmp / call) durchzuführen, als eine optimierte Version von " Schaltergehäuse..". Diese Technik kann auch in verschiedenen Arten von Finita-Automaten nützlich sein, z. B. in Prozessoremulatoren, Executoren, Befehlsstrom-Parsern usw., bei denen Geschwindigkeit und Codeswitch(x%4) case(0):... case(1):...
ungeeignet sind, da sie mehrere cmp / jnz-Anweisungen erzeugen. und dies sind kostspielige Operationen für die CPUDas einfachste und kürzeste Testprogramm (unter Standardbedingungen) für diesen Fall lautet wie folgt:
Es werden nur 12 Bytes Nutzlast hinzugefügt, und unsere Gesamtgröße beträgt 127 Bytes.
Sie sollten den Linker jedoch anweisen, die
f
Funktion statt als Einstiegspunkt zu verwendenmain
. Das ist die Art und Weise, wenn wir versuchen, aus dem kürzesten Code die schnellstmögliche Binärfunktion für diese Aufgabe zu erhalten ;-) Dies geschieht, weil die C-Bibliothek vor dem Aufrufen Ihrer main () -Funktion zusätzlichen Init / Shutdown-Code hinzufügt.Code wird auf MSVS Community 2015 ohne Tricks und Probleme kompiliert und liefert korrekte Ergebnisse. Ich habe es nicht mit gcc getestet, aber ich bin sicher, es wird auch gut funktionieren.
quelle
R,
4742 BytesWendet die Funktion
-
,+
,*
, oder^
auf der Basis des E - Modulx
aufx
undx
.-
ist die einzige (etwas) kluge Sache, dax-x
immer 0 ist.R, 33 Bytes
Gleiche Methode wie andere Leute. Obwohl es kürzer ist, mag ich es bei weitem nicht so sehr.
quelle
Pyth , 12 Bytes
Probieren Sie es online!
Wie es funktioniert
Beachten Sie zunächst, dass
x&3
entsprichtx%4
, wo%
Modulo ist. Da Pyth dann modular indexing (a[n] == a[n+len(a)]
) verwendet, müssen wir uns damit nicht einmal befassen.Dann:
x%4==0
, returnx-x
(aus Konsistenzgründen);x%4==1
, kehre zurückx+x
;x%4==2
, kehre zurückx*x
;x%4==3
, kehre zurückx^x
.Weitere Informationen zur polnischen Notation: Wikipedia (schade, wenn Sie in der Türkei sind).
quelle
Japt , 13 Bytes
Probieren Sie es online!
Dies verwendet die gleiche Methode wie die anderen Auswertungsantworten, außer dass das Programm
-U
nur negiertU
, sodass wir^
stattdessen (bitweises XOR) verwenden.quelle
Vim, 50 Bytes
Hier
^V
repräsentiert aCtrl+V
,^R
repräsentiertCtrl-R
und^[
repräsentiert dasesc
SchlüsselArbeiten, indem Sie zuerst den Ausdruck aufbauen und dann lassen
bc
ihn auswerten. Erwartet die Eingabe in der ersten Zeile in einem ansonsten leeren Puffer.Erläuterung:
quelle
^V
, wird einfach eingefügt, was ich in meiner Zwischenablage habe, anstatt der Nummer ...D
anstelle vond$
Pyth, 9 Bytes
Testsuite
Hier ist nichts Besonderes los, berechnen Sie einfach die vier Werte und wählen Sie einen mit modularer Indizierung aus.
quelle
Batch, 135 Bytes
Ich hatte gehofft, die Potenzierung durch Aufbauen und Auswerten eines Strings der Form in
[0+...+0, 2+...+2, x+...+x, x*...*x]
Abhängigkeit von den letzten beiden Bits zux
erzeugen, aber leider dauerte es zu lange, den Code zum Auswählen der Operation auszudrücken, da ich ihn nicht*
alsfor
Parameter verwenden konnte, was ich aber tat Zumindest in der Lage, einige Fall-obwohl-Tricks zu verwenden, um einige Bytes wegzuspielen.quelle
Retina , 87 Bytes
Probieren Sie es online! (Link enthält Testsuite.)
Erläuterung: Die ersten beiden Zeilen konvertieren die Eingabe in eine unäre und duplizieren sie (so haben wir es jetzt
x;x
). Die nächsten beiden Zeilen suchen nach einemx&3
von entweder0
oder1
und ändern sichx;x
inx;0
oderx;2
entsprechend. Die nächsten beiden Zeilen suchenx&3==3
und ändern sichx;x
inx;x;x;...;x;1;x
(x
x
s). Dies bedeutet , dass wir entwederx;0
,x;2
,x;x
, oder ,x;...;x
und es bleibt zu multiplizieren alles zusammen und konvertieren zurück in Dezimalzahlen. (Der Multiplikationscode basiert auf dem im Retina-Wiki, wurde jedoch geändert, um die Multiplikation mit Null zu behandeln.)quelle