बैश - 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
_
को पूर्व निर्धारित । बैश का निर्माण बाएं से दाएं पढ़ा जाएगा, इसलिए पहली पाली में , दूसरे पर, और इसी तरह से बनाएं ।$((_-=8))
24
16
कार्रवाई में:
set -- 192.168.1.1
echo $[_=32,`printf "%d<<(_-=8)|" ${1//./ }`0]
3232235777
मज़े के लिए: इसके $_
बाद, सामग्री प्राप्त करने की कोशिश कर रहा है :
echo $_
3232235777
; बी
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
एक और संस्करण अलग गोल्फ: 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
}