バッシュ-46
目次
4つの異なるゴルフバージョンがあります。
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0] # 46chr
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4] # 47chr
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v] # 65chr
mapfile -td. i<<<$1;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o # 68chr
新しいバージョン!2018-11-15さらにゴルフ、46文字
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
説明
- 私
$_
はより多くのゴルフに使用しました。
- 構文
${1//./ }
は、すべてのドット.
をスペースで置き換えます
。
- のよう
printf
なものをレンダリングします192<<(_-=8)|168<<(_-=8)|1<<(_-=8)|1<<(_-=8)|
- その後
0
、最後のORを追加します |
と
- プリセット
_
に32。bashは左から右にコンストラクトを読み取る$((_-=8))
ため24
、1番目のシフトで16
、2番目のシフトで、というように続きます。
動作中:
set -- 192.168.1.1
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
3232235777
楽しみのために:$_
この後、コンテンツを取得しようとしています:
echo $_
3232235777
; -b
set -- 192.168.1.1
echo $_ $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0] $_
192.168.1.1 3232235777 0
はい、それは正しいです 32 - 4 x 8 = 0
関数内:
ip2int() {
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
}
ip2int 192.168.1.1
3232235777
ip2int 255.255.255.255
4294967295
ip2int 0.0.0.0
0
またはループに:-> 60
ip2int() {
for i;do
echo $[_=32,`printf "%d<<(_-=8)|" ${i//./ }`0]
done
}
ip2int 192.168.1.1 10.10.104.36 8.8.8.8 1.1.1.1 255.255.255.255 0.0.0.0
3232235777
168454180
134744072
16843009
4294967295
0
バッシュ(v4.1 +):47
最初の投稿
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4]
説明:
- 構文
${1//./ }
は、すべてのドット.
をスペースで置き換えます
。
set --
定位置パラメーターの設定($@=($1 $2 $3...)
)
- だから、
set -- ${1//./ }
分割されます$1
ドットとセットで$1
、$2
、$3
および$4
文字列containg場合3
、ドット(スペースなし)。
動作中:
set -- 192.168.1.1
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4]
3232235777
または関数内:
ip2int() {
set -- ${1//./ }
echo $[$1<<24|$2<<16|$3<<8|$4]
}
ip2int 192.168.1.1
3232235777
ip2int 0.0.0.0
0
またはループに:-> 61
for i;do set -- ${i//./ };echo $[$1<<24|$2<<16|$3<<8|$4];done
動作中:
ip2int() {
for i;do
set -- ${i//./ }
echo $[$1<<24|$2<<16|$3<<8|$4]
done
}
ip2int 192.168.1.1 10.10.104.36 8.8.8.8 1.1.1.1 0.0.0.0
3232235777
168454180
134744072
16843009
0
別のゴルフのバージョン:65
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v]
サンプル:
ip2int() {
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v]
}
ip2int 255.255.255.255
4294967295
ip2int 10.10.104.36
168454180
ループ内(+14):82
ip2int() {
for i;do
v=('|%d<<'{24,16,8,0})
printf -vv "${v[*]}" ${1//./ }
echo $[0$v]
done
}
*またはもう少しい:70 *
v=('|%d<<'{24,16,8});printf -vv "${v[*]}" ${1//./ };echo $[0${v%<<2*}]
ここで、最後にカットする必要があるprintf
ような文字列|192<<24 |168<<16 |1<<8|1<<24 |0<<16 |0<<8
を指定します<<2...
。
でゴルフmapfile
、長い:68
ip2int() {
mapfile -td. i<<<$1;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o
}
またはループ付き:82
ip2int() {
for a;do
mapfile -td. i<<<$a;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o
done
}