উত্স আউটপুট, এক সময় এক বিট


18

একটি খালি নয় এমন প্রোগ্রাম বা ফাংশন লিখুন যা যখন একক মান, 1 বা 0 আউটপুট বলে এবং যখন একাধিকবার কল করা হয়, আউটপুট নম্বরগুলি আপনার প্রোগ্রামের উত্স কোডের বাইনারি উপস্থাপনা তৈরি করে (একই কোড পৃষ্ঠাতে যা থেকে আপনার কোডটি সংকলিত হয়) / ব্যাখ্যা)।

উদাহরণস্বরূপ, যদি আপনার উত্স কোড ছিল abc (ASCII তে) থাকে তবে ফলাফলগুলি :

1st call:  0           // ASCII letter 'a'
2nd call:  1
3rd call:  1
4th call:  0
5th call:  0
6th call:  0
7th call:  0
8th call:  1

9th call:  0           // ASCII letter 'b'
10th call: 1
11th call: 1
12th call: 0
13th call: 0
14th call: 0
15th call: 1
16th call: 0

17th call: 0           // ASCII letter 'c'
18th call: 1
19th call: 1
20th call: 0
21st call: 0
22nd call: 0
23rd call: 1
24th call: 1

After the 24th call, the behaviour is undefined.

উত্সের বাইনারি উপস্থাপনায় অবশ্যই কমপক্ষে একটি 0 বিট এবং 1 বিট থাকতে হবে।

1 এবং 0 এর পরিবর্তে, আপনি যে কোনও দুটি স্বতন্ত্র, ধারাবাহিক মান আউটপুট করতে পারেন (যেমন such true এবং false) ।

মূল উত্সের বাইনারি উপস্থাপনাকে আউটপুট দেয় এমন স্ব-সংশোধনকারী প্রোগ্রামগুলি অনুমোদিত হয়, তবে তারা পরবর্তী কী মুদ্রণ করবে তা সন্ধানের জন্য উত্স কোডটি না পড়েন।

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins

উত্তর:


8

ফানকি , 47 41 37 বাইট

কিছুটা উপস্থাপন করে এমন একটি নম্বর প্রদান করে।

f=_=>1&("%b"%("f="+f)[i//8])>>7-i++%8

এটি এর কাইন বিন্যাস ব্যবহার করে f=_=>"f="+f। এটি অক্ষরটিকে ⌊i / 8⌋ এ নিয়ে যায় , তারপরে, বর্তমান চরিত্রের আসকি মান n >> 7-i%8কোথায় nরয়েছে তার জুটিটি নিয়ে বিটটি পায় ।

এটি একটি পুনরাবৃত্তি ফাংশন যা iপ্রতিটি কলের সাথে বৃদ্ধি পায় , একবার এটি উত্স কোডের বাইরে চলে গেলে, এটি nচিরকালের জন্য কোডটি লিখবে ।

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


এটি কি জাভাস্ক্রিপ্ট সহ বহুবিবাহ?
স্ট্যান স্ট্রাম

9

বাশ , 105 বাইট

trap -- 'trap|xxd -b -c1|cut -d\  -f2|tr -d \\n|cut -c`x=\`cat f||echo 1\`;echo $((x+1))>f;echo $x`' EXIT

দ্রষ্টব্য : আপনি যে fডিরেক্টরিটি পরীক্ষা করছেন এটিতে আপনার কাছে একটি গুরুত্বপূর্ণ ফাইল না রয়েছে তা নিশ্চিত করুন ।


আপনি যদি এটি পরীক্ষা করতে চান তবে নীচের কমান্ডটি ব্যবহার করতে পারেন:

for i in $(seq 848); do bash path/to/script.sh 2> /dev/null; done | tr -d \\n

যা একই আউটপুট দিতে হবে xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n

ব্যাখ্যা

এটি trapকৌশলটি ব্যবহার করছে - ক্রিয়াকলাপের trapভিতরে কল করা trapকেবল সেই লাইনটি মুদ্রণ করে। এরপরে সেই আউটপুটটি পাইপ হয়ে যায় xxdযা এটিকে বাইনারিতে রূপান্তর করে (দুর্ভাগ্যক্রমে xxd -bpকাজ করে না - এইভাবে cut& এর সাথে কার্যক্ষম tr):

xxd -c1 -b $0|cut -d\  -f2|tr -d \\n

সে থেকে আমরা কেবলমাত্র একটি বিট (বলি N) -এর সাথে আগ্রহী যা আমরা নির্বাচন করতে পারিcut -cN

Nআমরা কী ব্যবহার করছি তা জানতে (প্রতিটি কলের পরে সেই অংশটি বাড়ানোর দরকার রয়েছে তা মনে রাখবেন), কেবল xফাইলের বিষয়বস্তুতে সেট করার চেষ্টা করুন fএবং যদি এটি বিদ্যমান না থাকে তবে এটি সেট করে 1:

x=`cat f||echo 1`

শেষ কাজটি হ'ল ফাইলটি আপডেট করা f- এতে লেখা x+1:

echo $((x+1))>f

7

টিআই-বেসিক (টিআই -83 সিরিজ), 592 357 309 বাইট

"123456789ABCDEF02A3132333435363738394142434445463004AA003FB958833404593FB9588338045A3F3230363FDA582B383F303FCE5A405A6B3232333F5A70BB0FAA002BBB0CAA002B5A2B313FB932BA32F01058713459713511BB0FAA002BBB0CAA002B597031377132722B31→Str1
iPart(X/4→Y
iPart(X/8→Z
206
IS>(X,8
0
If Z and Z<223
Z+inString(Str1,sub(Str1,Z,1
iPart(2fPart(2^(X-4Y-5)inString(Str1,sub(Str1,Y+17-2Ans,1

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

তুলনা এবং / বা interest তিহাসিক আগ্রহের জন্য: টিআই-বেসিকে লেখা প্রথম কুইন্স

কিভাবে এটা কাজ করে

Str1 সোর্স কোডটি সংরক্ষণ করে (এখন গৌরবময় হেক্সাডেসিমালে, আগের বাইনারি সংস্করণে প্রচুর জায়গা সাশ্রয় করছে) বিটগুলি রেখে যেখানে লিখিত সামগ্রীগুলি রয়েছে Str1 উপস্থাপন করা হবে।

আমরা অভিমানী করছি যে প্রোগ্রাম একটি ক্যালকুলেটর যার মেমরির শুধু সাফ করা হয়েছে আউট শুরু হয়, তাই Xহল 0। প্রোগ্রামের মাধ্যমে প্রতিটি সময়, আমরা বৃদ্ধিX

সাধারণত, আমরা কেবলমাত্র অর্ধ-বাইটটি আবিষ্কার করি যা থেকে আমরা কিছুটা বের করতে, এটিকে পড়তে Str1, হেক্সাডেসিমাল থেকে বাইনারি রূপান্তর করতে এবং মুদ্রণ করার চেষ্টা করছি। আমরা সোর্স কোড যে সংরক্ষণকারী অংশ হন, তাহলে Str1(যা প্রোগ্রামের মোট দৈর্ঘ্য দুই তৃতীয়াংশ হয়), তাহলে আমরা স্ট্রিং এর সংশ্লিষ্ট অংশ প্রথম পদক্ষেপ সংরক্ষণকারী 31, 32, ইত্যাদি।


4

জাভা 8, 249 241 237 234 148 বাইট

int i;v->{String s="int i;v->{String s=%c%s%1$c;return s.format(s,34,s).charAt(-i/8)>>(--i&7)&1;}";return s.format(s,34,s).charAt(-i/8)>>(--i&7)&1;}

দীর্ঘ ব্যাখ্যার জন্য অগ্রিম দুঃখিত। :)

  • হোয়াপ্পে 89 বাইটস সংরক্ষণ করেছেন @ নেভায়ে ধন্যবাদ ।

এখানে চেষ্টা করুন।

ব্যাখ্যা:

int i;                     // Index-integer on class-level
v->{                       // Method with empty unused parameter and integer return-type
  String s="int i;v->{String s=%c%s%1$c;return s.format(s,34,s).charAt(-i/8)>>(--i&7)&1;}";
                           //  String containing the unformatted source code
  return s.format(s,34,s)  //    Quine to get the source code,
      .charAt(-i/8)        //     and get the character at index `-i/8`
     >>                    //    And bitwise right-shift it with:
       (--i&7)             //     `i-1` bitwise-AND 7
                           //     by first decreasing `i` by 1 with `--i`
      &1;                  //   Then bitwise-AND everything above with 1
}                          // End of method

অতিরিক্ত ব্যাখ্যা:

:

  • String s অরূপিত উত্স কোড রয়েছে contains
  • %s এই স্ট্রিংটি নিজের মধ্যে রাখার জন্য ব্যবহৃত হয় s.format(...)
  • %c, %1$cএবং 34ডাবল-কোটগুলি ফর্ম্যাট করতে ব্যবহৃত হয় ( ")
  • s.format(s,34,s) সব একসাথে রাখে

কুইন আউটপুটগুলির নিজস্ব উত্স কোড যাচাই করতে কিছু অংশ মুছে ফেলা / সংশোধন করে এটি চেষ্টা করে দেখুন।

:


পুরানো 233 বাইট উত্তর:

int i;v->{String s="int i;v->{String s=%c%s%1$c;return Long.toString((s.format(s,34,s).charAt(i/8)&255)+256,2).substring(1).charAt(i++%%8);}";return Long.toString((s.format(s,34,s).charAt(i/8)&255)+256,2).substring(1).charAt(i++%8);}

এখানে চেষ্টা করুন।

ব্যাখ্যা:

int i;                           // Index-integer on class-level
v->{                             // Method with empty unused parameter and char return-type
  String s="int i;v->{String s=%c%s%1$c;return Long.toString((s.format(s,34,s).charAt(i/8)&255)+256,2).substring(1).charAt(i++%%8);}";
                                 //  String containing the unformatted source code
  return Long.toString(
          (s.format(s,32,s)      //  Quine-formatting
          .charAt(i/8)           //  Take the current character
           &255)+256,2).substring(1)
                                 //  Convert it to an 8-bit binary-String 
         .charAt(i++%8);         //  And return the bit at index `i` modulo-8
                                 //  and increase index `i` by 1 afterwards with `i++`
}                                // End of method

অতিরিক্ত ব্যাখ্যা:

:

উপরোক্ত হিসাবে একই ব্যাখ্যা, সংযোজন সহ:

  • %%মডুলো-সাইন এর পালানো ফর্ম ( %)

কুইন আউটপুটগুলির নিজস্ব উত্স কোড যাচাই করতে কিছু অংশ মুছে ফেলা / সংশোধন করে এটি চেষ্টা করে দেখুন।

:

  • i/8স্বয়ংক্রিয়ভাবে পূর্ণসংখ্যা বিভাগে কেটে যাবে, সুতরাং i0-7 হলে এটি হয়ে যাবে 0; যদি i8-15, এটা হয়ে যাবে 1; প্রভৃতি
  • সুতরাং s.charAt(i/8)উত্স-কোডের বর্তমান চরিত্রটি একে অপরের পরে আটবার নেয়। পরিবর্তিত সংস্করণ সহ এটি এখানে চেষ্টা করুন।
  • 255হয় 0xFFবা 11111111(স্বাক্ষরবিহীন বাইটের সর্বাধিক মান)
  • 256হয় 0x100বা100000000
  • &একটি পূর্ণসংখ্যা হওয়া ASCII-অক্ষর upcasts। এই মুহুর্তে, এটি যে কোনও জায়গায় 0এবং 255( 00000000থেকে 11111111) এর মধ্যে।
  • Long.toString(...,2) এটি 9-বিট বাইনারি স্ট্রিং উপস্থাপনায় রূপান্তর করে
  • +256এবং .substring(1)নিশ্চিত করবে যে সেখানে শীর্ষস্থানীয় শূন্য রয়েছে, এবং 9-বিটকে 8-বিটে রূপান্তর করবে।

পুরো বাইটগুলি যাচাই করতে কিছু অংশ মুছে ফেলা / সংশোধন করে এটি চেষ্টা করে দেখুন


1
149 বাইট:int i;v->{String s="int i;v->{String s=%c%s%1$c;return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}";return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}
নেভায়ে

@ নেভা হুইপিং ৮৮ বাইট সংরক্ষণ করা হয়েছে। ধন্যবাদ! এবং যেহেতু এটি আমার কাছে মূলত ছিল তার চেয়ে অনেক বেশি ভিন্ন পদ্ধতির, তাই আমি পুরানো উত্তরটি রেখেছি এবং নতুনটি যুক্ত করেছি। (আপনি যদি চান আমি আবার সরিয়ে ফেলবো এবং আপনি এটি নিজের পোস্ট করতে পারেন, কিন্তু আপনি আমাকে অতীতে বলেছে যে আপনি গলফ অন্য লোকেদের পছন্দ - প্রধানত খনি XD - পরিবর্তে অধিকার কোড আপনার নিজের উত্তর পোস্ট,)
কেভিন Cruijssen

2

জাভাস্ক্রিপ্ট ES6, 73 58 52 বাইট

o=_=>`o=${o}`.charCodeAt((o.n=1+o.n|0)/8)>>(7-o.n%8)&1

ব্যাখ্যা

কোড ভাঙ্গা:

  • o=_=>: একটি ফাংশন সংজ্ঞায়িত।
  • `o=${o}`: একটি স্ট্রিং নির্মাণ; oস্ট্রিংয়ে রূপান্তরিত হয়, যা এই ক্ষেত্রে ফাংশনের উত্স কোড।
  • .charCodeAt(: এর ASCII অক্ষর কোড হিসাবে স্ট্রিংয়ের একটি অক্ষর পান।
  • (o.n=1+o.n|0)/8: একটি চরিত্র নির্বাচন করুন। এটিও যেখানে কাউন্টারের বর্ধিত হয়।
  • )>>(7-o.n%8): ফলাফলের অক্ষর কোডটি শিফট করুন যাতে কাঙ্ক্ষিত বিটটি সঠিক অবস্থানে থাকে।
  • &1: অন্যান্য সমস্ত বিট 0 তে সেট করুন।

আপনি এটিকে একটি ল্যাম্বডায় সংক্ষিপ্ত করতে পারেনo=_=>(o+'').charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
এটিাকো

এটি একটি ফাংশন সংজ্ঞায়িত হিসাবে গণনা করা হয়।
এ্যাটাকো

1
চেষ্টা o=_=>('o='+o).charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
এ্যাটাকো

বদলে 'n'in top?++n:n=0আপনি ব্যবহার করতে পারেন ++n||(n=0)বা ++n?n:n=0বা n=++n||0বাn=1+n||0 যা সব কাজে লাগাতে এর falsiness NaNযে বৃদ্ধিশীল দ্বারা উত্পাদিত হয়undefined
Bergi

1
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
tsh

2

কিউ / কেডিবি + , 45 বাইট

সমাধান:

a:-1;f:{((,/)0b vs'4h$"a:-1;f:",($).z.s)a+:1}

উদাহরণ:

q)f[] / call function f with no parameters
0b   
q)f[]
1b   
q)f[]
1b   
q)f[]
0b   
q)f[]
0b   
q)f[]
0b   
q)f[]
0b   
q)f[]
1b   
q)f[]  
q)"c"$0b sv 01100001b / join back to a byte and cast to a character
"a"

ব্যাখ্যা:

আমি মনে করি আমি সংক্ষেপে বুঝতে পেরেছি।

aপ্রথমটির মানটির সাথে একটি বৈশ্বিক পরিবর্তনশীল সেটআপ করুন -1। ফাংশনটি ফাংশনের স্ট্রিং উপস্থাপনের fবাইনারি উপস্থাপনা তৈরি করে (সহ সমস্ত কিছু){} ) a:-1;f:জাঙ্কের সাথে প্রিপেন্ড করা হয় এবং সূচিপত্র এ এই বাইনারি তালিকায় সূচকগুলি (যা প্রতিটি কল বাড়িয়ে তোলে)।

a:-1;f:{(raze 0b vs'4h$"a:-1;f:",string .z.s)a+:1} / ungolfed solution
a:-1;                                              / stick -1 in variable a
     f:{                                         } / define function f
                                             a+:1  / increment a by 1 (:: is required as a is a global variable), indexes into the left
        (                                   )      / do all this together
                                 string .z.s       / z.s is the function, string converts it to a string
                       "a:-1;f:",                  / prepend "a:-1;f:" to the start
                    4h$                            / cast to bytes
              0b vs'                               / convert each byte to binary
         raze                                      / flatten binary into long list

2

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

lambda s='lambda s=%r,i=[]:i.append(1)or"{:08b}".format(ord((s%%s)[~-len(i)/8]))[~-len(i)%%8]',i=[]:i.append(1)or"{:08b}".format(ord((s%s)[~-len(i)/8]))[~-len(i)%8]

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

ব্যাখ্যা

আসুন স্ট্যান্ডার্ড পাইথন 2 কুইন দিয়ে শুরু করি।

s = '...'; print s % s

ঠিক আছে, ভাল, এটি ঠিক যেমন এটি আউটপুট। আমাদের বাইনারি দরকার!

s = '...'; print "\n".join("\n".join("{:08b}".format(ord(i))) for i in s % s)

ঠিক আছে, এটি কেবল বাইনারিতে রূপান্তরিত করে। তবে শিরোনামটি "একবারে এক বিট" বলে। একাধিক রান চালিয়ে যাওয়ার জন্য আমাদের কিছু দরকার। আমি জানি, আসুন এটি একটি ফাংশন করা যাক!

lambda s = '...': "\n".join("\n".join("{:08b}".format(ord(i))) for i in s % s)

অপেক্ষা করুন, এটি সাহায্য করে না ... হুম, আউটপুট হওয়ার জন্য প্রয়োজনীয় বিটের সূচকটি আমরা কীভাবে ট্র্যাক রাখতে পারি? ওহ, ওহ, ট্র্যাক রাখার জন্য একটি পূর্ণসংখ্যা আসুন

lambda s = '...', i = 0: "{:08b}".format(ord((s % s)[i / 8]))[i % 8]

উম ... যা সর্বদা প্রথম বিট দেয়। ওহ, আমাদের ট্র্যাকার বাড়ানো দরকার! ওহ ক্র্যাপ, পাইথন সংশোধন করার জন্য ডিফল্ট আর্গুমেন্ট হিসাবে পূর্ণসংখ্যার অনুমতি দেয় না। এবং অ্যাসাইনমেন্টগুলি পাইথনে এক্সপ্রেশন নয়, সুতরাং আপনি ল্যাম্বডায় এটি করতে পারবেন না। ওয়েলপ, পাইথনে এটি অসম্ভব, কেস বন্ধ রয়েছে।

... ঠিক আছে, বেশ না। পাইথন করে তালিকা অনুমতি ডিফল্ট আর্গুমেন্ট পরিবর্তন করা হবে। (এবং এটি পাইথন প্রোগ্রামারগুলিকে সর্বদা কামড়ায়)) এর দৈর্ঘ্যটি ব্যবহার করা যাক!

lambda s = '...', i = []: "{:08b}".format(ord((s % s)[len(i) / 8]))[len(i) % 8]

এটি এখনও ট্র্যাকারটিকে সংশোধন করে না ... এর দৈর্ঘ্য বাড়ানোর জন্য আমরা এটিতে কিছু যুক্ত করতে পারি ... তবে কীভাবে? আহ, ভাল, আমরা পেয়েছি list.appendlst.append(1)সমতূল্য lst += [1]। গ্রেট!

lambda s = '...', i = []: i.append(1) and "{:08b}".format(ord((s % s)[len(i) / 8]))[len(i) % 8]

ওফফ, এই বিটটি প্রথমটি এড়িয়ে যায় কারণ বিট আউটপুট হওয়ার আগে ট্র্যাকারের দৈর্ঘ্য 1 হয়। আমাদের এটির দৈর্ঘ্য হ্রাস করতে হবে।

lambda s = '...', i = []: i.append(1) and "{:08b}".format(ord((s % s)[(len(i) - 1) / 8]))[(len(i) - 1) % 8]

এটা আছে, ভাবেন! এটি গল্ফ এবং আপনি আমার সমাধান পেয়েছেন!


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