একটি বিকিরণ-কঠোর ইরেডিয়েটর লিখুন


17

কাজটি হ'ল একটি বিকিরণ-কঠোর ইরেডিয়েটর লিখতে। আমি এর অর্থ কি, ঠিক?

ইরেডিয়েটর এমন একটি প্রোগ্রাম যা ইনপুট হিসাবে একটি স্ট্রিং দেওয়া হলে, একটি অক্ষর অপসারণ করে স্ট্রিংয়ের সমস্ত সম্ভাব্য সংস্করণ আউটপুট দেয়। উদাহরণস্বরূপ, ইনপুট দেওয়া Hello, world!, প্রোগ্রাম আউটপুট করা উচিত:

ello, world!
Hllo, world!
Helo, world!
Helo, world!
Hell, world!
Hello world!
Hello,world!
Hello, orld!
Hello, wrld!
Hello, wold!
Hello, word!
Hello, worl!
Hello, world

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

পরীক্ষার মামলা

abc -> bc; ac; ab
foo bar -> oo bar:fo bar:fo bar:foobar:foo ar:foo br:foo ba
source -> ource;surce;sorce;souce;soure;sourc;

বিশেষ উল্লেখ

  • আপনি আমাদের মানক I / O বিধি দ্বারা যে কোনও গ্রহণযোগ্য পদ্ধতিতে ইনপুট নিতে পারেন
  • আউটপুটটি হ'ল স্ট্রিংগুলির তালিকা হতে পারে বা একটি অক্ষর বা অক্ষরের গোষ্ঠী দ্বারা সীমিত একটি মুদ্রিত তালিকা হতে পারে। একটি পিছনের সীমানা গ্রহণযোগ্য
  • যতগুলি সম্ভব সংস্করণ রয়েছে ততক্ষণ আউটপুট কোনও ক্রমে থাকতে পারে
  • সদৃশ এন্ট্রি (যেমন Helo, world!প্রথম উদাহরণে দুটি গুলি) ফিল্টার আউট হতে পারে, তবে এটি প্রয়োজনীয় নয়
  • এটি , ক্ষুদ্রতম প্রোগ্রামটি, বাইটে, জিতেছে

... নাকি কমা সম্ভবত?
জোনাথন অ্যালান

4
এই এক সত্যিই golfing ভাষায় পক্ষপাতী কারণ সঙ্গে সি প্রোগ্রাম vমধ্যে voidমুছে কম্পাইল করা হবে না
Krzysztof Szewczyk

3
@ ক্রিজিসটফ টিবিএইচ আমি মনে করি যে সমস্ত ব্যবহারিক ভাষাগুলি শব্দভাণ্ডার এবং বাক্য গঠনের কারণে বিকিরণ শক্ত হয়ে উঠবে না। কেবল এই চ্যালেঞ্জই নয়, সমস্ত আরএইচ চ্যালেঞ্জগুলি।
শিয়েরু আসাকোটো

উত্তর:


13

05 এ বি 1 ই , 29 26 বাইট

æIg<ùˆ\æIg<ùˆ\æIg<ùˆ¯¯{Å`s

এটি অনলাইন চেষ্টা করুন! , বা সমস্ত উদ্বেগিত সংস্করণ ব্যবহার করে দেখুন

আমি যে সংক্ষিপ্ততম আইরেডিয়েটারটি পেয়েছি তা হ'ল 5 বাইট:

æ        # powerset of the input
 Ig      # length of the input
   <     # - 1
    ù    # elements of a with length b

এই ধারণাটি 3 বার পুনরাবৃত্তি করা হবে, তারপরে সংখ্যাগরিষ্ঠ ভোটদান করুন:

æIg<ù         # irradiate
     ˆ        # add the result to the global array
      \       # pop (in case the above instruction gets irradiated)
æIg<ùˆ\       # idem
æIg<ùˆ        # no pop, it's okay to dirty the stack at this point
¯             # push global array
 ¯            # and again, so at least one goes through
  {           # sort
   Å          # conveniently ignored by the parser
    `         # dump
     s        # swap
              # and implicitly output

Å2-বাইট কমান্ডগুলির জন্য একটি উপসর্গ, তবে কোনও Å`আদেশ নেই, যার কারণে এটি Åউপেক্ষা করা হয়। যদিও আমাদের এটি পরে প্রয়োজন হবে।

বাছাই করা নিশ্চিত করে যে সংখ্যাগরিষ্ঠ ভোটটি অ্যারের মাঝখানে রয়েছে। ডাম্পিং তারপর অদলবদল স্ট্যাকের শীর্ষে সেই মানটি পায়।

প্রাথমিক অংশে যে কোনও বিকিরণ কেবলমাত্র বৈশ্বিক অ্যারেতে একটি ত্রুটির ফলস্বরূপ, যা সংখ্যাগরিষ্ঠ ভোটে সমাধান হয়ে যায়। চূড়ান্ত বিড়ালের মধ্যে জ্বলজ্বলগুলি এ {Å`sসম্পর্কে যুক্তিযুক্ত কারণগুলি থেকে আরও জটিল:

  • Å যাইহোক যাইহোক উপেক্ষা করা হয়, সুতরাং এটি ক্রেডিট করা ঠিক আছে

  • যদি ব্যাকটিকটি বিকলিত হয়, Å`sহয়ে যায় Ås, যা "অ্যারের মাঝখানে পান" বর্ধিত কমান্ড।

  • যদি {বা sবিকিরণ হয় তবে এর অর্থ আর কিছুই নয়, তাই বিশ্বব্যাপী অ্যারে একই মান তিনবার হয়। সেক্ষেত্রে আমাদের বাছাই / অদলবদলের দরকার নেই, যে কোনও মানই কাজ করবে।


3
খুব চিত্তাকর্ষক! আমি ভাবিনি যে আমি আরএইচ চ্যালেঞ্জের জন্য একটি 05AB1E উত্তর দেখতে পাচ্ছি। আমি এই উত্তরটি পুরষ্কারের জন্য একটি বরাদ্দ যোগ করব (এবং চ্যালেঞ্জটিকে আরও কিছুটা এক্সপোজার দেই পাশাপাশি আমি অনুমান করি) away আপনি আমার অনেক উত্তর গল্ফ করেছেন, সুতরাং আপনি তাদের জন্যও অনেক ক্রেডিট প্রাপ্য! :)
কেভিন ক্রুইজসেন

3
আসলে, আমি এর আগে একটি আরএইচ চ্যালেঞ্জের উপর 05AB1E উত্তরগুলি দেখেছি । তবুও, খুব চিত্তাকর্ষক!
কেভিন ক্রুইজসেন

5

8086 মেশিন কোড (এমএস-ডস। কম), 83 বাইট

ডসবক্স বা আপনার প্রিয় বাষ্প চালিত কম্পিউটিং ইঞ্জিনে চলমান Run ইরেডিয়েট করার স্ট্রিংটি একটি কমান্ড লাইন আর্গুমেন্ট হিসাবে দেওয়া হয়।

বাইনারি:

00000000 : EB 28 28 8A 0E 80 00 49 BD 83 00 B4 02 51 8A 0E : .((....I.....Q..
00000010 : 80 00 BE 82 00 AC 39 EE 74 04 88 C2 CD 21 E2 F5 : ......9.t....!..
00000020 : 59 45 B2 0A CD 21 E2 E5 C3 90 EB D7 D7 8A 0E 80 : YE...!..........
00000030 : 00 49 BD 83 00 B4 02 51 8A 0E 80 00 BE 82 00 AC : .I.....Q........
00000040 : 39 EE 74 04 88 C2 CD 21 E2 F5 59 45 B2 0A CD 21 : 9.t....!..YE...!
00000050 : E2 E5 C3                                        : ...

রিডেবল:

cpu 8086
org 0x100
    jmp part2
    db 0x28

part1:
    mov cl, [0x80]
    dec cx
    mov bp, 0x83
    mov ah, 0x02

.l:
    push cx
    mov cl, [0x80]
    mov si, 0x82
.k:
    lodsb
    cmp si, bp
    je .skip
    mov dl, al
    int 0x21
.skip:
    loop .k
    pop cx
    inc bp
    mov dl, 10
    int 0x21
    loop .l
    ret

    nop
part2:
    jmp part1
    db 0xd7
    mov cl, [0x80]
    dec cx
    mov bp, 0x83
    mov ah, 0x02

.l:
    push cx
    mov cl, [0x80]
    mov si, 0x82
.k:
    lodsb
    cmp si, bp
    je .skip
    mov dl, al
    int 0x21
.skip:
    loop .k
    pop cx
    inc bp
    mov dl, 10
    int 0x21
    loop .l
    ret

ভগ্নস্বাস্থ্য শিঠ্ট

সক্রিয় অংশটি ডুপ্লিকেট করা হয়েছে যাতে রেডিয়েশনের দ্বারা সর্বদা একটি ছোঁয়া থাকে। আমরা লাফানোর মাধ্যমে স্বাস্থ্যকর সংস্করণটি নির্বাচন করি। প্রতিটি লাফ একটি সংক্ষিপ্ত লাফ, এবং ঠিক মাত্র দুটি বাইট দীর্ঘ, যেখানে দ্বিতীয় বাইট হ'ল স্থানচ্যুতি (অর্থাত্ লাফের দূরত্ব, লক্ষণ নির্ধারণের দিক সহ)।

আমরা কোডটি চারটি ভাগে ভাগ করতে পারি যা বিকিরণযোগ্য হতে পারে: লাফ 1, কোড 1, লাফ 2, এবং কোড 2 ধারণাটি একটি পরিষ্কার কোড অংশ সর্বদা ব্যবহৃত হয় তা নিশ্চিত করা হয়। কোডের একটি অংশ যদি বিকৃত হয় তবে অন্যটি অবশ্যই চয়ন করতে হবে, তবে একটি লাফের যদি বিকিরণ হয় তবে উভয় কোড অংশই পরিষ্কার হয়ে যাবে, তাই কোনটি বেছে নেওয়া উচিত তা বিবেচ্য নয়।

দুটি লাফ পার্ট থাকার কারণ হ'ল প্রথম অংশে ঝাঁপিয়ে পড়ে বিকিরণ সনাক্ত করা। যদি প্রথম কোড অংশটি বিকিরণ করা হয় তবে এর অর্থ আমরা চিহ্নটি বন্ধ করে এক বাইটে উপস্থিত হব। যদি আমরা নিশ্চিত হয়ে থাকি যে এই জাতীয় বোটচড অবতরণ কোড 2 নির্বাচন করে এবং একটি উপযুক্ত অবতরণ কোড 1 নির্বাচন করে, আমরা সোনার।

উভয় জাম্পের জন্য, আমরা প্রতিস্থাপন বাইটটি নকল করি, প্রতিটি জাম্পের অংশ 3 বাইট দীর্ঘ করি। এটি নিশ্চিত করে যে শেষ দুটি বাইটগুলির মধ্যে একটিতে ইরেডিয়েশন এখনও লাফটি বৈধ করে তুলবে। প্রথম বাইটে ইরেডিয়েশন হ'ল লাফটি একেবারে থামবে না, যেহেতু শেষ দুটি বাইট সম্পূর্ণ ভিন্ন নির্দেশিকা তৈরি করবে।

প্রথম লাফটি নিন:

EB 28 28        jmp +0x28 / db 0x28

যদি কোনও একটি 0x28বাইট অপসারণ করা হয় তবে এটি এখনও একই জায়গায় চলে যাবে। যদি 0xEBবাইটটি সরিয়ে ফেলা হয় তবে আমরা এর পরিবর্তে শেষ করব

28 28           sub [bx + si], ch

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

যদি জাম্পটি নেওয়া হয়, তবে আমরা দ্বিতীয় লাফটিতে নামব:

EB D7 D7        jmp -0x29 / db 0xd7

যদি এই বাইট ক্রমটি অক্ষত থাকে এবং আমরা ঠিক চিহ্নের উপরে অবতরণ করি, তার অর্থ হল কোড 1টি পরিষ্কার ছিল এবং এই নির্দেশটি সেই অংশে ফিরে আসে। সদৃশ স্থানচ্যুতি বাইটটি এর গ্যারান্টি দেয়, এমনকি যদি এটি ক্ষতিগ্রস্থ হওয়া এই স্থানচ্যুতি বাইটগুলির মধ্যে একটিও হয়। যদি আমরা হয় একটি বাইট অফ অফ (যদি ক্ষতিগ্রস্থ কোড 1 বা 1 লাফ 1) বা 0xEBবাইটটি ক্ষতিগ্রস্থ হয় তবে বাকী দুটি বাইটও এখানে সৌম্য হবে:

D7 D7           xlatb / xlatb

যাই হোক না কেন, যদি আমরা এই দুটি নির্দেশনা কার্যকর করে শেষ করি তবে আমরা জানি যে হয় লাফ 1, কোড 1, বা 2 লাফগুলি বিকিরণ করা হয়েছিল, যা কোড 2 এ নিরাপদে পড়ে।

পরীক্ষামূলক

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

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    FILE *fin, *fout, *fbat;
    int fsize;
    char *data;

    if (!(fin = fopen(argv[1], "rb")))
    {
        fprintf(stderr, "Could not open input file \"%s\".\n", argv[1]);
        exit(1);
    }

    if (!(fbat = fopen("tester.bat", "w")))
    {
        fprintf(stderr, "Could not create BAT test file.\n");
        exit(2);
    }

    fseek(fin, 0L, SEEK_END);
    fsize = ftell(fin);
    fseek(fin, 0L, SEEK_SET);

    if (!(data = malloc(fsize)))
    {
        fprintf(stderr, "Could not allocate memory.\n");
        exit(3);
    }

    fread(data, 1, fsize, fin);

    fprintf(fbat, "@echo off\n");

    for (int i = 0; i < fsize; i++)
    {
        char fname[512];

        sprintf(fname, "%03d.com", i);
        fprintf(fbat, "%s Hello, world! > %03d.txt\n", fname, i);

        fout = fopen(fname, "wb");

        fwrite(data, 1, i, fout);
        fwrite(data + i + 1, 1, fsize - i - 1, fout);

        fclose(fout);
    }

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