Результаты розыгрыша в кости в ASCII

25

Покажите случайный результат броска кубика, если он сделан с кубиком в форме ASCII.

$ dice

должен привести к одному из

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

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

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

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

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

-----
|o o|
|o o|
|o o|
-----
Йонас Эльфстрём
источник
4
Вы не определили метрику здесь. Это должен быть кодовый гольф? Всегда стоит обсудить возможные задачи в чате пазла или в песочнице на мета, чтобы вы могли ответить на такие вопросы, прежде чем начать работу.
dmckee
Извините, я думал, что метрика всегда является количеством символов? Спасибо, что указал мне на чат, а затем на песочницу мета. Если этот вопрос не сработает, я его удалю. Я ненавижу делать это прямо сейчас, на тот случай, если кто-то уже начал работать над этим.
Йонас Эльфстрем
Ах ... обратите внимание на название сайта "Программирование головоломок и кода гольфа" (и да, я думал, что оно сканируется лучше и наоборот). Вы также найдете остроты , король-оф-хилл турниры и кодовые вызовы (все остальное, но вы все еще должны установить объективную метрику для победы), поэтому необходимо сказать и применить соответствующий тег.
dmckee
13
Согласно XKCD № 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');это правильная программа.
JiminP
9
Если вы удалите тег ascii-art, я могу предложить свое решение 39char print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art).
пользователь неизвестен

Ответы:

25

Питон, 112 110 символов

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
Те сравнения в индексаторе массива полностью впечатляют!
Йонас Эльфстрем
2
То же самое! Мне нравится, как вы использовали симметрию кристалла :)
System Down
Не могли бы вы использовать что-то вроде id(0)%7%6? Это не будет равномерное распределение, но оно значительно короче ...
Набб
@Nabb: это не очень случайно. В частности, это часто одно и то же от бега к бегу, так что это не очень полезно для генерации случайных бросков костей.
Кит Рэндалл
11

Руби 1.9, 80 84 символов

z=" o";$><<(s=?-*5+"
|#{z[2/~a=rand(6)]} #{z[a/3]}|
|"+z[a/5])+z[~a%2]+s.reverse
Ventero
источник
Мне понравился +s.reverse
Jonas Elfström
7

Windows PowerShell, 89 93 96 97 101 119 символов

-join('-----
|{0} {1}|
|{2}{3}'-f'o '[$(!($x=random 6);$x-lt3;$x-ne5;$x%2)])[0..14+13..0]
детеныш
источник
5

Python, 109 символов Юникода

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

Примечание: здесь не используется случайная функция, поэтому она будет не такой случайной, как у других.

ТЫ
источник
5

Perl, 74 символа

Беги с perl -M5.010.

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

(Обратите внимание, что новые строки в листинге являются частью строки, а не просто вставлены для удобства чтения.)

Если вам интересно, что, черт возьми, $->$делает эта операция, вам могут помочь следующие заметки:

  • Переменная $-автоматически усекает присвоенное ей значение до целого числа.

  • Переменная $"предустановлена ​​на один пробел.

  • oэто голое слово (представляющее "o").

Хлебница
источник
4

Первый раз игрок в гольф

Питон, 161 символ

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

Обратите внимание, что новые строки являются значительными. В отличие от этих глупых «современных» языков, Common Lisp предпочитает удобочитаемость, а не краткость, поэтому мы имеем громоздкую конструкцию «concatenate 'string ...» и не имеем краткого способа ссылаться на символ в строке.

Доктор Пейн
источник
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(''))

Выглядит не совсем правильно, alertпотому что это не шрифт с фиксированной шириной, но будьте уверены, что он правильный, или протестируйте, выдав <pre>тег и выполнив writeln:-)

Доказательство: http://jsfiddle.net/d4YTn/3/ (работает только в JS 1.7-совместимых браузерах, таких как FF2 +)

Кредиты: Mathвзломанный трюк от @minitech и печать логики от @Keith.

Редактирование : Удалить Mathтрюк из @minitech , потому что он на самом деле сделал это больше :-)

Изменить 2 : сохранить 17 символов. Взять трюк от @Keith для использования симметрии костей. Используйте трюк для упрощения преобразования случайного числа в int.

Редактировать 3 : Удалить, 1+чтобы изменить случайное число от 1-6 до 0-5 и сохранить 2 символа. В результате, я могу также изменить , r%2-1чтобы r%2и сохранить еще 2 символов.

Редактировать 4 : jsfiddle снова работает. Обновлено :-)

mellamokb
источник
E4X! И я не могу поверить, что Chrome не поддержит это!
Ry-
Хех, я победил тебя наконец :)
Ry-
Два персонажа, теперь, используя ваш |0трюк :-)
Ry-
Это работает в 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-----');

Удар мелламокб, но я полностью изменил свое первоначальное решение. Если вы хотите, чтобы это выглядело хорошо, используйте Google Chrome или что-то еще, измените alertна console.logи вуаля.

Редактировать: заимствовал трюк mellamokb | 0, чтобы спасти некоторых персонажей.

Рыбаковым
источник
@minitech: Кстати, твой M=Mathтрюк, который я пытался украсть, на самом деле оказывается на один символ длиннее
mellamokb
@mellamokb: Я знаю, я первоначально думал, что буду использовать это больше ...
Ry-
@minitech: Вы можете сохранить два [s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
символа
1
@mellamokb: Нет; sэто массив. Я собираюсь перезагрузить и попробовать еще раз.
Ry-
@minitech: Здесь мы идем снова :-) Эволюция лучшего ответа конкурса. Сейчас у меня 137, но вы можете позаимствовать один из моих трюков и сэкономить, возможно, 10 символов.
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);
Олег
источник
Закрытие ?>может быть опущено, сохраняя вас 2 символа.
Ry-
Вы можете вставить объявление для $r, сохраняя другой символ. Пробел после echoможет быть также опущен. Вы можете встроить инициализацию $aтоже, доведя вас до 128. Помещение разрывов строк непосредственно в строку вместо их экранирования с \nсохранением еще двух символов.
Джои
3

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

Компилируется с:

cl /DA="\"   \0   \0   \"" /DB="\"5282582468\"" /DC='o' /DD="\"0136\"" /DE="\"+---+\n\"" /Dp=printf dice.c
user23241
источник
1
Это что-то вроде обмана со всеми этими флагами в командной строке? Я не понимаю это / DA / DB / DC .. вещь.
mellamokb
Мой компилятор не понимает /Dпереключателя ... Пожалуйста, не обманывайте, помещая случайные определения в команду компиляции.
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
источник
3

F # - 165 161 символов

(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
источник
3

Питон 108 114 119 121 122 129

WTF! выглядит как 1-е решение ?! но я не ... мошенник

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
источник
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
источник
1
+1 за использование dieвместо 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 символа

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

Он использует примерно ту же идею, что и Python.

Читаемая версия:

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 " "
Лямбда Фея
источник
3

Golfscript 80 65

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

Программу можно протестировать здесь

Кристиан Лупаску
источник
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);

Другое решение PHP. Я пришел почти к тому же решению от Олега.

Альберто Фернандес
источник
2

Питон (153)

Это далеко не самое маленькое представление, я просто думал, что это выглядело хорошо :)

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 символов)

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

Использование:

dice[]
skeevey
источник
2

C, 168 164 163 символа

Извините, если я немного опоздал на вечеринку, но так как ответ еще не был принят, и единственное другое решение C было несколько длиннее, здесь идет ...

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

Вы можете удалить include и сохранить еще 18 символов, но тогда он не скомпилируется без предупреждений.

Редактировать :
используя трюк командной строки user23241 , самый короткий код C, который дает результат (без предупреждений компилятора), составляет всего 12 символов:

#include I
M

По крайней мере, если вы читер и используете следующую командную строку для компиляции:

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

с, 140 символов

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

Это мой второй CodeGolf, и я на самом деле не стремился к краткости, так как изменчивость кода и соответствие игровым критериям.

Вы можете создавать 4-х сторонние кости, а также 6-ти сторонние.

Возможно, позже я укоротю его и сделаю немного более динамичным.

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

Выход 4-х сторонний:

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

Выход 6-ти сторонний:

-----
|o  |
| o |
|  o|
-----
Горизонт событий
источник
1

JavaScript 220 байт

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
источник
1

Рубин, 134 132 119 118 117 112 111 символов,

Мой второй гольф в жизни. Я использовал магические числа. Любые советы, пожалуйста?

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

Выходы:

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
источник
1

VimScript - 169 символов

Обратите внимание, что это не чистый Vim, поскольку Vim не имеет встроенного генератора случайных чисел. Конечно, для него можно скачать расширения, но, поскольку я - преданный Linux, я подумал, почему бы просто не полагаться на среду оболочки.

Код

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

объяснение

  • Первая строка генерирует «коробку», которая представляет матрицу.
  • Вторая строка выбирает случайное число из окружения и, используя модульную арифметику, заставляет его быть действительным числом для игры в кости.
  • Оставшиеся линии перемещаются по поверхности матрицы, заполняя ее o. Обратите внимание, что это должно быть оптимизировано для наименьшего количества символов, а не для наименьшего количества движений (то есть, если бы я делал это вручную, были бы более быстрые способы нажатия клавиш)if в моей голове).
  • Как всегда, ^это не литерал, ^а указание на escape-последовательность.

тестирование

Измените RANDOMна DICEVALUE, сохраните код VimScript dice.vim, затем запустите на нем этот сценарий оболочки, указав в качестве аргументов любые числа, которые вы хотите проверить:

#!/bin/sh
for DICEVALUE in $@; do
    export DICEVALUE
    vim -S dice.vim
done
Kazark
источник
1

Mathematica 166 161 146 143 символов

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

Пример вывода:

5


Если фигурные скобки матрицы обижать, вы можете заменить MatrixFormс TableFormв коде.

DavidC
источник
1

PHP 5.4, 107 байт

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

102 байта *

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

** К сожалению, 102-байтовая версия выдает уведомления из-за приведения boolк intпри индексации строки $d. Кроме этого, он отлично работает. *

Дэн Лугг
источник
Кажется, количество байтов составляет 105 и 100 соответственно.
12Me21
Ах, я, должно быть, учел новые строки.
Дэн Лугг