99 এ প্রতি ASCII চরিত্রটি গল্ফ করছে


11

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

ইন 99 আপনি পৃথক মুদ্রণ করতে পারেন হওয়া ASCII stdout- এ অক্ষর, কিন্তু ভাষার সীমাবদ্ধতার কারণে, এটা সবসময় পরিষ্কার করা হয় না কিভাবে সংক্ষেপে যতটা সম্ভব একটি নির্দিষ্ট অক্ষর প্রিন্ট করতে।

128 ASCII অক্ষরের প্রত্যেকটির জন্য, এমন একটি 99 টি প্রোগ্রাম লিখুন যা কোনও ইনপুট নেয় না এবং সেই একক অক্ষরটিকে আউটপুট দেয়। আপনি নিজের হাতে এই উত্তরগুলির যে কোনও বা সমস্ত কোড করতে পারেন, বা আপনার জন্য এগুলি তৈরি করতে আপনি অন্য কোনও প্রোগ্রাম (আপনার পছন্দ মতো কোনও ভাষায়) লিখতে পারেন।

আপনার 128 99 টি প্রোগ্রামের প্রতিটি অক্ষরের যোগফলটি আপনার স্কোর। সর্বনিম্ন স্কোর জয়। নিউলাইনগুলি একটি চরিত্র হিসাবে গণনা করে।

মনে রাখবেন, 99 সালে , এমনকি 9999আউটপুট ASCII অক্ষরগুলির মতো আকারের ভেরিয়েবলগুলি (বিজোড় আকারের ভেরিয়েবল আউটপুট পূর্ণসংখ্যার)। তাদের মান 9 দ্বারা বিভক্ত হয় এবং তারপরে 128 মোড নেওয়া হয়, সুতরাং ASCII অক্ষরগুলিতে মানচিত্র নির্দিষ্ট করার জন্য মানগুলির প্রয়োজন হয় না। উদাহরণস্বরূপ, অভ্যন্তরীণ মানগুলি 297, 1449 এবং -855 সমস্ত অক্ষরের সাথে সঙ্গতিপূর্ণ !কারণ যখন সেগুলি 9 দ্বারা বিভক্ত হয় এবং 128 মোড গ্রহণ করা হয়, তখন সেগুলি 33 হয়, যা চরিত্রের কোড !

আপনার যদি 99 এর জন্য দোভাষী দরকার হয় তবে আমি ম্যাকের পাইথন উত্তরটি প্রস্তাব করব

আমি জানি আমি বলেছিলাম যে আমার পরবর্তী চ্যালেঞ্জটি আরও ইন্টারঅ্যাকটিভ হবে তবে আমি এখনও তার জন্য স্টাফের উপর কাজ করছি।

উত্তর:


7

একটি নিয়োগ, 2075 (অনুকূল)

এটি সর্বোত্তম মান হওয়া উচিত (যদি না আমি তর্ক করতে বা আমার পরীক্ষা সফল না করে)।

সবার আগে। 99 টিতে আপনি প্রকাশ করতে পারবেন মাত্র 7 টি পৃথক নম্বর (Mod 128) 7 ...)

4 টির মধ্যে একটি মান যদি আপনি এমনকি একটি বৃহত্তর নাইন দিয়ে প্রকাশ করতে পারেন তবে এই সংখ্যাটি আউটপুট দেওয়ার চেয়ে স্পষ্টতই সর্বোত্তম সমাধান।

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

অতএব কেবলমাত্র 4 টি সরাসরি সংখ্যা এবং এক-অ্যাসাইনমেন্ট পদ্ধতির পরীক্ষা করা সর্বোত্তম সমাধানটি সন্ধান করার জন্য যথেষ্ট be নিম্নলিখিত পাইথন (2 এবং 3 সামঞ্জস্যপূর্ণ) প্রোগ্রামটি সমস্ত প্রোগ্রাম উত্পন্ন করে এবং তাদের দৈর্ঘ্যের পরিমাণ যোগ করে। এটি একটি সাধারণ আইডিএ * পদ্ধতির ব্যবহার করে।

from itertools import count

def nines_to_dec(nines):
    return ((10**nines - 1) // 9) % 128

def shortest_representation(ascii_value):
    # try simple output,
    # max code length is 8, (8 nines == 10 nines == 12 nines == ...)
    # if this works, than this is the shortest representation

    for nines in range(2, 9, 2):
        if nines_to_dec(nines) == ascii_value:
            return "9" * nines

    # otherwise try one assignment
    for length in count(1):
        result = assignment(ascii_value, length, [])
        if result:
            return "99 " + result + "\n99"

def assignment(value, left, nines_list):
    if left == 0:
        eval_numbers = [nines_to_dec(nines) for nines in nines_list]

        if (sum(eval_numbers[::2]) - sum(eval_numbers[1::2])) % 128 == value:
            return " ".join("9" * nines for nines in nines_list)
        else:
            return False

    for nines in range(1, 8):
        left2 = left - nines - 1 # -1 for space
        if left2 >= 0:
            result = assignment(value, left2, nines_list + [nines])
            if result:
                return result

    return False

lengths = []
for i in range(128):
    program =shortest_representation(i)
    lengths.append(len(program))
    print("ASCII-value: {}, ASCII-char: {}".format(i, chr(i)))
    print(program)

print(sorted(lengths))
print(sum(lengths))

আউটপুট নিম্নলিখিত ফর্ম হয়:

....
ASCII-value: 65, ASCII-char: A
99 9 999999 9999999
99
ASCII-value: 66, ASCII-char: B
99 9 99 9999 99
99
ASCII-value: 67, ASCII-char: C
99 9 99 9 99 9999
99
....

আপনি সম্পূর্ণ আউটপুট এটিতে পেতে পারেন: http://pastebin.com/bKXLAArq

সংক্ষিপ্ততম প্রোগ্রামের সাথে (2 চর) চার্টটি 2 টির vertical tab - 11দৈর্ঘ্যের প্রোগ্রামের সাথে থাকে, দীর্ঘতম প্রোগ্রামগুলির সাথে অক্ষরগুলি (22 চর) হয় bell - 7এবং হয় A - 65

সমস্ত প্রোগ্রামের যোগফল 2075।

এবং যাইহোক , আমি টিমার্টিন থেকে কে / কিউ ইন্টারপ্রেটার ব্যবহার করেছি । আমি অন্যান্য সমস্যার সাথে পাইথন, পার্থ, সিজেম। নিশ্চিত না যে এটি আমার দোষ ছিল কিনা।


এটি আপনাকে দোভাষীগুলির বাস্তবায়নকারীদের সহায়তা করবে যদি আপনি কী কী সমস্যায় পড়েন তা বর্ণনা করতে পারেন। দুর্দান্ত উত্তর।
coredump

3

প্রযুক্তি বিভিন্ন ধরণের, 42109

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

সম্পাদনা: ASCII অক্ষরগুলি ব্যবহার করতে নম্বরগুলি পরিবর্তন করা হয়েছে, তাই এটিকে উপেক্ষা করুন। আমি জাভা কোডটিতে মূল নম্বরটি রেখেছি তবে কেউ যদি এটি ব্যবহার করতে চায় সে ক্ষেত্রে মন্তব্য করে।

এর মধ্যে কয়েকটি আমি হাতে হাতে করেছি, বেশিরভাগ আমি কেবল টাইপ করার জন্য একটি প্রোগ্রাম লিখেছিলাম।

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

এখানে ব্যবহৃত সবচেয়ে সাধারণ কৌশলটি orlp এর পদ্ধতির মতো ছিল:

৯৯ থেকে ৯ টি বিয়োগ করে চালিয়ে যান, তারপরে আউটপুট।

আমার সংস্করণটি কিছু কাস্টম কেস ব্যবহার করে এবং কেবল একটি লাইনে প্রচুর গণিত রচনা করে পৃথক। কাস্টম কেসগুলি হ'ল কেবল যেখানে 9 এর একগুচ্ছ চরিত্রটি উপস্থাপন করা যেতে পারে এবং কোনও গণিত বা আমার প্রজন্মের কোড ছোট করা যায় না।

প্রোগ্রাম

আপনারা যারা প্রোগ্রামটি চালানোর মতো মনে করেন না তাদের জন্য আউটপুট আমি রেখেছি:

http://pastebin.com/Cs6WZUfb

জাভা কোড আমি ব্যবহার করেছি:

public class AsciiGen99 {

  public static void main(String[] args) {
    long totalsize = 0;
    for (int i = 0; i < 128; i++) {
      System.out.println("\n The program for ASCII code " + i + " is as follows:\n");
      String yea = find(i);
      if (yea != null) {
        System.out.println(yea);
        totalsize += yea.length();
      } else {
        String v = "99 9 9\n9 99 9";
        if (i != 0) {
          v += "\n99";
          for (int j = 0; j < i; j++) {
            v += " 99 9";
          }
        }

        v += "\n99";

        System.out.println(v);
        totalsize += v.length();
      }
    }
    System.out.println(totalsize);
  }

  public static String find(int i) {
    switch (i) {
      case '\0':
        return "99 9 9\n99";
      case '\1':
        return "99 9\n99";
    }
//    if (48 <= i && i <= 57) {
//      switch (i) {
//        case '0':
//          return "9 9 9\n9";
//        case '1':
//          return "9";
//        case '2':
//          return "999 9 9\n9 999 9\n999 999 9 999 9\n999";
//        case '3':
//          return "999 9 9\n9 999 9\n999 999 9 999 9 999 9\n999";
//        case '4':
//          return "999 9 9\n9 999 9\n999 999 9 999 9 999 9 999 9\n999";
//        case '5':
//          return "999 9 9\n9 999 9\n999 999 9 999 9 999 9 999 9 999 9\n999";
//        case '6':
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//        case '7':
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//        case '8':
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//        case '9'://ironic
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//      }
//    }
    int x, a;
    for (x = 0; x < 100000; x++) {
      a = i + 128 * x;
      String s = "" + a*9;
      if (containsOnly9(s) && (s.length() & 1) == 0) {
        return ("" + (a * 9));
      }
    }

    return null;
  }
  public static boolean containsOnly9(String s) {
    for (char c : s.toCharArray()) {
      if (c != '9' && c != ' ' && c != '\n' && c != '\r' && c != '\t') {
        return false;
      }
    }
    return true;
  }
}

আপনাকে কেবলমাত্র সংখ্যাটি নয়, চরিত্রটি আউটপুট করতে হবে। সুতরাং 999শেষে সমস্ত প্রোগ্রাম স্থির করা প্রয়োজন।
ক্যালভিনের

আহ, ঠিক আছে, আমি এক মুহুর্তে এটি ঠিক করব।
ব্লো

আমি যদি কিছু মিস না করি তবে এখনই ঠিক করা উচিত। আমি মূল কোডটি রেখে দিয়েছি তবে কেউ যদি এর মতো নম্বর ব্যবহার করতে চায় তবে মন্তব্য করেছিলাম। পাস্তবিনও সম্পাদিত হয়েছিল।
ব্লো

গ্রেট। যদিও কারও জন্য আমি মনে করি আপনি স্রেফ যুক্ত করতে পারতেন 99 999\n99(পুনরায় সাইন ইন 999করার জন্য 99এটি একটি চরিত্র হিসাবে মুদ্রণ করবে)।
ক্যালভিনের শখ

1

পুনরাবৃত্তি বিয়োগ, 65280

তুলনায় একটি তুচ্ছ সমাধান। ৯৯ থেকে ৯ টি বিয়োগ করে চালিয়ে যান, তারপরে আউটপুট। ASCII চরিত্র 10 এর উদাহরণ:

99 99 9
99

এখানে 128 টি প্রোগ্রাম রয়েছে। প্রথম প্রোগ্রামটি দুটি অক্ষর দীর্ঘ (99), এর পরের প্রতিটি পূর্বেরটির চেয়ে 8 টি অক্ষর (99 99 9 \ n) দীর্ঘ।

পাইথন প্রোগ্রাম উত্পন্ন প্রোগ্রামগুলি ফাঁকা লাইন এবং কম্পিউটিং স্কোর দ্বারা পৃথক করা:

score = 0
for n in range(128):
    program = "99 99 9\n" * n + "99"
    score += len(program)
    print(program + "\n")

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