Бросить кубик ASCII


16

В этом соревновании по вы должны вывести ascii-искусство случайного броска кубика.

как это:

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

Обратите внимание, что:

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

неверный вывод, потому что это не является возможным результатом на кристалле

Существует 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 возможности бросков кубика.

Ваша программа должна вывести один из этих бросков кубика в форме ascii art (смоделированной как показано ниже, с xy и zs замененными числами), как выше, с каждым выходом, имеющим> 0 вероятности возникновения, но вероятности не должны быть четными (они могут быть игральными кубиками, в отличие от реальной жизни). Ваша программа не может вывести неверный бросок кубика или бросок кубика. Ваша программа должна иметь вероятность 1 вывода правильного броска

Пожалуйста, обратите внимание, что ваш кубик не обязательно должен быть кубом с правшей, как показано на первом изображении. (правша и левша описывают сеть кубика)

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

Если ваш кубик левша, следующий вывод действителен, но не если ваш кубик правша:

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

Несмотря на то, что вы можете выбрать левую или правую руку, ваш кубик должен быть последовательным: он не может меняться слева направо или наоборот

Ниже приведен список допустимых выходов для штампа. Обратитесь к рисункам выше для позиций 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

опять же, это , поэтому чем меньше байтов, тем лучше


4
Решатели могут быть заинтересованы в формуле для третьего лица с учетом двух других.
xnor

@xnor и как таковой, я думаю, что это сильный аргумент, что этот вопрос является дубликатом
Digital Trauma

1
Я не знаю ни одного искусства ASCII, чтобы нарисовать куб в этой проекции. С таким небольшим размером я не знаю, можно ли добиться большего успеха, чем жесткое кодирование в таких языках, как Python.
xnor


@xnor действительно, даже с некоторыми последовательностями из 7 и 8 символов.
Джонатан Аллан

Ответы:


8

Python 3, 197 196 192 байта

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

Проверьте это на Ideone

Правша (переключиться на левшу, поменяв местами u*uс l*lпоследней строки)

Обязан быть побежденным - но давайте сделаем вздох в кости - тем более, что все мои попытки сыграть в ASCII, за исключением того, что я использовал сырье и форматирование старой школы, не смогли сохранить байты;
- Любые дальнейшие советы по игре в гольф для n00b с удовольствием приветствуются.


1
Вы можете сохранить 1 байт, используя from random import*и c=choice.
Акролит

@daHugLenny - теперь я мог пропустить этот пробел перед *; та!
Джонатан Аллан

1
Добро пожаловать в PPCG! Хороший первый пост!
GamrCorps

Спасибо @GamrCorps - я собирался сделать что-то какое-то время ... теперь у меня есть репутация, я могу опубликовать содержательное решение по защищенному вопросу ...: D
Джонатан Аллан

2
Вместо того, чтобы иметь 3 пробела, а затем %d, используйте %4dвместо этого, и это будет правильно заполнить его для вас. Возможно, вы сможете использовать его и для других частей матрицы.
стоимость чернил

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

В тестовой программе

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

объяснение

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 байт

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

Который, когда безголовый это:

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

Алгоритм

Учтите, что на каждом из 8 угловых пересечений матрицы, пересекающиеся номиналы матрицы фиксированы, но могут появляться в любом из 3 поворотов. Например, смотря вниз на угол «1», «2», «3», матрицу можно повернуть вокруг оси через угол и выйти из противоположного угла, чтобы показать «1», «2» или «3». на вершине ASCII искусства.

vЖесткие коды граней матрицы, которые пересекаются в каждом углу, bявляются смещением к началу случайного угла и oначалом поворота в данных угла. Искусство ASCII записывается в консоль с использованием console.logстроки формата.


Вероятно, вы можете сократить несколько байтов, используя `кавычки, которые позволяют использовать буквенные символы новой строки вместо необходимости писать \nвсе время.
Нил

@ Нил больше всего ценил, он работал хорошо. Также удален трейлинг';'
traktor53

4

TSQL 308 байт

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 байт (в Server Management Studio: запрос - результат в текст)

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

Примечание: удалив отпечаток и часть объявления - и выведите результат непосредственно из SELECT. Однако это не будет работать в скрипке

скрипка


Может быть, вы можете изменить, ABS(a^3*b-a*b^3)чтобы сохранить 4 байта? (Я не уверен - кажется, работает на скрипке, но он дает мне только один бросок a, b, c = 5,1,3, так что я могу ошибаться)
Джонатан Аллан

@JonathanAllan спасибо за ваш комментарий. Экспоненциальный написано POWER (a, 3) в TSQL. ^ имеет другое значение
t-clausen.dk

4

Javascript, 251 байт

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

Звонок с использованием u();
Это долго, но это ответ, и я не отвечал в течение длительного времени.


Отсутствует пробел в верхнем левом углу выходного теста на ideone .
Джонатан Аллан

a=()=>(0|Math.random()*6)+1;должен спасти 8
traktor53

3

Рубин, 150 байт

Все злоупотребления форматированием строки !!!

Кредит на получение формулы для получения последнего номера идет на @xnor здесь .

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]

Нет - кредит за формулу достается xnor
Джонатан Аллан

@JonathanAllan спасибо, что указали мне на правильный кредит. Во всяком случае, то, как я отформатировал этот ответ, было в большей степени тем, что я имел в виду, когда сказал, что вы, возможно, сможете использовать строковое форматирование в своих интересах для экономии байтов.
Чернила стоимости
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.