Hasilkan Probabilitas di sekitar Numpad

12

Terinspirasi oleh pertanyaan ini sebelumnya hari ini , saya ingin melihat cara menarik berbagai bahasa pemrograman yang dapat mengubah numpad menjadi probabilitas. Umumnya, game berbasis ubin akan memungkinkan Anda menggunakan numpad untuk bergerak ke arah mana pun berdasarkan di mana karakter Anda saat ini. Ketika membuat AI untuk game-game ini, Math.random() * 8tidak cukup, jadi saya harus sedikit kreatif untuk membuat gerakan terlihat dan terasa agak alami.

Numpad didefinisikan sebagai berikut:

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

Harap dicatat, 5 adalah nomor yang tidak valid, karena Anda tidak dapat pindah ke diri Anda sendiri.

Semua contoh akan menggunakan probabilitas ini: [50, 40, 30, 20, 10]

Jika saya ingin membuat probabilitas di sekitarnya 8, akan terlihat seperti ini:

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

Hasilnya akan [20, 10, 20, 30, 30, 40, 50, 40](dengan 5 dihilangkan) atau [20, 10, 20, 30, null, 30, 40, 50, 40](dengan 5 hadir)

Jika saya ingin membuatnya sekitar 1, akan terlihat seperti ini:

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

Hasilnya akan [50, 40, 30, 40, 20, 30, 20, 10](dengan 5 dihilangkan) atau [50, 40, 30, 40, null, 20, 30, 20, 10](dengan 5 hadir)

Anda dapat menulis program lengkap yang mengambil input dengan cara biasa (baris perintah, stdin) dan mencetak output, atau Anda dapat menulis fungsi dengan argumen angka, yang mencetak atau mengembalikan output. Program atau fungsi Anda harus menerima satu nomor - posisi untuk menghasilkan sekitar. Anda harus menggunakan probabilitas ini: [50, 40, 30, 20, 10](mereka tidak harus di-hardcode).

Kode terpendek dalam byte menang. Celah standar tidak diijinkan. Jawaban yang diposting di utas tertaut tidak diizinkan. Ruang tertinggal atau terdepan diizinkan. Anda dapat memperlakukan posisi 4sebagai tidak ada atau kosong, tergantung pada preferensi Anda. Saya tidak terlalu pilih-pilih format output - cetak sebagai string yang dipisahkan koma atau sebagai array.

(Ini pertanyaan pertamaku, santai saja!)

Seiyria
sumber

Jawaban:

5

CJam, 27 byte

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

Cobalah online di penerjemah CJam .

Ide

Jika kita melewati angka sekitar 5 dengan cara berlawanan arah jarum jam, kita mendapatkan string 12369874atau rotasinya (tergantung pada titik awal).

Setelah memutar string ini sehingga digit input n berada di posisi paling kiri, digit dalam string yang diputar memiliki probabilitas berikut:

50 40 30 20 10 20 30 40

Jika kita perhatikan indeks dari angka-angka ini, yaitu

 0  1  2  3  4  5  6  7

kurangi 4 dari masing-masing untuk menghasilkan

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

dan ambil nilai absolut untuk mendapatkannya

 4  3  2  1  0  1  2  3

kita hanya perlu menambahkan 1 dan menambahkan 0 untuk mendapatkan probabilitas yang diinginkan.

Kode

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

Ini menggunakan fakta bahwa hasil untuk 9 adalah kebalikan dari hasil untuk 1, sama untuk 2 dan 8, 3 dan 7 dan 4 dan 6. Ada pola yang dapat dikenali untuk beralih dari hasil 1 ke hasil 2,3 dan 4 tapi saya cukup yakin itu akan lebih lama untuk kode ini daripada hardcoding urutan untuk 1 hingga 4, itulah yang saya lakukan.

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

Fatalisasi
sumber
Strategi yang valid, meskipun saya berharap beberapa bahasa membuatnya lebih mudah untuk dilakukan secara algoritmik daripada hardcode-nya. Saya kira kita akan melihat.
Seiyria
@ Seiyria Saya berasumsi bahasa berorientasi array akan melakukan hal itu. Sayangnya, Anda biasanya tidak dapat mengubah elemen daftar dalam jumlah pendek dalam Prolog.
Fatalkan tanggal
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]

aadalah array dengan nilai-nilai dalam urutan sekitar numpad (berlawanan arah jarum jam dari 1), dan bmemetakan angka pada numpad ke posisi di sekitarnya. Berdasarkan jumlah spasi di sekitar numpad untuk nomor input (ditentukan menggunakan b), ia membuat array dengan banyak elemen yang dipindahkan dari depan ahingga akhir, kemudian menggunakan blagi untuk mengatur ulang elemen agar sesuai dengan angka numpad.

faubi
sumber
Anda dapat menyimpan banyak dengan membuat /10dan kemudian meletakkannya *10di loop Anda.
Maltysen
Bukankah (a[c:]+a[:c])[e]itu sama a[(c+e)%8]atau a[c+e-8]? Dan kemudian menghubungkannya dengan cmenyederhanakan ekspresi.
xnor
0

Pyth - 38 byte

Menggunakan teknik yang agak sama dengan jawaban Python kecuali dengan kompresi dasar untuk dua array.

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

Coba di sini online .

Maltysen
sumber
Apa yang ê dan à lakukan?
fase
@phase kompresi basis yang disebutkan di atas: codegolf.stackexchange.com/questions/40039/…
Maltysen
Jawaban singkat ini tidak akan pernah berhenti membuat saya takjub.
Seiyria
@Seiyria Saya benar-benar dapat menyarankan untuk belajar Pyth - program-program ini terlihat jauh lebih rumit daripada :)
orlp
0

Jawa, 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 memegang probabilitas (dibagi 10) dalam urutan berlawanan dengan input = 1 sebagai default 50.

int[]imenerjemahkan input menjadi indeks menjadi v. Misalnya, v.charAt(i[1])adalah 5. Input 0 dan 5 tidak valid sehingga i [0] dan i [5] memiliki nilai placeholder 8 yang merupakan indeks untuk '\ 0' di akhir v.

Saya memutar angka dalam v ke kanan dengan nilai i [n], dan kemudian mencetak probabilitas sebagai string yang dipisahkan koma.

Jack Ammo
sumber