লিখিত এন্ডিয়ান সংখ্যা থেকে স্ট্রিং রূপান্তর


13

ভূমিকা

বিএমপি (বিটম্যাপ) জেনারেটরের সাথে কাজ করার সময় আমি সংখ্যাকে সামান্য এডিয়ান হেক্স স্ট্রিংয়ে রূপান্তর করার সমস্যার মুখোমুখি হই। আমি জাভাস্ক্রিপ্টে তৈরি করি এমন ফাংশনটি এখানে - তবে কীভাবে ছোট কোডটি একইভাবে কাজ করতে পারে তা অবাক করে দিন

let liEnd= num => num.toString(16).padStart(8,'0').match(/../g).reverse().join``;
console.log(liEnd(304767)) // 304767 dec = 0x4a67f hex

চ্যালেঞ্জ

ফাংশন লিখুন যা ইনপুটটিতে 32 বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার নম্বর নেবে এবং সামান্য এন্ডিয়ান অর্ডার সহ 8-অঙ্কের হেক্সাডেসিমাল স্ট্রিং তৈরি করবে। কাজটি করে যা উদাহরণ অ্যালগরিদম:

  • অসাড়কে হেক্স স্ট্রিংয়ে রূপান্তর করুন যেমন: 304767 -> '4a67f'
  • 8-চর স্ট্রিং পেতে প্যাডিং জিরো যুক্ত করুন: '0004a67f'
  • চারটি 2-চর টুকরোতে স্ট্রিং বিভক্ত করুন: '00','04','a6','7f'
  • টুকরো বিপরীত ক্রম '7f','a6','04','00'
  • টুকরোয় যোগ দিন এবং ফলস্বরূপ ফিরে: '7fa60400'

উদাহরণ ইনপুট এবং আউটপুট

ইনপুট নম্বর (বা ডিক সংখ্যার সাথে স্ট্রিং) এর বাম দিকে আছে ->, আউটপুট হেক্স স্ট্রিং ডানদিকে

2141586432 -> 0004a67f
304767     -> 7fa60400

উত্তর:



6

পাইথন 3 , 37 বাইট

lambda n:n.to_bytes(4,"little").hex()

এটি অনলাইন চেষ্টা করুন!

পাটিগণিত ভিত্তিক পুনরাবৃত্ত সমাধান ( 50 49 বাইট, পাইথন 2 এর জন্যও কাজ করে ) :

f=lambda n,i=4:i*'1'and"%02x"%(n%256)+f(n>>8,i-1)

এটি অনলাইন চেষ্টা করুন!

-1 বাইট @ জোনাথন অ্যালানকে ধন্যবাদ


আমি বলতে চাই যে পুনরাবৃত্তকারীটিকে পাইথন 2 এন্ট্রি হিসাবে জমা দিন :)
জনাথন অ্যালান

f=lambda n,i=4:i*'1'and'%02x'%(n%256)+f(n>>8,i-1)একটি বাইট সংরক্ষণ করুন :)
জোনাথন অ্যালান

@ জোনাথান অ্যালান ধন্যবাদ আমি সমস্ত পাইথন 2 টি ট্রিকের সাথে পরিচিত নই এবং কীভাবে এটি আরও খাটো করা যায় তা দেখছি না।
জোয়েল 19

এটি কিন্তু 37 টি পাই 2 তে কাজ করবে না
জোনাথন অ্যালান

হ্যাঁ। এই বিল্ট-ইনগুলির মধ্যে কয়েকটি পাইথন -3-কেবল।
জোয়েল

6

আর , 54 53 বাইট

format.hexmode(scan()%/%256^(0:3)%%256%*%256^(3:0),8)

এটি অনলাইন চেষ্টা করুন!

2 অক্ষর প্রত্যেকটি গ্রুপ বেস 256. একটি ডাক হেক্স উপস্থাপনা আসলে scan()%/%256^(0:3)%%256ধর্মান্তরিত একটি বেস 256 নম্বরে 4 সংখ্যা সঙ্গে বিপরীত, ...%*%256^(3:0)তাদের একটি একক পূর্ণসংখ্যা হিসাবে যোগদান করে, এবং format.hexmode(...,8)যে 8 টি সংখ্যা সঙ্গে তার হেক্স উপস্থাপনা নম্বর পরিবর্তন করে।


5

জাভাস্ক্রিপ্ট (ES7),  59  57 বাইট

স্ট্রিং ম্যানিপুলেশন।

n=>(n+2**32).toString(16).match(/\B../g).reverse().join``

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

সমস্ত নেতৃস্থানীয় 0 টি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করার জন্য আমরা প্রথমে এন+ +232 কে হেক্সাডেসিমালে রূপান্তর করি :0

(304767 + 2**32).toString(16) // --> '10004a67f'

এটি অনলাইন চেষ্টা করুন!

আমরা রেগুলার এক্সপ্রেশন ব্যবহার /\B../g2 ডিজিটের সকল গোষ্ঠী মেলে শীর্ষস্থানীয় উপেক্ষা 1 ধন্যবাদ \B(অ- শব্দ সীমানা )।

'10004a67f'.match(/\B../g) // --> [ '00', '04', 'a6', '7f' ]

এটি অনলাইন চেষ্টা করুন!

আমরা reverse()এবং join()চূড়ান্ত স্ট্রিং পেতে।


জাভাস্ক্রিপ্ট (ES6), 61 বাইট

পুনরাবৃত্তি ফাংশন।

f=(n,k=4)=>k?[(x=n&255)>>4&&'']+x.toString(16)+f(n>>8,k-1):''

এটি অনলাইন চেষ্টা করুন!


⭐ - আপনি সুন্দর উত্তরের জন্য তারকা পেয়েছেন - আমি এটি পছন্দ করি, সংক্ষিপ্ত তবে তবুও পরিষ্কার এবং "মানব-পুনঃনির্দেশযোগ্য" :)
কামিল কিয়েসজেউস্কি


5

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 54 বাইট

x=>$"{(x=x>>16|x<<16)>>8&16711935|(x&16711935)<<8:x8}"

@ পিটারকর্ডসকে ধন্যবাদ 4 টি বাইট সংরক্ষণ করা হয়েছে

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

x=>                                                    //Lambda taking in an uint
     (x=x>>16|x<<16)                                   //Swap the first two and the last two bytes of the uint (0x7fa60400 -> 0x04007fa6)
                    >>8&16711935|(x&16711935)<<8       //Swap each pair of bytes in every group of 2 bytes (0x04007fa6 -> 0x0004a67f)
  $"{                                           :x8}"  //Format as hex string, padded with leading zeroes to length 8

আপনি সঙ্কুচিত করতে পারেন 4278255360থেকে মাস্ক ধ্রুবক 16711935( 0xff00ff) আপনি নামান আগে মাস্কিং? বা অতিরিক্ত প্যারেন্স খরচ হয়? এছাড়াও, যদি না 0xff00ff00হয় তবে একই দৈর্ঘ্য তবে মানুষের কাছে অনেক বেশি অর্থবহ।
পিটার কর্ডস

@PeterCordes এটি হিসাবে বন্ধনী অপসারণ করতে সক্ষম হচ্ছে যোগ সুবিধা আছে >>উচ্চতর প্রাধান্য চেয়ে আছে &4 বাইট মোট, whcih সংরক্ষিত হয়েছে। ধন্যবাদ!
অজ্ঞতার

কুল। আপনার "ব্যাখ্যা" বিভাগে, আমি হেক্সে ধ্রুবকগুলি লেখার পরামর্শ দেব।
পিটার কর্ডস

4

জাপট -P , 10 বাইট

sG ùT8 ò w

চেষ্টা করে দেখুন

sG ùT8 ò w     :Implicit input of integer
s              :Convert to string
 G             :  In base-16
   ù           :Left pad
    T          :  With 0
     8         :  To length 8
       ò       :Split into 2s
         w     :Reverse
               :Implicitly join and output

কি করে -P?
এসএস অ্যান

Answer আপনার উত্তর শীর্ষে আছে (আপনি ব্যাখ্যা যুক্ত করতে পারেন?)
কামিল কিয়েসজেউস্কি

@ জেএল 2210 ডক্স থেকে : "-P : যদি আউটপুটটি একটি অ্যারে হয় তবে কোনও বিভাজক (আউট এর সাথে যোগ P) না করে আউটপুট দেয় " " সুতরাং পতাকাটি বাইটস সংরক্ষণে সুস্পষ্ট যোগদানের পরিবর্তে অন্তর্নিহিতদের জন্য। :)
কেভিন ক্রুইজসেন

2
@ কামিলকিএকজেউসকি, ব্যাখ্যা যুক্ত করা হয়েছে।
শেগি

4

যখন একটি বড়-এন্ডিয়ান মেশিনে চালানো হয়, তখন এটি লিটল-এন্ডিয়ানতে রূপান্তরিত হবে না?
পিটার ফেরি

@ পিটারফেরি 3 টি পুনর্বিবেচনাটি দেখুন
এসএস অ্যানি

4

পাইথন 2 , 43 বাইট

lambda n:[("%08x"%n)[i^6]for i in range(8)]

এটি অনলাইন চেষ্টা করুন!

-4 বাইট ধন্যবাদ benrg

অক্ষরের একটি তালিকা আউটপুট করে। সূচকগুলিতে ইনপুটটির হেক্স ডিজিটগুলি পুনরুদ্ধার করে গণনা করা হয়েছে 6, 7, 4, 5, 2, 3, 0, 1


2
[i^6]for i in range(8)কয়েক বাইট সাশ্রয়।
20-22 এ benrg

স্ট্রিংয়ের পরিবর্তে এটি কি আউটপুট তালিকার অনুমতি দেয়?
কিউয়েরটি

তালিকা হিসাবে আউটপুট সত্যিকারের প্রশ্নের জন্য মানানসই নয়
imo

3

সি (জিসিসি) এন্ডিয়ান অজোনস্টিক, স্ট্যান্ডার্ড লিবস নয়, 92 91 বাইট

h(n)এটি একটি একক-সংখ্যার পূর্ণসংখ্যার-> হেক্স সহায়ক সহায়ক ফাংশন।
f(x,p)একটি পূর্ণসংখ্যা এবং একটি char[8]পয়েন্টার নেয় । ফলাফল 8 বাইট charতথ্য। ( যদি কলার তা না করে তবে 0-সমাপ্ত নয় ))

অনুমান: ASCII অক্ষর সেট। সম্পূরক 2 এর intতাই ডান শিফ্ট অবশেষে চিহ্ন একটু নিচে নিয়ে আসে, এবং একটি রূপান্তর uint32_tকরতে intবিট-প্যাটার্ন munge নেই যদি উচ্চ বিট সেট। intকমপক্ষে 32-বিট হয়। (বৃহত্তর এটির 1 টির পরিপূরক বা সাইন-প্রস্থের সি বাস্তবায়নে কাজ করতে পারে)।

অ-অনুমান: বাইট অর্ডার বা এর স্বাক্ষর বাস্তবায়ন সম্পর্কে কিছু char

i;h(n){n&=15;return n>9?n+87:n+48;}f(x,p)char*p;{for(i=5;--i;x>>=8)*p++=h(x>>4),*p++=h(x);}

এটি অনলাইন চেষ্টা করুন! পরীক্ষার কলার printf("%.8s\n", buf)0-সমাপ্ত না করে আউটপুট বাফার মুদ্রণ করতে ব্যবহার করে।

Ungolfed:

int h(n){n&=15;return n>9 ? n+'a'-10 : n+'0';}      // single digit integer -> hex

int i;
void ungolfed_f(x,p)char*p;{
    for(i=5; --i; x>>=8)   // LS byte first across bytes
        *p++=h(x>>4),      // MS nibble first within bytes
        *p++=h(x);
}

এরকম n&=15;ভিতরে h(x)বিরতি-এমনকি হয়; সেখানে 6 বাইট বনাম 3 জন্য প্রতিটি&15উভয় কল সাইটে নিম্ন স্তনবৃন্ত বিচ্ছিন্ন করার রয়েছে।

,একটি সিকোয়েন্স পয়েন্ট (বা আধুনিক পরিভাষায় সমতুল্য) তাই অপারেটর *p++= stuffদ্বারা পৃথক হয়ে গেলে একটি বিবৃতিতে দু'বার করা নিরাপদ ,

>>স্বাক্ষরিত পূর্ণসংখ্যার ক্ষেত্রে অঙ্কটি গাণিতিক বা যৌক্তিক হিসাবে বাস্তবায়ন-সংজ্ঞায়িত হয়। জিএনইউ সি এটিকে গাণিতিক 2 এর পরিপূরক হিসাবে সংজ্ঞায়িত করে। তবে যে কোনও 2 টি পরিপূরক মেশিনে এটি সত্যিকার অর্থে কিছু যায় আসে না কারণ আমরা কখনই স্থানান্তরিত 0 সে বা সাইন বিটের অনুলিপিগুলিতে তাকাতে পারি না। মূল এমএসবি অবশেষে লো বাইটে অপরিবর্তিত হয়ে নামবে। সাইন / মাত্রার ক্ষেত্রে এটি নয় এবং আমি 1 এর পরিপূরক সম্পর্কে নিশ্চিত নই।

সুতরাং এটি কেবল 2 এর পরিপূরক সি বাস্তবায়নের পোর্টেবল হতে পারে। (অথবা যেখানে intহয় ব্যাপকতর চেয়ে 32 বিট তাই বিট 31 মাত্রার শুধু অংশ।) স্বাক্ষরবিহীন -> স্বাক্ষরিত রূপান্তর এছাড়াও munges নেতিবাচক পূর্ণসংখ্যার জন্য বিট-প্যাটার্ন, তাই &15একটি অন intশুধুমাত্র সম্পূরক 2 এর উপর মূল স্বাক্ষরবিহীন মান nibbles নিষ্কাশন করা হবে। আবার, যদি না intছিল ব্যাপকতর চেয়ে 32 বিট তাই সব ইনপুট অ নেতিবাচক হয়।

গল্ফযুক্ত সংস্করণটিতে একটি অ-শূন্য ফাংশনটির সমাপ্তি থেকে ইউবি রয়েছে। কোনও মান ফেরত দেওয়ার জন্য নয়, কেবল এটি voidডিফল্টের পরিবর্তে ঘোষণা করা এড়াতে int। আধুনিক সংকলকগুলি অপ্টিমাইজেশন সক্ষম করার সাথে এটি ভঙ্গ করবে।


অনুপ্রেরণা: আমি একটি x86 বা এআরএম থাম্ব এএসএম উত্তরটি বিবেচনা করছিলাম, ভেবেছিলাম সিতে এটি ম্যানুয়ালি করা মজাদার হতে পারে, সম্ভবত সংকলক-উত্পাদিত asm কে একটি সূচনা পয়েন্ট হিসাবে দেখায়। গতি-দক্ষ x86 অ্যাসেমের জন্য /programming/53823756/how-to-convert-a-number-to-hex দেখুন একটি AVX512VBMI সংস্করণ সহ যা কেবলমাত্র 2 টি নির্দেশনা রয়েছে (তবে vpmultishiftqb এবং vpshufb এর জন্য নিয়ন্ত্রণ ভেক্টরগুলির প্রয়োজন গল্ফ জন্য দুর্দান্ত না হবে)। সাধারণত সিমডির জন্য ছোট্ট এন্ডিয়ান x86-এ প্রিন্টিং অর্ডারে বাইট-রিভার্স করতে অতিরিক্ত কাজ লাগে তাই এই বাইট-বিপরীত হেক্স আউটপুটটি স্বাভাবিকের চেয়ে আসলে সহজ।


অন্যান্য ধারণা

আমি সংক্ষিপ্ত char*-এডিয়ান সি বাস্তবায়নে (x86 বা এআরএম এর মতো) রেফারেন্স দিয়ে পূর্ণসংখ্যা গ্রহণ এবং এর বাইটগুলি লুপ করে বিবেচনা করেছি । তবে আমি মনে করি না যে এটি অনেক কিছু সঞ্চয় করতে পারত।

sprintfগল্ফ করার পরে একবারে 1 বাইট, 64 বাইট ব্যবহার করে:

int i;
void f(x,p)char*p;{
        for(i=4;sprintf(p,"%.2x",x&255),--i;x>>=8)
                p+=2;
}

তবে আমরা যদি প্রিন্টফ -এর মতো ফাংশনগুলি ব্যবহার করি তবে আমরা বাইট-অদল-বদল করতে এবং @ JL2210 এর উত্তরের%x মতো পুরো জিনিসটির একটি প্রিন্টফ করতে পারি


⭐ - আপনি সুন্দর উত্তরের জন্য তারকা পেয়েছেন
কামিল কিয়েসজেউস্কি

3

x86 সিমডি মেশিন কোড (AVX512-VBMI), 36 বাইট

(যার মধ্যে 16 বাইট হেক্স দেখার সারণী)

এটি এমন একটি ফাংশন যা একটি পূর্ণসংখ্যা নেয় xmm0এবং এএসসিআইআই চর ডেটার 8 বাইট প্রদান করেxmm0 কলকারী যেখানে যেখানে খুশি সেখানে সঞ্চয় করার জন্য এটি । (উদাহরণস্বরূপ, অ্যাট্রিবিউট বাইটের সাহায্যে ইন্টারলিভ করার পরে, বা নির্মাণাধীন স্ট্রিংয়ে বা যাই হোক না কেন ভিডিও মেমোরিতে)

সি থেকে, এটিকে __m128i retval = lehex(_mm_cvtsi32_si128(x))x86-64 সিস্টেম ভি কলিং কনভেনশন বা এমএস উইন্ডোজ হিসাবে কল করুন vectorcall

# disassembly with machine-code bytes (the answer) and NASM source code.
0000000000401000 <lehex>:
  401000:       c5 f1 72 d0 04          vpsrld      xmm1, xmm0, 4         ; AVX1
  401005:       c5 f1 60 c8             vpunpcklbw  xmm1, xmm1, xmm0      ; AVX1
  401009:    62 f2 75 08 8d 05 01 00 00 00 vpermb  xmm0, xmm1, [rel .hex_lut]
  401013:       c3                      ret    

0000000000401014 <lehex.hex_lut>:
  401014:     30 31 ...  61 62 ...     .hex_lut:  db "0123456789abcdef"

মোট = 0x24 = 36 বাইট।

দেখুন কিভাবে হেক্স একটি সংখ্যাকে কনভার্ট করবেন? এটি কীভাবে কাজ করে তার জন্য এস। (শিফট / পাঙ্কের জন্য এসএসই 2, তারপরে আমাদের vpermbযে কাজটি প্রয়োজন তা সংরক্ষণ করে pshufbS এসএসই 2 / এসএসএসই 3 এর পরিবর্তে এভিএক্স 1 এছাড়াও একটি movapsরেজিস্টার অনুলিপি এড়িয়ে চলে ))

লক্ষ্য করুন যে punpcklbwসেই ক্রম অনুসারে উত্স অপারেশনগুলি আমাদেরকে নিম্নতম বাইট উপাদানটিতে নিম্ন ইনপুট বাইটের সর্বাধিক-উল্লেখযোগ্য স্তনবৃন্ত দেবে, তারপরে সর্বনিম্ন উত্স বাইটের সর্বনিম্ন-তাত্পর্যপূর্ণ নীচু করবে। (এই এসও উত্তরে, একটি bswapকেবল এসএসই 2 দিয়ে স্ট্যান্ডার্ড প্রিন্টিং অর্ডারে ফলাফল পেতে ইনপুটটিতে ব্যবহৃত হয় But তবে এখানে আমরা চাই , যাতে: প্রতিটি বাইট মধ্যে নিম্ন উপাদানের ক্ষেত্রে উচ্চ মৃদু কামড়, কিন্তু এখনও অল্প endian বাইট অর্ডার)।

আমাদের যদি আরও ডেটা কনস্ট্যান্ট থাকে তবে আমরা একটি করে অ্যাড্রেসিং-মোড স্পেসটি সেভ করতে পারতাম mov edx, imm32ব্যবহার করে [rdx+16]বা যাই হোক না কেন অ্যাড্রেসিং মোডগুলি ব্যবহার করে । বা vpbroadcastb xmm0, [rdx+1]

তবে আমি মনে করি একটি 16 বাইট হেক্স LUT + শর্তটি vpermbবাস্তবায়নের তুলনায় এখনও ভাল n>9 : n+'a'-10 : n+'0': এর জন্য 3 টি ধ্রুবক এবং AVX512BW বাইট-মাস্কিংয়ের সাথে কমপক্ষে 3 টি নির্দেশাবলী প্রয়োজন (মাস্কে তুলনা করুন vpaddb, মার্জ-মুখোশযুক্ত vpaddb), বা এভিএক্স 1 বা এসএসই 2 এর সাথে আরও কিছু। (দেখুন, কীভাবে একটি নম্বর হেক্সে রূপান্তর করবেন? এর একটি এসএসই 2 সংস্করণের জন্য এসও তে)। এবং প্রতিটি এভিএক্স 512 বিডাব্লু নির্দেশ হ'ল কমপক্ষে 6 বাইট লম্বা (4 বাইট ইভিএক্স + অপকোড + মড্রাম), ঠিকানা মোডে স্থানচ্যুতি সহ দীর্ঘতর।

আসলে এটি কমপক্ষে 4 টি নির্দেশনা নেবে কারণ তুলনার আগে আমাদের উচ্চ আবর্জনা পরিষ্কার করতে হবে andps(বা vpandd4-বাইট সম্প্রচারের মেমরি অপেনড সহ ইভিএক্স )। এবং এগুলির প্রত্যেকের জন্য আলাদা ভেক্টর ধ্রুবক প্রয়োজন। AVX512 মেমরি অপারেশনগুলি সম্প্রচার করেছে, তবে কেবল 32-বিট এবং বৃহত্তর উপাদানগুলির জন্য। যেমন ইভিএক্সেরvpaddb সর্বশেষ অপারেন্ডটি কেবল xmm3/m128, নয় xmm3/m128/m8bcst। (ইন্টেলের লোড পোর্টগুলি লোডের অংশ হিসাবে কেবল 32 এবং 64-বিট সম্প্রচার বিনামূল্যে করতে পারে তাই ইনটেল এভিএক্স 512 বিডাব্লুটি প্রতিফলিত করার জন্য ডিজাইন করেছিল এবং বাইট বা শব্দ সম্প্রচারের মেমরি অপারেশনগুলিকে কোনও বিকল্প না দিয়ে পরিবর্তিতভাবে এনকোড করতে সক্ষম হবে না) পাঠ্য সম্প্রচার করুন যাতে আপনি এখনও আপনার ধ্রুবককে 4 বাইট: /।) এ সংকুচিত করতে পারেন)

আমি এসএসএসইvpermb 3 / এভিএক্স 1 এর পরিবর্তে AVX512VBMI ব্যবহার করার কারণটিpshufb দ্বিগুণ:

  • vpermbনির্বাচকদের উচ্চ বিট উপেক্ষা। (v)pshufbকন্ট্রোল ভেক্টরের উচ্চ বিট অনুসারে জিরো বাইটস এবং একটি অতিরিক্ত pandবা andpsপ্রকৃতপক্ষে নীবলগুলি বিচ্ছিন্ন করার জন্য প্রয়োজন হত । এক্সএমএম / ১ 16-বাইট আকারের সাথে, vpermbকেবল অপারেশন বিভাগে[3:0] ইন্টেলের স্বীকৃতিতে বিচলিত-নিয়ন্ত্রণ উপাদানগুলির কম 4 বিটগুলি দেখতে পাওয়া যায় ।
  • vpermbডেটাটি মেমোরি অপারেণ্ড হিসাবে পরিবর্তন করতে (লুকিং টেবিল) পরিবর্তন করতে পারে can (v)pshufbএর এক্সএমএম / মেম অপারেন্ড হ'ল শিফেল-নিয়ন্ত্রণ ভেক্টর।

মনে রাখবেন যে AVX512VBMI কেবল ক্যাননলেক / আইস লেকের উপর উপলভ্য যাতে আপনার সম্ভবত এটি পরীক্ষা করার জন্য একটি সিমুলেটর প্রয়োজন, যেমন ইন্টেলের এসডিই।


⭐ - আপনি সুন্দর উত্তরের জন্য তারকা পেয়েছেন
কামিল কিয়েসজেউস্কি

@ কামিলকিএকজেউসকি: লোল ধন্যবাদ সংখ্যাগুলিকে দক্ষতার সাথে দক্ষতার সাথে রূপান্তর করা আমার পছন্দের জিনিস। বেশ কয়েকটি ঝরঝরে কৌশল এবং বিট-ম্যানিপুলেশনের জন্য এটি দুর্দান্ত ব্যবহারের ক্ষেত্র।
পিটার কর্ডস

3

স্কালা , 58 40 36 বাইট

"%08X"format Integer.reverseBytes(_)

এটি অনলাইন চেষ্টা করুন!

এখনও একটি এর বাইটগুলি বিপরীত করতে বিল্টিন ব্যবহার করে Intতবে একটি হেক্স হিসাবে formatফর্ম্যাট করতে ব্যবহার করে Int। কল করার দরকার নেই toHexString

পেরেনগুলি সরিয়ে ফেলা হয়েছে format। এটির অর্থ এখন যুক্তিটি স্পষ্টভাবে ব্যবহার করে নেওয়া যেতে পারে _


2

ফোর্থ (গফার্থ) , 52 51 40 বাইট

: f hex 0 4. do <# # # 0. #> type loop ;

এটি অনলাইন চেষ্টা করুন!

কোড ব্যাখ্যা

: f           \ start a new word definition
  hex         \ set the current base to base 16
  0           \ convert the input number to a double-cell integer
  4. do       \ start a counted loop from 0 to 3
    <# # #    \ start a formatted numeric string and move last 2 digits to format area
    0.        \ move remaining digits down the stack
    #>        \ delete top two stack value and convert format area to string
    type      \ output string
  loop        \ end loop
;             \ end word definition

2

জেলি , 13 বাইট

+Ø%b⁴Ḋs2Ṛ‘ịØh

এটি অনলাইন চেষ্টা করুন!

একটি পূর্ণ প্রোগ্রাম যা একটি পূর্ণসংখ্যাটিকে তার তর্ক হিসাবে গ্রহণ করে এবং একটি স্ট্রিং মুদ্রণ করে।


Answer আপনার উত্তর শীর্ষে রয়েছে
কামিল কিয়েসজেউস্কি


2

এক্সেল, 91 বাইট

=RIGHT(DEC2HEX(A1,8),2)&MID(DEC2HEX(A1,8),5,2)&MID(DEC2HEX(A1,8),3,2)&LEFT(DEC2HEX(A1,8),2)

2

কে 4 , 12 11 বাইট

সমাধান:

,/$|4_0x0\:

উদাহরণ:

q)k),/$|4_0x0\:304767
"7fa60400"
q)0W
"0004a67f"

ব্যাখ্যা:

প্রশ্নটি ঠিক কী জিজ্ঞাসা করে:

,/$|4_0x0\: / the solution
      0x0\: / split to bytes
    4_      / drop first 4 bytes
   |        / reverse
  $         / convert to string
,/          / flatten

মন্তব্য:

  • কে -৪ নম্বর হিসাবে -১ বাইট ডিফল্টরূপে লম্বা (bit৪ বিট), সুতরাং 4 বাইট (32 বিট) ছাড়বে

Answer আপনার উত্তর শীর্ষে রয়েছে
কামিল কিয়েসজেউস্কি

2

পিএইচপি , 31 বাইট

<?=unpack(H8,pack(V,$argn))[1];

এটি অনলাইন চেষ্টা করুন!

পিএইচপি এর প্যাক সুবিধা গ্রহণ এবং আনপ্যাকটির আমি স্বাক্ষরযুক্ত ইনপুটটিকে "32 বিট লিটল এন্ডিয়ান বাইট অর্ডার" ফর্ম্যাট ( V) দিয়ে বাইনারি স্ট্রিংয়ে প্যাক করি এবং তারপরে "হেক্স স্ট্রিং, হাই নিবল প্রথম" ফর্ম্যাট ( H) দিয়ে আনপ্যাক করে ফলাফলটি মুদ্রণ করি।

এটি এমন একটি বিরল ক্ষেত্রে মনে হয় যেখানে পিএইচপি'র বিল্ট-ইনগুলি একটি সাধারণ অ্যালগরিদম বাস্তবায়নের চেয়ে সংক্ষিপ্ততর হয়!


পিএইচপি pack()/ unpack()ফাংশনগুলি আপনাকে বেশিরভাগ পিএইচপি প্রকল্পে 0 বার প্রয়োজন হয় তার জন্য দুর্দান্ত। অভিনন্দন, আপনি তাদের ব্যবহার খুঁজে পেয়েছেন!
2140

1

কাঠকয়লা , 11 বাইট

⪫⮌⪪﹪%08xN²ω

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

        N   Input as a number
   ﹪%08x    Format using literal string
  ⪪      ²  Split into pairs of characters
 ⮌          Reverse
⪫         ω Join
            Implicitly print

পাইথন ফর্ম্যাটিংয়ের অবলম্বন না করে 19 বাইট:

⪫…⮌⪪⍘⁺X²¦³⁶N¹⁶¦²¦⁴ω

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

           N        Input as a number
     ⁺              Plus
       ²            Literal 2
      X             To power
         ³⁶         Literal 36
    ⍘               Convert to base
            ¹⁶      Literal 16
   ⪪           ²    Split into pairs of digits
  ⮌                 Reverse the list
 …               ⁴  Take the first 4 pairs
⪫                 ω Join together
                    Implicitly print

Answer আপনার উত্তর শীর্ষে রয়েছে
কামিল কিয়েসজেউস্কি


1

জে , 10 বাইট

8{._1{3!:3

এটি অনলাইন চেষ্টা করুন!

কিভাবে

3!:3হেক্স উপস্থাপনের জন্য এটি একটি জে "বিদেশী সংমিশ্রণ", এখানে নথিভুক্ত । এটি হেক্সে রূপান্তর করার জন্য অন্তর্নির্মিত। যাইহোক, এটি আউটপুট এটি যা আমরা চাই তা পুরোপুরি নয়। যেমন চলমান:

3!:3 (304767)

সৃষ্টি করে:

e300000000000000
0400000000000000
0100000000000000
0000000000000000
7fa6040000000000

অন্যান্য লাইনের অর্থ উপরে বর্ণিত ডক পৃষ্ঠায় ব্যাখ্যা করা হয়েছে। যাইহোক, এটি পরিষ্কার যে আমরা শেষ লাইনের প্রথম 8 টি অক্ষর চাই।

_1{ শেষ লাইন পেতে।

8{. এটির প্রথম 8 টি অক্ষর পেয়েছে।


Answer আপনার উত্তর শীর্ষে রয়েছে
কামিল কিয়েসজেউস্কি

1

রুবি , 31 27 বাইট

নাইট 2 এর পিএইচপি উত্তরের একটি বন্দর হয়ে শেষ হয়েছিল কারণ রুবির একই প্যাক / আনপ্যাক কার্যকারিতা রয়েছে।

->*i{i.pack(?V).unpack'H8'}

এটি অনলাইন চেষ্টা করুন!

আমার আসল 31-বাইট উত্তর যা H8 আনপ্যাক মোডটির সুবিধা নেয়নি কারণ আমি এটি সম্পর্কে জানতাম না:

->*i{'%02x'*4%i.pack(?V).bytes}

এটি অনলাইন চেষ্টা করুন!


1

উইন্ডোজ ব্যাচ, 90 বাইট

@for /l %%x in (24,-8,0)do @set/aa=%1^>^>%%x^&255&cmd/cexit !a!&<nul set/p=!=exitcode:~-2!

বিলম্বিত প্রসারণ সক্ষম করতে / v দিয়ে কমান্ড-লাইনটি চালান।


1

x86 32-বিট মেশিন কোড, 24 21 বাইট

চেঞ্জলগ: -৩ বাইট: স্ট্যান্ডার্ড অ্যাড / সিএমপি / জেবি / প্রতিস্থাপন করুন একটি ডিএএস হ্যাকের সাথে @ পেটার ফেরি দ্বারা

64-বিট: এখনও 24 বাইট। লং মোডটি ডিএএস অপকোডটিকে সরিয়েছে।
16-বিট মোড: ডিফল্ট অপারেন্ড-আকারটি 16-বিট তবে সমস্যাটি নির্দিষ্টভাবে অন্তর্নিহিত 32-বিট। হার্ড-কোডেড 8 হেক্স ডিজিট সহ।


bswapস্ট্যান্ডার্ড অর্ডারে ম্যানুয়াল ইনট-> হেক্সের সাথে বাইট-রিভার্স করুন (সর্বাধিক উল্লেখযোগ্য স্তন্যপায়ী , প্রথমে আরোহী ক্রমে চার্ট আউটপুট বাফারে হেক্স সংখ্যা লিখতে হবে)) এটি একটি বাইট বনামের মধ্যে নিবলগুলির মধ্যে ক্রমটি স্যুইচ করার জন্য লুপটি আনারল করা দরকার avo বাইট জুড়ে।

void lehex(char buf[8] /*edi*/, uint32_t x /*esi*/);X86-64 সিস্টেম ভি এর মতো কলযোগ্য , বাদে এটি 64-বিট মোডে কাজ করে না। (এটির জন্য ইডিআইতে আউটপুট পয়েন্টার প্রয়োজন stosb। ইনপুট নম্বর ইসিএক্স বা ইএএক্স ছাড়া অন্য কোনও রেজিস্টারে থাকতে পারে))

     1                             lehex:
     2 00000000 0FCE                   bswap  esi
     3 00000002 6A08                   push   8            ; 8 hex digits
     4 00000004 59                     pop    ecx
     5                             .loop:                ;do{
     6 00000005 C1C604                 rol    esi, 4       ; rotate high nibble to the bottom
     7                             
     8 00000008 89F0                   mov    eax, esi
     9 0000000A 240F                   and    al, 0x0f     ; isolate low nibble
    10 0000000C 3C0A                   cmp al, 10          ; set CF according to digit <= 9
    11 0000000E 1C69                   sbb al, 0x69        ; read CF, set CF and conditionally set AF
    12 00000010 2F                     das                 ; magic, which happens to work
    13                             
    14 00000011 AA                     stosb               ; *edi++ = al
    15 00000012 E2F1                   loop  .loop       ; }while(--ecx)
    16                             
    17 00000014 C3                     ret

আকার = 0x15 = 21 বাইট।

টিএমও FASM 32-বিট x86 টেস্ট কেস হিসাবে একটি এসএম কলারের সাথে কেস ব্যবহার করেwrite দুটি বারে বাফারের সাথে যুক্ত করতে দুবার কল করার পরে আউটপুট লিখতে সিস্টেম কল ব্যবহার করে। সংখ্যা বনাম চিঠির মধ্যে সীমানায় 9 এবং A সহ সমস্ত হেক্স্স অঙ্ক 0..F পরীক্ষা করে।

দ্য DASহ্যাক - এক্স 86 কম মৃদু কামড় থেকে বের করে নিয়ে, একটি অর্ধ বহন পতাকা হয়েছে। প্যাক-বিসিডি স্টাফ যেমন DAS নির্দেশের জন্য দরকারী, দুটি 2-সংখ্যার বিসিডি পূর্ণসংখ্যার বিয়োগের পরে ব্যবহারের উদ্দেশ্যে। AL- এর নিম্ন স্তনবৃন্ত 0-9 সীমার বাইরে থাকায় আমরা অবশ্যই এখানে এটি গালি দিচ্ছি।

ম্যানুয়ালটিতে অপারেশন বিভাগের if (old_AL > 99H) or (old_CF = 1)তৃতীয় AL ← AL − 60H;অংশটি লক্ষ্য করুন ; sbb সর্বদা এখানে সিএফ সেট করে যাতে সেই অংশটি সর্বদা ঘটে। বড় হাতের অক্ষরের জন্য এটি এবং এএসসিআইআই ব্যাপ্তি পছন্দটিকে প্রেরণা দেয়sub al, 0x69

  • cmp 0xD, 0xA সিএফ সেট করে না
  • SBB 0xD - 0x69 AL = এ মোড়ানো0xA4 ইনপুট হিসাবে । (এবং সিএফ সেট করে, এএফ সাফ করে)
  • ড্যাসের প্রথম অংশে কোনও এলএল - = 6 নেই (কারণ 4> 9 টি মিথ্যা এবং এএফ = 0)
  • AL - = 0x60 দ্বিতীয় অংশে ছেড়ে যাচ্ছে 0x44, এর জন্য ASCII কোড'D'

বনাম একটি সংখ্যা:

  • cmp 0x3, 0xA সিএফ সেট করে
  • SBB 3 - 0x69 - 1 = AL = 0x99 এবং সিএফ এবং এএফ সেট করে
  • DAS এর প্রথম অংশে কোনও AL - = 6 নেই (9> 9 টি মিথ্যা তবে এএফ সেট করা আছে), 0x93 রেখে
  • AL - = 0x60 দ্বিতীয় অংশে 0x33 রেখে ASCII কোড '3'

এসবিবিতে বিয়োগ 0x6aপ্রতিটি অঙ্কের জন্য এএফ সেট করবে <= 9 সুতরাং সমস্ত সংখ্যা একই যুক্তি অনুসরণ করে। এবং এটি প্রতিটি বর্ণমালা হেক্স ডিজিটের জন্য সাফ রেখে দিন। অর্থাত্ DAS- র 9 / A বিভাজন হ্যান্ডলিং সঠিকভাবে কাজে লাগানো।


সাধারণত (পারফরম্যান্সের জন্য) আপনি একটি স্কেলার লুপের জন্য একটি লুকিং টেবিল বা সম্ভবত একটি শাখাবিহীন 2x leaএবং cmp/cmovশর্তসাপেক্ষ অ্যাড ব্যবহার করবেন add তবে 2-বাইট al, imm8নির্দেশাবলী কোড-আকারের জন্য একটি বড় জয়।


x86-64 'VERSION সংস্করণ : শুধু অংশ আলাদা মধ্যে and al, 0xfএবং stosb

;; x86-64 int -> hex  in 8 bytes
    10 0000000C 0430                   add    al, '0'
    11 0000000E 3C39                   cmp    al, '9'
    12 00000010 7602                   jbe  .digit
    13 00000012 0427                     add    al, 'a'-10 - '0'     ; al =  al>9 ? al+'a'-10 : al+'0'
    14                             .digit:

লক্ষ্য করুন যে add al, '0' সর্বদা চলতে থাকে, এবং শর্তসাপেক্ষ যুক্তটি কেবল / এর পরিবর্তে কেবলমাত্র একটি তৈরি করতে 'a'-10এবং এর মধ্যে পার্থক্য যুক্ত করে'0'ififelse

আমার সি উত্তরmain হিসাবে একই কলার ব্যবহার করে পরীক্ষিত এবং কাজ করে , যা ব্যবহার করে এবং ।char buf[8]printf("%.8s\n", buf)


আপনি কি এখানে অনলাইন-ওয়ার্কিং স্নিপেট তৈরি করতে পারেন ?
কামিল কিয়েসজেউস্কি

@ কামিলকিএকজেউসকি: টিআইও একটি এসএম ফাংশন পরীক্ষা করার জন্য সি-তে কলার লেখা অসম্ভব করে তোলে (এএফএআইকি) যাতে আমি প্রায়শই বিরক্ত হই না, তবে নিশ্চিত যেহেতু আপনি জিজ্ঞাসা করেছেন এবং sys_writeনির্ধারিত দৈর্ঘ্যের স্ট্রিংগুলি সহজে আউটপুট করতে পারেন। ওহ আকর্ষণীয়, আমি টিআইও-তে FASM উপলব্ধি করতে পারি নি যে আপনাকে 32-বিট এক্সিকিউটেবল তৈরি করতে দিন, NASM এর সাথে ভিন্ন নয় যেখানে এটি সম্মান করে না -felf32। আমি যাইহোক x86-64 পছন্দ করি এবং এই উত্তরটি 32-বিট কোড থেকে কোনও বাইট সংরক্ষণ করে না।
পিটার কর্ডস

⭐ - আপনি সুন্দর উত্তরের জন্য তারকা পেয়েছেন
কামিল কিয়েসজেউস্কি

1
@ জেএল 2210: আপনার মানে sprintf? আমার মনে হয় না যে libc এর বিন্যাস-স্ট্রিং ভিত্তিক কোনও স্ট্রিং-> স্ট্রিং-এর মতো কেবল স্ট্রিং-> স্ট্রিং ফাংশন রয়েছে। তবে হ্যাঁ, বিএসএপ / প্রিন্টফ সম্ভবত সংক্ষিপ্ত হবে, যদি আপনি গতিশীল লাইব্রেরিতে কোনও ফাংশনের জন্য জিওটি প্রবেশের জন্য বাইট গণনা করার কোনও উপায় বের করতে পারেন (6 বাইট call [rel printf wrt ..got]কল সাইটটি ছাড়াও ); একটি সর্বনিম্ন স্ট্যাটিক্যালি লিঙ্কযুক্ত এক্সিকিউটেবলগুলি গতিশীলের তুলনায় উল্লেখযোগ্যভাবে ছোট হতে পারে, কমপক্ষে যখন ldস্বাভাবিক ডিফল্ট দ্বারা তৈরি করা হয়। তবে আমি মনে করি না এটি স্ট্যাটিকালি লিঙ্ক করা যুক্তিসঙ্গত হবে তবে এর কোডের আকারটি গণনা করা হবে না।
পিটার কর্ডস

1
@ জেএল 2210: মনে রাখবেন এটি একটি x86 মেশিন কোড উত্তর, asm পাঠ্য উত্সের আকার নয়। আমি পূর্ববর্তী মেশিন-কোড জবাবগুলিতে libc ফাংশন ব্যবহার করি নি, কেবল লিনাক্স সিস্টেম কল (যেমন ফিবোনাকিতে) এবং আইডিকে আমি কীভাবে ব্যয় গণনা করতে যাব বা আমি এমনকি মেশিন-কোড-সহ-লিবিসি উত্তরগুলিও লিখতে চাই কিনা । এক্স 86 মেশিন কোডের জন্য ব্যবহারের কেস রয়েছে যেখানে একটি লাইবসি পাওয়া যায় না, যেমন একটি বুটলোডার।
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.