テンキーの周りの確率を生成する


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)で取得して出力を出力する完全なプログラムを作成するか、出力を出力または返すnumber引数を指定して関数を作成することができます。プログラムまたは関数は、1つの番号、つまり生成する位置を受け入れる必要があります。次の確率を使用する必要があります[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私は、配列指向言語がまさにそれを行うと思います。残念ながら、通常、Prologでは短いバイトのリストの要素を並べ替えることはできません。
— 15

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再度使用してテンキー番号に対応するように要素を再配置します。


を作成してからループに/10入れることで、大幅に節約でき*10ます。
— マルティセン

ありません(a[c:]+a[:c])[e]同じであることa[(c+e)%8]かa[c+e-8]?そして、プラグインするcことで式が単純化されます。
— xnor

0

Pyth-38バイト

2つの配列の基本圧縮を除き、Pythonの回答と同じ手法を使用します。

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

こちらからオンラインでお試しください。


êとàは何をしていますか?
— フェーズ


これらの短い答えは私を驚かせることを決して止めません。
— セイリア

@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 input = 1がデフォルトの50である確率を(10で割った)countrclockwiseの順序で保持します

int[]i 入力をインデックスへのvに変換します。たとえば、 v.charAt(i[1])あります5。入力0と5は無効であるため、i [0]とi [5]の両方には、vの末尾の '\ 0'のインデックスである8のプレースホルダー値があります。

vの数値を値i [n]だけ右に回転し、確率をコンマ区切りの文字列として出力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.