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.

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


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

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

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;

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);

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.


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


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)


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 )

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.