Calcola n% 12


27

Calcola il nmodulo 12per un numero intero a 32 bit senza segno.

Le regole:

  • Deve funzionare per tutti ntra 0 e 23. Altri numeri facoltativi.
  • Deve utilizzare solo uno degli operatori +-*, ~&^|o <<, >>come comunemente definito su 32 bit uints.
  • Può usare un numero arbitrario di uint costanti.
  • Non è possibile utilizzare alcuna forma di puntatore, inclusi array o ifistruzioni, inclusi elementi compilabili se istruzioni come operatori ternari o operatori "maggiori di".

Il punteggio:

  • Gli operatori + -e gli operatori bit a bit ~ & ^ | << >>(NOT, AND, XOR, OR, bit shift) danno un punteggio di 1, *danno un punteggio di 2.
  • Il punteggio totale più basso vince.

6
È possibile che si desideri definire gli operatori per utenti di lingue diverse da C / Java. Capisco +-*sono aggiungere, sottrarre, moltiplicare; ~&^|sono bit a bit NOT, AND, XOR, OR; e << >>sono bitrate.
Level River St

@steveverrill - grazie. Questa è davvero l'intenzione.
nbubis,

Posso usare for i in x:y:z, .dostuff?
Οuroso

Posso impostare una variabile uguale a un valore da usare in un'espressione?
xnor

4
la maggior parte dei compilatori ottimizzerà n % 12per una moltiplicazione e uno spostamento come nella delizia degli hacker, quindi questo è banale, basta emettere l'assemblaggio e vedere
phuclv,

Risposte:


29

4

(La lingua è irrilevante)

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

Corteggiare! Devo 4.

11-n assicurerà che tutti i bit di ordine superiore siano impostati se e solo se n> = 12.

48&(11-n) == se n> 11 quindi 48 altrimenti 0

(48&(11-n))>>2 == se n> 11 quindi 12 altro 0

n-((48&(11-n))>>2) è la risposta


1
Aww, mi hai battuto per questo approccio! Mi mancavano solo pochi istanti per la pubblicazione n - (((11 - n) & 0xC0000000) >> 28). Ben fatto, non credo che si possa fare in meno di quattro.
Runer112,

1
@ Runner112 Sì, speravo che nessuno mi avrebbe battuto mentre lo pubblicavo. Ben fatto per trovarlo da solo, però
isaacg

1
Fantastico :) 4 è davvero un risultato.
nbubis,

11

4

Una soluzione con una tabella di ricerca (cerca i ^ (i % 12)):

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

4

Ecco un'altra soluzione con 4 operazioni:

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

Presuppone che l'operando di conteggio dei bitshift sia implicitamente preso mod 32, cioè x >> -1sia lo stesso di x >> 31.

5

Un altro approccio, utilizzando una tabella di ricerca:

i - (16773120 >> i & 1) * 12

7

bash - 1

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

per esempio

$ 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
Questo non è valido perché utilizza i puntatori.
curiousdannii,

@curiousdannii A quali puntatori ti riferisci? I flussi stdine stdout? Certo, internamente, sono puntatori, ma allora potremmo anche squalificare Java perché usa la Integerclasse internamente per molte cose.
Cole Johnson,

$ () Non equivale effettivamente a un puntatore?
curiousdannii,

@curiousdannii - la documentazione di awk afferma che sono variabili integrate.

5

C, little-endian - 2

Questo probabilmente è un imbroglio, ma penso che soddisfi le regole ...

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;

Come funziona?
nbubis,

1
Sorta barare, poiché stai usando = 0 invece di & 0x0, che dovrebbe essere conteggiato come ulteriori 2 operazioni. Ma +1 per la creatività :)
nbubis,

4

PHP - punteggio 0

Mi chiedo come è possibile che nessuno sia venuto con questo prima di me !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
Bello. Penso che potrebbe esserci un problema, dal momento che gli array non sono consentiti. Davvero carino però.
AJMansfield,

@AJMansfield Si potrebbe obiettare che questo non ha array ma stringhe (sì, a stringhe di basso livello sono array di byte). :)
seequ

1
@seequ Si potrebbe anche sostenere che questo non è valido a causa del suo uso della RAM (sì, a basso livello, il ram è tecnicamente un array indicizzato) ¯_ (ツ) _ / ¯
Stan Strum,

2

C, punteggio 5

Funziona fino a 23, non garantito sopra.

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

((n+4)>>2)&4restituisce 4 per n> = 12. Aggiungilo a n e otterrai la risposta giusta nei 4 bit meno significativi, quindi tronca gli altri bit.


Molto bene!! Ora vediamo se qualcuno può arrivare a 4 ..
nbubis,

2

qualunque lingua: 5

non vincerà, ma parteciperà perché divertente e forse perché è più facile da capire quindi gli altri:

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

questo equivale a

n - (n>11)*12

questo è equivalente perché quando si aggiungono da 20 a 12, si ottiene 32, quindi il 5 ° bit diventa 1. Questo è solo quando n> 1 come 32 è il numero più piccolo in cui il 5 ° bit diventa 1.

nota inoltre che è facilmente espandibile per un intervallo più elevato, come puoi fare

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

per raggiungere un intervallo fino al 35


1

Python 2.x - 4

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

È =un operatore?

In tal caso il punteggio è 6.

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

La soluzione di BTW @steveverrill può essere utilizzata direttamente anche in Python.

Funziona per l'intervallo 0 .. 23

Cosa sta succedendo? Moltiplicare per 357913942 e dividere per 2 ^ 32 (o spostamento a destra 32)


Mi piace come hai usato una funzione per moltiplicare una sola volta. ma ho appena rinominato la moltiplicazione con la funzione m (,), che per me significa che l'hai usata due volte.
Pinna_be,

dipende da come vengono interpretate le regole, ma hai un punto valido
Willem,

1

C - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

Questo dovrebbe essere parte della domanda o solo un'altra risposta. Suggerisco quest'ultimo.
Jwosty,

@Jwosty - cambiato.
nbubis,

0

Cobra - 2 (o 3)

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

Questo potrebbe piegare un po 'le regole, ma ho chiesto e mi è stato permesso di usarlo.

Funziona anche con qualsiasi numero.


0

Kona - 5

Potrebbe non essere valido perché non sono sicuro che l'operatore del piano sia autorizzato, ma ne ho due *e uno negativo:

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

Che dovrebbe funzionare per qualsiasi numero intero.


Non sono sicuro del funzionamento del piano, ma sono sicuramente sicuro che la prima moltiplicazione stia operando su qualcosa di diverso dai numeri interi a 32 bit.
Runer112,

@ Runer112: OP dice che l' ingresso deve essere a 32 bit e gli operatori sono come definiti normalmente con uint a 32 bit; non dice nulla sui valori non interi nel codice.
Kyle Kanos,

A meno che non fraintenda qualcosa, 0,08333 * x non sembra una moltiplicazione come definito su uint a 32 bit, perché 0,08333 non è un uint a 32 bit.
Runer112,

1
"Può usare un numero arbitrario di uint costanti." - ie non può usare float arbitrari.
nbubis,

1
@nbubi: quella linea in realtà non pone restrizioni ai float.
Kyle Kanos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.