Genera probabilità attorno a un tastierino numerico


12

Ispirato a questa domanda prima di oggi , mi piacerebbe vedere modi interessanti in cui vari linguaggi di programmazione possono trasformare un tastierino numerico in probabilità. Comunemente, i giochi basati su tessere ti permetteranno di usare un tastierino numerico per muoverti in qualsiasi direzione in base alla posizione attuale del tuo personaggio. Quando realizzo un'intelligenza artificiale per questi giochi, Math.random() * 8non è sufficiente, quindi ho dovuto diventare un po 'creativo per rendere il movimento più naturale.

Un tastierino numerico è definito come tale:

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

Si noti che 5 è un numero non valido, poiché non è possibile spostarsi su se stessi.

Tutti gli esempi useranno queste probabilità: [50, 40, 30, 20, 10]

Se volessi generare probabilità in giro 8, sarebbe simile a questo:

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

L'output sarebbe [20, 10, 20, 30, 30, 40, 50, 40](con 5 omesso) o [20, 10, 20, 30, null, 30, 40, 50, 40](con 5 presenti)

Se volessi generarli in giro 1, sarebbe simile a questo:

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

L'output sarebbe [50, 40, 30, 40, 20, 30, 20, 10](con 5 omesso) o [50, 40, 30, 40, null, 20, 30, 20, 10](con 5 presenti)

È possibile scrivere un programma completo che accetta l'input in qualsiasi modo normale (riga di comando, stdin) e stampa l'output, oppure è possibile scrivere una funzione con un argomento numerico, che stampa o restituisce l'output. Il tuo programma o funzione dovrebbe accettare un numero: la posizione da generare intorno. Dovresti usare queste probabilità: [50, 40, 30, 20, 10](non devono essere codificate).

Vince il codice più breve in byte. Le scappatoie standard non sono ammesse. Le risposte pubblicate nel thread collegato non sono consentite. Sono ammessi spazi finali o iniziali. Puoi considerare la posizione 4come assente o vuota, a seconda delle tue preferenze. Non sono troppo esigente sul formato di output: stampalo come stringhe separate da virgola o come matrice.

(Questa è la mia prima domanda, andate piano con me!)

Risposte:


5

CJam, 27 byte

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

Provalo online nell'interprete CJam .

Idea

Se attraversiamo le cifre intorno a 5 in modo antiorario, otteniamo la stringa 12369874o una qualsiasi delle sue rotazioni (a seconda del punto iniziale).

Dopo aver ruotato questa stringa in modo che la cifra di input n sia nella posizione più a sinistra, le cifre nella stringa ruotata hanno le seguenti probabilità:

50 40 30 20 10 20 30 40

Se consideriamo gli indici di queste cifre, che sono

 0  1  2  3  4  5  6  7

sottrarre 4 da ciascuno per cedere

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

e prendere valori assoluti per ottenere

 4  3  2  1  0  1  2  3

dobbiamo solo aggiungere 1 e aggiungere uno 0 per ottenere le probabilità desiderate.

Codice

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.

2

Prolog, 166 byte

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

Questo utilizza il fatto che il risultato per 9 è il contrario del risultato per 1, lo stesso per 2 e 8, 3 e 7 e 4 e 6. Vi sono schemi riconoscibili per passare dal risultato di 1 ai risultati di 2,3 e 4, ma sono abbastanza sicuro che sarebbe più lungo codificarlo rispetto all'hardcoding delle sequenze da 1 a 4, che è quello che ho fatto.

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


Una strategia valida, anche se spero che alcune lingue rendano più semplice l'esecuzione algoritmica di quanto non lo sarebbe hardcode. Suppongo che vedremo.
Seiyria,

@Seiyria Presumo che i linguaggi orientati all'array faranno proprio questo. Sfortunatamente di solito non puoi permutare elementi di liste in una piccola quantità di byte in Prolog.
Fatalizza il

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]

aè un array con i valori in ordine attorno al tastierino numerico (in senso antiorario da 1) e bmappa i numeri sul tastierino numerico alle posizioni attorno ad esso. In base al numero di spazi attorno al tastierino numerico per il numero di input (determinato usando b), crea un array con molti elementi spostati dalla parte anteriore aalla fine, quindi li utilizza bnuovamente per riorganizzare gli elementi in modo che corrispondano ai numeri del tastierino numerico.


Puoi risparmiare molto facendo un /10e poi inserendo un *10ciclo.
Maltysen,

Non è lo (a[c:]+a[:c])[e]stesso è a[(c+e)%8]o a[c+e-8]? E poi collegare csemplifica l'espressione.
xnor

0

Pyth - 38 byte

Usa la stessa tecnica della risposta Python tranne che con la compressione di base per i due array.

J_jC"3ê"T*RTm@.<jC"<àR"T-8@JtQd.DJ4

Provalo qui online .


Cosa stanno facendo ê e à?
fase

@phase la suddetta compressione di base: codegolf.stackexchange.com/questions/40039/…
Maltysen,

Queste brevi risposte non cesseranno mai di stupirmi.
Seiyria,

@Seiyria Posso davvero suggerire di imparare Pyth - questi programmi sembrano molto più complicati di quanto non siano :)
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 contiene le probabilità (divise per 10) in ordine antiorario con input = 1 come valore predefinito 50.

int[]itraduce l'input in un indice in v. Ad esempio, v.charAt(i[1])è 5. Gli input 0 e 5 non sono validi, quindi sia i [0] che i [5] hanno un valore di segnaposto 8 che è l'indice per '\ 0' alla fine di v.

Ruoto i numeri in v a destra del valore i [n], quindi stampo le probabilità come stringhe separate da virgola.

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.