物理的な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
上記の値を変更して変更できます。あるいは、10進数を使用して他の算術を実行することもできます。
答え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
符号のみが異なる必要があり、2つの差は1です。使用されるすべてのツールはこれを考慮する必要があります。 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