Gulung dadu ASCII

16

Dalam tantangan , Anda harus menampilkan seni ascii dari die roll acak.

seperti ini:

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

Harap dicatat bahwa:

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

output tidak valid, karena itu bukan hasil yang mungkin pada cetakan

Ada 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 kemungkinan gulungan mati.

Program Anda harus menampilkan salah satu dari gulungan-gulungan ini dalam bentuk seni ascii (dimodelkan seperti yang di bawah ini, dengan xy dan zs diganti dengan angka-angka) seperti di atas, dengan setiap output memiliki> 0 kemungkinan terjadi, tetapi kemungkinan tidak harus genap (mereka diizinkan untuk menjadi trik dadu, tidak seperti dalam kehidupan nyata). Program Anda tidak dapat menghasilkan die roll yang tidak valid, atau non die roll. Program Anda harus memiliki probabilitas 1 menghasilkan gulungan yang valid

Harap dicatat bahwa dadu Anda tidak harus berupa dadu yang lurus seperti yang ditunjukkan pada gambar pertama. (Tangan kanan dan kiri menggambarkan jaring die)

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|
  \/_______/

Jika dadu Anda kidal, berikut ini adalah output yang valid, tetapi tidak jika dadu Anda kidal:

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

Meskipun Anda dapat memilih tangan kiri atau tangan kanan, dadu Anda harus konsisten: ia tidak dapat berubah dari kiri ke kanan atau sebaliknya

berikut ini adalah daftar output yang valid untuk die. Lihat gambar di atas untuk posisi 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

sekali lagi ini adalah , jadi lebih sedikit byte lebih baik

dirusak Lemon
sumber
4
Pemecah mungkin tertarik pada formula untuk wajah mati ketiga diberikan dua lainnya.
xnor
@ xnor dan karena itu saya pikir itu argumen yang kuat bahwa pertanyaan ini adalah duplikat
Digital Trauma
1
Saya tidak tahu ada seni ASCII untuk menggambar kubus dalam proyeksi ini. Dengan ukurannya yang kecil, saya tidak tahu apakah ada yang bisa lebih baik daripada hardcoding dalam bahasa seperti Python.
xnor
@ xnor memang, bahkan dengan beberapa urutan char 7 dan 8 di sana.
Jonathan Allan

Jawaban:

8

Python 3, 197 196 192 byte

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

Uji di ideone

Tangan kanan (beralih ke kidal dengan bertukar u*udengan l*lpada baris terakhir)

Pasti akan mengalahkan - tapi mari kita dadu bergulir napas - terutama karena semua upaya saya untuk golf ASCII kecuali akan baku dan menggunakan tua-sekolah format semua gagal menyimpan byte;
- tips golf lebih lanjut untuk n00b dengan senang hati dihargai.

Jonathan Allan
sumber
1
Anda dapat menyimpan 1 byte dengan menggunakan from random import*dan c=choice.
acrolith
@daHugLenny - tidak sekarang saya bisa melewatkan ruang putih sebelum *; ta!
Jonathan Allan
1
Selamat datang di PPCG! Posting pertama yang bagus!
GamrCorps
Terima kasih @GrrCorps - Saya bermaksud melakukan beberapa saat ... sekarang saya memiliki perwakilan, saya dapat mengirim solusi yang bermakna pada pertanyaan yang dilindungi ...: D
Jonathan Allan
2
Alih-alih memiliki 3 spasi dan kemudian %d, gunakan %4dsebaliknya dan itu akan cocok untuk Anda. Anda mungkin dapat memanfaatkannya untuk bagian lain dari die juga.
Value Ink
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);}

Dalam program uji

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

Penjelasan

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. 
Level River St
sumber
5

Javascript 238 232 207 201 byte

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

yang ketika ungolfed adalah:

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

Algoritma

Pertimbangkan bahwa pada masing-masing persimpangan sudut 8 dari mati, nilai-nilai wajah die berpotongan tetap tetapi dapat muncul dalam salah satu dari 3 rotasi. Misalnya sambil melihat ke sudut "1", "2", "3", dadu dapat diputar tentang sumbu melalui sudut dan keluar sudut yang berlawanan, untuk menunjukkan "1", "2" atau "3" di atas seni ASCII.

vkode keras wajah-wajah die yang berpotongan di setiap sudut, bmerupakan offset ke awal sudut acak, dan omerupakan awal rotasi dalam data sudut. Seni ASCII ditulis ke konsol menggunakan console.logstring format.

traktor53
sumber
Anda mungkin dapat mencukur beberapa byte dengan menggunakan `tanda kutip yang memungkinkan penggunaan karakter baris baru literal daripada harus menulis \nsepanjang waktu.
Neil
@ Neil paling dihargai, itu bekerja dengan baik. Juga menghapus trailing';'
traktor53
4

TSQL 308 byte

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 byte (di Server Management Studio: Permintaan - hasil ke teks)

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

Catatan: dengan menghapus cetakan dan bagian mendeklarasikan - dan mengeluarkan hasilnya langsung dari SELECT. Namun itu tidak akan berhasil dalam biola

Biola

t-clausen.dk
sumber
Mungkin Anda bisa berubah ABS(a^3*b-a*b^3) untuk menyimpan 4 byte? (Saya tidak yakin - tampaknya bekerja di biola, tapi itu hanya memberi saya satu gulungan a, b, c = 5,1,3 jadi saya mungkin salah)
Jonathan Allan
@ Jonathanathan Allan terima kasih atas komentar Anda. Eksponensial dituliskan POWER (a, 3) dalam TSQL. ^ memiliki arti yang berbeda
t-clausen.dk
4

Javascript, 251 byte

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

Panggilan menggunakan u();
Itu panjang tapi itu adalah jawaban, dan saya belum menjawab dalam waktu yang lama.

Botak Bantha
sumber
Kehilangan ruang di kiri atas tes keluaran pada ideone .
Jonathan Allan
a=()=>(0|Math.random()*6)+1;harus menyimpan 8
traktor53
3

Ruby, 150 byte

Semua penyalahgunaan format string !!!

Kredit untuk formula yang mendapatkan nomor terakhir jatuh ke @ xnor di sini .

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]
Nilai Tinta
sumber
Tidak - kredit untuk formula diberikan ke xnor
Jonathan Allan
@Jonathan Allan terima kasih telah menunjukkan saya pada kredit yang tepat. Bagaimanapun, bagaimana saya memformat jawaban ini lebih dari apa yang ada dalam pikiran saya ketika saya mengatakan Anda mungkin dapat memanfaatkan pemformatan string lebih untuk keuntungan Anda untuk menghemat byte.
Value Ink