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

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:



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]

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

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]

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.


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


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

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.


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


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.


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

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

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]

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

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]

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;

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

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


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.


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

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

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

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

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

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

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 % 

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

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.


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. *


Liczba bajtów wydaje się wynosić odpowiednio 105 i 100.
12

Ach, musiałem uwzględnić nowe linie.
Dan Lugg,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.