99 में प्रत्येक ASCII चरित्र को गोल्फ करना


11

99 एक प्रोग्रामिंग भाषा है जिसे मैंने इस सप्ताह के शुरू में अपनी चुनौती के लिए आविष्कार किया था । 99 के लिए एक दुभाषिया लिखें । (आविष्कार किया है, लेकिन आप में से आधा दर्जन के लिए धन्यवाद लागू करने की आवश्यकता कभी नहीं हुई है;)) पूरी भाषा कल्पना उस चुनौती में है, इसलिए मैं इसे यहां पर फिर से तैयार करने के लिए परेशान नहीं कर रहा हूं।

में 99 आप अलग-अलग मुद्रित कर सकते हैं ASCII stdout में वर्ण, लेकिन भाषा की कमी के कारण, यह हमेशा स्पष्ट नहीं है कि कैसे संक्षेप में संभव के रूप में एक विशेष चरित्र मुद्रित करने के लिए।

128 ASCII वर्णों में से प्रत्येक के लिए, एक 99 प्रोग्राम लिखें जो कोई इनपुट नहीं लेता है और उस एकमात्र चरित्र को आउटपुट करता है। आप इनमें से किसी भी या सभी उत्तरों को हाथ से कोड कर सकते हैं, या आप उन्हें बनाने के लिए एक और कार्यक्रम (किसी भी भाषा में आप की तरह) लिख सकते हैं।

आपके प्रत्येक १२ the ९९ कार्यक्रमों में पात्रों का योग आपका अंक है। सबसे कम स्कोर जीतता है। न्यूलाइन्स को एक चरित्र के रूप में गिना जाता है।

याद रखें, 99 में , 9999आउटपुट ASCII वर्ण (विषम आकार चर आउटपुट पूर्णांक) जैसे केवल चर भी आकार देते हैं। उनके मूल्य को 9 से विभाजित किया जाता है और फिर मॉड 128 लिया जाता है, इसलिए मानों को ASCII वर्णों के लिए मैप करने के लिए एक निश्चित सीमा में होने की आवश्यकता नहीं है। उदाहरण के लिए, आंतरिक मान 297, 1449, और -855 सभी वर्ण के अनुरूप हैं !क्योंकि जब वे 9 से विभाजित होते हैं और mod 128 लेते हैं, तो वे सभी 33 हो जाते हैं, जो कि के लिए वर्ण कोड है !

अगर आपको 99 के लिए दुभाषिया की आवश्यकता है , तो मैं मैक के पायथन उत्तर का सुझाव दूंगा

मुझे पता है कि मैंने कहा कि मेरी अगली चुनौती अधिक संवादात्मक होगी लेकिन मैं अभी भी उस पर काम कर रहा हूं।

जवाबों:


7

एक काम, 2075 (इष्टतम)

यह इष्टतम मूल्य होना चाहिए (जब तक कि मुझे तर्क या मेरे परीक्षण बेकार में एक बड़ी त्रुटि न हो)।

सबसे पहले। केवल 7 अलग-अलग संख्याएँ हैं (मॉड 128) जिसे आप 99 में व्यक्त कर सकते हैं। 7 या अधिक 9 के सभी मान समान संख्या 71 का मूल्यांकन करते हैं। (क्योंकि 10 ^ 8 मॉड 128 == 0, 10 ^ 9 मॉड 128 == 0) ...)

यदि 4 मानों में से एक आप एक समान संख्या के साथ व्यक्त कर सकते हैं, तो इस संख्या को आउटपुट करने से स्पष्ट रूप से इष्टतम समाधान है।

अन्यथा मैं एक असाइनमेंट स्टेटमेंट (99 पर असाइन करें) के साथ नंबर तक पहुंचने की कोशिश करता हूं और 99 प्रिंट करता हूं। जैसा कि यह अधिकतम कार्यक्रम का आकार बताता है इस दृष्टिकोण के साथ 22 चार्ट है। स्पष्ट रूप से गोटो का उपयोग निश्चित रूप से अधिक से अधिक लेता है। एकमात्र संभावना है कि एक असाइनमेंट समाधान पीटा जा सकता है दो असाइनमेंट के साथ एक समाधान है। मैंने इसका परीक्षण किया (उम्मीद है कि कोई त्रुटि नहीं है, इसके लिए कोड काफी गड़बड़ है), और किसी भी ASCII चार के लिए कोई समाधान नहीं मिला।

इसलिए केवल 4 प्रत्यक्ष संख्या और एक-असाइनमेंट दृष्टिकोण की जांच करना इष्टतम समाधान खोजने के लिए पर्याप्त होना चाहिए। निम्नलिखित पायथन (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 char) वाला char 2 की vertical tab - 11लंबाई वाला प्रोग्राम है, सबसे लंबे प्रोग्राम वाला char (22 char) bell - 7और A - 65

सभी कार्यक्रमों का योग 2075 है।

और वैसे, मैंने tmartin से k / q दुभाषिया का उपयोग किया । मैं अन्य लोगों (पायथन, पर्ल, सीजम) के साथ कुछ परेशानियों से नफरत करता हूं। यकीन नहीं होता तो मेरी गलती थी।


यह दुभाषियों के कार्यान्वयन में मदद करेगा यदि आप वर्णन कर सकते हैं कि आपको क्या परेशानी थी। बहुत बढ़िया जवाब।
coredump

3

तकनीक की एक किस्म, 42109

संख्याओं के लिए, बड़े ASCII वर्ण की गणना करने के बजाय, मैंने सिर्फ संख्या के मूल्य की गणना की। आपने केवल चरित्र को आउटपुट करने में सक्षम होने के लिए कहा था, इसलिए यह अभी भी काम करना चाहिए।

संपादित करें: ASCII वर्णों का उपयोग करने के लिए संख्याओं को बंद कर दिया, ताकि उपेक्षा हो। मैंने जावा कोड में मूल संख्या कोड छोड़ दिया था, लेकिन किसी ने भी इसका उपयोग करने की इच्छा होने पर टिप्पणी की।

इनमें से कुछ मैंने हाथ से किए, अधिकांश मैंने सिर्फ टाइप करने के लिए एक कार्यक्रम लिखा था।

ये 1-4 पंक्तियों में से प्रत्येक से बने होते हैं, इसलिए वे केवल एक कार्यक्रम में कॉपी और पेस्ट करने के लिए काफी अनुकूल हैं। यह ध्यान दिया जाना चाहिए कि वे मेरे उत्पन्न कोड के कारण उत्तराधिकार में काम नहीं करते हैं, चर राज्यों को संरक्षित नहीं करते हैं।

यहां इस्तेमाल की जाने वाली सबसे आम तकनीक ऑरलपी के दृष्टिकोण के समान थी:

९ को ९९ से घटाएँ, फिर आउटपुट।

मेरा संस्करण कुछ कस्टम मामलों का उपयोग करके और केवल एक पंक्ति में बहुत सारे गणित की रचना करके भिन्न होता है। कस्टम मामले सिर्फ ऐसे हैं जहां चरित्र को केवल 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.