Bir Numpad çevresinde Olasılıklar Yaratın


12

Bugün bu sorudan esinlenerek , çeşitli programlama dillerinin bir numpad'i olasılıklara dönüştürebileceği ilginç yollar görmek istiyorum. Döşemeye dayalı oyunlar genellikle karakterinizin bulunduğu yere göre herhangi bir yönde hareket etmek için bir sayısal tuş takımı kullanmanıza izin verir. Bu oyunlar için bir yapay zeka yaparken Math.random() * 8yeterli değil, bu yüzden hareketin biraz doğal görünmesi ve hissetmesi için biraz yaratıcı olmalıydım.

Bir sayısal tuş takımı şu şekilde tanımlanır:

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

Kendinize taşınamayacağınız için 5'in geçersiz bir sayı olduğunu lütfen unutmayın.

Tüm örnekler şu olasılıkları kullanacaktır: [50, 40, 30, 20, 10]

Eğer etrafında olasılıklar üretmek isteseydim 8, şöyle görünecektir:

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

Çıktı [20, 10, 20, 30, 30, 40, 50, 40](5 atlanmış) veya [20, 10, 20, 30, null, 30, 40, 50, 40](5 mevcut)

Onları etrafında oluşturmak isteseydim 1, şöyle olurdu:

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

Çıktı [50, 40, 30, 40, 20, 30, 20, 10](5 atlanmış) veya [50, 40, 30, 40, null, 20, 30, 20, 10](5 mevcut)

Girişi normal şekilde alan (komut satırı, stdin) ve çıktıyı basan tam bir program yazabilir veya çıktıyı yazdıran veya döndüren bir sayı bağımsız değişkenine sahip bir işlev yazabilirsiniz. Programınız veya işleviniz bir sayı kabul etmelidir - üretilecek konum. Şu olasılıkları kullanmalısınız: [50, 40, 30, 20, 10](bunların sabit kodlanması gerekmez).

Bayt cinsinden en kısa kod kazanır. Standart boşluklara izin verilmez. Bağlantılı konuya gönderilen cevaplara izin verilmez. Sondaki veya öndeki boşluklara izin verilir. 4Tercihinize bağlı olarak konumu yok veya boş olarak değerlendirebilirsiniz. Çıktı biçiminde çok seçici değilim - virgülle ayrılmış dizeler veya bir dizi olarak yazdırın.

(Bu benim ilk sorum, beni rahat bırak!)

Yanıtlar:


5

CJam, 27 bayt

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

CJam yorumlayıcısında çevrimiçi deneyin .

Fikir

5 civarında rakamlardan saat yönünün tersine geçersek, dizeyi 12369874veya dönüşlerinden herhangi birini (başlangıç ​​noktasına bağlı olarak) elde ederiz .

Bu dize, giriş basamağı n en solda olacak şekilde döndürüldükten sonra, döndürülen dizideki rakamlar aşağıdaki olasılıklara sahiptir:

50 40 30 20 10 20 30 40

Bu basamakların dizinlerini dikkate alırsak,

 0  1  2  3  4  5  6  7

çıkarma 4 vermek üzere her birinden

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

ve elde etmek için mutlak değerler alın

 4  3  2  1  0  1  2  3

istenen olasılıkları elde etmek için sadece 1 eklememiz ve 0 eklememiz gerekir .

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.

2

Prolog, 166 bayt

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

Bu, 9 sonucunun, 1 sonucunun tersi olduğu, 2 ve 8, 3 ve 7 ve 4 ve 6 için aynı olduğu gerçeğini kullanır. 1 sonucundan 2,3 sonucuna gitmek için tanınabilir desenler vardır. ve 4 ama bunu kodlamak 1 ila 4 için dizileri kodlamak daha uzun olurdu eminim, ki ben yaptım.

Örnek: a(7,R).çıktılar R = [30, 20, 10, 40, 20, 50, 40, 30].


Geçerli bir strateji, umarım bazı diller algoritmik yapmayı zor kodlamaktan daha kolay hale getirir. Sanırım göreceğiz.
Seiyria

@Seiyria Diziye yönelik dillerin bunu yapacağını varsayıyorum. Maalesef genellikle Prolog'da kısa bir baytlık liste öğelerine izin veremezsiniz.
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]

a, sayısal tuş takımının çevresindeki sırayla (1'den saat yönünün tersine) değerleri olan bir dizidir ve sayısal tuş takımındaki bsayıları çevresindeki konumlarla eşler. Giriş numarası için sayısal tuş takımı etrafındaki boşluk sayısına bağlı olarak (kullanılarak belirlenir b), önden asonuna kadar hareket eden çok sayıda öğeye sahip bir dizi oluşturur , ardından böğeleri sayısal tuş numaralarına karşılık gelecek şekilde yeniden düzenlemek için kullanır .


Bir döngü oluşturarak /10ve sonra döngünüze bir koyarak çok *10tasarruf edebilirsiniz.
Maltysen

Değil mi (a[c:]+a[:c])[e]aynı olduğunu a[(c+e)%8]ya a[c+e-8]? Ve sonra takmak cifadeyi basitleştirir.
xnor

0

Pyth - 38 bayt

İki dizinin taban sıkıştırması haricinde Python cevabı ile aynı tekniği kullanır.

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

Burada çevrimiçi deneyin .


Ê ve à ne yapıyor?
faz

@ yukarıda belirtilen taban sıkıştırması: codegolf.stackexchange.com/questions/40039/…
Maltysen

Bu kısa cevaplar beni asla şaşırtmayacak.
Seiyria

@Seiyria Pyth öğrenmeyi gerçekten önerebilirim - bu programlar olduklarından çok daha karmaşık görünüyor :)
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 olasılıkları (10'a bölünür) saatin tersi yönde tutar; giriş = 1 varsayılan 50'dir.

int[]iv içine bir indeks şeklinde girişi anlamına gelmektedir. Örneğin, v.charAt(i[1])bir 5. 0 ve 5 girişleri geçersiz olduğundan, hem i [0] hem de i [5], v'nin sonunda '\ 0' dizini olan 8 yer tutucu değerine sahiptir.

V'deki sayıları sağa i [n] değeriyle döndürdüm ve olasılıkları virgülle ayrılmış dizeler olarak yazdırıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.