জেভিএম সংস্করণ সনাক্ত করতে একটি জাভা কোড লিখুন


17

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

এই লক্ষ্যটি নিশ্চিত করতে, সঠিক আনুষ্ঠানিক বিধিগুলি হ'ল:

  1. কোডটি অবশ্যই জাভাতে লেখা থাকতে হবে এবং এটি যে JRE সংস্করণে চলছে তা আউটপুট করা উচিত।

  2. কোডটি অবশ্যই জাভা সংস্করণ সনাক্ত করার জন্য প্রদত্ত কোনও জেডিকে বা জেআরআই এপিআই ব্যবহার করা উচিত নয় বা যা জেডিকে বা জেআরই সংস্করণটি বিনামূল্যে দেয়।

  3. কোডটি অবশ্যই প্রতিবিম্ব ব্যবহার করবে না।

  4. কোডটি কেবল হটস্পট জাভা এসই 5, 6 এবং 7 এ কাজ করা প্রয়োজন, তবে অন্যান্য জেভিএম-এ কাজ করতে পারে।

  5. কোডটি অবশ্যই ক্লাসপথে কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করবে না।

  6. কোডটি অবশ্যই অন্য কোনও প্রক্রিয়া, জাভা বা শুরু করা উচিত নয়।

  7. কোডটি অবশ্যই পরিবেশের ভেরিয়েবল ব্যবহার করা উচিত নয়।

  8. কোডটি অবশ্যই পূর্ব-বিদ্যমান ফাইল বা ফোল্ডারগুলির সন্ধানকারী ফাইল সিস্টেম অনুসন্ধান করবে না।

  9. কোড একটি ফাইল অন্তর্ভুক্ত করতে হবে এবং এর মাধ্যমে বলা যেতে public static void main(String[] args)বা public static void main(String... args)

  10. কোডটিতে জেআরই-তে উপস্থিত কোনও অ-সর্বজনীন এপিআই ব্যবহার করা উচিত নয়।

  11. কোডটি কার্যকর করার সময় কোনও NoClassDefFoundError, NoSuchMethodError, ClassNotFoundException বা NoSuchMethodException উৎপন্ন করতে হবে না।

  12. কোডটি ইন্টারনেট বা কোনও স্থানীয় নেটওয়ার্ক থেকে সংযোগ বিচ্ছিন্ন এমন সিস্টেমে চালানো উচিত।

  13. এটি সংস্করণে কেন এক উপায়ে এবং অন্য সংস্করণে অন্য উপায়ে আচরণ করে তার একটি বিবরণ সরবরাহ করা উচিত।

স্কোরিং

সর্বোত্তম সমাধান পরিমাপের জন্য ব্যবহৃত পদ্ধতিটি হ'ল সর্বোচ্চ (এন / গুলি), যেখানে এন এই বিধিগুলির কোনও লঙ্ঘন না করে সনাক্ত করা বিভিন্ন জাভা সংস্করণগুলির সংখ্যা (কমপক্ষে 5, 6 এবং 7) এবং সেগুলি লাক্ষিক টোকেনের সংখ্যা সমাধানে।


এর চেয়ে ভাল ট্যাগ খুঁজে পাওয়া যায় নি, এবং আমাকে শেষ দুটিতে সরবরাহ করতে হয়েছিল। তদ্ব্যতীত, নতুন ট্যাগগুলি তৈরি করার মতো পর্যাপ্ত পরিমাণে আমার কাছে নেই। জাভা কারণ কারণ এটি সম্ভবত একটি খুব বহনযোগ্য ভাষা, তাই লেখা যে খুব আকর্ষণীয় হবে। আরও, জাভা সংস্করণগুলি এমনভাবে সংজ্ঞায়িত করা হয় যে আমরা আপেলগুলিতে কমলার তুলনা না করেই পরিবেশটিকে সনাক্তকরণের সাথে তুলনা করতে পারি uniform
ভিক্টর স্টাফুসা

আপনি [আন্ডারহেন্ডেড] যুক্তিটি বিবেচনা করতে পারেন যে ভিএম সংস্করণ সনাক্তকরণটি সিস্টেমে আক্রমণ করার এক ধাপ। আমি বলতে পারি না যে আমার আর একটি পরামর্শ আছে।
dmckee

@dmckee [কোড-গল্ফ] ট্যাগটি ফেলেছে। [আন্ডারহ্যান্ডেড] ট্যাগ যুক্ত করুন। আপনি কি দয়া করে [জাভা] ট্যাগটি তৈরি করতে পারেন?
ভিক্টর স্টাফুসা

4
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করতে ভোট দিচ্ছি কারণ ছদ্মবেশী চ্যালেঞ্জগুলি এখন আর এই সাইটে অন টপিক নয়। meta.codegolf.stackexchange.com/a/8326/20469
বিড়াল

@ বিড়াল, আপনার পরিবর্তে ট্যাগটি মুছে ফেলা উচিত ছিল, কারণ এটি প্রশ্নের উপযুক্ত নয়।
পিটার টেলর

উত্তর:


9

6/102 = 0.0588

6 সংস্করণ সনাক্ত করে। (আমি মোছা 103 থেকে নেমে 102 আভিধানিক টোকেন আছে publicমধ্যে public class)।

import java.security.Signature;

class GuessVersion {
        public static void main(String[] args) {
                String version = "Java 1.1";
                try {
                        "".getBytes("ISO8859_13");
                        version = "Java 1.3";

                        "".getBytes("ISO8859_15");
                        version = "Java 1.4";

                        Signature.getInstance("SHA256withRSA");
                        version = "Java 5";

                        "".getBytes("KOI8_U");
                        version = "Java 6";

                        Signature.getInstance("SHA256withECDSA");
                        version = "Java 7";
                } catch(Exception e) {}
                System.out.println(version);
        }
}

জাভা 1.1 জাভাতে অক্ষর এনকোডিং এবং ক্রিপ্টোগ্রাফিক অ্যালগরিদম প্রবর্তন করেছে। পরবর্তী সংস্করণগুলি আরও এনকোডিং এবং অ্যালগরিদম যুক্ত করেছে। এই প্রোগ্রামটি ব্যতিক্রম না হওয়া পর্যন্ত এনকোডিং এবং অ্যালগরিদম ব্যবহার করার চেষ্টা করে। আমি নিক্ষিপ্ত এনকোডিং নিক্ষেপ java.io.UnsupportedEncodingExceptionএবং একটি অনুপস্থিত অ্যালগরিদম নিক্ষেপ আশা করি java.security.NoSuchAlgorithmException

আমার জাভা চারটি পুরানো সংস্করণ সহ একটি পুরানো পাওয়ারপিসি ম্যাকিনটোস ছিল। আমার ওপেনবিএসডি মেশিনটিতে আরও দুটি সংস্করণ রয়েছে, তাই আমি এই ছয়টি সংস্করণ পরীক্ষা করেছি:

  • ম্যাক ওএস 9.2.2 এর জন্য এমআরজে 2.2.6 এ জাভা 1.1.8
  • ম্যাক ওএস এক্স প্যান্থারের জন্য জাভা 1.3.1_16
  • ম্যাক ওএস এক্স টাইগারটির জন্য জাভা 1.4.2_21
  • ম্যাক ওএস এক্স টাইগারটির জন্য জাভা 1.5.0_19
  • ওপেনডিজিডি 5.5 এর জন্য ওপেনডিজি 1.6.0_32
  • ওপেনডিজিডি 1.7.0_21 ওপেনবিএসডি 5.5 এর জন্য

এই প্রোগ্রামটি ওপেনবিএসডি-র জন্য জ্যামভিএম 1.5.4 এবং জিসিজে ৪.৮.২ এ চালাতে পারে, তবে এগুলি বিভিন্ন বাস্তবায়ন হিসাবে চিহ্নিত করে না। এটি কেবল "জাভা 5" মুদ্রণ করে।

জাভার জন্য ম্যাক ওএস রানটাইম

"একবার লিখুন, সর্বত্র চালান!" এর জন্য ধন্যবাদ, আমি এই প্রোগ্রামটি একবার লিখতে পারি, এটি একবার সংকলন করতে এবং আটটি ভার্চুয়াল মেশিনে একটি গ্যাসভার্সন.ক্লাস চালাতে পারি। আমার সংগ্রহে প্রাচীনতম সংস্করণ জাভা 1.1 এর জন্য আমার একটি সংকলক দরকার।

আমার javacসংকলকটি এমআরজে এসডিকে ২.২ এর সরঞ্জাম। ক্লাসিক ম্যাক ওএসের কোনও কমান্ড লাইন না থাকায় javacএটি একটি দুর্দান্ত গ্রাফিকাল সরঞ্জাম যেখানে আমি ফাইল এবং বিকল্পগুলি নির্বাচন করি এবং "জাভ্যাক করুন" ক্লিক করুন। আমি আমার কোড সম্পাদনা করার পরে, আমি আবার "জাভ্যাক" আবার ক্লিক করি।

ক্লাসিক ম্যাক ওএসের জন্য এমআরজে এসডিকে ২.২ থেকে জাভ্যাক

গুয়াসভারসন.ক্লাস চালানোর সহজতম উপায় হ'ল এটি এমআরজে এসডিকে ২.২ এর অন্য সরঞ্জাম জেবাইন্ডারিতে খোলা। রানটাইমটি এমআরজে 2.2.6, জাভা 1.1.8 এর একটি বাস্তবায়ন।


22

আমি নিশ্চিত না যে আমার স্কোরটি কী, কারণ এটি নির্ভর করে যে আপনি সঠিকভাবে একটি লেজিকাল টোকেন হিসাবে বিবেচনা করছেন, তবে আমি একটি দীর্ঘ স্ট্রিং দিয়ে যতটা সম্ভব গণনা পদ্ধতিটিকে অপব্যবহার করার চেষ্টা করছি ...

এটি আপনি 7 টি আলাদা সংস্করণ বা 16 টি সনাক্তকরণ হিসাবে গণনা করছেন কিনা তার উপরও নির্ভর করে ... (এটি তুচ্ছভাবে 190 পর্যন্ত প্রসারিত হতে পারে)।

class V extends ClassLoader
{
    public static void main(String[]args)
    {
        for(byte b=60;;)
            try {
                byte[]buf="\u00ca\u00fe\u00ba\u00be\u0000\u0000\u00002\u0000\u0005\u0007\u0000\u0003\u0007\u0000\u0004\u0001\u0000\u0001A\u0001\u0000\u0010java/lang/Object\u0006\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000".getBytes("ISO-8859-1");
                buf[7]=b--;
                new V().defineClass(buf,0,53);
                System.out.println(b-43);
                break;
            }
            catch(Throwable t){}
    }
}

এটি শ্রেণি বিন্যাসের মূল সংস্করণ সংখ্যার সাথে একটি কাস্টম ক্লাসলোডারটিতে একটি ইন্টারফেস সংজ্ঞায়িত করার চেষ্টা করে কাজ করে। প্রথমটি যা কোনও java.lang.UnsupportedClassVersionErrorভিএম এর সংস্করণটির সাথে সম্পর্কিত নয়।


84 টোকেন গণনা করা হয়েছে। তবুও এটি পরীক্ষা করা হয়নি।
ভিক্টর স্টাফুসা

আপনার উত্তর জেনিয়াল। তুচ্ছভাবে 83 টি টোকেন ব্যবহার করে হ্রাস করতে পারে String... args
ভিক্টর স্টাফুসা

@ ভিক্টর, এটি আরও 7 টি বিভিন্ন সংস্করণ আরও বেশি সমর্থন করে কিনা তা প্রশ্নকে জটিল করে তুলবে। আমি এমন কোনও সংকলক সম্পর্কে সচেতন নই যা জাভা 5 সিনট্যাক্স সমর্থন করে এবং জাভা 1-সামঞ্জস্যপূর্ণ শ্রেণীর ফাইলগুলিতে সংকলন করে।
পিটার টেলর

ভাল যুক্তি. আমি এটি সম্পর্কে ভুলে গেছি।
ভিক্টর স্টাফুসা

1
জাভা 1.1.8 (MRJ 2.2.6 মধ্যে), এই কম্পাইল করতে ব্যর্থ পর্যন্ত আমি 17 আরো টোকেন যোগ করেছেন: protected Class loadClass(String name, boolean resolve) { return Object.class; }। জাভা 1.2 এর আগে এটি কীভাবে অ্যাবস্ট্রাক্ট পদ্ধতি ছিল তা উল্লেখ করতে বর্তমান এপিআই ডক্স অবহেলা করে। আমি অবজেক্ট.ক্লাস ফিরিয়ে দিয়েছি কারণ পদ্ধতিটি "জাভা.লাং.অবজেক্ট" এর জন্য একটি কল পেয়ে যায়।
কর্নিগ

8
class Evil {
    public static void main(String... args) {
        String s1 = "Good";
        s1 += "morning";
        int a = 7;
        if (s1 != s1.intern())
            try {
                a--;
                javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar().equals(null);
            } catch (Throwable e) {
                a--;
            }
        System.out.println(a);
    }
}

ইন্টার্নিংয়ের অ্যালগরিদমটি জাভা 6 এবং 7 এর মধ্যে পরিবর্তিত হয়েছে দেখুন /programming//a/7224864/540552 দেখুন

এক্সএমএল গ্রেগরিয়ানক্যালেন্ডার.এক্কালস (নাল) জাভা 5-তে নুলপয়েন্টারএক্সসেপশন নিক্ষেপ করত, তবে এটি জাভা 6-তে স্থির করা হয়েছিল দেখুন See http://bugs.sun.com/view_bug.do?bug_id=6285370

100 96 92 87 85 টোকেন এখানে। 7 টোকেন হ্রাস করার জন্য পিটার টেলরকে ধন্যবাদ।


1
আপনি এস 1 তে সংস্করণ নম্বর সংরক্ষণ করে 3 টি টোকেন সংরক্ষণ করতে পারেন। DatatypeConfigurationExceptionনিক্ষেপ করা হবে না এমন ধারনাতে আপনি সম্ভবত সরাসরি থ্রোয়েবলকে ধরে আরও 2 টি সঞ্চয় করতে পারেন ।
পিটার টেলর

1
বা আরও ভাল, int aঅবিলম্বে এটি রাখুন তবে তা আরম্ভ করুন, যাতে ifব্লকটি খালি হয়ে যায়। শর্তটি আলোচনা করুন, অন্যটি সরিয়ে ফেলুন এবং এতে --সরাসরি অ্যাসাইনমেন্টের পরিবর্তে ব্যবহার করুন a
পিটার টেলর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.