2010-05-03 14 views
9

dando una X, qué matemática es necesaria para encontrar su Y, usando esta tabla?¿Qué matemáticas necesito para convertir este número

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

lenguaje agnóstico problema

y no, yo no/no puede simplemente almacenar la matriz, y hacer la búsqueda.

sí, la entrada siempre será el conjunto finito de 0 a 6. no se escalará más tarde.

+1

pertenece a http://mathoverflow.com ya que la pregunta es puramente matemática. –

+1

Puedes construir fácilmente una ecuación algebraica a partir de esto. – ChaosPandion

+2

¿Es esta tarea, y una declaración de interruptor cuenta como "solo almacenar la matriz"? –

Respuesta

36

Este:

y = (8 - x) % 7 

Así es como llegué a que:

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

En cuanto a por qué son equivalentes: en el módulo 7, '6 == -1' y' 8 == 1' , entonces '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

que parece:

y = (x * 6 + 1) % 7

1

tarea?

¿Qué tal:

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

y no, yo no/no puede simplemente almacenar el array, y hacer la búsqueda.

¿Por qué no?

sí, la entrada siempre será el conjunto finito de 0 a 6. no se escalará más tarde.

Simplemente use un manojo de condicionales.

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

O encontrar una fórmula si es fácil de ver uno, y es aquí:

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

He aquí una manera de evitar tanto el módulo y condicionales, al pasar de esto:

y = (8 - x) % 7

Sabemos que x % y = x - floor(x/y)*y

So podemos utilizar y = 8 - x - floor((8 - x)/7) * 7

+0

@ | V | lad: ¿cuál es el punto que elimina el módulo si usa un div? – kriss

+0

@kriss: es principalmente un logro teórico, pero en casos excepcionales es posible que ni siquiera tenga una función de módulo o podría ser más lenta que la división. – IVlad

+0

@ | V | lad: Solo quería señalar que mod y div son generalmente la misma operación de bajo nivel 'modiv' a nivel de procesador, por lo tanto, su sugerencia no es muy interesante ya que hay otras formas de evitar tanto% como/. Pero, de hecho, sé de idiomas (mal diseñados) donde solo tienes + - */(nunca vi mod más lento que div). – kriss

4

Combinando las ideas de Dave y de Pablo respuesta da la más elegante:

y = (8 - x) % 7` 

(aunque veo fui golpeado por la mano con esto)

23

0.048611x^6 - 0.9625x^5 + 7.340278x^4 - 26.6875x^3 + (45 + 1/9) x^2 - 25.85x + 1

Algunas veces las formas simples son las mejores.;)

+11

+1 por absurdo –

+0

@Matthew: ¿Te atrevo a preguntar cómo obtuviste este resultado? –

+1

hh regresión polinómica :-)? – Kugel

6

Aunque parece que ya han aparecido un montón de respuestas correctas, pensé en publicar esto solo para mostrar otra forma de resolverlo (básicamente todas son variaciones sobre lo mismo):

Bueno, el patrón subyacente es bastante simple:

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

y = 6 - x 

Sus datos sólo pasa a tener los valores de y desplazado "hacia abajo" por dos índices (o tener los valores de x desplazan "hacia arriba").

Así que necesita una función para cambiar el valor x. Esto debe hacerlo:

x = (x + 5) % 7; 

resultante ecuación:

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

que no me gusta mucho el operador% como lo hace la división de modo:

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

Pero entonces dicho algo acerca no está usando tablas de búsqueda así que quizás esto no funcione para usted :-)

Actualización: Puesto que usted quiere utilizar realmente esto en código de números reales y crípticos no son agradables, que puede ofrecer esta variante más fácil de mantener:

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

+1 ¿Cómo lo conseguiste? – Kugel

+1

@Kugel: sugerencia convertir número mágico a binario y puede ver la luz) – kriss

+0

Todos los valores del 0 al 6 pueden caber en diferentes posiciones en solo nueve bits, como: 000101100. Si pudiéramos encontrar la manera de traducir x en el índice correcto, podríamos obtener una fórmula como '44 >> (x??) & 7' ... – Guffa

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

wtf? por favor explique. – Kugel

+1

@Kugel: es una tabla de búsqueda simple con un poco de ofuscación en C. x ["I @ Velcro"] significa lo mismo que "I @ Velcro" [x] (ambos significa * (x + "I @ Velcro")). Eso es "obtener el personaje una posición x". Cada personaje tiene un código ascii y con & 7 solo conservas los 3 dígitos inferiores ... y funciona. Un poco de diversión. – kriss

+1

La parte divertida fue usar grep para tratar de encontrar palabras que pudiera pegar en la cuerda con los tres bits más bajos correctos. – sigfpe

1

¿Qué hay de cierto pedacito-fu?

Puede obtener el resultado utilizando solo minus, operadores lógicos y turnos.

b = (x >> 2) | ((x >> 1) & 1) 
y = ((b << 3)|(b^1)) - x 
Cuestiones relacionadas