Generuj prawdopodobieństwa wokół Numpada

12

Zainspirowany dzisiaj tym pytaniem chciałbym zobaczyć ciekawe sposoby, w jakie różne języki programowania mogą zamienić numpad w prawdopodobieństwa. Zwykle gry oparte na kafelkach pozwalają używać klawiatury numerycznej do poruszania się w dowolnym kierunku w zależności od tego, gdzie aktualnie znajduje się twoja postać. Tworzenie AI dla tych gier Math.random() * 8nie jest wystarczające, więc musiałem wykazać się kreatywnością, aby ruch wyglądał naturalnie.

Numpad jest zdefiniowany jako taki:

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

Uwaga: 5 to nieprawidłowy numer, ponieważ nie możesz przejść do siebie.

Wszystkie przykłady wykorzystają następujące prawdopodobieństwa: [50, 40, 30, 20, 10]

Gdybym chciał wygenerować prawdopodobieństwa 8, wyglądałoby to tak:

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

Wyjście byłoby [20, 10, 20, 30, 30, 40, 50, 40](z pominięciem 5) lub [20, 10, 20, 30, null, 30, 40, 50, 40](z obecnością 5)

Gdybym chciał je wygenerować 1, wyglądałoby to tak:

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

Wyjście byłoby [50, 40, 30, 40, 20, 30, 20, 10](z pominięciem 5) lub [50, 40, 30, 40, null, 20, 30, 20, 10](z obecnością 5)

Możesz napisać pełny program, który pobiera dane wejściowe w dowolny zwykły sposób (wiersz poleceń, standardowe wyjście) i wypisuje dane wyjściowe, lub możesz napisać funkcję z argumentem liczbowym, która wypisuje lub zwraca dane wyjściowe. Twój program lub funkcja powinna zaakceptować jeden numer - pozycję do wygenerowania wokół. Powinieneś użyć tych prawdopodobieństw: [50, 40, 30, 20, 10](nie muszą być zakodowane na stałe).

Najkrótszy kod w bajtach wygrywa. Standardowe luki są niedozwolone. Odpowiedzi opublikowane w połączonym wątku są niedozwolone. Dozwolone są spacje końcowe lub wiodące. Możesz traktować pozycję 4jako nieobecną lub pustą, w zależności od preferencji. Nie jestem zbyt wybredny co do formatu wyjściowego - wydrukuj go jako ciągi rozdzielone przecinkami lub jako tablicę.

(To moje pierwsze pytanie, spokojnie!)

Seiyria
źródło

Odpowiedzi:

5

CJam, 27 bajtów

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

Wypróbuj online w interpretatorze CJam .

Pomysł

Jeśli przejdziemy przez cyfry około 5 w kierunku przeciwnym do ruchu wskazówek zegara, otrzymamy łańcuch 12369874lub dowolną jego rotację (w zależności od punktu początkowego).

Po obróceniu tego łańcucha, tak aby cyfra wejściowa n znalazła się w skrajnym lewym położeniu, cyfry w obróconym łańcuchu mają następujące prawdopodobieństwa:

50 40 30 20 10 20 30 40

Jeśli weźmiemy pod uwagę indeksy tych cyfr, które są

 0  1  2  3  4  5  6  7

odejmij 4 od każdego, aby uzyskać

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

i weź wartości bezwzględne, aby je zdobyć

 4  3  2  1  0  1  2  3

musimy tylko dodać 1 i dodać 0, aby uzyskać pożądane prawdopodobieństwa.

Kod

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
źródło
2

Prolog, 166 bajtów

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

Wykorzystuje to fakt, że wynik dla 9 jest odwrotnością wyniku dla 1, taki sam dla 2 i 8, 3 i 7 oraz 4 i 6. Istnieją rozpoznawalne wzorce przejścia od wyniku 1 do wyników 2,3 i 4, ale jestem prawie pewien, że kodowanie tego byłoby dłuższe niż kodowanie sekwencji od 1 do 4, co zrobiłem.

Przykład: a(7,R).wyjścia R = [30, 20, 10, 40, 20, 50, 40, 30].

Fatalizować
źródło
Prawidłowa strategia, choć mam nadzieję, że niektóre języki ułatwią jej wykonanie algorytmiczne niż kodowanie na stałe. Chyba zobaczymy.
Seiyria
@Seiyria Zakładam, że języki zorientowane na tablice to zrobią. Niestety w Prologu zwykle nie można permutować elementów list w krótkich bajtach.
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]

ato tablica z wartościami w porządku wokół klawiatury numerycznej (przeciwnie do ruchu wskazówek zegara od 1) i bodwzorowuje liczby na klawiaturze numerycznej na pozycje wokół niej. Na podstawie liczby spacji wokół klawiatury numerycznej dla liczby wejściowej (określonej za pomocą b) tworzy tablicę z tyloma elementami przesuniętymi od przodu ado końca, a następnie używa bponownie do zmiany układu elementów zgodnie z liczbami na klawiaturze numerycznej.

faubi
źródło
Możesz dużo zaoszczędzić, robiąc a, /10a następnie wprowadzając *10pętlę.
Maltysen
Czy to nie (a[c:]+a[:c])[e]to samo, a[(c+e)%8]czy a[c+e-8]? A następnie podłączenie cupraszcza wyrażenie.
xnor
0

Pyth - 38 bajtów

Używa trochę tej samej techniki co odpowiedź Pythona, z wyjątkiem kompresji bazowej dla dwóch tablic.

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

Wypróbuj tutaj online .

Maltysen
źródło
Co robią ê i à?
faza
@faza wyżej wspomnianej kompresji bazowej: codegolf.stackexchange.com/questions/40039/…
Maltysen
Te krótkie odpowiedzi nigdy nie przestaną mnie zadziwiać.
Seiyria,
@Seiyria Naprawdę mogę zasugerować naukę Pyth - te programy wyglądają na znacznie bardziej skomplikowane niż są :)
lub
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 utrzymuje prawdopodobieństwa (podzielone przez 10) w kolejności przeciwnej do ruchu wskazówek zegara, przy czym input = 1 jest wartością domyślną 50.

int[]itłumaczy dane wejściowe na indeks na v. Na przykład v.charAt(i[1])jest 5. Wejścia 0 i 5 są niepoprawne, więc zarówno i [0], jak i i [5] mają wartość zastępczą 8, która jest indeksem „\ 0” na końcu v.

Obracam liczby w v w prawo o wartość i [n], a następnie drukuję prawdopodobieństwa jako ciągi oddzielone przecinkami.

Jack Ammo
źródło