Bash - 46
สารบัญ
คุณจะพบ 4 รุ่นที่แตกต่างกัน golfed:
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
หลังจากหรือครั้งสุดท้าย |
และ
- ที่ตั้งไว้
_
ไป32 ทุบตีจะอ่านสร้างจากซ้ายไปขวาเพื่อ$((_-=8))
ให้24
ที่ 1 กะ , 16
วันที่สองและอื่น ๆ
ในการดำเนินการ:
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
bash (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
อีกรุ่นที่แตกต่าง golfed: 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...
ที่สุด
golfed ด้วย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
}