Lăn một cái chết ASCII


16

Trong thử thách này , bạn phải xuất ra một nghệ thuật lăn ngẫu nhiên.

như thế này:

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

Xin lưu ý rằng:

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

là đầu ra không hợp lệ, vì đó không phải là kết quả có thể xảy ra khi chết

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 khả năng của cuộn chết.

Chương trình của bạn phải xuất một trong các cuộn chết này dưới dạng nghệ thuật ascii (được mô hình hóa như bên dưới, với xy và zs được thay thế bằng số) như trên, với mỗi đầu ra có> 0 xác suất xảy ra, nhưng xác suất không xảy ra phải là số chẵn (chúng được phép là xúc xắc, không giống như trong cuộc sống thực). Chương trình của bạn không thể xuất ra một cuộn chết không hợp lệ hoặc một cuộn không chết. Chương trình của bạn phải có xác suất 1 trong số đầu ra một cuộn hợp lệ

Xin lưu ý rằng cái chết của bạn không nhất thiết phải là một cái chết thuận tay phải như trong hình ảnh đầu tiên. (phải và tay trái mô tả mạng lưới của 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|
  \/_______/

Nếu chết của bạn là thuận tay trái, sau đây là đầu ra hợp lệ, nhưng không phải nếu chết của bạn là thuận tay phải:

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

Mặc dù bạn có thể chọn thuận tay trái hoặc tay phải, nhưng cái chết của bạn phải nhất quán: nó không thể thay đổi từ trái sang phải hoặc ngược lại

Sau đây là danh sách các đầu ra hợp lệ cho khuôn. Tham khảo các hình ảnh trên cho các vị trí của 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

một lần nữa, đây là , nên càng ít byte càng tốt


4
Người giải quyết có thể quan tâm đến một công thức cho khuôn mặt thứ ba cho hai người kia.
xnor

@xnor và như vậy tôi nghĩ đó là một lập luận mạnh mẽ rằng câu hỏi này là trùng lặp
Chấn thương kỹ thuật số

1
Mặc dù tôi không biết nghệ thuật ASCII nào để vẽ một khối lập phương trong hình chiếu này. Tuy nhiên, với kích thước nhỏ, tôi không biết liệu người ta có thể làm tốt hơn việc mã hóa bằng các ngôn ngữ như Python hay không.
xnor


@xnor thực sự, thậm chí với một số chuỗi 7 và 8 char trong đó.
Jonathan Allan

Câu trả lời:


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

Kiểm tra nó trên ideone

Thuận tay phải (chuyển sang số ít bằng cách hoán đổi u*uvới l*ldòng cuối cùng)

Bị ràng buộc để đánh bại - nhưng chúng ta hãy thở dài xúc xắc - đặc biệt là vì tất cả những nỗ lực của tôi để đánh gôn ASCII ngoại trừ việc đi thô và sử dụng định dạng trường học cũ đều thất bại trong việc lưu byte;
- bất kỳ lời khuyên chơi gôn nào khác cho một n00b sẵn sàng đánh giá cao.


1
Bạn có thể tiết kiệm 1 byte bằng cách sử dụng from random import*c=choice.
acrolith

@daHugLenny - bây giờ tôi không thể bỏ lỡ khoảng trắng đó trước *; ta!
Jonathan Allan

1
Chào mừng đến với PPCG! Bài đăng đầu tiên rất hay!
GamrCorps

Cảm ơn @GamrCorps - Tôi đã có ý định làm một thời gian ... bây giờ tôi có đại diện Tôi có thể đăng một giải pháp có ý nghĩa cho một câu hỏi được bảo vệ ...: D
Jonathan Allan

2
Thay vì có 3 khoảng trắng và sau đó %d, sử dụng %4dthay thế và nó sẽ đệm đúng cách cho bạn. Bạn cũng có thể tận dụng nó cho các phần khác của khuôn.
Mực giá trị

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

Trong chương trình thử nghiệm

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

Giải trình

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. 

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

mà khi không có ý thức là:

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

Thuật toán

Hãy xem xét rằng tại mỗi 8 giao điểm góc của một khuôn, các giá trị khuôn mặt giao nhau được cố định nhưng có thể xuất hiện trong bất kỳ 3 góc quay nào. Ví dụ: trong khi nhìn xuống góc "1", "2", "3", khuôn có thể được xoay quanh một trục qua góc và ra góc đối diện, để hiển thị "1", "2" hoặc "3" trên đỉnh của nghệ thuật ASCII.

vmã cứng các mặt chết giao nhau ở mỗi góc, blà phần bù cho điểm bắt đầu của một góc ngẫu nhiên và olà điểm bắt đầu của phép quay trong dữ liệu góc. Nghệ thuật ASCII được ghi vào bàn điều khiển bằng console.logchuỗi định dạng.


Bạn có thể có thể cạo một vài byte bằng cách sử dụng `dấu ngoặc kép cho phép sử dụng các ký tự dòng mới thay vì phải viết \ntất cả thời gian.
Neil

@Neil đánh giá cao nhất, nó hoạt động tốt. Đồng thời xóa dấu vết';'
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 (trong Server Management Studio: Truy vấn - kết quả thành văn bản)

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

Lưu ý: bằng cách xóa phần in và phần khai báo - và xuất kết quả trực tiếp từ CHỌN. Tuy nhiên, điều đó sẽ không hoạt động trong fiddle

Vĩ cầm


Có lẽ bạn có thể thay đổi ABS(a^3*b-a*b^3)để tiết kiệm 4 byte? (Tôi không chắc chắn - dường như hoạt động trong câu đố, nhưng nó chỉ cho tôi một cuộn a, b, c = 5,1,3 nên tôi có thể bị nhầm lẫn)
Jonathan Allan

@Jonathan ALLan cảm ơn bạn đã bình luận của bạn. Số mũ được viết POWER (a, 3) bằng TSQL. ^ có một ý nghĩa khác
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);}

Gọi bằng cách sử dụng u();
lâu nhưng đó là một câu trả lời và tôi đã không trả lời trong một thời gian dài.


Thiếu một khoảng trắng ở phía trên bên trái của bài kiểm tra đầu ra trên ideone .
Jonathan Allan

a=()=>(0|Math.random()*6)+1;nên lưu 8
traktor53

3

Ruby, 150 byte

Tất cả các lạm dụng định dạng chuỗi !!!

Tín dụng cho công thức có được số cuối cùng được gửi tới @xnor tại đây .

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]

Không - tín dụng cho công thức được chuyển đến xnor
Jonathan Allan

@Jonathan ALLan cảm ơn vì đã chỉ cho tôi hướng tới khoản tín dụng phù hợp. Ở mức độ nào, cách tôi định dạng câu trả lời này là nhiều hơn những gì tôi đã nghĩ khi tôi nói rằng bạn có thể tận dụng định dạng chuỗi nhiều hơn để lợi thế của bạn để tiết kiệm byte.
Mực giá trị
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.