একটি সাধারণ GOTO দিয়ে একটি প্রোগ্রাম তৈরি করুন


25

এক্সকেসিডি গোটো কমিক

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

দ্রষ্টব্য: এই চ্যালেঞ্জটি চেষ্টা করে আমি বেগের আক্রমণগুলির জন্য কোনও দায় দাবি করি না।


2
একটি একক এতে যান সমস্যাযুক্ত বলে মনে হয়। আমি যে সি কোড ব্যবহার করতে পারি তার সম্পর্কে প্রতিটি সি কোড কাঠামোগত কনস্ট্রাক্ট ব্যবহার করতে তুচ্ছভাবে পরিবর্তন করা যেতে পারে uses একাধিক gotos তবে ...
Pubby

@ পাব্বির দাবি বর্তমান দুটি সমাধানের বিরুদ্ধে রয়েছে বলে মনে হচ্ছে। প্রতিস্থাপন করা হচ্ছে gotoসঙ্গে switchউভয় পক্ষে সম্ভব বলে মনে হয়।
ugoren

@ পাব্বি একটি কার্যক্ষম সমাধান তৈরি করতে আপনার কতজনের দরকার? বর্তমানে উল্লিখিত সমস্যাটি যদি অসম্ভব হয়ে থাকে তবে আমি একটি বিকল্প সমস্যা তৈরি করতে পারি।
জো জে।

আমি মনে করি আপনি কার্টুন এম্বেড করার অনুমতি পাচ্ছেন, যতক্ষণ না কোনও লিঙ্ক রয়েছে।
লুসার droog

1
এটি যোগ্যতা অর্জন করে না, তবে আমি সত্যিই এটি করেছি
লুসার droog

উত্তর:


11

সি ফিজবজ

এই সমাধানটি বিঘ্ন এবং লেবেল ভেরিয়েবলগুলির ধারণার চারদিকে চলে (কেবলমাত্র জিসিসি, দুঃখিত)। প্রোগ্রামটি একটি টাইমার সেট আপ করে যা পর্যায়ক্রমে প্রধানকে কল করে, যেখানে আমরা আমাদের বাধা হ্যান্ডলারের (মূল) শেষ নির্বাহটি আমাদের যা করতে হবে তা জানিয়েছিলাম।

আমি এর আগে কখনও টাইমার বা লেবেল ভেরিয়েবল ব্যবহার করি নি, তাই আমার মনে হয় এখানে বল করার মতো অনেক কিছুই আছে।

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>

int main(int argc)
{
    static int run = 1;
    static int* gotoloc = &&init;
    static int num = 0;
    static int limit = 50;

    goto *gotoloc;
init:
    signal(SIGVTALRM, (void (*)(int)) main);
    gotoloc = &&loop;

    struct itimerval it_val;

    it_val.it_value.tv_sec = 0;
    it_val.it_value.tv_usec = 100000;
    it_val.it_interval.tv_sec = 0;
    it_val.it_interval.tv_usec = 100000;
    setitimer(ITIMER_VIRTUAL, &it_val, NULL);

    while(run);

loop:
    num = num + 1;
    run = num < limit;
    gotoloc = &&notfizz + (&&fizz - &&notfizz) * !(num % 3);
    return 1;

fizz:
    printf("fizz");
    gotoloc = &&notbuzz + (&&buzz - &&notbuzz) * !(num % 5);
    return 1;

notfizz:
    gotoloc = &&notfizzbuzz + (&&buzz - &&notfizzbuzz) * !(num % 5);
    return 1;

buzz:
    printf("buzz\n");
    gotoloc = &&loop;
    return 1;

notbuzz:
    printf("\n");
    gotoloc = &&loop;
    return 1;

notfizzbuzz:
    printf("%d\n", num);
    gotoloc = &&loop;
    return 1;
}

runঘোষণা করা উচিত volatile, অন্যথায় while(run)এটি "অনুকূলিত" হতে পারে while(1)। বা পরিবর্তে, কেবল যে কোথাও কল করে exit
ugoren

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

মূলের volatile int numবাইরে সংজ্ঞা দেওয়া উচিত এটি করা উচিত। সহ static, জিসিসি চিন্তা করে এটি কে জানে এটির সাথে গণ্ডগোল করতে পারে।
ugoren

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

5

পার্ল

আমি বোলিংয়ে খুব ভাল নই, তবে আমার সন্দেহ, এটি ওপিতে আগ্রহী। এটি ভেরিয়েবল গোটো ব্যবহার করে ইরোটোথিনিসের একটি চালনী। এটি যদি 'রিফ্যাক্টর' হয়ে থাকে তবে আমার সন্দেহ হয় যে এটির প্রথমটি কিছু লাইন ছাড়া অন্য কোনওটি পুনরায় ব্যবহারযোগ্য হবে। যখন চালনীটি শেষ হয়, অ্যারেতে থাকা সমস্ত 1গুলি @primesমূল মানগুলির সাথে সামঞ্জস্য হয়।

যুক্ত মজাদার জন্য, কোনও অ্যান্ডস, ওরস, টেরিনারি, শর্তসাপেক্ষ বা কোনও ধরণের তুলনা অপারেটর ব্যবহার করা হয়।

@primes[2..1e4]=(1)x9999;
$a=2;
Y:
  $b=$a*~-$a;
X:
  $primes[$b+=$a+=$c=$a/100%2+$b/1e4%2]=0;
  goto"$c"^h;
Z:

আমি কেন এখানে পোস্ট করছি তা নিয়ে কোনও বিভ্রান্তির ক্ষেত্রে, আলাদা প্রশ্নে (এখন মুছে ফেলা) ওপি বলেছে যে, "এই প্রশ্নটি তিনি আসলে জিজ্ঞাসা করতে চেয়েছিলেন", তবে নিশ্চিত ছিল না যে এটি সম্ভব কিনা ।
প্রিমো

আমি কী প্রশ্ন পোস্ট করেছি তা নিয়ে যদি কোনও বিভ্রান্তির সৃষ্টি হয় তবে এটি কেবল একটিটি না দিয়ে কেবল গোটোর ব্যবহার করে বিল্ডিং কোড সম্পর্কে একটি প্রশ্ন ছিল was
জো জে।

1
@ জোজেং আমার কাছে প্রাথমিকভাবে তিনটি ছিল, তবে আমি এটিকে কমিয়ে দিয়েছি যাতে এটিও এই সমস্যার বৈধ সমাধান হতে পারে।
primo

3

সি

আমার ম্যাক্রোগুলির ব্যবহার সম্ভবত এটি "ওয়ান গোটো" করে না।
এবং এটি বেশ সংক্ষিপ্ত, সুতরাং "সম্পূর্ণ পুনর্গঠন" বেশি নয়।
তবে এখানে যাইহোক আমার চেষ্টা।

স্ট্যান্ডার্ড ইনপুট থেকে একটি সংখ্যা পড়েন, এটি মডুলু 3 মুদ্রণ করে।

int main() {
    char s[100], *p, r=0;
    void *pl[] = { &&a, &&b, &&c, &&d, &&e, &&f, &&g, &&h, &&i, &&j, &&a, &&b, &&x, &&y, &&z }, *p1;
    p = gets(s);
    #define N(n) (pl+n)[!*p*60+*p-48];p++;goto *p1
    a: p1=N(0);
    b: p1=N(1);
    c: p1=N(2);
    d: p1=N(0);
    e: p1=N(1);
    f: p1=N(2);
    g: p1=N(0);
    h: p1=N(1);
    i: p1=N(2);
    j: p1=N(0);
    z: r++;
    y: r++;
    x: printf("%d\n", r);

    return 0;
}

1
হ্যাঁ, এর মতো ম্যাক্রো ব্যবহার করা "ওয়ান গোটো" নয়। তবে তারপরেও আপনাকে একটি গোটো ব্যবহার না করেই প্রোগ্রামটির পুনর্গঠন সরবরাহ করতে হবে। বিবৃতি অপসারণ আপনার স্কোর যোগ করে না।
জো জেড।

একটি সংখ্যা মডুলো 3 প্রিন্ট করা কেবল একটি printfএবং ব্যবহার করে সহজ হবে scanf। আপনার সমাধানের স্কোর সম্ভবত 2 বা 3 এর মতো হবে
জো জেড।

1
ন্যায্য বিন্দু. যদিও কেউ কেন কখনও এমন কিছু প্রোগ্রাম করতে চাইবে তা ভাবতে পারছি না n%3, যদিও। এটি এমন একটি প্রোগ্রাম হওয়া উচিত যা যখন জিওটিও সরানো হয় তখন এটি সংঘবদ্ধ হয়ে যায় , যখন এটি চালু হয় না
জো জে।

2
"কেন?" এই সাইটের জন্য অপ্রাসঙ্গিক - এটি বোকা জিনিসগুলি করার বোকা উপায়গুলি পূর্ণ। আপনি সরিয়ে ফেললে gotoপ্রোগ্রামটি কাজ করবে না। তবে আপনি কী প্রত্যাশা করেছিলেন - যে প্রোগ্রামটি কেবল অপসারণের মাধ্যমেই সংশ্লেষিত হবে?
ugoren

1
অপসারণ এবং পরবর্তী পুনর্গঠন দ্বারা, হ্যাঁ। একটি সাধারণ উদাহরণ হ'ল একাধিক নেস্টেড লুপগুলি ভেঙে ফেলার জন্য গোটো ব্যবহার।
জো জেড।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.