วาดผลลัพธ์ลูกเต๋าใน 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

ขออภัยฉันคิดว่าเมตริกเป็นจำนวนอักขระเสมอหรือไม่ ขอบคุณที่ชี้นำฉันไปที่การแชทจากนั้นกล่องทรายบนเมตา หากคำถามนี้ตรงไปตรงมาฉันจะลบมัน ฉันเกลียดที่จะทำตอนนี้ในกรณีที่มีคนเริ่มทำงานแล้ว
Jonas Elfström

อ่า ... จดชื่อไซต์"ปริศนาการเขียนโปรแกรมและการเขียนโค้ดกอล์ฟ" (และใช่ฉันคิดว่ามันสแกนได้ดีกว่าในอีกด้านหนึ่งด้วย) นอกจากนี้คุณยังจะได้พบกับหนึ่งสมุทร , การแข่งขันคิงของเนินเขาและรหัสความท้าทาย (ทุกอย่างอื่น แต่คุณยังคงควรจะสร้างวัตถุประสงค์ตัวชี้วัดสำหรับการชนะ) ดังนั้นจึงมีความจำเป็นที่จะพูดและจะนำไปใช้ที่เหมาะสม แท็ก
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) ของฉัน
ผู้ใช้ที่ไม่รู้จัก

คำตอบ:


7

Golfscript, 56 ตัวอักษร

"-"5*n"|":|"o "1/:&6rand:§1<=" "&§3<=|n|&§5<=]&§2%=1$-1%

การแก้ปัญหาสามารถทดสอบที่นี่


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
สิ่งที่เปรียบเทียบในตัวทำดัชนีอาร์เรย์นั้นน่าประทับใจมาก!
Jonas Elfström

2
เช่นเดียวกัน! ฉันชอบวิธีที่คุณใช้ความสมมาตรของคนตายด้วย :)
ระบบลง

คุณสามารถใช้สิ่งที่ชอบid(0)%7%6? มันไม่ได้เป็นไปได้กระจายชุด แต่ก็มีนัยสำคัญสั้น ...
Nabb

@Nabb: นั่นไม่ได้สุ่มมาก โดยเฉพาะอย่างยิ่งมันมักจะเหมือนกันจากการวิ่งเพื่อวิ่งดังนั้นมันจะไม่เป็นประโยชน์อย่างมากในการสร้างการทอยลูกเต๋าแบบสุ่ม
Keith Randall



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

(โปรดทราบว่าบรรทัดใหม่ในรายการเป็นส่วนหนึ่งของสตริงและไม่เพียงแทรกเพื่อความชัดเจน)

หากคุณพบว่าตัวเองสงสัยว่าการทำงานของ heck $->$นั้นเป็นอย่างไรบันทึกการอ่านต่อไปนี้อาจเป็นประโยชน์:

  • ตัวแปร$-จะตัดค่าที่กำหนดให้เป็นจำนวนเต็มโดยอัตโนมัติ

  • ตัวแปร$"ถูกตั้งค่าไว้ล่วงหน้าในพื้นที่เดียว

  • oเป็น bareword (แทน"o")



4

เสียงกระเพื่อมสามัญ 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/ (ใช้ได้กับเบราว์เซอร์ที่ใช้กับ JS 1.7 ได้เท่านั้นเช่น FF2 +)

เครดิต: Mathเคล็ดลับการแฮ็กจาก @minitech และตรรกะการพิมพ์แบบตายจาก @Keith

แก้ไข : ลบMathเคล็ดลับจาก @minitech เพราะจริง ๆ แล้วทำให้มันยาวกว่า :-)

แก้ไข 2 : บันทึก 17 ตัวอักษร เคล็ดลับการยืมจาก @Keith สำหรับการใช้ประโยชน์จากลูกเต๋าสมมาตร ใช้เคล็ดลับสำหรับการแปลงตัวเลขสุ่มให้เป็น int

แก้ไข 3 : ลบ1+เพื่อเลื่อนหมายเลขสุ่มจาก 1-6 ถึง 0-5 และบันทึก 2 ตัวอักษร เป็นผลให้ผมยังสามารถเปลี่ยนr%2-1ไปr%2และบันทึกอีก 2 ตัวอักษร

แก้ไข 4 : jsfiddle กำลังทำงานอีกครั้ง อัปเดต :-)


E4X! และฉันไม่อยากเชื่อเลยว่า Chrome จะไม่สนับสนุน!
Ry-

หึผมชนะคุณที่สุด :)
Ry-

ตัวละครทั้งสองตอนนี้โดยใช้|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และvoilà

แก้ไข: mellamokb ที่ยืมมา | 0 เคล็ดลับในการบันทึกตัวละครบางตัว


@minitech: BTW, M=Mathเคล็ดลับของคุณที่ฉันพยายามขโมยจริง ๆ แล้วจบลงด้วยการเป็นตัวละครตัวหนึ่งอีกต่อไป
mellamokb

@mellamokb: ฉันรู้ว่าฉันคิดเดิมว่าผมจะใช้มันมากขึ้น ...
Ry-

@minitech: คุณสามารถบันทึกสองตัวอักษรด้วย[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

1
@mellamokb: ไม่; sเป็นอาร์เรย์ ฉันจะเริ่มใหม่และลองอีกครั้ง
Ry-

@minitech: ที่นี่เราไปอีกครั้ง :-) วิวัฒนาการของคำตอบที่ดีที่สุดจากการแข่งขัน ตอนนี้ฉันลดเหลือ 137 แต่คุณสามารถยืมหนึ่งในกลอุบายของฉันและบันทึกได้ 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บันทึกอีกสองตัวอักษรจากนั้น
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);}

คอมไพล์ด้วย:

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

Python 108 114 119 121 122 129

WTF! ดูเหมือนว่าโซลูชั่นที่ 1! แต่ฉันไม่ใช่ ... สิบแปดมงกุฎ

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 สำหรับใช้dieแทนprint/say
mbx


3

Haskell, 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 อื่น ฉันมาถึงทางออกเดียวกันโดย Oleg


2

Python (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


1

PHP: 1284

นี่คือ 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

Ruby, 134 132 119 118 117 112ตัวอักษร

สนามกอล์ฟที่สองของฉันในชีวิต ฉันใช้หมายเลขเวทย์มนตร์ มีคำแนะนำอะไรมั้ย

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

คำอธิบาย

  • เครื่องกำเนิดบรรทัดแรกคือ "กล่อง" ที่แสดงถึงความตาย
  • บรรทัดที่สองดึงตัวเลขสุ่มจากสภาพแวดล้อมและการใช้เลขคณิตแบบแยกส่วนบังคับให้มันเป็นหมายเลขที่ถูกต้องสำหรับลูกเต๋า
  • บรรทัดที่เหลือย้ายไปรอบ ๆ เติมใบหน้าตายในo's โปรดทราบว่านี่คือสิ่งที่ควรได้รับการปรับให้เหมาะสมสำหรับจำนวนตัวอักษรน้อยที่สุดไม่ใช่จำนวนการเคลื่อนไหวน้อยที่สุด (เช่นจะมีวิธีการกดแป้นที่เร็วขึ้นหากฉันทำมันด้วยตนเอง - ทำifทุกอย่างในหัวของฉัน)
  • เช่นเคย^ไม่ใช่ตัวอักษร^แต่เป็นตัวบ่งชี้ลำดับการหลบหนี

การทดสอบ

เปลี่ยนRANDOMเป็นDICEVALUEบันทึกรหัส 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


หากแมทริกซ์จัดฟันขัดคุณอาจแทนที่MatrixFormด้วยTableFormในรหัส


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 $dนอกจากนั้นมันใช้งานได้ดี *


จำนวนไบต์ดูเหมือนจะเป็น 105 และ 100 ตามลำดับ
12Me21

อาฉันจะต้องคิดเป็นบรรทัดใหม่
Dan Lugg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.