Wirf einen ASCII-Würfel


16

In dieser Herausforderung müssen Sie eine Ascii-Kunst eines zufälligen Würfelwurfs ausgeben.

so was:

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

Bitte beachte, dass:

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

ist eine ungültige Ausgabe, da dies kein mögliches Ergebnis für einen Würfel ist

Es gibt 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 Möglichkeiten der Würfelwürfe.

Ihr Programm muss einen dieser Würfelwürfe in Form einer ASCII-Grafik (modelliert wie im Folgenden, wobei xy und zs durch Zahlen ersetzt werden) wie oben ausgeben, wobei jede Ausgabe mit einer Wahrscheinlichkeit von> 0 auftritt, die Wahrscheinlichkeiten jedoch nicht müssen gerade sein (sie dürfen, anders als im wirklichen Leben, Stichwürfel sein). Ihr Programm kann keinen ungültigen Würfelwurf oder keinen Nicht-Würfelwurf ausgeben. Ihr Programm muss mit einer Wahrscheinlichkeit von 1 eine gültige Rolle ausgeben

Bitte beachten Sie, dass Ihr Würfel nicht unbedingt ein rechtshändiger Würfel sein muss, wie im ersten Bild gezeigt. (Rechts- und Linkshänder beschreiben das Würfelnetz)

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

Wenn Ihr Würfel linkshändig ist, ist das Folgende eine gültige Ausgabe, aber nicht, wenn Ihr Würfel rechtshändig ist:

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

Während Sie zwischen Linkshändern und Rechtshändern wählen können, muss Ihr Würfel konsistent sein: Er kann nicht von links nach rechts oder umgekehrt wechseln

Das Folgende ist eine Liste der gültigen Ausgaben für den Chip. Beziehen Sie sich auf die Bilder oben für Positionen von 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

Auch dies ist , also ist weniger Byte besser


4
Solver könnten an einer Formel für die dritte Würfelfläche interessiert sein, wenn die anderen beiden gegeben sind.
xnor

@xnor und als solches denke ich, dass das ein starkes Argument ist, dass diese Frage ein Duplikat ist
Digitales Trauma

1
Ich kenne allerdings keine ASCII-Kunst, um einen Würfel in diese Projektion zu zeichnen. Bei der geringen Größe weiß ich allerdings nicht, ob man es besser kann, als in Sprachen wie Python hart zu codieren.
xnor


@xnor in der Tat, sogar mit einigen 7- und 8-Zeichen-Sequenzen.
Jonathan Allan

Antworten:


8

Python 3, 197 196 192 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 es auf ideone

Rechtshändiger (Schalter auf einen Linkshänder durch Vertauschen u*umit l*lin der letzten Zeile)

Bound to be beat - aber lassen Sie uns die Würfel rollen Seufzer - vor allem, da alle meine Versuche, das ASCII zu spielen, außer roh zu werden und Old-School-Formatierung zu verwenden, fehlgeschlagen sind, um Bytes zu sparen;
- weitere Golftipps für ein n00b werden gerne entgegengenommen.


1
Mit from random import*und können Sie 1 Byte speichern c=choice.
Acrolith

@daHugLenny - konnte ich diesen Leerraum vor dem nicht jetzt verfehlen *; ta!
Jonathan Allan

1
Willkommen bei PPCG! Schöner erster Beitrag!
GamrCorps

Danke @GamrCorps - Ich habe vor, einige für eine Weile zu tun ... jetzt habe ich rep Ich kann eine sinnvolle Lösung auf einer geschützten Frage posten ...: D
Jonathan Allan

2
%dVerwenden Sie %4dstatt 3 Leerzeichen stattdessen und es wird es ordnungsgemäß für Sie auffüllen. Möglicherweise können Sie es auch für andere Teile des Würfels einsetzen.
Wert Tinte

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

Im Testprogramm

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

Erläuterung

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

was, wenn ungolfed ist:

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

Algorithmus

Berücksichtigen Sie, dass an jedem der 8 Eckkreuzungspunkte eines Stempels die Schnittflächenwerte des Stempels fest sind, aber in einer von 3 Umdrehungen auftreten können. Wenn Sie beispielsweise auf die "1" -, "2" -, "3" -Ecke blicken, können Sie die Matrize um eine Achse durch die Ecke und aus der gegenüberliegenden Ecke heraus drehen, um "1", "2" oder "3" anzuzeigen. über der ASCII-Kunst.

vHartcodierung der Formflächen, die sich an jeder Ecke schneiden, bist ein Versatz zum Beginn einer zufälligen Ecke und oist der Beginn der Drehung innerhalb der Eckendaten. Die ASCII-Grafik wird mithilfe einer console.logFormatzeichenfolge in die Konsole geschrieben .


Sie können wahrscheinlich ein paar Bytes rasieren, indem Sie `Anführungszeichen verwenden, die die Verwendung von wörtlichen Zeilenumbrüchen ermöglichen, anstatt ständig schreiben zu müssen \n.
Neil

@Neil am meisten geschätzt, es hat gut funktioniert. Ebenfalls entfernt wurde der trailing';'
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 Byte (in Server Management Studio: Abfrage - Ergebnis in Text)

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

Hinweis: Entfernen Sie den Ausdruck und den Deklarationsteil und geben Sie das Ergebnis direkt aus SELECT aus. Allerdings würde das bei der Geige nicht funktionieren

Geige


Vielleicht können Sie ändern ABS(a^3*b-a*b^3), um 4 Bytes zu sparen? (Ich bin nicht sicher - scheint in der Geige zu arbeiten, aber es gibt mir immer nur eine einzige Rolle von a, b, c = 5,1,3, damit ich mich irre.)
Jonathan Allan

@ JonathanAllan vielen Dank für Ihren Kommentar. Exponential heißt in TSQL POWER (a, 3). ^ hat eine andere Bedeutung
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);}

Anrufen mit u();
Es ist lang, aber es ist eine Antwort, und ich habe lange nicht geantwortet.


Fehlendes Leerzeichen oben links im Ausgabetest für ideone .
Jonathan Allan

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

3

Ruby, 150 Bytes

Missbrauch der String-Formatierung !!!

Kredit für Formel , um die letzte Zahl zu erhalten geht an @xnor hier .

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]

Keine Gutschrift für Formel geht an xnor
Jonathan Allan

@JonathanAllan, danke, dass du mir den richtigen Kredit gegeben hast. Wie ich diese Antwort formatierte, war jedenfalls mehr das, was ich gedacht hatte, als ich sagte, dass Sie die Formatierung von Zeichenfolgen zu Ihrem Vorteil nutzen könnten, um Bytes zu sparen.
Value Ink
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.