Bash - 46
Mục lục
Bạn sẽ tìm thấy 4 phiên bản golf khác nhau:
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
Phiên bản mới! 2018-11-15 Chơi gôn nhiều hơn, 46 char
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
Giải trình
- Tôi đã sử dụng
$_ để chơi golf nhiều hơn.
- Cú pháp
${1//./ }sẽ thay thế mọi dấu chấm. bằng dấu cách .
- vì thế
printf sẽ làm cho một cái gì đó như192<<(_-=8)|168<<(_-=8)|1<<(_-=8)|1<<(_-=8)|
- sau đó chúng tôi sẽ thêm
0sau lần cuối HOẶC | và
- đặt trước
_đến 32 . bash sẽ đọc cấu trúc từ trái sang phải, vì vậy $((_-=8))hãy thực hiện 24ở ca 1 , 16vào giây, v.v.
trong hành động:
set -- 192.168.1.1
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
3232235777
Để giải trí: cố gắng lấy $_nội dung, sau này:
echo $_
3232235777
; -b
set -- 192.168.1.1
echo $_ $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0] $_
192.168.1.1 3232235777 0
Ok, đúng rồi 32 - 4 x 8 = 0
Trong một chức năng:
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
hoặc vào một vòng lặp: -> 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
bash (v4.1 +): 47
Bài viết đầu tiên
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4]
Giải trình:
- Cú pháp
${1//./ }sẽ thay thế mọi dấu chấm .bằng dấu cách .
set --đặt tham số vị trí ( $@=($1 $2 $3...))
- Vì vậy,
set -- ${1//./ }sẽ chia $1bởi dấu chấm và bộ $1, $2, $3và $4nếu chuỗi có chứa có 3dấu chấm (và không có khoảng trắng).
trong hành động:
set -- 192.168.1.1
set -- ${1//./ };echo $[$1<<24|$2<<16|$3<<8|$4]
3232235777
hoặc trong một chức năng:
ip2int() {
set -- ${1//./ }
echo $[$1<<24|$2<<16|$3<<8|$4]
}
ip2int 192.168.1.1
3232235777
ip2int 0.0.0.0
0
hoặc vào một vòng lặp: -> 61
for i;do set -- ${i//./ };echo $[$1<<24|$2<<16|$3<<8|$4];done
trong hành động:
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
Một phiên bản khác được đánh gôn khác: 65
v=('|%d<<'{24,16,8,0});printf -vv "${v[*]}" ${1//./ };echo $[0$v]
Mẫu vật:
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
Trong một vòng lặp (+14): 82
ip2int() {
for i;do
v=('|%d<<'{24,16,8,0})
printf -vv "${v[*]}" ${1//./ }
echo $[0$v]
done
}
* hoặc xấu hơn một chút: 70 *
v=('|%d<<'{24,16,8});printf -vv "${v[*]}" ${1//./ };echo $[0${v%<<2*}]
nơi printfđưa ra một số chuỗi như |192<<24 |168<<16 |1<<8|1<<24 |0<<16 |0<<8chúng ta phải cắt cuối cùng <<2....
chơi với mapfile, dài hơn: 68
ip2int() {
mapfile -td. i<<<$1;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o
}
hoặc với vòng lặp: 82
ip2int() {
for a;do
mapfile -td. i<<<$a;for((a=o=0;a<4;o+=i[a]<<(3-a++)*8)){ :;};echo $o
done
}