যখন চেষ্টা ব্লকের সমস্ত কিছু ইতিমধ্যে ধরা পড়ে তখন ধরা পড়ুন


19

আমার অনুমানের সিনট্যাক্স দ্বারা এটি জাভা এবং সি # এর মধ্যে সীমাবদ্ধ।

এই প্রোগ্রামিং ধাঁধাতে, আপনি এমন Exceptionগুলি তৈরি করতে পারবেন যা ধরা পড়তে পারে তবে ক্যাচ ব্লকের শেষে আবার নিক্ষেপ করা হয়।

try
{
    while(true)
        try
        {
            // you are only allowed to modify code between this try { } brackets
        }
        catch(Exception ex2) {  }
}
catch(Exception ex1)
{
    // your goal is to reach this catch block by modifying the code ...
    // in the inner try block above
    // You win if you reach this part and execute on of the following code lines
    Console.WriteLine("You won!"); // for C#
    // Or
    System.out.println("You won!"); // for Java
}

আপনি এই স্নিপেটের আগে এবং পরে অবাধে কোড রাখতে পারেন।

বাইরের catchব্লকটিতে পৌঁছানোর সবচেয়ে সংক্ষিপ্ত কোড ।


1
আমি মনে করি পাইথনও প্রতিযোগিতা করতে সক্ষম হতে পারে।
ব্যবহারকারী 12205

1
আপনি আমার স্নিপেটের আগে এবং পরে নিখরচায় কোড রাখতে পারেন।
ব্যবহারকারী 21634

2
খুব খারাপ এটি বন্ধ। আমি একটি সমাধান পেয়েছি । @ অ্যালগরিদমশর্ককে, মাইকেল এবং জান দ্বোড়াক: এটি কোনও সাধারণ প্রোগ্রামিং প্রশ্ন নয়। এটি একটি প্রোগ্রামিং ধাঁধা, জিরাফ কখন জিরাফ নয়? । আমি এটি পুনরায় খোলার জন্য মনোনীত করছি।
ব্যবহারকারী 12205

1
উহহহহহ, হোয়াট ???
TheDoctor

1
@ অ্যালগরিদমশর্ক আমি সন্নিবেশের দৈর্ঘ্যের যোগফল সহ যাব
ব্যবহারকারী 12205

উত্তর:


24

সি #, 46 (বয়লারপ্লেট সহ 88)

using System;class P{static void Main(){
        try
        {
            while(true)
                try
                {
                    System.Threading.Thread.CurrentThread.Abort();
                }
                catch(Exception ex2) {  }
        }
        catch(Exception ex1)
        {
            // your goal is to reach this catch block by modifying the code ...
            // in the inner try block above
            // You win if you reach this part and execute on of the following code lines
            Console.WriteLine("You won!"); // for C#
        }
}}

Abort()পদ্ধতি উত্থাপন ThreadAbortException , যা একটি বিশেষ ব্যতিক্রম যা স্বয়ংক্রিয়ভাবে প্রতিটি ধরা ব্লক শেষে rethrown করা হয় (যদি না হয় Thread.ResetAbort()বলা হয়)।


20

সি # 24 অক্ষর

উদ্দেশ্য চেষ্টা করার আগে অভ্যন্তরীণ চেষ্টা ব্লকটি বন্ধ করে দেয়, আমাকে চেষ্টা ব্লকের বাইরে একটি ব্যতিক্রম ঘটায়।

}finally{int a=1/0;}try{

1
মানুষ এই প্রতিভা! কেন আমি তা ভেবে দেখিনি? (বিটিডব্লিউ আপনি কি কোনও ব্যতিক্রম ছোঁড়ার পরিবর্তে ব্যতিক্রম ঘটানোর মাধ্যমে এটি সংক্ষিপ্ত করতে পারবেন? যেমন int a=1/0;?)
ব্যবহারকারী 12205

তোমার কি দরকার int a=? কিছু ভাষা আপনাকে কেবল 1/0
প্রকাশটি

এটি সম্পূর্ণ কাজের উদাহরণ নয়, তাই না? সুতরাং 24 টি অক্ষর গণনা করা যায় না ...
ম্যাট

13

জাভা, 76 বা 31

নতুন লাইন উপেক্ষা করে কোডগুলিতে কেবল সন্নিবেশগুলি গণনা করা হচ্ছে। 76 আপনি যদি আমার যোগ করা সমস্ত কিছু গণনা করেন , 31 আপনি যদি প্রথম লাইন এবং শেষ লাইনটি বাদ দেন, তবে কেবল গণনা int a=1/0;try{}catch(Error e){}

class P{public static void main(String[]A){
try
{
    while(true)
        try
        {
            int a=1/0;try{
        }
        catch(Exception ex2) {  }
}
catch(Exception ex1)
{
    // your goal is to reach this catch block by modifying the code ...
    // in the inner try block above
    // You win if you reach this part and execute on of the following code lines
    //Console.WriteLine("You won!"); // for C#
    // Or
    System.out.println("You won!"); // for Java
}
}catch(Error e){}
}}

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

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

খুব চতুর সমাধান।
নিকোলাস বারবুলেসকো

@ নিকোলাস বারবুলেসকো সত্যি বলতে আমি রায়ান এর উত্তর আমার চেয়ে বেশি চালাক বলে মনে করি। সর্বোপরি, আমি স্নিপেটের পরে একটি catchব্লক যুক্ত করেছি , তিনি তা করেননি।
ব্যবহারকারী 12205

3

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

জাভা (ওপেনজেডিকে 8) , 65 60 বাইট (মোড়কে সামান্য পরিবর্তন সহ)

Thread x=Thread.currentThread();new Thread(x::stop).start();

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

catch (Exception …)প্রশ্নে উভয় দৃষ্টান্তে পরিবর্তন করা দরকার catch (Throwable …)। এটি তত্ত্বগতভাবে আরও সুরক্ষিত হওয়া উচিত , কম নয়, তবে এটি এই সমাধানটিকে সম্ভব হতে সক্ষম করে।

আমি ল্যাম্বদার পরিবর্তে কোনও পদ্ধতি রেফারেন্স ব্যবহার করে এই উত্তরের প্রথম সংস্করণে 5 বাইট সংরক্ষণ করেছি।

জাভা 4, 104 বাইট (অরক্ষিত, মূল মোড়কের সাথে কাজ করা উচিত)

final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();

এটি অনলাইন চেষ্টা করুন! (লিঙ্কটি একটি জাভা 8 বাস্তবায়নে যায়, এভাবে কাজ করবে না)

জাভা এর আধুনিক সংস্করণগুলি থেকে মুছে ফেলা বৈশিষ্ট্যগুলি ব্যবহার করে, ধাঁধাটির এমন সংস্করণও সমাধান করা সম্ভব যা একটি প্রয়োজন Exception। সম্ভবত, কমপক্ষে। (জাভা 4 এখনই খুব পুরানো এবং আমি মনে করতে পারি না যে এটি কোন বৈশিষ্ট্যগুলি করেছে এবং এতে কী ছিল না seen হিসাবে দেখা যেতে পারে, জাভাতে এর আগে অনেক কম বৈশিষ্ট্য ছিল এবং এটি তাই আরও ভার্ভোজ ছিল; আমাদের ছিল না ল্যাম্বডাস, তাই আমাকে একটি অভ্যন্তর শ্রেণি তৈরি করতে হয়েছিল))

ব্যাখ্যা

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

উভয় প্রোগ্রাম কার্যকরভাবে অভিন্ন (সুতরাং প্রথম প্রোগ্রামটি যে কাজ করে তা আমাকে উচ্চ আত্মবিশ্বাস দেয় যে দ্বিতীয় প্রোগ্রামটিও কাজ করবে, যদি না আমি দুর্ঘটনাক্রমে জাভা -4 বৈশিষ্ট্যটি ব্যবহার করি না; Thread#stopজাভা 5-তে অবমূল্যায়ন করা হয়েছিল)।

জাভা Thread#stopপদ্ধতিটি পর্দার আড়ালে কাজ করে প্রশ্নবিদ্ধ থ্রেডে নিক্ষিপ্ত হতে পারে। উদ্দেশ্যটির জন্য নিক্ষিপ্ত উদ্দেশ্যটি হ'ল ThreadDeath(একটি Error, বিশেষত কারণ মানুষ প্রায়শই কম্বল ধরার ব্যতিক্রম চেষ্টা করে এবং জাভার ডিজাইনাররা এটি ঘটতে চাইছিল না), যদিও এটি আপনাকে কিছু ফেলে দিতে দেয় (বা অভ্যস্ত; এপিআই হওয়ার পরে কিছু সময়ে) নকশাকৃত, জাভার ডিজাইনাররা বুঝতে পেরেছিলেন যে এটি একটি অবিশ্বাস্যভাবে খারাপ ধারণা এবং পদ্ধতিটির যে সংস্করণটি আর্গুমেন্টকে পুরোপুরি গ্রহণ করে) তা মুছে ফেলে। অবশ্যই, যে সংস্করণটি ছুড়ে ফেলেছে ThreadDeathতা মোটামুটি ঝুঁকিপূর্ণ অপারেশন যা সম্পর্কে আপনি কয়েকটি গ্যারান্টি দিতে পারেন (উদাহরণস্বরূপ, এটি আপনাকে এই ধাঁধাটি সমাধান করার অনুমতি দেয়, এমন কিছু যা "সম্ভব নয়"), সুতরাং আপনার ধারণা করা উচিত নয় এটি ব্যবহার করুন, তবে জাভা 8 হিসাবে এটি এখনও কাজ করে।

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

(টিআইও দ্রষ্টব্য: টিআইওর বর্তমান সংস্করণটি এই প্রোগ্রামটি কার্যকর করার আগে খুব শীঘ্রই হত্যা করতে আগ্রহী, সম্ভবত সমস্ত থ্রেড তৈরি হওয়ার কারণে এটি টিআইওতে কাজ করতে পারে তবে নির্ভরযোগ্যভাবে কাজ করে না, তাই প্রায়শই কয়েকটি প্রচেষ্টা প্রয়োজন হয় "আপনি জিতেছেন!" আউটপুট পান)


1

সি শার্প

    try
    {
        int i = 0, j = 1, k;

        int flag = 0;
        lbl:
        if (flag == 1)
        {
            k = j / i;
        }

        while (true)
            try
            {
                k = j / i;

            }
            catch (Exception e)
            {
                flag = 1;
                goto lbl;
                //Console.WriteLine("loose");

            }
    }
    catch (Exception e)
    {
        Console.WriteLine("Won");

    }

1
প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম! যেহেতু এই প্রশ্নটি একটি কোড-গল্ফ চ্যালেঞ্জ, আপনার কোডটি যথাসম্ভব সংক্ষিপ্ত করার চেষ্টা করুন এবং আপনার উত্তরের শীর্ষে অক্ষর গণনা অন্তর্ভুক্ত করুন। ধন্যবাদ!
প্রোগ্রামফক্স

1

পার্ল 5 , 37 বা 36 বাইট

eval {
    while (1) {
        eval {

 

use overload'""',sub{die};die bless[]

 

        };
        $@ eq "" or 0;
    }
};
$@ eq "" or print "You won!\n";

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

দেখা যাচ্ছে যে এই প্রশ্নটি পার্লকে খুব একটা আকর্ষণীয় ধাঁধা তৈরি করতে যথেষ্ট ভাল অনুবাদ করেছে। পার্লের tryসমতুল্যকে বলা হয় (কিছুটা বিভ্রান্তিকরভাবে) eval, এবং @_যদি ব্যতিক্রম ঘটে থাকে সে ক্ষেত্রে সেট করে একটি ব্যতিক্রম এবং অন্যথায় নাল স্ট্রিং নির্দিষ্ট করে। যেমন, নাল স্ট্রিংয়ের catchসাথে তুলনা @_করার মাধ্যমে একটি ব্লক প্রয়োগ করা হয়।

এই সমাধানটি একটি অবজেক্ট তৈরি করে কাজ করে (যার ক্লাসটি সামগ্রিকভাবে প্রোগ্রাম; আপনি ক্লাসের মতো স্বেচ্ছাসেবী পার্ল ফাইল ব্যবহার করতে পারেন, জাভা এর বিপরীতে যেমন সাজান (যেখানে আপনি ফাইলের মতো স্বেচ্ছাসেবী ক্লাস ব্যবহার করতে পারেন))। এই bless[]অংশটি ( blessসাধারণত কেবল নির্মাণকারীদের ভিতরে গভীরভাবে উপস্থিত হয়, আদিম হিসাবে যা জিনিসগুলিকে প্রথম স্থানে পরিণত করে, তবে আপনি যদি সত্যিই চান তবে আপনি সরাসরি এটি ব্যবহার করতে পারেন; []বস্তুর জন্য মেমরি বরাদ্দকারী - একটি তালিকা নির্মাণকারী, এতে কেস - এবং ক্লাসটি দেওয়া হয়নি তাই এটি বর্তমানে সম্পাদনকারী হিসাবে ধরা হয়)। ইতিমধ্যে, আমরা আমাদের "শ্রেণি" (অর্থাত্ মূল ফাইলটি) এর মাধ্যমে একটি কাস্টম তুলনা-থেকে-স্ট্রিং পদ্ধতি দিয়ে থাকি use overloadএবং সেই পদ্ধতিটিকে একটি ব্যতিক্রম ছুঁড়ে ফেলা করি (এভাবে লুপটি ভেঙে ফেলে এবং ধাঁধা সমাধান করে); আমরা আসলে রাখতে পারিuse overloadযে কোনও জায়গায় এবং যদিও এটি traditionতিহ্যগতভাবে অন্যান্য পদ্ধতির সংজ্ঞা এবং ফাইলটির শীর্ষের কাছাকাছি যেতে পারে তবে আমরা এটিকে তার পরিবর্তে প্রদত্ত ফাঁকটিতে রাখতে পারি এবং এটি এখনও কার্যকর হয়। (যদি আমরা এটি ফাইলের শেষে রাখি তবে আমরা সেমিকোলনটি এর পরে বাদ দিতে পারি, যার ফলে ৩ 36-বাইট সমাধান পাওয়া যায়, তবে এটি তাত্ক্ষণিকভাবে প্রতারণা করছে কারণ এটি প্রথম স্থানে অনুবর্তনকারী সেমিকোলনটি প্রোগ্রামের উপর নির্ভর করে, যা গ্যারান্টিযুক্ত নয়)) স্ট্রিংফাই ক্রিয়াকলাপটি ওভারলোড করার জন্য এটি প্রকৃতপক্ষে খাটো এবং পার্ল একটি স্ট্রিংটিকে তার থেকে তুলনা করুন, ওভারলোড স্ট্রিংটি সরাসরি তুলনা করার চেয়ে বেশি হবে (কারণ কিছু অপারেটর আপনাকে অন্যান্য অপারেটরকেও ওভারলোড করতে বাধ্য করে)।

এখন, আমাদের যা করতে হবে তা হল আমাদের অবজেক্টটি ব্যবহার করে ফেলে দেওয়া dieevalবন্ধ, তারপর যখন আমরা তুলনা করার প্রচেষ্টা $@নাল স্ট্রিং (যদি সেখানে একটি ব্যতিক্রম ছিল দেখতে), তুলনা অন্য ব্যতিক্রম ছোঁড়ার এবং আমরা বাহিরে অব্যাহতি eval

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