Generar probabilidades alrededor de un teclado numérico

12

Inspirado por esta pregunta el día de hoy , me gustaría ver formas interesantes en que varios lenguajes de programación pueden convertir un teclado numérico en probabilidades. Comúnmente, los juegos basados ​​en mosaicos te permitirán usar un teclado numérico para moverte en cualquier dirección según dónde se encuentre tu personaje actualmente. Al hacer una IA para estos juegos, Math.random() * 8no es suficiente, así que tuve que ser un poco creativo para que el movimiento se viera y se sintiera algo natural.

Un teclado numérico se define como tal:

7 | 8 | 9
- - - - -
4 | x | 6
- - - - -
1 | 2 | 3

Tenga en cuenta que 5 es un número no válido, ya que no puede pasar a usted mismo.

Todos los ejemplos usarán estas probabilidades: [50, 40, 30, 20, 10]

Si quisiera generar probabilidades 8, sería así:

40 | 50 | 40 
-- | -- | --
30 | xx | 30
-- | -- | --
20 | 10 | 20

La salida sería [20, 10, 20, 30, 30, 40, 50, 40](con 5 omitidos) o [20, 10, 20, 30, null, 30, 40, 50, 40](con 5 presentes)

Si quisiera generarlos 1, se vería así:

30 | 20 | 10
-- | -- | --
40 | xx | 20
-- | -- | --
50 | 40 | 30

La salida sería [50, 40, 30, 40, 20, 30, 20, 10](con 5 omitidos) o [50, 40, 30, 40, null, 20, 30, 20, 10](con 5 presentes)

Puede escribir un programa completo que tome la entrada de la manera habitual (línea de comando, stdin) e imprima la salida, o puede escribir una función con un argumento numérico que imprima o devuelva la salida. Su programa o función debe aceptar un número: la posición para generar. Debe usar estas probabilidades: [50, 40, 30, 20, 10](no tienen que estar codificadas).

El código más corto en bytes gana. Las lagunas estándar no están permitidas. Las respuestas publicadas en el hilo vinculado no están permitidas. Se permiten espacios finales o iniciales. Puede tratar la posición 4como ausente o vacía, según su preferencia. No soy demasiado exigente con el formato de salida: imprímalo como cadenas separadas por comas o como una matriz.

(Esta es mi primera pregunta, ¡sé fácil conmigo!)

Seiyria
fuente

Respuestas:

5

CJam, 27 bytes

12369874s_$\_r#m<f{#4-z)0S}

Pruébelo en línea en el intérprete de CJam .

Idea

Si pasamos por los dígitos alrededor de 5 en sentido antihorario, obtenemos la cadena 12369874o cualquiera de sus rotaciones (dependiendo del punto de partida).

Después de rotar esta cadena para que el dígito de entrada n esté en la posición más a la izquierda, los dígitos en la cadena girada tienen las siguientes probabilidades:

50 40 30 20 10 20 30 40

Si consideramos los índices de estos dígitos, que son

 0  1  2  3  4  5  6  7

restar 4 de cada uno para obtener

-4 -3 -2 -1  0  1  2  3

y tomar valores absolutos para obtener

 4  3  2  1  0  1  2  3

solo tenemos que agregar 1 y agregar un 0 para obtener las probabilidades deseadas.

Código

12369874s                   e# Push "12369874".
         _$                 e# Push a sorted copy, i.e., "12346789".
           \                e# Swap it with the unsorted original.
            _r#             e# Find the index of the input in an unsorted copy.
               m<           e# Rotate the unsorted original that many units left.
                 f{       } e# For each character C in "12346789":
                            e#   Push the rotated string.
                   #        e#   Find the index of C.
                    4-      e#   Subtract 4.
                      z     e#   Compute the absolute value.
                       )    e#   Add 1.
                        0S  e#   Push a 0 and a space.
Dennis
fuente
2

Prólogo, 166 bytes

a(A,R):-I:J:K:L:M=50:40:30:20:10,B is abs(5-A),member(B:S,[4:[I,J,K,J,L,K,L,M],3:[J,I,J,K,K,L,M,L],2:[K,J,I,L,J,M,L,K],1:[J,K,L,I,M,J,K,L]]),(A/5>1,reverse(S,R);S=R).

Esto utiliza el hecho de que el resultado para 9 es el reverso del resultado para 1, lo mismo para 2 y 8, 3 y 7 y 4 y 6. Hay patrones reconocibles para pasar del resultado de 1 al resultado de 2,3 y 4, pero estoy bastante seguro de que sería más largo codificar esto que codificar las secuencias del 1 al 4, que es lo que hice.

Ejemplo: a(7,R).salidas R = [30, 20, 10, 40, 20, 50, 40, 30].

Fatalizar
fuente
Una estrategia válida, aunque espero que algunos lenguajes hagan que sea más fácil de hacer algorítmicamente de lo que sería codificarlo. Supongo que ya veremos.
Seiyria
@Seiyria Supongo que los lenguajes orientados a matrices harán exactamente eso. Desafortunadamente, generalmente no puede permutar elementos de listas en una pequeña cantidad de bytes en Prolog.
Fatalize
0

Python - 115

a=[50,40,30,20,10,20,30,40]
b=[0,1,2,7,8,3,6,5,4]
def v(n):
 c=8-b[n-1]
 return[(a[c:]+a[:c])[e]for e in b if e-8]

aes una matriz con los valores en orden alrededor del teclado numérico (en sentido antihorario desde 1), y basigna números en el teclado numérico a las posiciones a su alrededor. Basado en el número de espacios alrededor del teclado numérico para el número de entrada (determinado usando b), forma una matriz con tantos elementos movidos desde el frente ahacia el final, luego se usa bnuevamente para reorganizar los elementos para que correspondan con los números del teclado numérico.

faubi
fuente
Puede ahorrar mucho haciendo un /10y luego poniendo un *10en su bucle.
Maltysen
¿No es lo (a[c:]+a[:c])[e]mismo es a[(c+e)%8]o a[c+e-8]? Y luego enchufarlo csimplifica la expresión.
xnor
0

Pyth - 38 bytes

Utiliza la misma técnica que la respuesta de Python, excepto con la compresión base para las dos matrices.

J_jC"3ê"T*RTm@.<jC"<àR"[email protected]

Pruébalo aquí en línea .

Maltysen
fuente
¿Qué están haciendo ê y à?
fase
@phase la compresión base mencionada anteriormente: codegolf.stackexchange.com/questions/40039/…
Maltysen
Estas respuestas cortas nunca dejarán de sorprenderme.
Seiyria
@Seiyria Realmente puedo sugerirle que aprenda Pyth: estos programas se ven mucho más complicados de lo que son :)
orlp
0

Java, 190

void g(int n){int i[]={8,0,1,2,7,8,3,6,5,4};String v="54321234",s="";n=i[n];if(n>0)v=v.substring(8-n)+v.substring(0,8-n);for(n=0;n++<9;s=", ")if(n!=5)System.out.print(s+v.charAt(i[n])+"0");}

String v mantiene las probabilidades (divididas por 10) en el sentido contrario a las agujas del reloj con input = 1 como valor predeterminado 50.

int[]itraduce la entrada en un índice en v. Por ejemplo, v.charAt(i[1])es 5. Las entradas 0 y 5 no son válidas, por lo que tanto i [0] como i [5] tienen un valor de marcador de posición de 8, que es el índice de '\ 0' al final de v.

Roto los números en v hacia la derecha por el valor i [n], y luego imprimo las probabilidades como cadenas separadas por comas.

Jack munición
fuente