サイコロの結果をASCIIで描く


25

ASCIIで立方体型のダイスを使ってサイコロを投げた場合のランダムな結果を表示します。

$ dice

の結果になるはずです

-----
|   |
| o |
|   |
-----

-----
|o  |
|   |
|  o|
-----

-----
|o  |
| o |
|  o|
-----

-----
|o o|
|   |
|o o|
-----

-----
|o o|
| o |
|o o|
-----

-----
|o o|
|o o|
|o o|
-----

4
ここでメトリックを定義していません。これはコードゴルフを目的としていますか?パズルラボチャットまたはメタサンドボックスで可能なタスクを議論することは常に価値があります。そうすることで、これらの種類の質問に対応することができます。
dmckee

申し訳ありませんが、メトリックは常に文字数だと思いましたか?チャットを紹介し、メタのサンドボックスを表示してくれてありがとう。この質問がその面に平らに落ちたら、私はそれを削除します。誰かが既にそれに取り組み始めた場合のために、今それをするのは嫌いです。
ジョナスエルフストローム

ああ... 「プログラミングパズルとコードゴルフ」というサイト名に注意してください(そうですね、逆にスキャンした方が良いと思いました)。また、ワンライナーキングオブザヒルトーナメント、およびコードチャレンジ(他のすべて、ただし、勝つための客観的なメトリック確立する必要があります)があるため、適切な発言と適用が必要ですタグ。
dmckee

13
XKCD#221によると、これalert('-----\n|o o|\n| |\n|o o|\n-----');は正しいプログラムです。
-JiminP

9
ascii-artタグを削除すると、39char-solution print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art)を提供できます。
ユーザー不明

回答:



25

Python、112 110文字

from random import*
r=randrange(6)
C='o '
s='-----\n|'+C[r<1]+' '+C[r<3]+'|\n|'+C[r<5]
print s+C[r&1]+s[::-1]

6
配列インデクサーでのこれらの比較は非常に印象的です!
ジョナスエルフストローム

2
同じ!ダイの対称性の使用方法も気に入っています:)
システムダウン

次のようなものを使用できますid(0)%7%6か?...一様に分布するつもりはないが、それはかなり短いです
Nabb

@Nabb:それはあまりランダムではありません。特に、実行ごとに同じであることが多いため、ランダムなサイコロを振るのにあまり役に立たないでしょう。
キースランドール


7

Windows PowerShellの、89 93 96 97 101 119文字

-join('-----
|{0} {1}|
|{2}{3}'-f'o '[$(!($x=random 6);$x-lt3;$x-ne5;$x%2)])[0..14+13..0]

5

Python、109個のUnicode文字

#coding:u8
print u"鱸헓ȅ᪮ԅ᪅餠☏汁끝鐸즪聗K糉툜㣹뫡燳闣≆뤀⩚".encode("u16")[2:].decode("zlib").split("\n\n")[id(list())%7-1]

注:これはランダム関数を使用しないため、他の関数のようにランダムではありません。


5

Perl、74文字

で実行しperl -M5.010ます。

$-=rand 6;$_="-----
|0 2|
|4";s/\d/$->$&?o:$"/ge;say$_,$-&1?$":o,~~reverse

(リスト内の改行は文字列の一部であり、読みやすいように挿入されているだけではないことに注意してください。)

$->$操作が一体何をするのか疑問に思う場合は、次の注意事項が役立つ場合があります。

  • 変数は$-、割り当てられた値を自動的に整数に切り捨てます。

  • 変数$"は単一のスペースにプリセットされています。

  • oは裸語です(を表します"o")。


4

初めてのゴルファー

Python、161文字

from random import*
n=randint(1,7)    
o,x='o '
a='-'*5
b=(x,o)[n>3]
d=(x,o)[n>5]
c=(x,o)[n>1]    
print a+'\n|'+c+x+b+'|\n|'+d+(x,o)[n%2]+d+'|\n|'+b+x+c+'|\n'+a

4

Common Lisp 170

(let*((r(random 6))(a "-----
|")(c "o")(d " ")(e "|
|")(f(concatenate 'string a(if(< r 1)d c)d(if(< r 3)d c)e(if(> r 4)c ))))(concatenate 'string f(if(evenp r)c d)(reverse f)))

改行が重要であることに注意してください。これらの馬鹿げた「現代の」言語とは異なり、Common Lispは簡潔さよりも読みやすさを優先しているため、面倒な「連結 '文字列...」構成があり、文字列内の文字を参照する簡潔な方法はありません。


4

JavaScript(169 168 141 137)

r=Math.random()*6|0;s='-----\n|'+(r>0?'o ':'  ')+(r>2?'o':' ')+'|\n|'+(r-5?' ':'o');alert(s+(r%2?' ':'o')+s.split('').reverse().join(''))

alert固定幅のフォントではないため、あまり正しく見えませんが、正しいことを確認してください。または、<pre>タグをwriteln発行してテストしてください:-)

証明:http : //jsfiddle.net/d4YTn/3/(FF2 +などのJS 1.7準拠のブラウザーでのみ動作します)

クレジット:Math@minitechのハッキングトリックと@Keithのダイプリントロジック。

編集Math@minitechからトリックを削除します。実際には長くなりました :-)

編集 2:17文字を保存します。ダイスの対称性を利用するために@Keithからトリックを借ります。トリックを使用して、乱数をintに簡単に変換できます。

編集3:削除1+して乱数を1-6から0-5にシフトし、2文字を保存します。その結果、別の2文字に変更r%2-1r%2て保存することもできます。

編集4:jsfiddleは再び動作しています。更新しました :-)


E4X!そして、私はChromeがそれをサポートしないとは信じられません!
Ry-

ふむ、私は最終的にあなたを打つ:)
Ry-

今、2人のキャラクターがあなたの|0トリックを使用しています:-)
Ry-

私にとってはChromeで動作します。
pimvdb

4

JavaScript、215 213 212 145 135

r=Math.random()*6|0;alert('-----\n|'+[r>2?'o o':r?'o  ':'   ',r%2?r>3?'o o':'   ':' o ',r>2?'o o':r?'  o':'   '].join('|\n|')+'|\n-----');

mellamokbを破りましたが、元のソリューションを完全に変更しました。見栄えを良くしたい場合は、Google Chromeなどを使用して、に変更alertしてくださいconsole.log

編集:いくつかのキャラクターを保存するためにmellamokbの借りたトリックを使用しました。


@minitech:ところで、M=Math私が盗もうとしたあなたのトリックは実際には1文字長くなります
-mellamokb

@mellamokb:私は知っている、私はもともと私はそれをもっと使うと
思っていた...-Ry-

@minitech:2つの文字を保存できます[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
-mellamokb

1
@mellamokb:いいえ。s配列です。再起動して再試行します。
Ry-

@minitech:もう一度行きましょう:-)競争によるベストアンサーの進化。今は137にまで減りましたが、私のトリックの1つを借りて、おそらく10文字を節約できます。
mellamokb

3

PHP 119 126 128 131 188 201 213 234 239

<?$c=($r=rand()%6)%2?$r>4?'o ':'  ':' o';$b=$r>0?$r<3?'o  ':'o o':'   ';echo$a="-----\n|$b|\n|$c",substr(strrev($a),1);

終了?>は省略でき、2文字節約できます。
Ry-

の宣言をインライン$r化して、別の文字を保存できます。後のスペースechoも省略できます。初期化もインライン化$aして128にすることができます。改行をエスケープせずに文字列に直接入れると、\nさらに2文字が保存されます。
ジョーイ

3

C -215

#include <time.h>
#include <stdlib.h>
main(){char a[]=A,b[]=B,c=3,d=(srand(time(0)),rand()%6+1),e=d-2;if(d==1)a[5]=C;else{while(--e>-1)a[b[D[d-3]-48+e]-48]=C;a[0]=a[10]=C;}p(E);while(--c>-1)p("|%s|\n",a+c*4);p(E);}

コンパイル:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c

1
コマンドラインでこれらのフラグをすべて不正に扱っていますか?/ DA / DB / DC ..のことを理解していない。
mellamokb

私のコンパイラは/Dスイッチを理解していません...ランダムな定義をコンパイルコマンドに入れてチートしないでください。
FUZxxl

3

Python 133

import random as R
i=R.randint(1,6)
a='   ';b='0 0'
A='-----\n|'+((a,'0  ')[i>1],b)[i>3]+'|\n|'
print A+((a,' 0 ')[i%2],b)[i>5]+A[::-1]

3

F# - 165の 161文字

(System.Random()).Next 6|>fun x->[for y in[x>0;x%2=0;x>2;x=5]->if y then"o"else" "]|>fun[a;b;c;d]->printf"-----\n|%s %s|\n|%s%s%s|\n|%s %s|\n-----"a c d b d c a

3

パイソン 108 114 119 121 122 129

wtf!最初の解決策のように見えますか?!しかし、iamではありません...詐欺師

108

import random as R
i=R.randint(1,6)
X=' 0'
A='-----\n|%s %s|\n|'%(X[i>1],X[i>3])+X[i>5]
print A+X[i%2]+A[::-1]

119

import random as R
i=R.randint(1,6)
X=' 0';a=X[i>5]
A='-----\n|%s %s|\n|%s|'%(X[i>1],X[i>3],a+X[i%2]+a)
print A+A[-6::-1]

3

perlの- 111 103 101

$n=int rand 6;
($t="-----\n|0 1|\n|232|\n|1 0|\n-----\n")=~s/(\d)/5639742>>6*$1>>$n&1?o:$"/eg;
die$t;

1
/dieprintsay
mbxの

3

APL(69)

5 5⍴(5⍴'-'),{⊃⍵↓' o|'}¨2,(⌽M),2,2,(N∊¨6(1 3 5)6),2,2,2,⍨M←3 6 1>⍨N←?6

3

ハスケル、154の 162 167 172文字

import System.Random
main=randomRIO(1::Int,6)>>=putStrLn. \x->let{h="-----\n|"++c(>1):' ':c(>3):"|\n|"++[c(>5)];c f|f x='o'|True=' '}in h++c odd:reverse h

Pythonのアイデアとほぼ同じアイデアを使用します。

読み取り可能なバージョン:

import System.Random

main = do
    x <- randomRIO (1 :: Int, 6)
    putStrLn (render x)

render x = str ++ check odd ++ reverse str
  where
    str = concat
        [ "-----\n|"
        , check (> 1)
        , " "
        , check (> 3)
        , "|\n|"
        , check (> 5)
        ]
    check f = if f x then "o" else " "


2

PHP 126 127 179

<?$x=($r=rand(1,6))>3?"o o":($r<2?"   ":"o  ");$z=$r>5?"o o":($r%2==0?"   ":" o ");$v="-----\n|$x|\n";echo"$v|$z|".strrev($v);

別のPHPソリューション。私はオレグとほぼ同じ解決策を見つけました。


2

パイソン(153)

これは間違いなく最小の提出物ではなく、見た目が良いと思っただけです:)

import random as r
print"""-----
|%c %c|
|%c%c%c|
|%c %c|
-----"""%tuple(
r.choice([
"   o   ",
"o     o",
"o  o  o",
"oo   oo",
"oo o oo",
"ooo ooo"]))

2

Q(120文字)

dice:{(`t`e`l`c`r`w!5 cut"-----|   ||o  || o ||  o||o o|")(,/)(`t;(`e`c`e;`l`e`r;`l`c`r;`w`e`w;`w`c`w;`w`w`w)(*)1?6;`t)}

使用法:

dice[]

2

C、 168 164 163文字

パーティーに少し遅れてすみませんが、答えはまだ受け入れられておらず、他のCソリューションはもう少し長かったので、ここに行きます...

#include<stdio.h>
main(){srand(time(0));char*o="O ",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf("-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n",i,j,k,o[r&1],k,j,i);}

インクルードを削除してさらに18文字を保存できますが、警告なしでコンパイルされません。

編集user23241のコマンドライントリック
を使用して、結果を生成する最短のCコード(コンパイラ警告なし)はわずか12文字です:

#include I
M

少なくとも次のコマンドラインをチートして使用してコンパイルする場合:

gcc -DI="<stdio.h>" -DM="main(){srand(time(0));char*o=\"O \",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf(\"-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n\",i,j,k,o[r&1],k,j,i);}" dice.c -o dice

2

c、140文字

r,i,s;main(){srand(time(i=0));r=rand()%6;for(s=-1;i-=s;)putchar("\n|   |-o"[i>5?i==8&&r||i==10&&2<r||i==14&&4<r||i==15&&(s=1)&~r?7:i%6:6]);}

1

PHP:1284

これは私の2番目のCodeGolfであり、コードの可変性やゲームの基準を満たすことほど短いものを目指していませんでした。

4面のサイコロと6面のサイコロを生成できます。

たぶん後でそれを短くして、もう少し動的にします。

function draw_dice($numdice=1,$sides=4)
{
/* Verify acceptable parameters. */
if($sides<4){die("You must choose 4 sides or greater.");}
if($numdice<1){die("You must have at least one dice.");}
/* End verification */
$a=' ';
$b=' ';
$c=' ';
$d=' ';
$e=' ';
$f=' ';
$g=' ';
$h=' ';
$i=' ';
$j=' ';

switch($sides)
{
case $sides%2==0:
if($sides==4)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$j="o";
break;
case 3:
$b="o";
$g="o";
$j="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$j="o";
break;
}
echo "<div style='text-align:center;display:inline-block;'>";
echo " - <br/>";
echo "| |<br/>";
echo "|$a$b$c|<br/>";
echo "| $d$e$f |<br/>";
echo "|  $g$h$i$j  |<br/>";
echo "---------<br/>";
echo "</div>";

}

if($sides==6)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$i="o";
break;
case 3:
$a="o";
$i="o";
$e="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$i="o";
break;
case 5:
$a="o";
$c="o";
$g="o";
$i="o";
$e="o";
break;
case 6:
$a="o";
$c="o";
$d="o";
$f="o";
$g="o";
$i="o";
break;
}
echo "-----<br/>";
echo "|$a$b$c|<br/>";
echo "|$d$e$f|<br/>";
echo "|$g$h$i|<br/>";
echo "-----<br/>";
}

if($sides!==4&&$sides!==6)
{
die("Only 4 and 6 sided are supported at this time.");
}

break;

case $sides%2==1:
die("Must have even number of sides.");
break;
}

}

draw_dice(1,4);

出力4面:

    - 
   | |
  |o o|
 |     |
|  o  o  |
---------

出力6の両面:

-----
|o  |
| o |
|  o|
-----

1

JavaScript 220バイト

r=(1+Math.random()*6|0).toString(2).split("").reverse();b=r[1];c=r[2];s=[[b|c,0,c],[b&c,1&r[0],b&c],[c,0,b|c]];"-----\n|"+s.map(function(v){return v.map(function(w){return w?"o":" "}).join("")}).join("|\n|")+"|\n-----";

1

ルビー、134 132 119 118 117 112 111の文字、

人生で2度目のゴルフ。マジックナンバーを使用しました。何かアドバイスはありますか?

r=?-*5+"
|"+((a=:ghklm[rand 6])?a.to_i(36).to_s(2).tr("10","o "):"    o").insert(3,"|
|")
$><<r+r[0,14].reverse

出力:

ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|   |
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|o o|
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|   |
| o |
|   |
-----
ice@distantstar ~/virt % 

1

VimScript – 169人のキャラクター

Vimには乱数ジェネレータが組み込まれていないため、これは純粋なVimではないことに注意してください。もちろん、ダウンロードできる拡張機能がありますが、私は頑固なLinuxユーザーなので、代わりにシェル環境だけに頼らないのではないかと考えました。

コード

norm5a-^[YPo|   |^[YPP
let x=system('echo $RANDOM')%6+1
if x<2
norm jllro
el
norm lrolljj.k
if x>3
norm k.hjj
en
if x>2
norm h.k
en
if x>5
norm .l
en
if x>4
norm l.
en
en

説明

  • 最初の行は、ダイを表す「ボックス」を生成します。
  • 2行目は、環境から乱数を取得し、モジュラー演算を使用して、サイコロの有効な数値に強制します。
  • 残りの線は、ダイの面を動き回ってを埋めoます。これは、最小限の動きではなく、最小限の文字数に最適化されることに注意してください(つまり、手動で行うとキーストロークの順番が速くなりif、頭の中ですべてを実行できます)。
  • いつものように、^はリテラルではなく^、エスケープシーケンスの指標です。

テスト中

に変更RANDOMDICEVALUE、VimScriptコードをに保存してから、dice.vimこのシェルスクリプトを実行して、テストする数値を引数として指定します。

#!/bin/sh
for DICEVALUE in $@; do
    export DICEVALUE
    vim -S dice.vim
done

1

Mathematicaの166 161 146 143文字

a="O  ";b=" O ";c="  O";d="   ";e="O O";RandomInteger@{1, 6}/.Thread@Rule[Range@6,{{d,b,d},{a,d,c},{a,b,c},{e,d,e},{e,b,e}, {e,e,e}}]//MatrixForm

サンプル出力:

five


行列の中括弧が気分を害する場合は、交換することMatrixFormTableForm、コードに。


1

PHP 5.4、107バイト

<?$r=rand(1,6);$d=[' ','o'];$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

102バイト*

<?$r=rand(1,6);$d=' o';$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

**残念なことに、102バイトバージョンでは、文字列のインデックスを作成boolするintときにtoがキャストされるため、通知が発行されます$d。それ以外は、正常に動作します。*


バイト数はそれぞれ105および100のようです。
12Me21

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