Малюйте кістки результатами в 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
Дітто! Мені подобається, як ти використовував симетрію штампу :)
Система вниз

Чи можете ви скористатися чимось подібним id(0)%7%6? Це не буде рівномірним розподілом, але значно коротше ...
Набб

@Nabb: це не дуже випадково. Зокрема, це часто одне і те ж саме від запуску до запуску, тому це не буде дуже корисно при створенні випадкових рулонів кісток.
Кіт Рендалл


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

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

Примітка: для цього не використовується випадкова функція, тому вона буде не такою випадковою, як це роблять інші.


5

Перл, 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

Лист звичайний 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 працює знову. Оновлено :-)


E4X! І я не можу вірити, що Chrome не підтримає це!
Ри-

Хе, я тебе остаточно побив :)
Ри-

Два персонажі, використовуючи ваш |0трюк :-)
Ри-

Для мене це працює в 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-----');

Збийте mellamokb, але я змінив своє початкове рішення повністю. Якщо ви хочете, щоб це виглядало добре, використовуйте Google Chrome або щось подібне, перейдіть alertна console.logі voilà.

Редагувати: трюк mellamokb | 0 для збереження деяких символів.


@minitech: До речі, ваш M=Mathтрюк, який я намагався вкрасти, закінчується тим, що довший на
mellamokb

@mellamokb: Я знаю, спочатку я думав, що скористаюсь цим більше ...
Ри-

@minitech: Ви можете зберегти два символи за допомогою[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

1
@mellamokb: Nope; s- це масив. Я збираюся перезапустити і спробувати ще раз.
Ри-

@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 символи.
Ри-

Ви можете вбудувати декларацію для $rзбереження іншого символу. Простір після echoможна також опустити. Ви також можете вбудувати ініціалізацію $a, довівши до 128. Якщо розміщення рядків переривається прямо в рядок, а не уникнути їх, \nзберігає ще два символи.
Joey

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

1
Це сортування з усіма цими прапорами командного рядка? Я не розумію цього / DA / DB / DC .. річ.
mellamokb

Мій компілятор не розуміє /Dкомутатора ... Будь ласка, не обманюйте, вводячи випадкові значення в команду компіляції.
FUZxxl

3

Пітон 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 символів

(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

Пітон 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]

3

перл - 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 для використання dieзамість print/say
mbx


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


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

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

Ви можете вилучити включити та зберегти ще 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


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

220 байт JavaScript

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

Рубі, 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 % 

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 все було в моїй голові).
  • Як завжди, ^це не буквально, ^а вказівка ​​на послідовність втечі.

Тестування

Зміна RANDOMдо DICEVALUE, збереження коду VimScript в dice.vim, а потім запустити цей скрипт на ньому, привівши в якості аргументів будь-яких цифр , які ви хочете , щоб тест:

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

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

Вибірка зразка:

five


Якщо фігурні дужки матриці ображати, ви можете замінити MatrixFormз TableFormв коді.


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 відповідно.
12Ме21,

Ах, я, мабуть, рахував нові рядки.
Ден Лугг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.