হেক্স আপনার উত্স কোড ডাম্প


15

কোড-গল্ফ করার সময় এমন সময় আসবে যখন আপনার কোডের একটি হেক্স ডাম্পের প্রয়োজন হবে, সাধারণত আপনি অনিদ্রিত অক্ষর ব্যবহার করেছেন বলে। সুতরাং, কেন হেক্স ডাম্প নিজেই একটি প্রোগ্রাম তৈরি করবেন না?

চ্যালেঞ্জ

এই চ্যালেঞ্জটি হ'ল, কোনও ইনপুট না দিয়ে নিম্নলিখিত ফরম্যাটে আপনার উত্স কোডের একটি হেক্স ডাম্প আউটপুট দেয়:

0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

অথবা, উদাহরণস্বরূপ, যদি আপনার প্রোগ্রামটি ছিল print("SomeString"):rep(123)

0000: 70 72 69 6e 74 28 5c 22 53 6f 6d 65 53 74 72 69  print("SomeStrin
0010: 6e 67 5c 22 29 3a 72 65 70 28 31 32 33 29        g"):rep(123)

সুনির্দিষ্ট

হেক্স ডাম্পটি তিনটি অংশে সারিগুলিতে বিভক্ত হয়, প্রতিটি সারি আপনার উত্স কোডের 16 বাইট উপস্থাপন করে।

প্রথম অংশটি মেমরি ঠিকানা। এটি নির্দিষ্ট করে যে আপনার কোডটিতে বর্তমান সারিটি শুরু হয়। 2 বাইট হেক্সাডেসিমাল সংখ্যা হিসাবে লিখিত, এর পরে ক :, পরে একটি স্থান।

দ্বিতীয়টি হেক্স ডাম্প নিজেই। এটি আপনার সোর্স কোডের 16 বাইট, স্পেস দ্বারা পৃথক করে হেক্সাডেসিমাল ফর্মে লিখিত। এটি আপনার কোডের এনকোডিং ব্যবহার করে একটি সঠিক বাইট উপস্থাপনা হওয়া উচিত।

শেষ পর্যন্ত, দুটি স্থান ফাঁক হওয়ার পরে কোডটি নিজেই। এটি প্রিন্টযোগ্য অক্ষর হিসাবে আপনার কোডের কেবল 16 অক্ষর.

মন্তব্য

  • এই হল একটি তাই হয়, চ্যালেঞ্জ স্ট্যান্ডার্ড Quine বিধি প্রযোজ্য।
  • এবং এটি চ্যালেঞ্জও, সুতরাং স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ হয়।
  • দ্বিতীয় উদাহরণ হিসাবে দেখানো হয়েছে, EOF এর পরে বাইট লিখবেন না, পরিবর্তে হোয়াইটস্পেস ব্যবহার করুন।
  • স্পেস স্পেস ঠিক আছে।
  • হেক্স ডাম্পের ইনবিল্টস, যদি আপনার এই নির্দিষ্ট ফর্ম্যাটে একটি থাকে তবে এটি নিষিদ্ধ নয় তবে তা ভুগছে।
  • মুদ্রণযোগ্য অক্ষরগুলি এমন কোনও চরিত্রকে বোঝায় যা কেবলমাত্র একক বাইট হিসাবে উপস্থাপিত, একটি একক ব্যবধানযুক্ত গ্লিফ হিসাবে প্রতিনিধিত্ব করতে পারে না। হল UTF-8, এর মানে হল জন্য 0-31, 128-255। জন্য জেলি Codepage , যেমন সমস্ত অক্ষর একটি একক ব্যবধানযুক্ত গ্লিফের হিসাবে প্রতিনিধিত্ব করা যেতে পারে, কোন অ মুদ্রণযোগ্য অক্ষর।


ব্যক্তিগতভাবে আমার মনে হয় এটি একটি প্রয়োগকৃত কুইন এটিকে যথেষ্ট আলাদা করে তোলে তবে আমি সম্প্রদায়ের চিন্তাভাবনাগুলি দেখতে আগ্রহী।
এটাকো

1
সুতরাং রেকর্ডের জন্য, আপনি নিজের ফাইলের নাম এবং xxdএটি পড়তে পারবেন না ?
Rɪᴋᴇʀ

4
অবশ্যই তা নয়, স্ট্যান্ডার্ড কুইন বিধিগুলি
এটিকে

1
ব্যক্তিগতভাবে, আমি এটি উত্তর পর্যন্ত ছেড়ে দিতে হবে। এর কারণে কোনও ভাষা বাদ দেওয়া আমার মতে একেবারেই অপ্রয়োজনীয়। আপনি যদি একটি নির্দিষ্ট প্রস্থের জন্য জেদ করেন তবে এমন কিছু ব্যবহার করুন যা বেশিরভাগ ভাষার পক্ষে পর্যাপ্ত হওয়া উচিত। বেশিরভাগ হেক্সডাম্প ইউটিলিটিগুলি 7 হেক্স-ডিজিট ব্যবহার করে।
ডেনিস

উত্তর:


3

ভি , 39 বাইট

ñi241"qp:%!xxd
Î4x
Íøø / &
f&3i ÿ

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

মনে রাখবেন যে সাধারণত ভি ল্যাটিন 1 এনকোডিং ব্যবহার করে, যেখানে এটি 36 বাইট (যা টিআইও বলেছে) তবে এই জমাটি ইউটিএফ -8 ব্যবহার করছে যেখানে এটি 39 বাইট।

এটি আমি প্রায় ভি-কুইন টেম্পলেটটির একটি পরিবর্তন মাত্র ।


0aআউটপুট শেষে নিউলাইনটি সরানো উচিত নয়?
ক্রিটসি লিথোস

@ প্রকটিক্সিলিথোস আহ, আমি সে সম্পর্কে ভুলে গেছি। শেষের দিকে একটি নতুন লাইন যুক্ত করা সহজ।
জেমস

8

পার্ল, 81 বাইট

#!perl -l
$_=q($%+=print"00$%0: @{[unpack'(H2)*']}  $_"for"\$_=q($_);eval"=~/.{16}/g);eval

এক হিসাবে শেবাংকে গণনা করা হচ্ছে। কোড দৈর্ঘ্য 16 এর একাধিক হওয়া ফর্ম্যাটিংয়ের ক্ষেত্রে বেশ কিছুটা সাশ্রয় করে। নিজেই evalপুনরায় স্বাক্ষর$_ করতে ব্যবহার করে আইস 523 থেকে ধার নেওয়া ।

আউটপুট:

0000: 24 5f 3d 71 28 24 25 2b 3d 70 72 69 6e 74 22 30  $_=q($%+=print"0
0010: 30 24 25 30 3a 20 40 7b 5b 75 6e 70 61 63 6b 27  0$%0: @{[unpack'
0020: 28 48 32 29 2a 27 5d 7d 20 20 24 5f 22 66 6f 72  (H2)*']}  $_"for
0030: 22 5c 24 5f 3d 71 28 24 5f 29 3b 65 76 61 6c 22  "\$_=q($_);eval"
0040: 3d 7e 2f 2e 7b 31 36 7d 2f 67 29 3b 65 76 61 6c  =~/.{16}/g);eval

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


5

পার্ল + এক্সএক্সডি + কাট, 61 বাইট

$_=q(open F,"|xxd -g1|cut -c5-";print F"\$_=q($_);eval");eval

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

এটি পার্লের সর্বজনীন কুইন নির্মাতা + হেক্সডাম্পিংয়ের জন্য xxdএবং cutকরার জন্য একটি কল । প্রশ্নে থাকা প্রোগ্রামগুলির কোনওটিরই বিন্যাসে হেক্সডাম্প করার কোনও অন্তর্নির্মিত প্রশ্ন নেই; তবে, xxd -g1খুব কাছাকাছি আসে এবং তাই cutআউটপুটটিকে সঠিক আকারে ছাঁটাই করতে ব্যবহার করা সম্ভব ।

সর্বজনীন কুইন কনস্ট্রাক্টর হ'ল $_=q("\$_=q($_);eval");evalযা মেমরিতে নিজের উত্স কোডের একটি অনুলিপি তৈরি করে এবং এতে স্বেচ্ছাসেবক কার্য সম্পাদন করতে সংশোধন করা যায়। এই ক্ষেত্রে, আমি বাইরের প্রোগ্রামগুলিতে ইনপুটটি পাইপ করতে open "|"এবং printপাইপ করার জন্য, xxdযা হেক্সডাম্পিংয়ের বেশিরভাগ কাজ করে এবং cutএটি এটিকে প্রয়োজনীয় বিন্যাসে পরিবর্তন করে।


3

জাভাস্ক্রিপ্ট (ES6) 229 219 162 বাইট

অনেকগুলি বাইট সঞ্চয় করার জন্য @ নীলকে ধন্যবাদ জানাই

বিঃদ্রঃ

বেশ কিছু লোক মনে করে যে কোনও ফাংশনের সোর্স কোড অ্যাক্সেস করা আমার পক্ষে এটি প্রতারণা, তবে @ ডেনিসের মতে, এটি ঠিক আছে। যেমন, আমি আমার উত্তর এখানে রেখে দেব।

কোড

f=_=>([...c=`f=`+f].map(d=>d.charCodeAt()[t=`toString`](16)).join‌​` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00${i[t](16)}0: `+s+c.substr(i*16,16)).join`\n`

ব্যবহার

f()

কোনও যুক্তি ছাড়াই কেবল ফাংশনটি কল করুন।

আউটপুট

0000: 66 3d 5f 3d 3e 28 5b 2e 2e 2e 63 3d 60 66 3d 60 f=_=>([...c=`f=`
0010: 2b 66 5d 2e 6d 61 70 28 63 3d 3e 63 2e 63 68 61 +f].map(c=>c.cha
0020: 72 43 6f 64 65 41 74 28 29 5b 74 3d 60 74 6f 53 rCodeAt()[t=`toS
0030: 74 72 69 6e 67 60 5d 28 31 36 29 29 2e 6a 6f 69 tring`](16)).joi
0040: 6e 60 20 60 2b 60 20 60 2e 72 65 70 65 61 74 28 n` `+` `.repeat(
0050: 34 36 29 29 2e 6d 61 74 63 68 28 2f 2e 7b 34 38 46)).match(/.{48
0060: 7d 2f 67 29 2e 6d 61 70 28 28 73 2c 69 29 3d 3e }/g).map((s,i)=>
0070: 60 30 30 24 7b 69 5b 74 5d 28 31 36 29 7d 30 3a `00${i[t](16)}0:
0080: 20 60 2b 73 2b 63 2e 73 75 62 73 74 72 28 69 2a  `+s+c.substr(i*
0090: 31 36 2c 31 36 29 29 2e 6a 6f 69 6e 60 5c 6e 60 16,16)).join`\n`                                     

1
(নিশ্চিত না 'F =' + F মান quine নিয়ম অধীন অনুমতি যে হয় কিন্তু যদি এটা তাহলে 161 বাইট জন্য আমি আপনাকে দিতে f=_=>([...c=`f=`+f].map(c=>c.charCodeAt().toString(16)).join` `+` `.repeat(46)).match(/.{48}/g).map((s,i)=>`00`+i.toString(16)+`0 `+s+c.substr(i*16,16)).join`\n`
নিল

চতুর পদ্ধতির। আমি কিছু প্রশ্ন পড়েছি এবং দেখা যাচ্ছে যে লোকেদের সাধারণত এটি প্রতারণার বলে মনে করা হয় কারণ আমি একটি সুবিধাজনক ভাষার বৈশিষ্ট্যকে গালি দিচ্ছি। আমি আমার উত্তরে আপনার উন্নত কোড সহ এটি যুক্ত করব।
লুক

আমি মনে করি এটি অনুমোদিত হয়েছে, ডেনিস আরও একটি কুইন চ্যালেঞ্জের বিষয়ে বলেছিলেন যে ফাংশন উত্স পরিদর্শন ব্যবহার করা ভাল, এবং আমি জানি বেশ কয়েকটি "গল্ফ এ কুইন" উত্তর এটি ব্যবহার করে।
ফ্লিপট্যাক

প্রথমটি এবং দ্বিতীয়টি 3 টি বাইট সংরক্ষণ .toStringকরতে পরিবর্তন করুন । অন্য একটি সংরক্ষণ করতে পরিবর্তন করুন । [t=toString][t]<backtick>\n<backtick><backtick><newline><backtick>
ব্যবহারকারী 2428118

স্ট্রিং পদ্ধতিটি পরিবর্তনের জন্য ফাংশনের নামটির একটি স্ট্রিং হওয়া দরকার, এটি কেবল একটি বাইট সংরক্ষণ করে। নিউলাইন হিসাবে, এটি aহেক্স ডাম্পে একটি ফলস্বরূপ হবে , যার জন্য 0 টি প্রিপেন্ড করা দরকার, এবং এই চেকটি যুক্ত করার ফলে কেবল বাইকোন্ট বাড়ানো হবে।
লুক

2

রুবি, 128 112 বাইট

eval b='7.times{|y|$><<"%04x:"%y*=16;c=("eval b="+(a=39.chr)+b+a)[y,16];c.chars{|x|$><<" %x"%x.ord};puts"  "+c}'

নতুন লাইনের পিছনে ছাড়াই।

16-বাইট সীমানায় সারিবদ্ধ করার ধারণার জন্য প্রিমো ধন্যবাদ Thanks

আউটপুট

0000: 65 76 61 6c 20 62 3d 27 37 2e 74 69 6d 65 73 7b  eval b='7.times{
0010: 7c 79 7c 24 3e 3c 3c 22 25 30 34 78 3a 22 25 79  |y|$><<"%04x:"%y
0020: 2a 3d 31 36 3b 63 3d 28 22 65 76 61 6c 20 62 3d  *=16;c=("eval b=
0030: 22 2b 28 61 3d 33 39 2e 63 68 72 29 2b 62 2b 61  "+(a=39.chr)+b+a
0040: 29 5b 79 2c 31 36 5d 3b 63 2e 63 68 61 72 73 7b  )[y,16];c.chars{
0050: 7c 78 7c 24 3e 3c 3c 22 20 25 78 22 25 78 2e 6f  |x|$><<" %x"%x.o
0060: 72 64 7d 3b 70 75 74 73 22 20 20 22 2b 63 7d 27  rd};puts"  "+c}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.