숫자 키패드 주변의 확률 생성


12

오늘 초이 질문에서 영감을 받아 다양한 프로그래밍 언어가 숫자 키패드를 확률로 바꿀 수있는 흥미로운 방법을보고 싶습니다. 일반적으로 타일 기반 게임에서는 숫자 패드를 사용하여 현재 캐릭터의 위치에 따라 어떤 방향 으로든 이동할 수 있습니다. 이러한 게임을 위해 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

프롤로그, 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].


유효한 전략이지만, 일부 언어에서는 하드 코딩하는 것보다 알고리즘을 쉽게 수행 할 수 있기를 바랍니다. 우리가 보게 될 것 같아요.
Seiyria

@Seiyria 나는 배열 지향 언어가 그렇게 할 것이라고 가정합니다. 불행히도 일반적으로 Prolog에서 짧은 바이트 수로 목록 요소를 치환 할 수 없습니다.
Fatalize

0

파이썬-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숫자 키패드 주위의 값 (1에서 시계 반대 방향)으로 값을 가진 배열이며 숫자 키패드 b의 숫자를 그 주위의 위치에 매핑합니다. 입력 번호 (을 사용하여 결정 b)에 대한 숫자 키패드 주위의 공간 수를 기반으로, 많은 요소가있는 배열을 앞뒤로 이동시킨 a다음 b다시 사용 하여 숫자 숫자에 해당하는 요소를 다시 정렬합니다.


a를 만들고 루프에 /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

온라인으로 사용해보십시오 .


무엇을하고 있습니까?
Phase


이 짧은 대답은 결코 나를 놀라게하지 않을 것입니다.
Seiyria

@Seiyria 나는 정말로 Pyth를 배우라고 제안 할 수있다-이 프로그램들은 그들보다 훨씬 더 복잡해 보인다 :)
orlp

0

자바, 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 입력 = 1을 기본값 50으로하여 확률 (10으로 나눈)을 시계 반대 방향으로 유지합니다.

int[]i입력을 색인으로 변환하여 v로 변환합니다 (예 : v.charAt(i[1])is) 5. 입력 0과 5는 유효하지 않으므로 i [0]과 i [5] 모두 자리 표시 자 값이 8이며 v의 끝에서 '\ 0'에 대한 인덱스입니다.

v의 숫자를 오른쪽으로 i [n]만큼 회전 한 다음 확률을 쉼표로 구분 된 문자열로 인쇄합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.