IPv4 ইন্টিজার রূপান্তর ফাংশন


17

কোনও আইপি ঠিকানাটিকে পূর্ণসংখ্যার উপস্থাপনায় রূপান্তর করতে সংক্ষিপ্ততম ফাংশনটি লিখুন এবং এটি পূর্ণসংখ্যা হিসাবে আউটপুট করে।

এটির পূর্ণসংখ্যার উপস্থাপনায় একটি আইপিভি 4 ঠিকানা পরিবর্তন করতে, নিম্নলিখিত গণনাটি প্রয়োজনীয়:

  • আইপি ঠিকানাটিকে চারটি অক্টেটে বিভক্ত করুন।
  • (Octet1 * 16777216) + (Octet2 * 65536) + (Octet3 * 256) + (Octet4)

নমুনা ইনপুট

192.168.1.1           10.10.104.36           8.8.8.8

নমুনা আউটপুট

3232235777            168454180              134744072

2
আমি মনে করি কোনও ভাষার অন্তর্নির্মিত কার্যাদি নিষিদ্ধ করার জায়গায় যদি কোনও বিধিনিষেধ থাকে তবে এটি আরও ভাল হবে would
নাথান ওসমান

@ জর্জি - হ্যাঁ, এটি হত, কিন্তু আমি এটি inোকাতে পারার আগেই লোকেরা এটি করে ফেলেছিল - আমি সত্যই এটি সম্পর্কে ভাবিনি।
কাইল রোজেন্দো

উত্তর:





8

সি: characters৯ টি অক্ষর

main(i,a)char**a;{i=i<<8|strtol(a[1],a+1,0);*a[1]++?main(i,a):printf("%u",i);}

সম্পাদনা: মুছে ফেলা সি ++, শিরোনাম ছাড়া সংকলন করবে না; জিসিসির সাথে, printfএবং strtolফাংশনটি অন্তর্নির্মিত ফাংশনগুলি ট্রিগার করে, তাই শিরোনামগুলি এড়ানো যায়। টিপসটির জন্য THX থেকে @ugoren এটি অতিরিক্ত বিকল্প ছাড়াও সংকলন করবে gcc

সম্পাদনা 2: returnআসলে নিরর্থক :)


মূল () :) এর খুব চালাক ব্যবহার আমার সংস্করণটি ছিল 116 বাইটস।
আকির

আমি সেগমেন্টেশন ত্রুটি পাই get
নাথান ওসমান

@ জর্জি, আপনার ইনপুটটি কী এবং আপনি কীভাবে এটি চালাচ্ছেন?
নিম


এটি সি ++ এ কাজ করবে না, আপনি মূলটিকে পুনরাবৃত্তভাবে কল করতে পারবেন না।
স্কট লোগান

7

গল্ফস্ক্রিপ্ট - 16 টি অক্ষর

{[~]2%256base}:f

একটি স্বতন্ত্র প্রোগ্রাম হিসাবে, এটি 11 এ আরও ছোট হয়।

~]2%256base

অত্যন্ত সোজা। ইনপুট স্ট্রিং ( ~) এর মূল্যায়ন করে এবং এটিতে অ্যারে রাখে []। যেহেতু .স্ট্রিংয়ে থাকা এসগুলি স্ট্যাকের শীর্ষটিকে নকল করে, তাই আমরা কেবলমাত্র অ্যারেতে প্রতিটি অন্যান্য শব্দ গ্রহণ করি ( 2%)। আমাদের এখন একটি অ্যারে রয়েছে যা মূলত একটি বেজ 256 সংখ্যা উপস্থাপন করে, তাই আমরা রূপান্তরটি করতে একটি অন্তর্নির্মিত ফাংশনটি ব্যবহার করি। ( 256base)।


খুব চালাক. আমার ধারণা বেস 10 বা বেস 16 বলতে বেস 256 কে আলাদা আচরণ করা হয় তবে 48 => 0 কোথায়?
gnibbler

@gnibbler: আপনি কী পরামর্শ দিচ্ছেন তা আমি নিশ্চিত নই - বেস ফাংশনটি সমস্ত ঘাঁটিগুলিকে একইভাবে পরিচালনা করে, যেমন {:B;{\B*+}*}:base(যদিও আসল ফাংশনটি অন্যভাবে রূপান্তরগুলির জন্য ওভারলোড করা হয়েছে)) মজার বিষয় হল স্ট্রিংগুলির জন্য বেস রূপান্তরটি অ্যারেগুলির সমান (যেমন স্ট্রিংগুলি নেস্টিং ব্যতীত কেবল অ্যারে হয় তবে ভিন্ন আউটপুট ফর্ম্যাট সহ)।
ন্যাব

হ্যাঁ আমি স্ট্রিংগুলির বেস রূপান্তরগুলির কথা ভাবছিলাম, তাই আমি baseআমার উত্তরটির জন্য খুব কাছে থেকে
দেখিনি

খুব চালাক. এখন এটি একটি আইপিভি 6 ঠিকানার জন্য করুন। :)
ইলমারি করোনেন

6

বেফঞ্জ - 2x11 = 22 টি অক্ষর

এত কাছে, বেফুঞ্জ একদিন জিতবে।

>&+~1+#v_.@
^*4*8*8<

ব্যাখ্যা

বেফুঞ্জের বৃহত্তম বিশিষ্ট বৈশিষ্ট্যটি হ'ল বেশিরভাগ ভাষার মতো নির্দেশের রৈখিক সেট হওয়ার পরিবর্তে; এটি একক অক্ষর নির্দেশাবলীর একটি 2 ডি গ্রিড, যেখানে নিয়ন্ত্রণ যে কোনও দিকে প্রবাহিত হতে পারে।

>      v
^      <

এই অক্ষরগুলি আঘাত হানার পরে নিয়ন্ত্রণের দিক পরিবর্তন করে, এটি প্রধান লুপকে তৈরি করে।

 &+~1+

এটি একটি সংখ্যার ইনপুট করে এবং এটি স্ট্যাকের উপর চাপ দেয় ( &), স্ট্যাকের উপরের দুটি মানকে টুকরো টুকরো করে, যোগ করে এবং স্ট্যাকের ( +) এর দিকে ফিরে ঠেলে দেয় , একটি একক অক্ষরকে ইনপুট দেয় এবং স্ট্যাকের উপরে তার আসকি মান রাখে (~ ), স্ট্যাকের উপর 1 টি ঠেলে এবং এগুলি যুক্ত করে (1+ )।

আমি যে ইন্টারপ্রেটারটি ইনপুট সমাপ্তির জন্য রিটার্ন -1 ব্যবহার করছি, তার পরিবর্তে কিছু 0 ফিরে আসে যাতে 1+তাদের জন্য অংশটি সরানো যায়।

      #v_.@

#কারণ পরবর্তী অক্ষরে এড়ানো হবে, তারপর _পপ স্ট্যাকের বন্ধ মান এবং শূন্য নিয়ন্ত্রণ অধিকার পাঠায় যদি তা না হয়, অন্যথায় এটি বাম পাঠায়। মানটি যদি শূন্য .হয় তবে স্ট্যাকটি বন্ধ করে দেওয়া একটি মানকে পূর্ণসংখ্যা হিসাবে আউটপুট @দেয় এবং প্রোগ্রামটি বন্ধ করে দেয়। অন্যথায় vরিটার্ন লুপটিতে নিয়ন্ত্রণ পাঠায়।

^*4*8*8<

এটি কেবল স্ট্যাকের শীর্ষ মানটিকে 256 দ্বারা গুণিত করে এবং শুরুতে নিয়ন্ত্রণ ফিরিয়ে দেয়।


আমার অজ্ঞতা ক্ষমা করুন, তবে তা কি ১৯ টি চর হওয়া উচিত? আপনি কেন 2x11 বলছেন তা আমি বুঝতে পেরেছি তবে কেন এটি সেভাবে কাজ করে?
কাইল রোজেন্দো

বেফুঞ্জ একটি 2 ডি ভাষা, যদি আপনি এটির জন্য অনুসন্ধান করেন তবে >v<^এই প্রোগ্রামটির মূল লুপ এটি। আমি অনুমান করি এই ক্ষেত্রে নিয়ন্ত্রণটি নীচে থাকা শেষ 3 টি জায়গাগুলির মধ্য দিয়ে আসলে যায় না, তবে বেফুঞ্জ প্রোগ্রামগুলিকে কেবল সবচেয়ে ছোট বাউন্ডিং আয়তক্ষেত্র হিসাবে গণনা করা আমার পক্ষে সবচেয়ে সহজ বলে মনে হয়; এবং যদি আপনি নিয়ন্ত্রণ প্রবাহের চেষ্টা এবং গণনা করতে চান তবে আপনি স্ব-পরিবর্তনকারী প্রোগ্রামগুলির সাথে সমস্যায় পড়তে পারেন।
নিমো 157

5

রুবি (40)

q=->x{x.gsub(/(\d+)\.?/){'%02x'%$1}.hex}

->

q["192.168.1.1"]
=> 3232235777

রিজেপ্সপ ব্যবহারের দুর্দান্ত ধারণা।
হাউলেথ

খুব চালাক! এছাড়াও আপনি লিখতে পারেন to_i 16যেমন hexকিছু অক্ষর সংরক্ষণ করুন।
পল প্রেস্টিজ

ধন্যবাদ @chron উভয় এটি এবং প্রণীত লিংক 4 অক্ষর খাটো
jsvnm


3

গল্ফস্ক্রিপ্ট - 21 টি অক্ষর

{'.'/{~}%{\256*+}*}:f

+1 ভাল কঠিন সমাধান। আপনি কি চান না যে গল্ফস্ক্রিপ্ট বিট-শিফটিং অপারেটরদের সরবরাহ করে? ;-) (যদিও আমি জানি যে তাদের কোন চিহ্নের সাথে আবদ্ধ হওয়া উচিত))
ক্রিস জেস্টার-ইয়ং


3

সি ++ - প্রচুর অক্ষর

#include <boost/algorithm/string.hpp>
#include <string>
#include <vector>
uint f(std::string p)
{
        std::vector<std::string> x;
        boost::split(x,p,boost::is_any_of("."));
        uint r=0;
        for (uint i = 0; i < x.size(); i++)
                r=r*256+atoi(x[i].c_str());
        return r;
}

@George Edison: using boost helps to get down with the numbers of chars? :)
akira

3

PowerShell 66 61

Variation on Joey's answer:

filter I{([ipaddress](($_-split'\.')[3..0]-join'.')).address}

PS C:\> '192.168.1.1' | I
3232235777
PS C:\> '10.10.104.36' | I
168454180
PS C:\> '8.8.8.8' | I
134744072

Argh, I must have been stupid to have missed that ...
Joey

3

AWK in ~47 chars

First-timer here... Um, not sure how to count this, but without the 'echo' it's 47 chars in AWK. (Not exactly bogey golf, but it's in the hole.)

echo $addr | /bin/awk -F\. '{print $1*16777216+$2*65536+$3*256+$4}'

Full day early for #tbt, too, so I actually met a schedule!!! *8-)

Banner day.


1
স্বাগত! আপনি কেবল কোনও স্ক্রিপ্ট স্ক্রিপ্টে রেখেছিলেন তার বডিটি আপনি কেবল গণনা করতে পারেন। এই উত্তর দেখুন । আপনার ক্ষেত্রে আপনি কেবল গণনা করতেন {print $1*16777216+$2*65536+$3*256+$4}। অবশ্যই আপনাকে ফিল্ড বিভাজকটিকে প্রোগ্রাম হিসাবে সরাতে হবে, বরং এটি পতাকা হিসাবে নির্দিষ্ট করার চেয়ে।
জোনাহ

3

বাশ - 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]

ব্যাখ্যা

  • আমি ব্যবহার করতাম $_ for more golfing.
  • সিনট্যাক্স স্পেস দ্বারা ${1//./ }প্রতিটি বিন্দু প্রতিস্থাপন করবে..
  • সুতরাং printf কিছু রেন্ডার হবে192<<(_-=8)|168<<(_-=8)|1<<(_-=8)|1<<(_-=8)|
  • তারপরে আমরা 0শেষ OR পরে একটি যুক্ত করব | এবং
  • প্রিসেট _থেকে 32 কনস্ট্রাক্ট বাম থেকে ডানে, তাই থেকে পড়তে হবে $((_-=8))করতে 241 ম এ স্থানান্তর , 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

বাশ (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
}

আপনি একটি সংক্ষিপ্ত ব্যাখ্যা যোগ করতে পারেন? আমি ব্যাশ গল্ফিংয়ের দিকে যাওয়ার চেষ্টা করেছি এবং set --অংশটির সাথে কী ঘটছে তা আমি অনুসরণ করি না । ধন্যবাদ।
জোনা

@Jonah: set -- foo barপূরণ হবে $@সঙ্গে foo বিন্যাস যেমন $1এবং বার হিসাবে $2
এফ। হাউরি

@ জোনাহ নতুন সংস্করণ যুক্ত করেছে
এফ হাউরি

বর্নানার জন্য ধন্যবাদ.
জোনাহ

নতুন সংস্করণ! আরও গল্ফড, -1 চর !!
এফ। হাউরি

2

উইন্ডোজ পাওয়ারশেল, 70

সাদামাটা পদ্ধতির:

filter I{[int[]]$x=$_-split'\.'
$x[0]*16MB+$x[1]*64KB+$x[2]*256+$x[3]}

System.Net.IPAddress: 76 ব্যবহার করে 76

filter I{([ipaddress]($_-replace('(.+)\.'*3+'(.+)'),'$4.$3.$2.$1')).address}

টেস্ট:

> '192.168.1.1'|I
3232235777


2

পার্ল: ডিআইওয়াই (অনেলাইনারদের জন্য)) (40)

$j=3;$i+=($_<<($j--*8))for split/\./,$x;

# Value i তে মান ব্যবহার করুন

DIY ফাংশন (65):

sub atoi{my($i,$j)=(0,3);$i+=($_<<($j--*8))for split'.',shift;$i}

আপনি একটি স্ট্রিং দ্বারা বিভক্ত করতে পারেন, তাই আপনি এর split'.'পরিবর্তে ব্যবহার করে একটি অক্ষর সংরক্ষণ করুনsplit/\./
বেনামে কাপুরুষতা

ফাংশন সংস্করণ সহ, হ্যাঁ, তবে ইনলাইন সংস্করণটি নেই, কারণ split q{.}শেল উদ্ধৃতিগুলি রক্ষা করার জন্য আপনার দরকার পড়ার দরকার ছিল: /
কেন্ট ফ্রেড্রিক

2

হাস্কেল - 14 টি অক্ষর

(.) a=(256*a+)

usage in GHCi:

Prelude> let (.) a=(256*a+)
Prelude> 192. 168. 0. 1
3232235521

The only problem is that you have to put spaces left or right of the dot, otherwise the numbers will be interpreted as floating point.


mind adding a brief explanation?
Jonah

the dot infix operator is redefined to do the computation, very smart indeed!
memo

This is very clever, but it doesn't use the correct input format (because of the spaces)
12Me21

2

C# – 77 chars

Func<string,uint>F=s=>s.Split('.').Aggregate(0u,(c,b)=>(c<<8)+uint.Parse(b));

2

JavaScript (45 characters)

Requires support for the .reduce() Array method introduced in ES5 and arrow functions.

f=(x)=>x.split('.').reduce((p,c)=>p<<8|c)>>>0

Huh... I didn't know >>> worked like that (converting to unsigned 32 bit integer)
12Me21

2

Powershell, 47 43 bytes

$args-split'\.'|%{$r=([long]$r-shl8)+$_};$r

Test script:

$f = {

$args-split'\.'|%{$r=([long]$r-shl8)+$_};$r

}

@(
    ,("192.168.1.1",3232235777)
    ,("10.10.104.36",168454180)
    ,("8.8.8.8",134744072)
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$($result-eq$expected): $result"
}

Output:

True: 3232235777
True: 168454180
True: 134744072

1

C# - 120 Characters

float s(string i){var o=i.Split('.').Select(n=>float.Parse(n)).ToList();return 16777216*o[0]+65536*o[1]+256*o[2]+o[3];}

My first code golf - be gentle ;)


You can remove the spaces around your first '='. However, your main problem is int overflow ;). Remember, an IP address takes up 4 full bytes.
Nellius

@Nellius - quite right. I didn't even think of checking that, basically checked on compile. Thanks, will fix now.
Kyle Rozendo

1

D: 84 Characters

uint f(S)(S s)
{
    uint n;
    int i = 4;

    foreach(o; s.split("."))
        n += to!uint(o) << 8 * --i;

    return n;
}

i don't know D so forgive me if it's whitespace sensitive like python, but this doesn't look golfed. can you remove the double line breaks or the line breaks between semi-colon terminated statements?
Jonah

1

Python 3.2 (69)

sum((int(j)*4**(4*i)) for i,j in enumerate(input().split('.')[::-1]))

1

PHP (no builtins/eval) - 54

<foreach(explode(".",$argv[1])as$b)$a=@$a<<8|$b;echo$a;

Shouldn't this open with <?php, not just <?
TRiG

@TRiG, I believe you can change the PHP opening delimiter in the config file. Useful in this case.
Xeoncross

@Xeoncross. Ah. Neat. I might try that one day, just to mess with my workmates' heads.
TRiG

1

Perl, 14 characters:

sub _{unpack'L>',pop}

# Example usage
print _(10.10.104.36) # prints 168454180

5
How do you make that 14 characters? I count 21.
Peter Taylor




আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.