Losuj wyniki kości w ASCII

25

Pokaż losowy wynik rzutu kostką, jeśli wykonano to kostką w kształcie kostki, w ASCII.

$ dice

powinien dać jeden z

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

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

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

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

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

-----
|o o|
|o o|
|o o|
-----
Jonas Elfström
źródło
4
Nie zdefiniowano tutaj metryki. Czy to ma być golf golfowy? Zawsze warto omawiać możliwe zadania na czacie w laboratorium logicznym lub piaskownicy na meta , abyś mógł odpowiedzieć na tego rodzaju pytania przed rozpoczęciem gry.
dmckee
Przepraszam, myślałem, że metryką jest zawsze liczba znaków? Dzięki za wskazanie mi czatu, a następnie piaskownicę na meta. Jeśli to pytanie padnie płasko na twarz, usunę je. Nienawidzę tego robić teraz, na wypadek, gdyby ktoś już nad tym pracował.
Jonas Elfström
Ach ... zwróć uwagę na nazwę strony „Programowanie zagadek i golfa kodowego” (i tak, myślałem, że skanowałem też lepiej na odwrót). Znajdziesz także linijki , turnieje króla wzgórza i wyzwania kodowe (wszystko inne, ale nadal powinieneś ustalić obiektywne wskaźniki wygranej), więc musisz powiedzieć i zastosować odpowiednie etykietka.
dmckee
13
Według xkcd nr 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');jest właściwy program.
JiminP
9
Jeśli usuniesz tag ascii-art, mogę zaoferować moje rozwiązanie 39char print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art).
użytkownik nieznany

Odpowiedzi:

7

Golfscript, 56 znaków

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

Rozwiązanie można przetestować tutaj .

Ventero
źródło
25

Python, 112 110 znaków

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
źródło
6
Te porównania w indeksatorze tablic są imponujące!
Jonas Elfström
2
Tak samo! Podoba mi się również to, jak wykorzystałeś symetrię kości :)
System Down
Czy możesz użyć czegoś takiego id(0)%7%6? Nie będzie to jednolita dystrybucja, ale znacznie krótsza ...
Nabb
@Nabb: to nie jest zbyt losowe. W szczególności jest to często takie same w różnych biegach, więc nie byłoby bardzo przydatne w generowaniu losowych rzutów kostką.
Keith Randall
11

Ruby 1.9, 80 84 znaków

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse
Ventero
źródło
Podobał mi się s.reverse
znak
7

Windows PowerShell, 89 93 96 97 101 119 znaków

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

Python, 109 znaków Unicode

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

Uwaga: Nie używa się funkcji losowej, więc nie będzie tak losowa jak inne.

TY
źródło
5

Perl, 74 znaki

Uruchom z perl -M5.010.

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

(Należy pamiętać, że nowe wiersze na liście są częścią ciągu, a nie tylko wstawiane dla czytelności).

Jeśli zastanawiasz się, co do cholery $->$robi operacja, pomocne mogą być następujące uwagi do czytania:

  • Zmienna $-automatycznie obcina przypisaną wartość do liczby całkowitej.

  • Zmienna $"jest wstępnie ustawiona na pojedynczą spację.

  • oto jedno słowo (reprezentujące "o").

chlebak
źródło
4

Pierwszy raz golfista

Python, 161 znaków

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 wyłączony
źródło
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)))

Zauważ, że nowe linie są znaczące. W przeciwieństwie do tych głupich „współczesnych” języków, Common Lisp preferuje czytelność nad zwięzłością, więc mamy nieporęczną konstrukcję „konkatenacji łańcucha” ... i nie ma zwięzłego sposobu odwoływania się do znaku w łańcuchu.

Dr. Pain
źródło
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(''))

Nie wygląda całkiem dobrze, alertponieważ nie jest to czcionka o stałej szerokości, ale zapewniamy, że jest poprawna, lub przetestuj, emitując <pre>znacznik i wykonując writeln:-)

Dowód: http://jsfiddle.net/d4YTn/3/ (działa tylko w przeglądarkach zgodnych z JS 1.7, takich jak FF2 +)

Kredyty: MathZhakowana sztuczka z @minitech i die logika drukowania z @Keith.

Edycja : Usuń Mathlewę z @minitech, ponieważ faktycznie wydłużyła ją :-)

Edycja 2 : Zapisz 17 znaków. Pożycz sztuczkę od @Keith za skorzystanie z symetrii kości. Użyj sztuczki, aby uprościć konwersję liczb losowych na int.

Edycja 3 : Usuń, 1+aby zmienić losową liczbę z 1-6 na 0-5 i zapisać 2 znaki. W rezultacie, można również zmieniać r%2-1się r%2i zaoszczędzić kolejne 2 znaki.

Edycja 4 : jsfiddle znów działa. Zaktualizowano :-)

mellamokb
źródło
E4X! I nie mogę uwierzyć, że Chrome go nie obsługuje!
Ry-
Hej, w końcu cię pokonałem :)
Ry-
Dwie postacie używają teraz swojej |0sztuczki :-)
Ry-
Dla mnie działa w Chrome.
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-----');

Pokonałem mellamokb, ale całkowicie zmieniłem swoje oryginalne rozwiązanie. Jeśli chcesz, aby wyglądał dobrze, użyj Google Chrome lub czegoś innego, zmień alertna console.logi voilà.

Edycja: sztuczka pożyczona przez mellamokb | 0 w celu uratowania niektórych postaci.

Ry-
źródło
@minitech: BTW, twoja M=Mathsztuczka, którą próbowałem ukraść, kończy się na tym, że jest jedną postacią dłużej
mellamokb
@mellamokb: Wiem, początkowo myślałem, że
użyję
@minitech: Możesz zapisać dwa znaki za pomocą[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb
1
@mellamokb: Nope; sjest tablicą. Uruchomię się ponownie i spróbuję ponownie.
Ry-
@minitech: Znowu zaczynamy :-) Ewolucja najlepszej odpowiedzi na podstawie konkurencji. Teraz jestem na poziomie 137, ale możesz pożyczyć jedną z moich lew i zaoszczędzić prawdopodobnie 10 znaków.
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
źródło
Zamknięcie ?>można pominąć, oszczędzając 2 znaki.
Ry-
Możesz wstawić deklarację dotyczącą $r, zapisując inną postać. echoMożna również pominąć miejsce po . Możesz także zainicjować inicjalizację $a, doprowadzając cię do 128. Umieszczenie podziałów linii bezpośrednio w łańcuchu zamiast ucieczki przed nimi za pomocą \nzapisuje kolejne dwa znaki.
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);}

Kompiluje się z:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c
użytkownik23241
źródło
1
Czy to trochę oszustwo z tymi wszystkimi flagami w wierszu poleceń? Nie rozumiem tego w / DA / DB / DC ..
mellamokb
Mój kompilator nie rozumie /Dprzełącznika ... Proszę nie oszukiwać, wprowadzając losowe definicje do polecenia kompilacji.
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
źródło
3

F # - 165 161 znaków

(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
źródło
3

Python 108 114 119 121 122 129

wtf! wygląda jak 1. rozwiązanie? ale nie jestem ... oszustem

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
źródło
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
źródło
1
+1 za użycie diezamiast 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
źródło
3

Haskell, 154 162 167 172 znaków

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

Używa mniej więcej tego samego pomysłu co Python.

Wersja do odczytu:

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 Fairy
źródło
3

Golfscript 80 65

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

Program można przetestować tutaj

Cristian Lupascu
źródło
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);

Kolejne rozwiązanie PHP. Doszedłem do prawie tego samego rozwiązania Olega.

Alberto Fernández
źródło
2

Python (153)

To zdecydowanie nie najmniejsze zgłoszenie, pomyślałem, że ładnie wygląda :)

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
źródło
2

Q (120 znaków)

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

Stosowanie:

dice[]
skeevey
źródło
2

DO, 168 164 163 znaki

Przepraszam, jeśli jestem trochę spóźniony na imprezę, ale ponieważ żadna odpowiedź nie została jeszcze zaakceptowana, a jedyne inne rozwiązanie C było nieco dłuższe, oto idzie ...

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

Możesz usunąć dołączenie i zapisać kolejne 18 znaków, ale wtedy nie skompiluje się bez ostrzeżeń.

Edycja :
przy użyciu sztuczki wiersza poleceń użytkownika23241 najkrótszy kod C, który daje wynik (bez ostrzeżeń kompilatora), ma tylko 12 znaków:

#include I
M

Przynajmniej jeśli oszukujesz i używasz następującego wiersza poleceń do kompilacji:

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
Pan Lister
źródło
2

c, 140 znaków

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]);}
króliczek
źródło
1

PHP: 1284

To mój drugi CodeGolf i tak naprawdę nie dążyłem tak krótko, jak zmienność kodu i dopasowanie kryteriów gry.

Możesz generować 4-stronne kości, a także 6-stronne.

Może później skrócę go i sprawię, że będzie trochę bardziej dynamiczny.

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

Wyjście 4-stronne:

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

Wyjście 6-stronne:

-----
|o  |
| o |
|  o|
-----
Horyzont zdarzeń
źródło
1

JavaScript 220 bajtów

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
źródło
1

Ruby, 134 132 119 118 117 112 111 znaków,

Mój drugi golf w życiu. Użyłem magicznych liczb. Wszelkie porady proszę?

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

Wyjścia:

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
źródło
1

VimScript - 169 znaków

Zauważ, że to nie jest czysty Vim, ponieważ Vim nie ma wbudowanego generatora liczb losowych. Są oczywiście rozszerzenia, które można pobrać, ale skoro jestem zagorzałym człowiekiem z Linuksa, pomyślałem, dlaczego zamiast tego polegać na środowisku powłoki.

Kod

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

Wyjaśnienie

  • Generatory pierwszego wiersza generują „pole”, które reprezentuje matrycę.
  • Druga linia pobiera losową liczbę ze środowiska, a użycie modułowej arytmetyki zmusza ją do uzyskania prawidłowej liczby kości.
  • Pozostałe linie przesuwają się wokół powierzchni matrycy, wypełniając olitery. Zauważ, że ma to być zoptymalizowane pod kątem najmniejszej liczby znaków, a nie najmniejszej liczby ruchów (tj. Byłyby szybsze sposoby na zmianę sekwencji klawiszy, gdybym robił to ręcznie -if wszystko w mojej głowie).
  • Jak zawsze ^nie jest to dosłowne, ^ale wskazanie sekwencji ucieczki.

Testowanie

Zmień RANDOMna DICEVALUE, zapisz kod VimScript w dice.vim, a następnie uruchom na nim ten skrypt powłoki, podając jako argumenty dowolne liczby, które chcesz przetestować:

#!/bin/sh
for DICEVALUE in $@; do
    export DICEVALUE
    vim -S dice.vim
done
Kazark
źródło
1

Mathematica 166 161 146 143 znaków

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

Przykładowe dane wyjściowe:

pięć


Jeśli szelki matrix obrazić, można wymienić MatrixFormze TableFormw kodzie.

DavidC
źródło
1

PHP 5.4, 107 bajtów

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

102 bajty *

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

** Niestety, wersja 102-bajtowa wydaje powiadomienia z powodu rzutowania boolna intpodczas indeksowania łańcucha $d. Poza tym działa dobrze. *

Dan Lugg
źródło
Liczba bajtów wydaje się wynosić odpowiednio 105 i 100.
12
Ach, musiałem uwzględnić nowe linie.
Dan Lugg,