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

죄송합니다. 측정 항목이 항상 글자 수라고 생각하십니까? 채팅을 한 다음 메타의 샌드 박스를 가리켜 주셔서 감사합니다. 이 질문이 얼굴에 평평하게 떨어지면 삭제하겠습니다. 누군가가 이미 작업을 시작한 경우를 대비하여 지금은 싫어요.
Jonas Elfström

아 ... 사이트 이름 "프로그래밍 퍼즐 및 코드 골프"에 주목하십시오 . 또한 원 라이너 , 킹 오브 힐 토너먼트코드 도전 (다른 모든 것, 그러나 여전히 우승을 위한 객관적인 메트릭설정 해야 함 )을 찾을 수 있으므로 적절한 말을하고 적용해야합니다. 꼬리표.
dmckee

13
에 따르면 XKCD # 221 , alert('-----\n|o o|\n| |\n|o o|\n-----');정확한 프로그램입니다.
JiminP

9
ascii-art 태그를 제거하면 39char-solution print("⚀⚁⚂⚃⚄⚅"(util.Random.nextInt(6)))(utf-art)을 제공 할 수 있습니다 .
사용자 알 수 없음

답변:


7

골프 스크립트, 56 자

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

여기에서 솔루션을 테스트 할 수 있습니다 .


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
배열 인덱서의 비교는 완전히 인상적입니다!
Jonas Elfström

2
같게! 나는 당신이 다이의 대칭을 어떻게 사용했는지 좋아합니다 :)
System Down

같은 것을 사용할 수 id(0)%7%6있습니까? 그것은 균일하게 분포되지는 않지만 상당히 짧습니다.
Nabb

@ Nabb : 그것은 매우 무작위가 아닙니다. 특히, 실행마다 동일하기 때문에 임의의 주사위 롤을 생성하는 데별로 유용하지 않습니다.
Keith Randall


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

파이썬, 109 개의 유니 코드 문자

#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

자바 스크립트 ( 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/(FF2+ 와 같은 JS 1.7 호환 브라우저에서만 작동)

크레딧 : Math@minitech의 해킹 트릭과 @Keith의 인쇄 로직을 죽입니다.

편집 : Math실제로 그것이 더 길어 지기 때문에 @minitech에서 트릭을 제거하십시오 :-)

편집 2 : 17자를 저장합니다. 주사위 대칭을 활용하기위한 @Keith의 차용 트릭. 난수를 int로 변환하는 것을 단순화하는 트릭을 사용하십시오.

편집 3 : 1+임의의 숫자를 1-6에서 0-5로 이동하고 2자를 저장하려면 제거하십시오 . 그 결과, 나는 또한 변경할 수 있습니다 r%2-1r%2다른 2 개 문자를 저장합니다.

편집 4 : jsfiddle이 다시 작동합니다. 업데이트 :-)


E4X! 그리고 Chrome이 지원하지 않는다고 믿을 수 없습니다!
Ry-

Heh, 나는 당신을 마침내 이겼습니다 :)
Ry-

지금, 당신의 |0트릭을 사용하여 두 문자 :-)
Ry-

Chrome에서 작동합니다.
pimvdb 2016 년

4

자바 스크립트, 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을 이겼지 만 원래 솔루션을 완전히 바꿨습니다. 당신이보기 좋은이 원하는 경우, 구글 크롬이나 뭐, 변경 사용 alertconsole.log, 봐라합니다.

편집 : 일부 문자를 저장하기 위해 mellamokb의 | 0 트릭을 빌 렸습니다.


@minitech : BTW, M=Math내가 훔치려 고했던 당신의 트릭은 실제로 한 글자 더 길어집니다
mellamokb

@mellamokb : 알고 있습니다. 원래 더 많이 사용할 것이라고 생각했습니다.
Ry-

@minitech : 다음으로 두 문자를 절약 할 수 있습니다[s.substr(0,3),s.substr(3,3),s.substr(6,3)].join('|\n|')
mellamokb

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도 생략 할 수 있습니다. 초기화를 인라인하여 $a128로 가져올 수 있습니다. 줄 바꿈을 사용하여 문자열을 이스케이프하는 대신 직접 \n두 개의 문자 를 저장하면됩니다.
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);}

다음과 함께 컴파일 :

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! 첫 번째 솔루션처럼 보입니다! 그러나 iam ... 사기꾼

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

하스켈 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

파이썬과 거의 같은 아이디어를 사용합니다.

읽을 수있는 버전 :

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 솔루션. 나는 Oleg에 의해 거의 동일한 솔루션에 왔습니다.


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

기음, 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의 명령 줄 트릭 만 12 문자입니다 (컴파일러 경고없이) 결과를 생성하는 짧은 C 코드를 :

#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

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

자바 스크립트 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-----";

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).
  • 항상 그렇듯이 ^리터럴이 ^아니라 이스케이프 시퀀스를 나타냅니다.

테스팅

로 변경 하고 VimScript 코드 RANDOMDICEVALUE에 저장 dice.vim한 다음이 쉘 스크립트를 실행하여 테스트하려는 숫자를 인수로 제공하십시오.

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

1

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

샘플 출력 :

다섯


매트릭스 중괄호가 기분을 상하게하는 경우 대체 할 수 MatrixFormTableForm코드입니다.


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 바이트 버전 은 문자열을 인덱싱 boolint때 캐스팅으로 인해 통지를 발행 합니다 $d. 그 외에는 잘 작동합니다. *


바이트 수는 각각 105와 100 인 것으로 보입니다.
12Me21

아, 나는 줄 바꿈을 설명해야합니다.
Dan Lugg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.