물리적인 6면 주사위를 굴려서 생성된 기본 6 숫자가 있고 이를 기본 2/이진으로 변환하고 싶습니다.
이 작업을 수행할 수 있는 내장 명령이나 프로그램이 있습니까?
그렇지 않은 경우 숫자를 수동으로 변환하는 방법은 무엇입니까?
답변1
Jeff가 주석에서 암시했듯이 이를 bc
기본 변환에 사용할 수 있습니다. 실제 주사위의 경우 숫자는 일반적으로 1~6인 반면 bc
(및 수학)에는 0~5의 숫자가 필요하므로 이를 수동으로 처리하거나 비슷한 것을 사용하여 처리해야 합니다 tr
.
111
예를 들어, 이 함수는 ->0, 112
->1, 121
->6 등을 매핑합니다 .
f() {
echo "obase=10; ibase=6; $(echo $1 | tr 1-6 0-5)" | bc;
}
출력은 10진수로 표시되며 obase
위의 값을 변경하여 변경할 수 있습니다. 또는 십진수를 사용하여 다른 산술을 수행할 수도 있습니다.
답변2
수동
Set total to 0
Repeat until no more roles:
multiply total by 6 #this has no effect the first time around the loop
role dice
add (number on dice -1) to total
소프트웨어
다른 답변 및 의견 보기
답변3
16진수를 2진수로 변환할 수 있는 여러 POSIX 도구가 있습니다.
그러나 주사위의 부호와 1 2 3 4 5 6
16진수 정수는 0 1 2 3 4 5
부호만 달라야 하며 둘 사이의 차이는 1입니다. 사용되는 모든 도구는 이를 고려해야 합니다. 한 자리 숫자의 경우 이는 큰 문제가 되지 않습니다.
가장 간단한 것은 bc(또는 dc)입니다. 단일 숫자의 변환은 다음과 같이 수행할 수 있습니다.
digit=5; echo "n=$digit - 1; obase=2; n" | bc
하지만 문자열로 된 여러 권의 경우에는 31256
10진수로 입력하고 각 숫자에서 1을 뺀 다음( 11111
이 경우) 16진수로 다시 입력해야 합니다.
$ echo "ibase=6; obase=2; $(echo "31256-11111" | bc)" | bc
101001100001
또는 텍스트로 6에서 5로, 5에서 4로 등으로 변환할 수 있습니다.
$ echo "ibase=6; obase=2; $(echo "31256" | tr 123456 012345)" | bc
101001100001
또 다른 옵션은 awk입니다.
awk -v n=31256 '
function roll2dec(str, ret, i, c){
for (i = 1; i <= length(str); i++) {
c = substr(str, i, 1)
ret = ret * 6 + index("23456", c)
}
return ret
}
function dec2bin(dec, bin){
while (dec>0){
bin = dec%2 bin;
dec=int(dec/2)
};
return bin
}
BEGIN{
print dec2bin(roll2dec(n))
}'
101001100001