Покатайте ASCII штампу


16

У цьому виклику з ви повинні вивести мистецтво випадкового рулону.

подобається це:

   ________
  /\       \
 /  \   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 (за зразком, подібного до наведеного нижче, з 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

С, 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.
Ніл

@Neil найбільше оцінив, він працював добре. Також вилучено трейлінг';'
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 байт (у студії управління сервером: Запит - результат до тексту)

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.