2010-05-03 13 views
9

data una X, che matematica è necessaria per trovare la sua Y, usando questa tabella?di quale matematica ho bisogno per convertire questo numero

x->y 
0->1 
1->0 
2->6 
3->5 
4->4 
5->3 
6->2 

lingua problema agnostico

e non, io non/non posso solo memorizzare l'array, e fare la ricerca.

sì, l'input sarà sempre l'insieme finito da 0 a 6. non verrà ridimensionato in seguito.

+1

appartiene a http://mathoverflow.com poiché la domanda è puramente matematica. –

+1

Si può facilmente costruire un'equazione algebrica da questo. – ChaosPandion

+2

È questo compito a casa, e un'istruzione di commutazione conta come "semplicemente memorizzando l'array"? –

risposta

36

questo:

y = (8 - x) % 7 

Ecco come sono arrivato a questa:

x 8-x (8-x)%7 
---------------- 
0 8  1 
1 7  0 
2 6  6 
3 5  5 
4 4  4 
5 3  3 
6 2  2 
+5

Per quanto riguarda il perché sono equivalenti: nel modulo 7, '6 == -1' e' 8 == 1' , quindi 'x * 6 + 1 == (-1) x + 1 == (-1) x + 8' –

2
unsigned short convertNumber(unsigned short input) { 
    if (input <= 1) { return !input; } //convert 0 => 1, 1 => 0 
    return (8-input); //convert 2 => 6 ... 6 => 2 
} 
16

Assomiglia:

y = (x * 6 + 1) % 7

1

compiti?

ne dite:

y = (x <= 1 ? 1 : 8) - x 
1

e non, io non/non posso semplicemente memorizzare il array, e fare la ricerca.

Perché no?

sì, l'input sarà sempre l'insieme finito da 0 a 6. non verrà ridimensionato in seguito.

Basta usare un po 'di condizionali quindi.

if (input == 0) return 1; 
else if (input == 1) return 0; 
else if (input == 2) return 6; 
... 

O trovare una formula se è facile vedere uno, ed è qui:

if (input == 0) return 1; 
else if (input == 1) return 0; 
else return 8 - input; 

Ecco un modo per evitare sia modulo e condizionali, che va da questo:

y = (8 - x) % 7

Sappiamo che x % y = x - floor(x/y)*y

Quindi possiamo usare y = 8 - x - floor((8 - x)/7) * 7

+0

@ | V | lad: qual è il punto di rimozione del modulo se usi un div? – kriss

+0

@kriss: è principalmente un risultato teorico, ma in rari casi potresti non avere nemmeno una funzione modulo o potrebbe essere più lento della divisione. – IVlad

+0

@ | V | lad: Volevo solo far notare che mod e div sono di solito la stessa modivazione di funzionamento a basso livello a livello di processore, quindi il tuo suggerimento non è molto interessante in quanto vi sono altri modi per evitare sia% che/. Ma in realtà conosco le lingue (mal progettate) in cui hai appena + - */(mai visto mod più lento di div). – kriss

4

Combinando le idee in risposta Dave e Paolo dà la piuttosto elegante:

y = (8 - x) % 7` 

(anche se vedo sono stato battuto al punzone con questo)

23

0.048611x^6 - 0,9625x^5 + 7,340278x^4 - 26,6875x^3 + (45 + 1/9) x^2 - 25,85x + 1

A volte i modi semplici sono i migliori.;)

+11

+1 per assurdità –

+0

@Matthew: mi chiedo persino come hai ottenuto questo risultato? –

+1

hh regressione polinomiale :-)? – Kugel

6

anche se sembra un po 'di risposte corrette sono già apparsi, ho pensato che avrei posto questo solo per mostrare un altro modo di aver lavorato fuori (sono tutti fondamentalmente variazioni sulla stessa cosa):

Ebbene, il modello di base è piuttosto semplice:

x y 
0 6 
1 5 
2 4 
3 3 
4 2 
5 1 
6 0 

y = 6 - x 

Suoi dati avviene solo per avere i valori y spostata "verso il basso" di due indici (o di avere i valori x spostati "up").

Quindi è necessaria una funzione per spostare il valore x. Questo dovrebbe farlo: equazione

x = (x + 5) % 7; 

risultante:

y = 6 - ((x + 5) % 7); 
13

non mi piace molto l'operatore% dal momento che la divisione così:

 
y = (641921 >> (x*3)) & 7; 

Ma poi hai detto qualcosa a proposito non utilizzare le tabelle di ricerca, quindi forse questo non funziona per voi :-)

Aggiornamento: Dal momento che si desidera utilizzare effettivamente questo nel codice reale e numeri criptici non sono bello, posso offrire questa variante più gestibile:

 
y = (0x2345601 >> (x*4)) & 15; 
+1

+1 Come hai ottenuto questo? – Kugel

+1

@Kugel: suggerimento convertire il numero magico in binario e si può vedere la luce) – kriss

+0

Tutti i valori da 0 a 6 possono essere adattati in posizioni diverse in soli nove bit, ad esempio: 000101100. Se potessimo trovare il modo di tradurre x nell'indice giusto, potremmo ottenere una formula come '44 >> (x??) & 7' ... – Guffa

26
int f(int x) 
{ 
    return x["[email protected]"] & 7; 
} 
+0

wtf? Spiega per favore. – Kugel

+1

@Kugel: questa è una semplice tabella di ricerca con un po 'di confusione in C. x ["I @ Velcro"] significa la stessa cosa di "I @ Velcro" [x] (entrambi i mezzi * (x + "I @ Velcro")). Questo è "ottenere il carattere una posizione x". Ogni personaggio ha un codice ASCII e con & 7 mantieni solo le 3 cifre in basso ... e funziona. Un po 'di divertimento. – kriss

+1

Il bit divertente stava usando grep per cercare di trovare le parole che potevo inserire nella stringa con i tre bit più bassi corretti. – sigfpe

1

Che dire di una certa punta-fu?

È possibile ottenere il risultato utilizzando solo negativi, operatori logici e turni.

b = (x >> 2) | ((x >> 1) & 1) 
y = ((b << 3)|(b^1)) - x 
Problemi correlati