Zeichne Würfelergebnisse in ASCII

25

Zeigen Sie das zufällige Ergebnis eines Würfelwurfs in ASCII, wenn Sie einen würfelförmigen Würfel verwenden.

$ dice

sollte zu einem von führen

-----
|   |
| o |
|   |
-----

-----
|o  |
|   |
|  o|
-----

-----
|o  |
| o |
|  o|
-----

-----
|o o|
|   |
|o o|
-----

-----
|o o|
| o |
|o o|
-----

-----
|o o|
|o o|
|o o|
-----
Jonas Elfström
quelle
4
Sie haben die Metrik hier nicht definiert. Soll das ein Codegolf sein? Es lohnt sich immer, mögliche Aufgaben im Chat des Rätsellabors oder in der Sandbox auf Meta zu diskutieren, damit Sie diese Fragen beantworten können, bevor Sie live gehen.
dmckee
Sorry, ich dachte die Metrik ist immer die Anzahl der Zeichen? Danke, dass du mich auf den Chat und dann auf die Sandbox auf Meta hingewiesen hast. Wenn diese Frage flach auf den Kopf fällt, werde ich sie löschen. Ich hasse es, es jetzt zu tun, nur für den Fall, dass jemand bereits anfängt, daran zu arbeiten.
Jonas Elfström
Ah ... beachte den Site-Namen "Programming Puzzles and Code Golf" (und ja, ich dachte, es scannt auch anders herum besser). Sie werden auch Einzeiler , King-of-the-Hill-Turniere und Code-Challenges finden (alles andere, aber Sie müssen immer noch eine objektive Metrik für den Gewinn festlegen), daher ist es notwendig, die entsprechenden zu sagen und anzuwenden Etikett.
dmckee
13
Nach XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');ist ein richtiges Programm.
3.
9
Wenn Sie das ASCII-Art-Tag entfernen, kann ich meine 39char-Lösung print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art) anbieten .
Benutzer unbekannt

Antworten:

7

Golfscript, 56 Zeichen

"-"5*n"|":|"o "1/:&6rand:§1<=" "&§3<=|n|&§5<=]&§2%=1$-1%

Die Lösung kann hier getestet werden .

Ventero
quelle
25

Python, 112 110 Zeichen

from random import*
r=randrange(6)
C='o '
s='-----\n|'+C[r<1]+' '+C[r<3]+'|\n|'+C[r<5]
print s+C[r&1]+s[::-1]
Keith Randall
quelle
6
Diese Vergleiche im Array-Indexer sind absolut beeindruckend!
Jonas Elfström
2
Dito! Mir gefällt auch, wie Sie die Symmetrie des Würfels genutzt haben :)
System Down
Könnten Sie so etwas verwenden id(0)%7%6? Es wird keine einheitliche Verteilung sein, aber es ist deutlich kürzer ...
Nabb
@Nabb: das ist nicht sehr zufällig. Insbesondere ist es häufig von Lauf zu Lauf gleich, so dass es beim Erzeugen von zufälligen Würfeln nicht sehr nützlich wäre.
Keith Randall
11

Ruby 1.9, 80 84 Zeichen

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse
Ventero
quelle
Ich mochte die +s.reverse
Jonas Elfström
7

Windows PowerShell, 89 93 96 97 101 119 Zeichen

-join('-----
|{0} {1}|
|{2}{3}'-f'o '[$(!($x=random 6);$x-lt3;$x-ne5;$x%2)])[0..14+13..0]
Joey
quelle
5

Python, 109 Unicode-Zeichen

#coding:u8
print u"鱸헓ȅ᪮ԅ᪅餠☏汁끝鐸즪聗K糉툜㣹뫡燳闣≆뤀⩚".encode("u16")[2:].decode("zlib").split("\n\n")[id(list())%7-1]

Hinweis: Diese Funktion verwendet keine Zufallsfunktion, daher ist sie nicht so zufällig wie andere.

SIE
quelle
5

Perl, 74 Zeichen

Laufen Sie mit perl -M5.010.

$-=rand 6;$_="-----
|0 2|
|4";s/\d/$->$&?o:$"/ge;say$_,$-&1?$":o,~~reverse

(Beachten Sie, dass die Zeilenumbrüche in der Auflistung Teil der Zeichenfolge sind und nicht nur der Lesbarkeit halber eingefügt werden.)

Wenn Sie sich fragen, was zum Teufel die $->$Operation bewirkt, können die folgenden Lesehinweise hilfreich sein:

  • Die Variable $-schneidet den zugewiesenen Wert automatisch auf eine Ganzzahl ab.

  • Die Variable $"ist auf ein einzelnes Leerzeichen voreingestellt.

  • oist ein Barewort (darstellend "o").

Brot-Box
quelle
4

Zum ersten Mal Golfspieler

Python, 161 Zeichen

from random import*
n=randint(1,7)    
o,x='o '
a='-'*5
b=(x,o)[n>3]
d=(x,o)[n>5]
c=(x,o)[n>1]    
print a+'\n|'+c+x+b+'|\n|'+d+(x,o)[n%2]+d+'|\n|'+b+x+c+'|\n'+a
System aus
quelle
4

Common Lisp 170

(let*((r(random 6))(a "-----
|")(c "o")(d " ")(e "|
|")(f(concatenate 'string a(if(< r 1)d c)d(if(< r 3)d c)e(if(> r 4)c ))))(concatenate 'string f(if(evenp r)c d)(reverse f)))

Beachten Sie, dass die Zeilenumbrüche von Bedeutung sind. Im Gegensatz zu diesen albernen "modernen" Sprachen bevorzugt Common Lisp die Lesbarkeit gegenüber der Prägnanz. Wir haben also das umständliche Konstrukt "Verkettung" ... und keine prägnante Möglichkeit, auf ein Zeichen in einer Zeichenfolge zu verweisen.

Dr. Pain
quelle
4

JavaScript ( 169 168 141 137)

r=Math.random()*6|0;s='-----\n|'+(r>0?'o ':'  ')+(r>2?'o':' ')+'|\n|'+(r-5?' ':'o');alert(s+(r%2?' ':'o')+s.split('').reverse().join(''))

Sieht nicht ganz richtig in , alertweil es nicht Schrift mit fester Breite, aber sicher sein , es richtig ist , oder Test durch einen Emissions <pre>Tag und tun writeln:-)

Beweis: http://jsfiddle.net/d4YTn/3/ (funktioniert nur in JS 1.7-kompatiblen Browsern wie FF2 +)

Credits: Hacked MathTrick von @minitech und die Printlogik von @Keith.

Edit : Entferne den MathTrick von @minitech, weil er es tatsächlich länger gemacht hat :-)

Edit 2 : Speichern Sie 17 Zeichen. Leihen Sie sich einen Trick von @Keith aus, um die Würfelsymmetrie zu nutzen. Verwenden Sie den Trick, um die Umwandlung von Zufallszahlen in int zu vereinfachen.

Bearbeiten 3 : Entfernen 1+, um die Zufallszahl von 1-6 auf 0-5 zu verschieben und 2 Zeichen zu speichern. Infolgedessen kann ich auch r%2-1zu r%2weiteren 2 Zeichen wechseln und diese speichern.

Edit 4 : jsfiddle arbeitet wieder. Aktualisiert :-)

mellamokb
quelle
E4X! Und ich kann nicht glauben, dass Chrome es nicht unterstützt!
Ry
Heh, ich habe dich endlich geschlagen :)
Ry-
Jetzt zwei Charaktere mit deinem |0Trick :-)
Ry-
Es funktioniert in Chrome für mich.
pimvdb
4

JavaScript, 215 213 212 145 135

r=Math.random()*6|0;alert('-----\n|'+[r>2?'o o':r?'o  ':'   ',r%2?r>3?'o o':'   ':' o ',r>2?'o o':r?'  o':'   '].join('|\n|')+'|\n-----');

Beat mellamokb, aber ich habe meine ursprüngliche Lösung komplett geändert. Wenn Sie möchten, dass dies gut aussieht, verwenden Sie Google Chrome oder etwas anderes, und wechseln Sie alertzu console.logund voilà.

Bearbeiten: Mellamokbs | 0-Trick ausgeliehen, um einige Charaktere zu speichern.

Ry-
quelle
@minitech: Übrigens, dein M=MathTrick, den ich zu stehlen versucht habe, endet tatsächlich damit, dass er einen Charakter länger ist
mellamokb
@ Mellamokb: Ich weiß, ich dachte ursprünglich, dass ich es mehr verwenden würde ...
Ry-
@minitech: Sie können zwei Zeichen mit[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb
1
@ Mellamokb: Nein; sist ein Array. Ich werde neu starten und es erneut versuchen.
Ry
@minitech: Hier gehts nochmal :-) Entwicklung der besten Antwort durch Konkurrenz. Jetzt bin ich auf 137 gekommen, aber Sie können einen meiner Tricks ausleihen und möglicherweise 10 Zeichen sparen.
mellamokb
3

PHP 119 126 128 131 188 201 213 234 239

<?$c=($r=rand()%6)%2?$r>4?'o ':'  ':' o';$b=$r>0?$r<3?'o  ':'o o':'   ';echo$a="-----\n|$b|\n|$c",substr(strrev($a),1);
Oleg
quelle
Das Schließen ?>kann weggelassen werden, wodurch Sie 2 Zeichen sparen.
Ry
Sie können die Deklaration für inline setzen $rund ein anderes Zeichen speichern. Der Raum danach echokann auch weggelassen werden. Sie können auch die Initialisierung von inline setzen $aund gelangen auf 128. Wenn Sie Zeilenumbrüche direkt in die Zeichenfolge einfügen, anstatt sie mit einem \nEscapezeichen zu versehen, werden zwei weitere Zeichen gespeichert.
Joey
3

C - 215

#include <time.h>
#include <stdlib.h>
main(){char a[]=A,b[]=B,c=3,d=(srand(time(0)),rand()%6+1),e=d-2;if(d==1)a[5]=C;else{while(--e>-1)a[b[D[d-3]-48+e]-48]=C;a[0]=a[10]=C;}p(E);while(--c>-1)p("|%s|\n",a+c*4);p(E);}

Kompiliert mit:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c
user23241
quelle
1
Betrügt das irgendwie mit all diesen Flags auf der Kommandozeile? Ich verstehe das / DA / DB / DC-Ding nicht.
Mellamokb
Mein Compiler versteht den /DSchalter nicht ... Bitte betrügen Sie nicht, indem Sie zufällige Definitionen in den Kompilierungsbefehl einfügen.
FUZxxl
3

Python 133

import random as R
i=R.randint(1,6)
a='   ';b='0 0'
A='-----\n|'+((a,'0  ')[i>1],b)[i>3]+'|\n|'
print A+((a,' 0 ')[i%2],b)[i>5]+A[::-1]
0b1t
quelle
3

F # - 165 161 Zeichen

(System.Random()).Next 6|>fun x->[for y in[x>0;x%2=0;x>2;x=5]->if y then"o"else" "]|>fun[a;b;c;d]->printf"-----\n|%s %s|\n|%s%s%s|\n|%s %s|\n-----"a c d b d c a
nharren
quelle
3

Python 108 114 119 121 122 129

wtf! sieht aus wie 1. Lösung?! aber ich bin nicht ... Betrüger

108

import random as R
i=R.randint(1,6)
X=' 0'
A='-----\n|%s %s|\n|'%(X[i>1],X[i>3])+X[i>5]
print A+X[i%2]+A[::-1]

119

import random as R
i=R.randint(1,6)
X=' 0';a=X[i>5]
A='-----\n|%s %s|\n|%s|'%(X[i>1],X[i>3],a+X[i%2]+a)
print A+A[-6::-1]
0b1t
quelle
3

perl - 111 103 101

$n=int rand 6;
($t="-----\n|0 1|\n|232|\n|1 0|\n-----\n")=~s/(\d)/5639742>>6*$1>>$n&1?o:$"/eg;
die$t;
Swilliams
quelle
1
+1 für die Verwendung dieanstelle von print/say
mbx
3

APL (69)

5 5⍴(5⍴'-'),{⊃⍵↓' o|'}¨2,(⌽M),2,2,(N∊¨6(1 3 5)6),2,2,2,⍨M←3 6 1>⍨N←?6
Marinus
quelle
3

Haskell, 154 162 167 172 Zeichen

import System.Random
main=randomRIO(1::Int,6)>>=putStrLn. \x->let{h="-----\n|"++c(>1):' ':c(>3):"|\n|"++[c(>5)];c f|f x='o'|True=' '}in h++c odd:reverse h

Es verwendet ungefähr die gleiche Idee wie das Python.

Lesbare Version:

import System.Random

main = do
    x <- randomRIO (1 :: Int, 6)
    putStrLn (render x)

render x = str ++ check odd ++ reverse str
  where
    str = concat
        [ "-----\n|"
        , check (> 1)
        , " "
        , check (> 3)
        , "|\n|"
        , check (> 5)
        ]
    check f = if f x then "o" else " "
Lambda-Fee
quelle
3

Golfscript 80 65

6rand):^;'-'5*n+:_[^6&0^4&^6=].^1&+-1%+3/{'|'\{'o'' 'if+}/'|'n}/_

Das Programm kann hier getestet werden

Cristian Lupascu
quelle
2

PHP 126 127 179

<?$x=($r=rand(1,6))>3?"o o":($r<2?"   ":"o  ");$z=$r>5?"o o":($r%2==0?"   ":" o ");$v="-----\n|$x|\n";echo"$v|$z|".strrev($v);

Eine andere PHP-Lösung. Ich bin zu der fast gleichen Lösung von Oleg gekommen.

Alberto Fernández
quelle
2

Python (153)

Dies ist bei weitem nicht die kleinste Einreichung, ich dachte nur, es sah gut aus :)

import random as r
print"""-----
|%c %c|
|%c%c%c|
|%c %c|
-----"""%tuple(
r.choice([
"   o   ",
"o     o",
"o  o  o",
"oo   oo",
"oo o oo",
"ooo ooo"]))
quasimodo
quelle
2

Q (120 Zeichen)

dice:{(`t`e`l`c`r`w!5 cut"-----|   ||o  || o ||  o||o o|")(,/)(`t;(`e`c`e;`l`e`r;`l`c`r;`w`e`w;`w`c`w;`w`w`w)(*)1?6;`t)}

Verwendung:

dice[]
Skeevey
quelle
2

C, 168 164 163 Zeichen

Tut mir leid, wenn ich ein bisschen zu spät zur Party komme, aber da noch keine Antwort angenommen wurde und die einzige andere C-Lösung etwas länger war, geht es hier ...

#include<stdio.h>
main(){srand(time(0));char*o="O ",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf("-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n",i,j,k,o[r&1],k,j,i);}

Sie können das Include entfernen und weitere 18 Zeichen speichern, es wird dann jedoch nicht ohne Warnung kompiliert.

Bearbeiten :
Mit dem Befehlszeilentrick von user23241 ergibt der kürzeste C-Code (ohne Compiler-Warnungen) nur 12 Zeichen:

#include I
M

Zumindest, wenn Sie schummeln und die folgende Befehlszeile zum Kompilieren verwenden:

gcc -DI="<stdio.h>" -DM="main(){srand(time(0));char*o=\"O \",r=rand()%6,i=o[r<1],j=o[r<3],k=o[r<5];printf(\"-----\n|%c %c|\n|%c%c%c|\n|%c %c|\n-----\n\",i,j,k,o[r&1],k,j,i);}" dice.c -o dice
Herr Lister
quelle
2

c 140 Zeichen

r,i,s;main(){srand(time(i=0));r=rand()%6;for(s=-1;i-=s;)putchar("\n|   |-o"[i>5?i==8&&r||i==10&&2<r||i==14&&4<r||i==15&&(s=1)&~r?7:i%6:6]);}
Baby-Kaninchen
quelle
1

PHP: 1284

Dies ist mein zweiter CodeGolf und ich habe nicht so sehr auf Kürzheit als auf Code-Veränderbarkeit und Übereinstimmung mit den Spielekriterien geachtet.

Sie können sowohl 4-seitige als auch 6-seitige Würfel erzeugen.

Vielleicht werde ich es später kürzen und etwas dynamischer machen.

function draw_dice($numdice=1,$sides=4)
{
/* Verify acceptable parameters. */
if($sides<4){die("You must choose 4 sides or greater.");}
if($numdice<1){die("You must have at least one dice.");}
/* End verification */
$a=' ';
$b=' ';
$c=' ';
$d=' ';
$e=' ';
$f=' ';
$g=' ';
$h=' ';
$i=' ';
$j=' ';

switch($sides)
{
case $sides%2==0:
if($sides==4)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$j="o";
break;
case 3:
$b="o";
$g="o";
$j="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$j="o";
break;
}
echo "<div style='text-align:center;display:inline-block;'>";
echo " - <br/>";
echo "| |<br/>";
echo "|$a$b$c|<br/>";
echo "| $d$e$f |<br/>";
echo "|  $g$h$i$j  |<br/>";
echo "---------<br/>";
echo "</div>";

}

if($sides==6)
{
$ran=rand(1,$sides);
switch($ran)
{
case 1:
$e="o";
break;
case 2:
$a="o";
$i="o";
break;
case 3:
$a="o";
$i="o";
$e="o";
break;
case 4:
$a="o";
$c="o";
$g="o";
$i="o";
break;
case 5:
$a="o";
$c="o";
$g="o";
$i="o";
$e="o";
break;
case 6:
$a="o";
$c="o";
$d="o";
$f="o";
$g="o";
$i="o";
break;
}
echo "-----<br/>";
echo "|$a$b$c|<br/>";
echo "|$d$e$f|<br/>";
echo "|$g$h$i|<br/>";
echo "-----<br/>";
}

if($sides!==4&&$sides!==6)
{
die("Only 4 and 6 sided are supported at this time.");
}

break;

case $sides%2==1:
die("Must have even number of sides.");
break;
}

}

draw_dice(1,4);

Ausgang 4 seitig:

    - 
   | |
  |o o|
 |     |
|  o  o  |
---------

Ausgang 6 seitig:

-----
|o  |
| o |
|  o|
-----
Ereignishorizont
quelle
1

JavaScript 220 Bytes

r=(1+Math.random()*6|0).toString(2).split("").reverse();b=r[1];c=r[2];s=[[b|c,0,c],[b&c,1&r[0],b&c],[c,0,b|c]];"-----\n|"+s.map(function(v){return v.map(function(w){return w?"o":" "}).join("")}).join("|\n|")+"|\n-----";
Eikes
quelle
1

Ruby, 134 132 119 118 117 112 111 Zeichen,

Mein zweiter Golf im Leben. Ich habe magische Zahlen benutzt. Irgendwelche Ratschläge bitte?

r=?-*5+"
|"+((a=:ghklm[rand 6])?a.to_i(36).to_s(2).tr("10","o "):"    o").insert(3,"|
|")
$><<r+r[0,14].reverse

Ausgänge:

ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|   |
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|o o|
|o o|
|o o|
-----
ice@distantstar ~/virt % ruby ./golf.rb
-----
|   |
| o |
|   |
-----
ice@distantstar ~/virt % 
defhlt
quelle
1

VimScript - 169 Zeichen

Beachten Sie, dass dies kein reines Vim ist, da Vim keinen eingebauten Zufallszahlengenerator hat. Es gibt natürlich Erweiterungen, die dafür heruntergeladen werden können, aber da ich ein eingefleischter Linux-Mann bin, dachte ich mir, warum verlasse ich mich nicht stattdessen nur auf die Shell-Umgebung.

Code

norm5a-^[YPo|   |^[YPP
let x=system('echo $RANDOM')%6+1
if x<2
norm jllro
el
norm lrolljj.k
if x>3
norm k.hjj
en
if x>2
norm h.k
en
if x>5
norm .l
en
if x>4
norm l.
en
en

Erläuterung

  • Die erste Zeile generiert die "Box", die den Würfel darstellt.
  • Die zweite Zeile holt eine Zufallszahl aus der Umgebung und erzwingt mit modularer Arithmetik, dass sie eine gültige Zahl für einen Würfel ist.
  • Die verbleibenden Linien bewegen sich um die Formfläche und füllen die oFormflächen aus. Beachten Sie, dass dies für die geringste Anzahl von Zeichen optimiert werden soll, nicht für die geringste Anzahl von Bewegungen (dh, es gäbe schnellere Wege bei Tastenanschlägen, wenn ich es manuell machen würde - indem ich das mache)if alles in meinem Kopf).
  • Wie immer ^handelt es sich nicht um ein Literal, ^sondern um einen Hinweis auf eine Escape-Sequenz.

Testen

Wechseln Sie RANDOMzu DICEVALUE, speichern Sie den VimScript-Code in dice.vimund führen Sie dieses Shell-Skript darauf aus. Geben Sie als Argumente die Zahlen an, die Sie testen möchten:

#!/bin/sh
for DICEVALUE in $@; do
    export DICEVALUE
    vim -S dice.vim
done
Kazark
quelle
1

Mathematica 166 161 146 143 Zeichen

a="O  ";b=" O ";c="  O";d="   ";e="O O";RandomInteger@{1, 6}/.Thread@Rule[Range@6,{{d,b,d},{a,d,c},{a,b,c},{e,d,e},{e,b,e}, {e,e,e}}]//MatrixForm

Beispielausgabe:

fünf


Wenn die Matrix Klammern beleidigen, können Sie MatrixFormmit TableFormim Code ersetzen .

DavidC
quelle
1

PHP 5.4, 107 Bytes

<?$r=rand(1,6);$d=[' ','o'];$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

102 Bytes *

<?$r=rand(1,6);$d=' o';$o='+---+
|'.$d[$r>1].' '.$d[$r>3].'|
|'.$d[$r>5];echo$o.$d[$r%2].strrev($o);

** Leider gibt die 102-Byte-Version Hinweise aufgrund des Castings von boolto intbeim Indizieren des Strings $d. Ansonsten funktioniert es einwandfrei. *

Dan Lugg
quelle
Die Byteanzahl scheint 105 bzw. 100 zu sein.
12.
Ah, ich muss die Zeilenumbrüche berücksichtigt haben.
Dan Lugg