สร้างความน่าจะเป็นรอบ ๆ Numpad


12

ได้รับแรงบันดาลใจจากคำถามนี้ก่อนหน้านี้ในวันนี้ฉันอยากจะเห็นวิธีที่น่าสนใจในภาษาการเขียนโปรแกรมที่หลากหลายสามารถเปลี่ยน numpad ให้เป็นความน่าจะเป็น โดยทั่วไปแล้วเกมที่เป็นแบบไทล์จะช่วยให้คุณสามารถใช้ numpad เพื่อไปในทิศทางใดก็ได้ตามที่ตัวละครของคุณอยู่ในขณะนี้ เมื่อสร้าง AI สำหรับเกมเหล่านี้Math.random() * 8ไม่เพียงพอดังนั้นฉันจึงต้องมีความคิดสร้างสรรค์เล็กน้อยเพื่อให้การเคลื่อนไหวมีลักษณะและความรู้สึกเป็นธรรมชาติ

ตัวเลขถูกกำหนดให้เป็นเช่น:

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

โปรดทราบว่า 5 เป็นหมายเลขที่ไม่ถูกต้องเนื่องจากคุณไม่สามารถไปยังตัวคุณเองได้

ตัวอย่างทั้งหมดจะใช้ความน่าจะเป็นเหล่านี้: [50, 40, 30, 20, 10]

ถ้าฉันต้องการสร้างความน่าจะเป็นรอบ ๆ8มันจะมีลักษณะเช่นนี้:

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

ผลลัพธ์จะเป็น[20, 10, 20, 30, 30, 40, 50, 40](ด้วย 5 เว้น) หรือ[20, 10, 20, 30, null, 30, 40, 50, 40](ด้วย 5 ปัจจุบัน)

ถ้าฉันต้องการสร้างพวกเขารอบ ๆ1มันจะมีลักษณะเช่นนี้:

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

ผลลัพธ์จะเป็น[50, 40, 30, 40, 20, 30, 20, 10](ด้วย 5 เว้น) หรือ[50, 40, 30, 40, null, 20, 30, 20, 10](ด้วย 5 ปัจจุบัน)

คุณสามารถเขียนโปรแกรมเต็มรูปแบบที่รับอินพุตด้วยวิธีปกติ (บรรทัดคำสั่ง stdin) และพิมพ์ผลลัพธ์หรือคุณอาจเขียนฟังก์ชันด้วยอาร์กิวเมนต์ตัวเลขซึ่งพิมพ์หรือส่งคืนเอาต์พุต โปรแกรมหรือฟังก์ชั่นของคุณควรยอมรับหนึ่งหมายเลข - ตำแหน่งที่จะสร้าง คุณควรใช้ความน่าจะเป็นเหล่านี้: [50, 40, 30, 20, 10](ไม่ต้องฮาร์ดโค้ด)

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานไม่ได้รับอนุญาต คำตอบที่โพสต์ในเธรดที่เชื่อมโยงนั้นไม่ได้รับอนุญาต อนุญาตให้ใช้ช่องว่างต่อท้ายหรือนำหน้า คุณอาจปฏิบัติต่อตำแหน่ง4ไม่อยู่หรือว่างเปล่าขึ้นอยู่กับความชอบของคุณ ฉันไม่จู้จี้จุกจิกกับรูปแบบผลลัพธ์มากนัก - พิมพ์ออกมาเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคหรือเป็นอาร์เรย์

(นี่เป็นคำถามแรกของฉันไปได้ง่าย ๆ กับฉัน!)

คำตอบ:


5

CJam, 27 ไบต์

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

ลองใช้ออนไลน์ในล่าม CJam

ความคิด

ถ้าเราใช้ตัวเลข5หลักแบบทวนเข็มนาฬิกาเราจะได้สตริง12369874หรือการหมุนใด ๆ (ขึ้นอยู่กับจุดเริ่มต้น)

หลังจากหมุนสตริงนี้เพื่อให้อินพุตหลักnอยู่ที่ตำแหน่งซ้ายสุดตัวเลขในสตริงหมุนมีความน่าจะเป็นดังต่อไปนี้:

50 40 30 20 10 20 30 40

หากเราพิจารณาดัชนีของตัวเลขเหล่านี้ซึ่งก็คือ

 0  1  2  3  4  5  6  7

ลบ4จากแต่ละไปยังผลผลิต

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

และรับค่าสัมบูรณ์เพื่อรับ

 4  3  2  1  0  1  2  3

เราเพียงแค่ต้องเพิ่ม1และผนวก0เพื่อให้ได้ความน่าจะเป็นที่ต้องการ

รหัส

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 ไบต์

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

นี่ใช้ความจริงที่ว่าผลลัพธ์สำหรับ 9 คือการย้อนกลับของผลลัพธ์สำหรับ 1, เหมือนกันสำหรับ 2 และ 8, 3 และ 7 และ 4 และ 6 มีรูปแบบที่จดจำได้ให้ไปจากผลลัพธ์ 1 ถึงผลลัพธ์ของ 2,3 และ 4 แต่ฉันค่อนข้างแน่ใจว่าจะใช้รหัสนี้นานกว่าการเข้ารหัสลำดับสำหรับ 1 ถึง 4 ซึ่งเป็นสิ่งที่ฉันทำ

ตัวอย่าง: เอาท์พุทa(7,R).R = [30, 20, 10, 40, 20, 50, 40, 30]


กลยุทธ์ที่ถูกต้องถึงแม้ว่าฉันหวังว่าบางภาษาจะทำให้การทำอัลกอริทึมง่ายกว่าการใช้ hardcode ฉันคิดว่าเราจะเห็น
เซย์เรีย

@ Seiyria ฉันคิดว่าภาษาที่เกี่ยวกับอาร์เรย์จะทำเช่นนั้น คุณมักจะไม่สามารถเปลี่ยนแปลงองค์ประกอบของรายการในจำนวนไบต์สั้น ๆ ใน Prolog
เสียชีวิต

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คืออาร์เรย์ที่มีค่าเรียงตามรอบ numpad (ทวนเข็มนาฬิกาจาก 1) และbจับคู่ตัวเลขบน numpad ไปยังตำแหน่งที่อยู่รอบ ๆ ขึ้นอยู่กับจำนวนของช่องว่างรอบ ๆ numpad สำหรับหมายเลขอินพุต (พิจารณาโดยใช้b) ทำให้อาร์เรย์ที่องค์ประกอบจำนวนมากถูกย้ายจากด้านหน้าaไปยังจุดสิ้นสุดจากนั้นใช้bอีกครั้งเพื่อจัดเรียงองค์ประกอบใหม่เพื่อให้สอดคล้องกับหมายเลข numpad


คุณสามารถประหยัดได้มากโดยการทำ/10และจากนั้นใส่*10ในวงของคุณ
Maltysen

ไม่ได้เป็น(a[c:]+a[:c])[e]ที่เดียวกันa[(c+e)%8]หรือa[c+e-8]? แล้วเสียบเข้าcกับนิพจน์ที่ทำให้ง่ายขึ้น
xnor

0

Pyth - 38 ไบต์

ใช้เทคนิคเดียวกันกับคำตอบของ Python ยกเว้นกับการบีบอัดฐานสำหรับสองอาร์เรย์

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

ลองมันนี่เกมออนไลน์


êและàกำลังทำอะไร
ช่วง

@ เฟสการบีบอัดฐานดังกล่าวข้างต้น: codegolf.stackexchange.com/questions/40039//
Maltysen

คำตอบสั้น ๆ เหล่านี้จะไม่ทำให้ฉันประหลาดใจ
เซย์เรีย

@Seiyria ฉันสามารถแนะนำให้เรียนรู้ Pyth จริง ๆ - โปรแกรมเหล่านี้ดูซับซ้อนกว่าพวกเขามาก :)
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 เก็บความน่าจะเป็น (หารด้วย 10) ตามลำดับ countrclockwise โดยที่อินพุต = 1 เป็นค่าเริ่มต้น 50

int[]iแปลเข้าสู่ index เข้าไปในโวล. ยกตัวอย่างเช่นเป็นv.charAt(i[1]) 5อินพุต 0 และ 5 ไม่ถูกต้องดังนั้นทั้ง i [0] และ i [5] มีค่าตัวยึด 8 ซึ่งเป็นดัชนีสำหรับ '\ 0' ที่ส่วนท้ายของ v

ฉันหมุนตัวเลขใน v ไปทางขวาด้วยค่า i [n] จากนั้นพิมพ์ความน่าจะเป็นเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.