Role um dado ASCII

16

Neste desafio do , você deve produzir uma arte ascii de um dado aleatório.

como isso:

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

Observe que:

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

é saída inválida, porque esse não é um resultado possível em um dado

Existem 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 possibilidades de rolagens.

Seu programa deve gerar um desses rolos de matriz na forma de uma arte ascii (modelada como a abaixo, com os xy e zs substituídos por números) como acima, com cada saída com probabilidade> 0 de ocorrer, mas as probabilidades não tem que ser par (eles podem ser dados de truque, diferente da vida real). Seu programa não pode gerar um rolo de matriz inválido ou um rolo de matriz não. Seu programa deve ter uma probabilidade de 1 de gerar um rolo válido

Observe que seu dado não precisa necessariamente ser um dado destro, como mostrado na primeira imagem. (destro e canhoto descrevem a rede do dado)

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

Se o seu dado for canhoto, o resultado é válido, mas não se o seu dado for destro:

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

Embora você possa escolher canhoto ou destro, seu dado deve ser consistente: ele não pode mudar da esquerda para a direita ou vice-versa

A seguir, é apresentada uma lista de saídas válidas para o dado. Consulte as figuras acima para posições de 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

novamente, isso é , então menos bytes é melhor

Limão destrutível
fonte
4
Os solventes podem estar interessados ​​em uma fórmula para a terceira face da matriz, dadas as outras duas.
Xnor
@xnor e, como tal, eu acho que é um forte argumento que esta questão é uma duplicata
Trauma Digital
1
Não conheço nenhuma arte ASCII para desenhar um cubo nesta projeção. Porém, com o tamanho pequeno, não sei se é possível fazer melhor do que codificar em idiomas como Python.
Xnor
@ xnor de fato, mesmo com algumas sequências de 7 e 8 caracteres.
Jonathan Allan

Respostas:

8

Python 3, 197196192 bytes

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

Teste em ideone

Destro (alterne para um canhoto trocando u*ucom l*lna última linha)

É imbatível - mas vamos dar um suspiro aos dados - especialmente porque todas as minhas tentativas de jogar golfe no ASCII, exceto ficarem cruas e usar a formatação da velha escola, falharam em salvar bytes;
- quaisquer outras dicas de golfe para um n00b apreciadas com prazer.

Jonathan Allan
fonte
1
Você pode salvar 1 byte usando from random import*e c=choice.
Acrolith
@daHugLenny - agora não podia perder esse espaço em branco antes da *; ta!
Jonathan Allan
1
Bem-vindo ao PPCG! Bom primeiro post!
GamrCorps
Graças @GamrCorps - Tenho sido significado para fazer algum por um tempo ... agora eu tenho rep posso postar uma solução significativa sobre uma questão protegida ...: D
Jonathan Allan
2
Em vez de ter três espaços e %d, em seguida , use-o %4de ele será preenchido adequadamente para você. Você também pode aproveitá-lo para outras partes do dado.
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);}

No programa de teste

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

Explicação

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

Javascript 238 232 207 201 bytes

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

que quando não-golpeado é:

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

Algoritmo

Considere que em cada uma das 8 interseções de canto de uma matriz, os valores de face da matriz são fixos, mas podem aparecer em qualquer uma das três rotações. Por exemplo, enquanto olha para o canto "1", "2", "3", a matriz pode ser girada em torno de um eixo através do canto e sair pelo canto oposto, para mostrar "1", "2" ou "3" sobre o art. ASCII.

vcodifica as faces da matriz que se cruzam em cada canto, bé um deslocamento para o início de um canto aleatório e oé o início da rotação nos dados do canto. A arte ASCII é gravada no console usando uma console.logstring de formato.

traktor53
fonte
Provavelmente, você pode economizar alguns bytes usando `aspas que permitem o uso de caracteres literais de nova linha, em vez de precisar escrever \no tempo todo.
Neil
@ Neil mais apreciado, funcionou bem. Também removido o arrasto';'
traktor53
4

TSQL 308 bytes

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 bytes (no Server Management Studio: Consulta - resultado em texto)

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

Nota: removendo a impressão e a parte declarada - e envie o resultado diretamente do SELECT. No entanto, isso não funcionaria no violino

Violino

t-clausen.dk
fonte
Talvez você possa mudar ABS(a^3*b-a*b^3)para salvar 4 bytes? (Não tenho certeza - parece trabalho no violino, mas é sempre apenas me dando um único rolo de a, b, c = 5,1,3 para que eu possa estar enganado)
Jonathan Allan
@ JonathanAllan obrigado por seu comentário. Exponencial é escrito POWER (a, 3) em TSQL. ^ Tem um significado diferente
t-clausen.dk
4

Javascript, 251 bytes

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

Ligue usando u();
É longo, mas é uma resposta, e eu não respondo há muito tempo.

Bald Bantha
fonte
Falta um espaço na parte superior esquerda do teste de saída em ideone .
Jonathan Allan
a=()=>(0|Math.random()*6)+1;deve salvar 8
traktor53 08/08
3

Ruby, 150 bytes

Todo o abuso de formatação de string !!!

O crédito pela fórmula que obtém o último número vai para @xnor aqui .

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]
Value Ink
fonte
Não - de crédito para a fórmula vai para xnor
Jonathan Allan
@ JonathanAllan obrigado por me indicar o crédito adequado. De qualquer forma, como eu formatei essa resposta era mais o que eu tinha em mente quando disse que você provavelmente poderia aproveitar a formatação de strings mais a seu favor para economizar bytes.
Value Ink