Gambar hasil dadu di ASCII


25

Perlihatkan hasil acak lemparan dadu jika dilakukan dengan dadu berbentuk kubus, di ASCII.

$ dice

harus menghasilkan salah satu

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

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

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

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

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

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

4
Anda belum menentukan metrik di sini. Apakah ini dimaksudkan sebagai kode golf? Itu selalu layak untuk membahas tugas-tugas yang mungkin dalam obrolan lab teka - teki atau kotak pasir di meta sehingga Anda dapat mengatasi pertanyaan-pertanyaan semacam ini sebelum Anda ditayangkan.
dmckee

Maaf, saya pikir metrik selalu adalah jumlah karakter? Terima kasih telah mengarahkan saya ke obrolan dan kemudian memberi kotak pada meta. Jika pertanyaan ini jatuh datar di wajahnya maka saya akan menghapusnya. Aku benci melakukannya sekarang, kalau-kalau ada yang sudah mulai bekerja.
Jonas Elfström

Ah ... catat nama situs "Teka-teki pemrograman dan golf kode" (dan ya, saya pikir itu juga memindai lebih baik sebaliknya). Anda juga akan menemukan turnamen satu-liners , king-of-the-hill , dan kode-tantangan (semua yang lain, tetapi Anda masih harus membuat metrik objektif untuk menang), sehingga perlu untuk mengatakan dan menerapkan yang sesuai menandai.
dmckee

13
Menurut XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');adalah program yang benar.
JiminP

9
Jika Anda menghapus tag ascii-art, saya dapat menawarkan solusi 39char saya print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art).
pengguna tidak diketahui

Jawaban:



25

Python, 112 110 karakter

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
Mereka membandingkan dalam pengindeks array benar-benar mengesankan!
Jonas Elfström

2
Dito! Saya suka bagaimana Anda menggunakan simetri dadu juga :)
System Down

Bisakah Anda menggunakan sesuatu seperti id(0)%7%6? Ini tidak akan menjadi distribusi yang seragam, tetapi secara signifikan lebih pendek ...
Nabb

@ Nabb: itu tidak terlalu acak. Secara khusus, seringkali sama dari menjalankan ke menjalankan, sehingga tidak akan sangat berguna dalam menghasilkan gulungan dadu acak.
Keith Randall

11

Ruby 1.9, 80 84 karakter

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

Saya menyukai +s.reverse
Jonas Elfström

7

Windows PowerShell, 89 93 96 97 101 119 karakter

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

5

Python, 109 karakter unicode

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

Catatan: Ini tidak menggunakan fungsi acak, jadi tidak akan begitu acak seperti yang lainnya.


5

Perl, 74 karakter

Jalankan dengan perl -M5.010.

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

(Perhatikan bahwa baris baru dalam daftar adalah bagian dari string, dan tidak hanya disisipkan untuk keterbacaan.)

Jika Anda bertanya-tanya apa yang dilakukan $->$operasi, catatan bacaan berikut mungkin bermanfaat:

  • Variabel $-secara otomatis memotong nilainya yang ditetapkan ke integer.

  • Variabel $"diatur ke ruang tunggal.

  • oadalah kata pengantar (mewakili "o").


4

Pegolf waktu pertama

Python, 161 karakter

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

Gangguan Umum 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)))

Perhatikan bahwa baris baru itu penting. Tidak seperti bahasa-bahasa "modern" yang konyol ini, Common Lisp lebih memilih keterbacaan daripada kesederhanaan, jadi kami memiliki konstruksi "string gabungan" yang rumit ... dan tidak ada cara ringkas untuk merujuk karakter dalam string.


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

Tidak terlihat benar alertkarena ini bukan font dengan lebar tetap, tetapi yakinlah itu benar, atau uji dengan memancarkan <pre>tag dan melakukan writeln:-)

Bukti: http://jsfiddle.net/d4YTn/3/ (hanya berfungsi di browser yang sesuai dengan JS 1.7, seperti FF2 +)

Penghargaan: MathTrik yang diretas dari @minitech dan mati logika cetak dari @Keith.

Sunting : Hapus Mathtrik dari @minitech karena sebenarnya membuatnya lebih lama :-)

Sunting 2 : Simpan 17 karakter. Trik pinjam dari @Keith untuk memanfaatkan simetri dadu. Gunakan trik untuk menyederhanakan konversi angka acak ke int.

Sunting 3 : Hapus 1+untuk menggeser angka acak dari 1-6 ke 0-5 dan menyimpan 2 karakter. Akibatnya, saya juga dapat mengubah r%2-1ke r%2dan menyimpan lain 2 chars.

Sunting 4 : jsfiddle bekerja kembali. Diperbarui :-)


E4X! Dan saya tidak percaya Chrome tidak akan mendukungnya!
Ry-

Heh, akhirnya aku kalahkan kamu :)
Ry-

Dua karakter, sekarang, menggunakan |0trik Anda :-)
Ry-

Ini berfungsi di Chrome untuk saya.
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-----');

Kalahkan mellamokb, tetapi saya mengubah solusi asli saya sepenuhnya. Jika Anda ingin ini terlihat bagus, gunakan Google Chrome atau sesuatu, ubah alertke console.log, dan voila.

Sunting: meminjam | 0 trik mellamokb untuk menyimpan beberapa karakter.


@minitech: BTW, M=Mathtrik Anda yang saya coba curi sebenarnya menjadi satu karakter lebih lama
mellamokb

@ellamokb: Saya tahu, saya pikir semula bahwa saya akan menggunakannya lebih banyak ...
Ry-

@minitech: Anda dapat menyimpan dua karakter dengan[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

1
@mellamokb: Tidak; sadalah sebuah array. Saya akan memulai ulang dan mencoba lagi.
Ry-

@minitech: Ini dia lagi :-) Evolusi jawaban terbaik oleh kompetisi. Sekarang saya turun ke 137, tetapi Anda dapat meminjam salah satu trik saya dan menyimpan 10 karakter.
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);

Penutupan ?>bisa dihilangkan, menghemat 2 karakter.
Ry-

Anda dapat menguraikan deklarasi untuk $r, menyimpan karakter lain. Ruang setelah echodapat dihilangkan juga. Anda dapat inisialisasi inisialisasi $ajuga, membawa Anda ke 128. Menempatkan baris langsung ke string daripada melarikan mereka dengan \nmenyimpan dua karakter lain, lalu.
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);}

Kompilasi dengan:

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

1
Apakah itu agak curang dengan semua bendera di command-line? Saya tidak mengerti itu / DA / DB / DC .. hal.
mellamokb

Kompiler saya tidak memahami /Dsakelar ... Tolong jangan curang dengan memasukkan definisi acak ke dalam perintah kompilasi.
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 karakter

(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! sepertinya solusi 1 ?! tapi aku tidak ... curang

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 untuk menggunakan diealih-alih 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 karakter

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

Ini menggunakan kira-kira ide yang sama dengan yang Python.

Versi yang dapat dibaca:

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

Solusi PHP lain. Saya sampai pada solusi yang hampir sama oleh Oleg.


2

Python (153)

Sejauh ini bukan pengiriman terkecil, saya hanya berpikir itu terlihat bagus :)

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

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

Pemakaian:

dice[]

2

C, 168 164 163 karakter

Maaf jika saya agak terlambat ke pesta, tetapi karena belum ada jawaban yang diterima, dan satu-satunya solusi C yang agak lama, begini ...

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

Anda dapat menghapus sertakan dan menyimpan 18 karakter lainnya, tetapi kemudian tidak dapat dikompilasi tanpa peringatan.

Sunting :
menggunakan trik command-line user23241 , kode C terpendek yang menghasilkan hasil (tanpa peringatan kompiler) hanya 12 karakter:

#include I
M

Setidaknya jika Anda menipu dan menggunakan baris perintah berikut untuk mengkompilasi:

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 karakter

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

Ini adalah CodeGolf kedua saya, dan saya tidak benar-benar mengincar kekurangan sebanyak kode yang berubah-ubah dan mencocokkan kriteria permainan.

Anda dapat menghasilkan 4 dadu sisi dan 6 sisi.

Mungkin nanti saya akan mempersingkat dan membuatnya sedikit lebih dinamis.

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

Output 4 sisi:

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

Output 6 sisi:

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

Ruby, 134 132 119 118 117 112 111 karakter,

Golf kedua saya dalam hidup. Saya telah menggunakan angka ajaib. Adakah saran?

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

Output:

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 karakter

Perhatikan bahwa ini bukan Vim murni karena Vim tidak memiliki generator nomor acak bawaan. Ada ekstensi yang dapat diunduh untuk itu tentu saja, tetapi karena saya seorang Linux yang tangguh, saya pikir, mengapa tidak hanya mengandalkan lingkungan shell saja.

Kode

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

Penjelasan

  • Baris pertama menghasilkan "kotak" yang mewakili cetakan.
  • Baris kedua mengambil nomor acak dari lingkungan dan menggunakan aritmatika modular memaksa itu menjadi nomor yang valid untuk dadu.
  • Garis yang tersisa bergerak di sekitar wajah yang mati mengisi o's. Perhatikan bahwa ini dimaksudkan untuk dioptimalkan untuk jumlah karakter paling sedikit, bukan jumlah gerakan paling sedikit (yaitu akan ada cara yang lebih cepat dalam pergantian penekanan tombol jika saya melakukannya secara manual — melakukan ifsemua yang ada di kepala saya).
  • Seperti biasa, ^bukan literal ^tetapi indikasi urutan pelarian.

Pengujian

Ubah RANDOMke DICEVALUE, simpan kode VimScript ke dalamnya dice.vim, kemudian jalankan skrip shell ini di atasnya, berikan sebagai argumen nomor apa pun yang ingin Anda uji:

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

1

Mathematica 166 161 146 143 143 karakter

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

Output sampel:

lima


Jika matriks itu menyinggung, Anda bisa mengganti MatrixFormdengan TableFormdalam kode.


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

** Sayangnya, versi 102 byte mengeluarkan pemberitahuan karena casting boolke intsaat pengindeksan string $d. Selain itu, berfungsi dengan baik. *


Hitungan byte tampaknya masing-masing 105 dan 100.
12Me21

Ah, saya pasti sudah memperhitungkan baris baru.
Dan Lugg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.