Berechnen Sie n% 12

27

Berechnen Sie nModulo 12für eine vorzeichenlose 32-Bit-Ganzzahl.

Die Regeln:

  • Muss für alle nzwischen 0 und 23 funktionieren . Andere Zahlen optional.
  • Muss nur eine der Operatoren verwenden +-*, ~&^|oder <<, >>wie sie üblicherweise auf 32 - Bit - uints definiert.
  • Kann eine beliebige Anzahl konstanter Einheiten verwenden.
  • Darf keine Form von Zeigern, einschließlich Arrays, oder ifAnweisungen, einschließlich Dingen, die zu if-Anweisungen wie ternären Operatoren oder Operatoren "größer als" kompiliert werden.

Die Wertung:

  • Operatoren + -und die bitweisen Operatoren ~ & ^ | << >>(NOT, AND, XOR, OR, Bitverschiebungen) ergeben eine Punktzahl von 1, *ergeben eine Punktzahl von 2.
  • Die niedrigste Gesamtpunktzahl gewinnt.
nbubis
quelle
6
Möglicherweise möchten Sie die Operatoren für Benutzer anderer Sprachen als C / Java definieren. Ich verstehe, +-*sind addieren, subtrahieren, multiplizieren; ~&^|sind bitweise NOT, AND, XOR, OR; und << >>sind Bitverschiebungen.
Level River St
@steveverrill - danke. Das ist in der Tat die Absicht.
Nbubis
Kann ich benutzen for i in x:y:z, .dostuff?
Urous
Kann ich eine Variable gleich einem Wert setzen, der in einem Ausdruck verwendet wird?
20.
4
Die meisten Compiler optimieren n % 12auf eine Multiplikation und eine Verschiebung wie bei
Hackern

Antworten:

29

4

(Sprache ist irrelevant)

n-((48&(11-n))>>2)

Woo! Ich muss 4.

11-n stellt sicher, dass alle höherwertigen Bits genau dann gesetzt werden, wenn n> = 12 ist.

48&(11-n) == wenn n> 11 dann 48 sonst 0

(48&(11-n))>>2 == wenn n> 11 dann 12 sonst 0

n-((48&(11-n))>>2) ist die Antwort

isaacg
quelle
1
Oh, du hast mich geschlagen! Ich war nur einen Moment vom Posten entfernt n - (((11 - n) & 0xC0000000) >> 28). Gut gemacht, ich glaube nicht, dass es in weniger als vier Jahren geht.
Runer112
1
@ Runner112 Ja, ich hatte gehofft, dass mich niemand schlagen würde, als ich es gepostet habe. Gut gemacht, um es selbst zu finden
isaacg
1
Genial :) 4 ist in der Tat eine Leistung.
nbubis
11

4

Eine Lösung mit einer Nachschlagetabelle (sieht nach i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

Hier ist eine andere Lösung mit 4 Operationen:

i - ((0xffff >> (i - 12)) & 12)

Es wird angenommen, dass der Zähloperand von Bitverschiebungen implizit als mod 32 genommen wird, dh x >> -1derselbe ist wie x >> 31.

5

Ein anderer Ansatz unter Verwendung einer Nachschlagetabelle:

i - (16773120 >> i & 1) * 12
Kopieren
quelle
7

Bash - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

z.B

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

quelle
1
Dies ist nicht gültig, da es Zeiger verwendet.
curiousdannii
@curiousdannii Auf welche Zeiger beziehen Sie sich? Die stdinund stdoutStröme? Sicher, intern sind sie Zeiger, aber dann können wir Java genauso gut disqualifizieren, weil es die IntegerKlasse intern für viele Dinge verwendet.
Cole Johnson
Entspricht $ () nicht effektiv einem Zeiger?
curiousdannii
@curiousdannii - awk-Dokumentation besagt, dass es sich um integrierte Variablen handelt.
5

C, Little-Endian - 2

Dies ist wahrscheinlich Betrug, aber ich denke, es genügt den Regeln ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;
R ..
quelle
Wie funktioniert es?
nbubis
1
Sortieren Sie das Betrügen, da Sie = 0 stattdessen verwenden & 0x0, was als zusätzliche 2 Operationen gelten sollte. Aber +1 für die Kreativität :)
nbubis
4

PHP - Punktzahl 0

Ich frage mich, wie es möglich ist, dass niemand vor mir hierher gekommen ist !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);
Tomas
quelle
2
Nett. Ich denke, es könnte ein Problem geben, da Arrays nicht zugelassen sind. Wirklich nett.
AJMansfield
@AJMansfield Man könnte argumentieren, dass dies keine Arrays, sondern Strings sind (ja, auf niedriger Ebene sind Strings Byte-Arrays). :)
Siehe auch
1
@seequ Man könnte auch argumentieren, dass dies ungültig ist, weil RAM verwendet wird (ja, auf niedriger Ebene ist RAM technisch ein indiziertes Array) ¯_ (ツ) _ / ¯
Stan Strum
2

C, Punktzahl 5

Funktioniert bis zu 23, darüber hinaus nicht garantiert.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4gibt 4 für n> = 12 zurück. Addiere es zu n und du erhältst die richtige Antwort in den niedrigstwertigen 4 Bits, dann schneide die anderen Bits ab.

Level River St
quelle
Gut gemacht!! Nun wollen wir mal sehen, ob jemand auf 4 ..
nbubis 20.06.14
2

Welche Sprache auch immer: 5

Ich werde nicht gewinnen, aber teilnehmen, weil es Spaß macht und vielleicht leichter zu verstehen ist als andere:

n - ((n+20)>>5)*12

das ist äquivalent zu

n - (n>11)*12

Dies ist äquivalent, denn wenn Sie 20 zu 12 addieren, erhalten Sie 32, und das 5. Bit wird zu 1. Dies ist nur dann der Fall, wenn n> 1 ist, da 32 die kleinste Zahl ist, bei der das 5. Bit zu 1 wird.

Beachten Sie auch, dass es für einen höheren Bereich leicht erweiterbar ist, wie Sie es tun können

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

eine Reichweite bis 35 erreichen

Pinna_be
quelle
1

Python 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

Ist =ein Betreiber?

In diesem Fall ist die Punktzahl 6.

j-12*(j*357913942>>32)

Die Lösung von BTW @steveverrill kann auch direkt in Python verwendet werden.

Funktioniert für den Bereich 0 .. 23

So was ist los ? Mit 357913942 multiplizieren und durch 2 ^ 32 teilen (oder Verschiebung nach rechts 32)

Willem
quelle
Mir gefällt, wie Sie eine Funktion verwendet haben, um nur einmal zu multiplizieren. aber imho hast du gerade die multiplikation in die funktion m (,) umbenannt, was für mich bedeutet, dass du sie zweimal benutzt hast.
Pinna_be
hängt davon ab, wie die Regeln interpretiert werden, aber Sie haben einen gültigen Punkt
Willem
1

C - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )
nbubis
quelle
Dies sollte entweder Teil der Frage oder nur eine andere Antwort sein. Letzteres schlage ich vor.
Jwosty
@ Jwosty - geändert.
nbubis
0

Cobra - 2 (oder 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

Dies könnte die Regeln ein wenig biegen, aber ich habe gefragt und durfte dies verwenden.

Es funktioniert auch für eine beliebige Anzahl.

Οurous
quelle
0

Kona - 5

Könnte ungültig sein, weil ich nicht sicher bin, ob der Floor Operator erlaubt ist, aber ich habe zwei *und ein Minus:

mod:{x-(_0.08333*x)*12}

Welches sollte für jede ganze Zahl funktionieren.

Kyle Kanos
quelle
Ich bin mir bei der Floor-Operation nicht sicher, aber ich bin mir definitiv sicher, dass die erste Multiplikation mit etwas anderem als 32-Bit-Ganzzahlen funktioniert.
Runer112,
@ Runer112: OP gibt an, dass die Eingabe 32-Bit sein muss und die Operatoren wie definiert sind, normalerweise mit 32-Bit-Einheiten. es sagt nichts über nicht ganzzahlige Werte im Code aus.
Kyle Kanos
Sofern ich nichts falsch verstehe, scheint 0.08333 * x keine Multiplikation im Sinne von 32-Bit-Uint zu sein, da 0.08333 keine 32-Bit-Uint ist.
Runer112,
1
Msgstr "Kann eine beliebige Anzahl konstanter Einheiten verwenden." - dh kann keine willkürlichen Schwimmer verwenden.
nbubis
1
@nbubis: Diese Zeile schränkt Floats nicht ein.
Kyle Kanos