Lancia un dado ASCII


16

In questa sfida di , devi produrre un'arte ascii di un tiro di dado casuale.

come questo:

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

Si prega di notare che:

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

è un output non valido, perché questo non è un possibile risultato su un dado

Ci sono 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 possibilità di tiri di dado.

Il tuo programma deve generare uno di questi tiri di dado sotto forma di arte ascii (modellato come quello sotto, con xy e zs sostituiti con numeri) come sopra, con ogni uscita con> 0 probabilità di accadere, ma le probabilità non lo fanno devono essere pari (sono autorizzati a giocare a dadi, a differenza della vita reale). Il tuo programma non può generare un tiro di dado non valido o un tiro di non dado. Il tuo programma deve avere una probabilità di 1 di lanciare un tiro valido

Nota che il tuo dado non deve necessariamente essere un dado destro come mostrato nella prima immagine. (destra e sinistra descrivono la rete del 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 il tuo dado è mancino, quanto segue è un risultato valido, ma non se il tuo dado è mancino:

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

Mentre puoi scegliere la mano sinistra o la mano destra, il tuo dado deve essere coerente: non può cambiare da sinistra a destra o viceversa

di seguito è riportato un elenco di output validi per il dado. Fare riferimento alle immagini sopra per le posizioni di 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

di nuovo questo è , quindi meno byte è meglio


4
I solutori potrebbero essere interessati a una formula per la terza faccia del dado dati gli altri due.
xnor

@xnor e come tale penso che sia una forte argomentazione secondo cui questa domanda è un duplicato
Digital Trauma

1
Non so però di alcuna arte ASCII per disegnare un cubo in questa proiezione. Con le piccole dimensioni, però, non so se si possa fare di meglio dell'hardcoding in linguaggi come Python.
xnor


@xnor in effetti, anche con alcune sequenze di 7 e 8 caratteri.
Jonathan Allan,

Risposte:


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

Provalo su ideone

Destro (passare a un mancino scambiando u*ucon l*lsull'ultima riga)

Vincolato a essere battuto - ma facciamo sospirare i dadi tirando i dadi - specialmente dal momento che tutti i miei tentativi di giocare a golf con l'ASCII tranne quello di diventare grezzi e usando la formattazione della vecchia scuola non sono riusciti a salvare byte;
- ulteriori suggerimenti sul golf per un n00b volentieri apprezzato.


1
È possibile salvare 1 byte utilizzando from random import*e c=choice.
acrolith

@daHugLenny - ora non potevo perdere quello spazio bianco prima del *; ta!
Jonathan Allan,

1
Benvenuti in PPCG! Bel primo post!
GamrCorps il

Grazie @GamrCorps - Ho intenzione di fare un po 'di tempo ... ora ho un rappresentante che posso pubblicare una soluzione significativa su una domanda protetta ...: D
Jonathan Allan

2
Invece di avere 3 spazi e poi %d, usa %4dinvece e lo riempirà correttamente per te. Potresti essere in grado di sfruttarlo anche per altre parti del 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);}

Nel programma di test

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

Spiegazione

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

che quando è non golfato è:

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

Considerare che in ciascuna delle 8 intersezioni angolari di un dado, i valori della faccia dello stampo che si intersecano sono fissi ma possono apparire in una delle 3 rotazioni. Ad esempio, guardando l'angolo "1", "2", "3", il dado può essere ruotato attorno ad un asse attraverso l'angolo e fuori dall'angolo opposto, per mostrare "1", "2" o "3" in cima all'arte ASCII.

vcodifica le facce del dado che si intersecano in ciascun angolo, bè un offset rispetto all'inizio di un angolo casuale ed oè l'inizio della rotazione all'interno dei dati dell'angolo. L'arte ASCII viene scritta sulla console usando una console.logstringa di formato.


Probabilmente puoi radere qualche byte usando le `virgolette che consentono l'uso di caratteri letterali di nuova riga invece di dover scrivere \ntutto il tempo.
Neil,

@Neil più apprezzato, ha funzionato bene. Rimosso anche il 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 (in Server Management Studio: query - risultato in testo)

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: rimuovendo la stampa e la parte dichiarata - e producendo il risultato direttamente da SELEZIONA. Tuttavia, ciò non funzionerebbe nel violino

Violino


Forse puoi passare a ABS(a^3*b-a*b^3)per salvare 4 byte? (Non sono sicuro - sembra funzionare nel violino, ma mi dà sempre e solo un singolo tiro di a, b, c = 5,1,3, quindi potrei sbagliarmi)
Jonathan Allan,

@JonathanAllan grazie per il tuo commento. Esponenziale è scritto POWER (a, 3) in TSQL. ^ ha un significato diverso
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);}

Chiama usando u();
È lungo ma è una risposta e non rispondo da molto tempo.


Manca uno spazio in alto a sinistra del test di output su ideone .
Jonathan Allan,

a=()=>(0|Math.random()*6)+1;dovrebbe salvare 8
traktor53

3

Rubino, 150 byte

Tutti gli abusi di formattazione delle stringhe !!!

Il credito per la formula che ottiene l'ultimo numero va a @xnor qui .

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]

No - il credito per la formula va a xnor
Jonathan Allan l'

@JonathanAllan grazie per avermi indicato il merito. Ad ogni modo, il modo in cui ho formattato questa risposta era più ciò che avevo in mente quando dicevo che probabilmente avresti potuto sfruttare maggiormente la formattazione delle stringhe a tuo vantaggio per risparmiare byte.
Value Ink
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.