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.