Vẽ kết quả súc sắc trong ASCII


25

Hiển thị kết quả ngẫu nhiên của một lần tung xúc xắc nếu được thực hiện với khuôn hình khối, trong ASCII.

$ dice

sẽ dẫn đến một trong những

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

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

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

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

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

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

4
Bạn chưa xác định số liệu ở đây. Đây có phải là một golf mã? Luôn luôn đáng để thảo luận về các nhiệm vụ có thể có trong trò chuyện trong phòng thí nghiệm câu đố hoặc hộp cát trên meta để bạn có thể giải quyết các loại câu hỏi này trước khi bạn phát trực tiếp.
dmckee

Xin lỗi, tôi nghĩ số liệu luôn là số lượng ký tự? Cảm ơn đã chỉ cho tôi trò chuyện và sau đó hộp cát trên meta. Nếu câu hỏi này rơi thẳng vào mặt nó thì tôi sẽ xóa nó. Tôi ghét phải làm điều đó ngay bây giờ, chỉ trong trường hợp ai đó đã bắt đầu làm việc với nó.
Jonas Elfstrom

À ... lưu ý tên trang web "Lập trình câu đố và đánh gôn mã" (và vâng, tôi nghĩ rằng nó cũng quét tốt hơn theo cách khác). Bạn cũng sẽ tìm thấy một lớp lót , giải đấu vua-of-the-đồi , và mã thách thức (mọi thứ khác, nhưng bạn vẫn có nghĩa vụ phải thiết lập một số liệu khách quan cho chiến thắng), vì vậy nó là cần thiết để nói và để áp dụng phù hợp nhãn.
dmckee

13
Theo XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');là một chương trình chính xác.
JiminP

9
Nếu bạn xóa thẻ ascii-art, tôi có thể cung cấp giải pháp 39char print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art) của mình.
người dùng không xác định

Câu trả lời:



25

Python, 112 110 ký tự

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
Những so sánh trong bộ chỉ mục mảng là hoàn toàn ấn tượng!
Jonas Elfstrom

2
Như trên! Tôi cũng thích cách bạn sử dụng tính đối xứng của súc sắc :)
System Down

Bạn có thể sử dụng một cái gì đó như thế id(0)%7%6nào? Đây sẽ không phải là một bản phân phối đồng đều, nhưng nó ngắn hơn đáng kể ...
Nabb

@Nabb: điều đó không phải là rất ngẫu nhiên. Đặc biệt, nó thường giống nhau từ chạy đến chạy, vì vậy nó sẽ không hữu ích trong việc tạo ra các cuộn súc sắc ngẫu nhiên.
Keith Randall

11

Ruby 1.9, 80 84 ký tự

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse

Tôi thích +s.reverse
Jonas Elfström

7

Windows PowerShell, 89 93 96 97 101 119 ký tự

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

5

Python, 109 ký tự unicode

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

Lưu ý: Điều này không được sử dụng chức năng ngẫu nhiên, vì vậy nó sẽ không quá ngẫu nhiên như những người khác.


5

Perl, 74 ký tự

Chạy với perl -M5.010.

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

(Lưu ý rằng các dòng mới trong danh sách là một phần của chuỗi và không chỉ được chèn cho mức độ dễ đọc.)

Nếu bạn thấy mình băn khoăn không biết $->$thao tác này làm gì, các ghi chú đọc sau đây có thể hữu ích:

  • Biến $-tự động cắt ngắn giá trị được gán của nó thành một số nguyên.

  • Biến $"được đặt trước vào một không gian duy nhất.

  • olà một bareword (đại diện "o").


4

Người chơi gôn lần đầu

Python, 161 ký tự

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

Lisp thường gặp 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)))

Lưu ý rằng các dòng mới là đáng kể. Không giống như các ngôn ngữ "hiện đại" ngớ ngẩn này, Common Lisp ưa thích khả năng đọc hơn tính cô đọng, do đó chúng tôi có cấu trúc "chuỗi" cồng kềnh ... "và không có cách nào ngắn gọn để tham chiếu một ký tự trong chuỗi.


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(''))

Trông không đúng lắm alertvì nó không phải là phông chữ có chiều rộng cố định, nhưng hãy yên tâm rằng nó là chính xác hoặc kiểm tra bằng cách phát ra một <pre>thẻ và thực hiện writeln:-)

Bằng chứng: http://jsfiddle.net/d4YTn/3/ (chỉ hoạt động trong các trình duyệt tuân thủ JS 1.7, chẳng hạn như FF2 +)

Tín dụng: Hack Mathlừa từ @minitech và logic in chết từ @Keith.

Chỉnh sửa : Xóa Maththủ thuật khỏi @minitech vì nó thực sự làm cho nó dài hơn :-)

Chỉnh sửa 2 : Lưu 17 ký tự. Mượn lừa từ @Keith để tận dụng sự đối xứng của súc sắc. Sử dụng thủ thuật để đơn giản hóa chuyển đổi số ngẫu nhiên thành int.

Chỉnh sửa 3 : Xóa 1+để chuyển số ngẫu nhiên từ 1-6 sang 0-5 và lưu 2 ký tự. Kết quả là, tôi cũng có thể thay đổi r%2-1để r%2và tiết kiệm thêm 2 ký tự.

Chỉnh sửa 4 : jsfiddle đang hoạt động trở lại. Đã cập nhật :-)


E4X! Và tôi không thể tin rằng Chrome sẽ không hỗ trợ nó!
Ry-

Heh, cuối cùng tôi đã đánh bại bạn :)
Ry-

Bây giờ, hai nhân vật sử dụng |0mánh khóe của bạn :-)
Ry-

Nó hoạt động trong Chrome đối với tôi.
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-----');

Đánh bại mellamokb, nhưng tôi đã thay đổi hoàn toàn giải pháp ban đầu của mình. Nếu bạn muốn nó trông ổn, hãy sử dụng Google Chrome hoặc thứ gì đó, đổi alertthành console.logvà voilà.

Chỉnh sửa: mượn mellamokb's | 0 để lưu một số ký tự.


@minitech: BTW, M=Mathmánh khóe của bạn mà tôi đã cố gắng đánh cắp thực sự cuối cùng trở thành một nhân vật dài hơn
mellamokb

@mellamokb: Tôi biết, ban đầu tôi nghĩ rằng tôi sẽ sử dụng nó nhiều hơn ...
Ry-

@minitech: Bạn có thể lưu hai ký tự với[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

1
@mellamokb: Không; slà một mảng. Tôi sẽ khởi động lại và thử lại.
Ry-

@minitech: Ở đây chúng tôi đi một lần nữa :-) Sự phát triển của câu trả lời tốt nhất bằng cách cạnh tranh. Bây giờ tôi xuống còn 137, nhưng bạn có thể mượn một trong những mánh khóe của tôi và tiết kiệm được 10 ký tự.
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);

Việc đóng ?>có thể được bỏ qua, giúp bạn tiết kiệm 2 ký tự.
Ry-

Bạn có thể nội tuyến khai báo cho $r, lưu một ký tự khác. Không gian sau echocó thể được bỏ qua là tốt. Bạn cũng có thể đặt nội tuyến cho quá trình khởi tạo $a, đưa bạn tới 128. Sau đó, ngắt dòng trực tiếp vào chuỗi thay vì thoát chúng bằng cách \nlưu hai ký tự khác, sau đó.
Joey

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);}

Biên dịch với:

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

1
Đó có phải là gian lận với tất cả các cờ trên dòng lệnh không? Tôi không hiểu điều đó / DA / DB / DC .. điều.
mellamokb

Trình biên dịch của tôi không hiểu công /Dtắc ... Xin đừng gian lận bằng cách đặt định nghĩa ngẫu nhiên vào lệnh biên dịch.
FUZxxl

3

Con trăn 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 ký tự

(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

Con trăn 108 114 119 121 122 129

wtf! Hình như giải pháp thứ 1?! nhưng tôi không ... lừa dối

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
+1 để sử dụng diethay vì print/say
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

Haskell, 154 162 167 172 ký tự

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

Nó sử dụng ý tưởng gần giống như ý tưởng của Python.

Phiên bản dễ đọc:

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

Một giải pháp PHP khác. Tôi đã đến với giải pháp gần như tương tự của Oleg.


2

Con trăn (153)

Đây không phải là đệ trình nhỏ nhất, tôi chỉ nghĩ rằng nó trông đẹp :)

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 ký tự)

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

Sử dụng:

dice[]

2

C, 168 164 163 ký tự

Xin lỗi nếu tôi đến bữa tiệc muộn một chút, nhưng vì chưa có câu trả lời nào được chấp nhận và giải pháp C duy nhất khác có phần lâu hơn, nên đến đây ...

#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);}

Bạn có thể xóa bao gồm và lưu 18 ký tự khác, nhưng sau đó nó không biên dịch mà không có cảnh báo.

Chỉnh sửa :
sử dụng thủ thuật dòng lệnh của user 23241 , mã C ngắn nhất tạo ra kết quả (không có cảnh báo trình biên dịch) chỉ có 12 ký tự:

#include I
M

Ít nhất nếu bạn gian lận và sử dụng dòng lệnh sau để biên dịch:

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 ký tự

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

Đây là CodeGolf thứ hai của tôi và tôi không thực sự nhắm đến sự ngắn gọn nhiều như khả năng biến đổi mã và phù hợp với tiêu chí chơi game.

Bạn có thể tạo xúc xắc 4 mặt cũng như 6 mặt.

Có lẽ sau này tôi sẽ rút ngắn nó và làm cho nó năng động hơn một chút.

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

Đầu ra 4 mặt:

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

Đầu ra 6 mặt:

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

1

JavaScript 220 byte

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

Hồng ngọc, 134 132 119 118 117 112 111 ký tự,

Golf thứ hai của tôi trong cuộc sống. Tôi đã sử dụng số ma thuật. Bất cứ lời khuyên nào?

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

Đầu ra:

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 ký tự

Lưu ý rằng đây không phải là Vim thuần vì Vim không có trình tạo số ngẫu nhiên dựng sẵn. Có những phần mở rộng có thể được tải xuống cho nó, nhưng vì tôi là một người đàn ông Linux chết tiệt, tôi nghĩ, tại sao không chỉ dựa vào môi trường shell thay thế.

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

Giải trình

  • Dòng đầu tiên tạo ra "hộp" đại diện cho khuôn.
  • Dòng thứ hai lấy một số ngẫu nhiên từ môi trường và sử dụng số học mô-đun buộc nó phải là một số hợp lệ cho một con xúc xắc.
  • Các dòng còn lại di chuyển xung quanh khuôn mặt chết trong o's. Lưu ý rằng điều này có nghĩa là được tối ưu hóa cho số lượng ký tự ít nhất, không phải số lượng chuyển động ít nhất (nghĩa là sẽ có những cách nhanh hơn trong các lần nhấn phím nếu tôi đang thực hiện thủ công.if .
  • Như mọi khi, ^không phải là một nghĩa đen ^mà là một dấu hiệu của một chuỗi thoát.

Kiểm tra

Thay đổi RANDOMthành DICEVALUE, lưu mã VimScript vào dice.vim, sau đó chạy tập lệnh shell này trên nó, đưa ra làm đối số cho bất kỳ số nào bạn muốn kiểm tra:

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

1

Toán học 166 161 146 143 ký tự

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

Đầu ra mẫu:

số năm


Nếu ma trận niềng răng vi phạm, bạn có thể thay thế MatrixFormbằng TableFormtrong mã.


1

PHP 5,4, 107 byte

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

102 byte *

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

** Thật không may, phiên bản 102 byte phát hành các thông báo do việc truyền boolvào intkhi lập chỉ mục chuỗi $d. Ngoài ra, nó hoạt động tốt. *


Tổng số byte dường như là 105 và 100, tương ứng.
12Me21

Ah, tôi phải tính đến các dòng mới.
Dan Lugg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.