ASCIIダイスを振る


16

このチャレンジでは、ランダムなサイコロのアスキーアートを出力する必要があります。

このような:

   ________
  /\       \
 /  \   6   \
{ 4  }-------}
 \  /   5   /
  \/_______/

その点に注意してください:

   ________
  /\       \
 /  \   3   \
{ 4  }-------}
 \  /   5   /
  \/_______/

無効な出力です。これは、ダイで起こりうる結果ではないためです。

6(faces that could be up)*4(faces that could be the left face after the top is determined)*1(faces that could be the right face after the other two are determined)サイコロの= 24の可能性があります。

プログラムは、これらのサイコロの1つを上記のようにアスキーアート(xyとzsを数字に置き換えた以下のモデル)の形式で出力する必要があります。各出力は発生する確率が0を超えますが、確率は均一である必要があります(実際の生活とは異なり、それらはトリックダイスであることが許可されています)。あなたのプログラムは、無効なダイスロールまたは非ダイスロールを出力できません。プログラムには、有効なロールを出力する確率が1でなければなりません

最初の画像に示されているように、ダイが必ずしも右利きのダイである必要はないことに注意してください。(右利きと左利きがダイのネットを説明します)

right-handed die
   ________
  /\       \    net
 /  \   z   \     _|4|_ _
{ x  }-------}   |6|2|1|5|
 \  /   y   /      |3|
  \/_______/


left handed die
   ________
  /\       \    net
 /  \   y   \     _|3|_ _
{ x  }-------}   |6|2|1|5|
 \  /   z   /      |4|
  \/_______/

ダイが左利きの場合、以下は有効な出力ですが、ダイが右利きの場合はそうではありません。

   ________
  /\       \
 /  \   2   \
{ 1  }-------}
 \  /   3   /
  \/_______/

左利きまたは右利きを選択できますが、ダイスは一貫している必要があります。左から右へ、またはその逆に変更することはできません。

以下は、ダイの有効な出力のリストです。XYZの位置については、上の写真を参照してください。

X-Y-Z
-----
5-4-1
1-5-4
4-1-5

5-6-4
4-5-6
6-4-5

5-3-6
6-5-3
3-6-5

5-1-3
3-5-1
1-3-5

2-6-3
3-2-6
6-3-2

2-4-6
6-2-4
4-6-2

2-1-4
4-2-1
1-4-2

2-3-1
1-2-3
3-1-2

繰り返しますが、これはなので、バイト数が少ない方が良いです


4
ソルバーは、他の2つを与えられた3番目のダイ面の公式に興味があるかもしれません。
-xnor

@xnorなど、この質問が重複しているという強い議論だと思います
デジタルトラウマ

1
この投影法で立方体を描くASCIIアートについては知りません。しかし、サイズが小さいため、Pythonのような言語でハードコーディングするよりも優れているかどうかはわかりません。
-xnor


実際、いくつかの7文字と8文字の文字列が含まれている場合でも、@ xnor。
ジョナサンアラン

回答:


8

Pythonの3、197の196 192バイト

from random import*;c=choice;r=range(1,7);u=c(r);l=c(list(set(r)-{u,u^7}));print(r'''   ________
  /\       \
 /  \%4d   \
{ %d  }-------}
 \  /%4d   /
  \/_______/'''%(u,l,3*u*l*(u*u-l*l)%7))

イデオンでテストする

右利き(最後の行u*uと交換しl*lて左利きに切り替える)

勝つためにバインドされています-しかし、サイコロの転がり溜息を取得しましょうをつきましょう-特に、生で行って旧式のフォーマットを使用する以外のASCIIのゴルフの試みはすべて、バイトを節約できませんでした。
-n00bのさらなるゴルフのヒントは喜んであります。


1
from random import*およびを使用して1バイトを保存できますc=choice
アクロリス

@daHugLenny-その前にその空白を見逃すことはできませんでした*; た!
ジョナサンアラン

1
PPCGへようこそ!素敵な最初の投稿!
GamrCorps

おかげ@GamrCorps -私はしばらくの間、いくつかを行うことを意味してきた...今私は担当者Iが保護問題について意味のある解決策を投稿することができますが...:D
ジョナサン・アラン

2
3つのスペースを%d使用してからを使用する%4d代わりに、代わりに使用すると、適切に埋め込みます。ダイの他の部分にも同様に活用できる場合があります。
バリューインク

5

C、177

f(r){r=rand()%24;r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

テストプログラムで

f(r){r=rand()%24;
r=(5545>>r%4*3&63^256-(r*2&8))*513>>r/8*3;
printf("   ________\n  /\\%9s /  \\%4d   \\\n{ %d  }-------}\n \\  /%4d   /\n  \\/_______/","\\\n",7&r,7&r/8,7&r/64);}

j;
main(){
    for(j=99;j--;puts(""))f();
}

説明

r=                    \\after calculation, assign to r (in order to use only one variable.)
(5545>>r%4*3&63       \\5545 is 12651 in octal. Select 2 digts for the equator
^256-(r*2&8))         \\if 4's bit of r is 0, prepend 4=256/64. Else prepend 3 and reverse one of the faces by xoring with 7. 256-8 = 248 = 3*64+7*8.
*513                  \\now we have a 3 digit octal number. duplicate all digits by multiplying by 1001 octal.
>>r/8*3               \\rightshift 0,1 or 2 digits to rotate. 

5

Javascriptの238 232 207 201バイト

var r=24*Math.random()|0,o=r%3,b=r-o,v="123513653263154214624564";console.log(`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,v[r],v[b+(o+1)%3],v[b+(o+2)%3])

これは、次のようになります。

var r = 24 * Math.random() | 0,
    o = r % 3,
    b = r - o,
    v = "123513653263154214624564";
console.log(
`   ________
  /\\       \\
 /  \\   %s   \\
{ %s  }-------}
 \\  /   %s   /
  \\/_______/`,

    v[r],
    v[b+(o+1)%3]
    ,v[b+(o+2)%3]
)

アルゴリズム

ダイの8つのコーナーの交点のそれぞれで、ダイの交差する面の値は固定されていますが、3回の回転のいずれでも出現する可能性があることを考慮してください。たとえば、「1」、「2」、「3」のコーナーを見下ろしながら、ダイを軸の周りに回転させてコーナーを通り、反対側のコーナーから「1」、「2」または「3」を表示できます。 ASCIIアートの上に。

v各コーナーで交差するダイ面をハードコードしb、ランダムコーナーの開始点へのオフセットであり、oコーナーデータ内の回転の開始点です。ASCIIアートは、console.logフォーマット文字列を使用してコンソールに書き込まれます。


常に`書き込む必要がなく、リテラルの改行文字の使用を許可する引用符を使用すると、おそらく数バイトを削ることができます\n
ニール

@Neilが最も高く評価されており、うまく機能しました。末尾も削除しました';'
traktor53

4

TSQL 308バイト

DECLARE @ char(87)=(SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x)PRINT @

280バイト(Server Management Studioの場合:クエリ-テキストへの結果)

SELECT
REPLACE(REPLACE(REPLACE('   ________
  /\       \ 
 /  \   7   \ 
{ 8  }-------}
 \  /   9   /
  \/_______/',7,a),8,b),9,3*ABS(a*a*a*b-a*b*b*b)%7)
FROM(SELECT*,SUBSTRING(REPLACE(STUFF(123456,a,1,''),7-a,''),CAST(RAND()*4as int)+1,1)b
FROM(SELECT CAST(RAND()*6as int)+1a)x)x

注:印刷部分と宣言部分を削除することにより、SELECTから直接結果を出力します。しかし、それはフィドルでは機能しません

フィドル


に変更しABS(a^3*b-a*b^3)て4バイトを節約できますか?(よくわからない-フィドルで動作しているようですが、a、b、c = 5,1,3のロールを1つだけ与えているので、間違っているかもしれません)
ジョナサンアラン

@JonathanAllan、コメントありがとうございます。指数関数は、TSQLでPOWER(a、3)と記述されます。^意味が異なります
-t-clausen.dk

4

Javascript、251バイト

r="replace";a=()=>(0|Math.random()*6)+1;b=(x,y)=>3*x*y*(x*x+6*y*y)%7;u=()=>{x=a(),y=a();z=b(x,y);if(z==0)u();return"   ________\r\n  \/\\       \\\r\n \/  \\   1   \\\r\n{ 2  }-------}\r\n \\  \/   3   \/\r\n  \\\/_______\/"[r](1,x)[r](2,y)[r](3,z);}

u();
それを使用して呼び出します長いですが、それは答えであり、私は長い間答えていません。


ideoneの出力テストの左上にスペースがありません。
ジョナサンアラン

a=()=>(0|Math.random()*6)+1;8を保存する必要があります
traktor53

3

ルビー、150バイト

すべての文字列フォーマットの乱用!!!

最後の数値を取得する式の功績は、ここの @xnorに帰属します

u=1+rand(6)
l=([*1..6]-[u,u^7]).sample
$><<'%11s
  /\%8s
 /  \%4d%4s
{ %d  }%s}
 \  /%4d%4s
  \/%s/'%[?_*8,?\\,u,?\\,l,?-*7,3*u*l*(u*u-l*l)%7,?/,?_*7]

いいえ-式のクレジットはxnorに送られます
ジョナサンアラン

@JonathanAllanは、適切なクレジットを示してくれてありがとう。とにかく、この回答をどのようにフォーマットしたかは、バイトを節約するために文字列フォーマットをより有利に活用できると言ったときに思い描いていたものよりも多かったです。
バリューインク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.