ইন্ট্রোস্পেক্টিভ প্রোগ্রামিং: কোড যা এর উত্স এবং এর আউটপুট বিশ্লেষণ করে


13

এমন একটি প্রোগ্রাম লিখুন যা তার উত্স এবং এর আউটপুটে মোট অক্ষরের সংখ্যা এবং প্রতিটি অক্ষরের ফ্রিকোয়েন্সি আউটপুট করে। আপনাকে অবশ্যই উদাহরণে বর্ণিত ফর্ম্যাটটি অনুসরণ করতে হবে।

উদাহরণ

যদি আপনার কোড ছিল

abb1

এর আউটপুট হতে হবে

My source has 4 characters.
1 is "a"
2 are "b"
1 is "1"
Besides unquoted numbers, my output has 383 characters.
34 are "
"
79 are " "
63 are """
2 are "'"
2 are ","
4 are "."
2 are "1"
2 are "B"
2 are "I"
2 are "M"
39 are "a"
4 are "b"
6 are "c"
4 are "d"
38 are "e"
3 are "g"
5 are "h"
4 are "i"
4 are "m"
3 are "n"
8 are "o"
3 are "p"
2 are "q"
38 are "r"
12 are "s"
8 are "t"
7 are "u"
3 are "y"
It's good to be a program.

(আউটপুট অবশ্যই stdout যেতে হবে।)

লক্ষ করুন, উদাহরণস্বরূপ, আউটপুটে দুটি মূলধনযুক্ত মি আছে। Myএকটির জন্য এবং একটির জন্য 2 are "M"। এটি অবশ্যই সমস্ত অক্ষরের জন্য সত্য ধরে রাখতে হবে যাতে আউটপুট কোনওভাবেই নিজের সাথে বিপরীত হয় না।

অসম্পূর্ণযোগ্য ফ্রিকোয়েন্সি সেটগুলি এড়ানোর জন্য আউটপুটে অব্যক্ত নম্বরগুলি উপেক্ষা করা হয়। উদাহরণস্বরূপ, 1 is "1"উভয় 1 টি গণনা করা হলে ভুল is এটি পড়া উচিত 2 are "1", কিন্তু তারপরে আবার কেবল 1 জন রয়েছে।

ফর্ম্যাট স্পষ্টকরণ

  • "এক" অক্ষর সংঘটনগুলির জন্য অবশ্যই ব্যবহার করা উচিত।

  • "are" অবশ্যই একাধিক অক্ষরের উপস্থিতির জন্য ব্যবহার করা উচিত।

  • "is" কখনই আউটপুট অক্ষরের তালিকায় উপস্থিত হওয়া উচিত নয় কারণ এটি অত্যধিক হবে। 1 is 'Z'জেডকে নিজেই বোঝায় তাই পুরো লাইনটি মুছে ফেলা যায়।

  • তিনটি পূর্ণ-বাক্য বাক্যাংশ অবশ্যই অক্ষরের ফ্রিকোয়েন্সি তালিকার সাথে অবশ্যই উপস্থিত হবে (উদাহরণ হিসাবে দেখায়)। সুতরাং আপনার আউটপুট শুরু My source...এবং দিয়ে শেষ হবে ...be a program.। দ্রষ্টব্য যে আউটপুট শেষে কোনও নতুন লাইন নেই।

  • চরিত্রের ফ্রিকোয়েন্সিগুলি তাদের কোনও ক্রমে তালিকাবদ্ধ করে।

  • নিউলাইনগুলি একটি অক্ষর হিসাবে গণনা করে (যদি তারা \ r \ n হয়)।

ফর্ম্যাট পরীক্ষক

নিম্নলিখিত পাইথন স্ক্রিপ্টটি আপনার কোড এবং এর আউটপুটটিকে স্ট্রিং হিসাবে গ্রহণ করে এবং জোর দেয় যে আউটপুটটির কোনও বিরোধ নেই। কিছু ভুল হলে এটি একটি দরকারী ত্রুটি বার্তা সরবরাহ করে। আপনি অনলাইনে http://ideone.com/6H0ldu এ এটি চালিয়ে , সিডিএডি এবং আউটপুট স্ট্রিংগুলি প্রতিস্থাপন করে, তারপরে চালাতে পারবেন। এটি কখনই মিথ্যা ইতিবাচক বা নেতিবাচকতা দেবে না (এটির ত্রুটি মুক্ত বলে ধরে))

#Change the CODE and OUTPUT strings to test your program

CODE = r'''abb1'''

OUTPUT = r'''My source has 4 characters.
1 is "a"
2 are "b"
1 is "1"
Besides unquoted numbers, my output has 383 characters.
34 are "
"
79 are " "
63 are """
2 are "'"
2 are ","
4 are "."
2 are "1"
2 are "B"
2 are "I"
2 are "M"
39 are "a"
4 are "b"
6 are "c"
4 are "d"
38 are "e"
3 are "g"
5 are "h"
4 are "i"
4 are "m"
3 are "n"
8 are "o"
3 are "p"
2 are "q"
38 are "r"
12 are "s"
8 are "t"
7 are "u"
3 are "y"
It's good to be a program.'''

#######################################################

import re

amountPattern = r'(\d+) (is|are) "(.)"\n'

class IntrospectionException(Exception):
    pass

def getClaimedAmounts(string, errorOnIs):
    groups = re.findall(amountPattern, string, re.DOTALL)

    for amount, verb, char in groups:
        if verb == 'is':
            if errorOnIs:
                raise IntrospectionException('\'1 is "%s"\' is unnecessary' % char)
            elif amount != '1':
                raise IntrospectionException('At "%s", %s must use "are"' % (char, amount))
        elif verb == 'are' and amount == '1':
            raise IntrospectionException('At "%s", 1 must use "is"' % char)

    amounts = {}
    for amount, verb, char in groups:
        if char in amounts:
            raise IntrospectionException('Duplicate "%s" found' % char)
        amounts[char] = int(amount)
    return amounts

def getActualAmounts(string):
    amounts = {}
    for char in string:
        if char in amounts:
            amounts[char] += 1
        else:
            amounts[char] = 1
    return amounts

def compareAmounts(claimed, actual):
    for char in actual:
        if char not in claimed:
            raise IntrospectionException('The amounts list is missing "%s"' % char)
    for char in actual: #loop separately so missing character errors are all found first
        if claimed[char] != actual[char]:
            raise IntrospectionException('The amount of "%s" characters is %d, not %d' % (char, actual[char], claimed[char]))
    if claimed != actual:
        raise IntrospectionException('The amounts are somehow incorrect')

def isCorrect(code, output):
    p1 = r'^My source has (\d+) characters\.\n'
    p2 = r'Besides unquoted numbers, my output has (\d+) characters\.\n'
    p3 = r"It's good to be a program\.$"
    p4 = '%s(%s)*%s(%s)*%s' % (p1, amountPattern, p2, amountPattern, p3)

    for p in [p1, p2, p3, p4]:
        if re.search(p, output, re.DOTALL) == None:
            raise IntrospectionException('Did not match the regex "%s"' % p)

    claimedCodeSize = int(re.search(p1, output).groups()[0])
    actualCodeSize = len(code)
    if claimedCodeSize != actualCodeSize:
        raise IntrospectionException('The code length is %d, not %d' % (actualCodeSize, claimedCodeSize))

    filteredOutput = re.sub(r'([^"])\d+([^"])', r'\1\2', output)

    claimedOutputSize = int(re.search(p2, output).groups()[0])
    actualOutputSize = len(filteredOutput)
    if claimedOutputSize != actualOutputSize:
        raise IntrospectionException('The output length (excluding unquoted numbers) is %d, not %d' % (actualOutputSize, claimedOutputSize))

    splitIndex = re.search(p2, output).start()

    claimedCodeAmounts = getClaimedAmounts(output[:splitIndex], False)
    actualCodeAmounts = getActualAmounts(code)
    compareAmounts(claimedCodeAmounts, actualCodeAmounts)

    claimedOutputAmounts = getClaimedAmounts(output[splitIndex:], True)
    actualOutputAmounts = getActualAmounts(filteredOutput)
    compareAmounts(claimedOutputAmounts, actualOutputAmounts)

def checkCorrectness():
    try:
        isCorrect(CODE, OUTPUT)
        print 'Everything is correct!'
    except IntrospectionException as e:
        print 'Failed: %s.' % e

checkCorrectness()

স্কোরিং

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


আপনার নিজস্ব উত্স ফাইলটি পড়ার অনুমতি রয়েছে?
ভেন্টোরো

@ শ্রীলরে অন্যান্য ত্রুটি থাকতে পারে তবে আমি কেবল বুঝতে পেরেছিলাম যে ট্রিপল কোট ('' ') এখনও ব্যাকস্ল্যাশ দিয়ে জিনিসগুলি এড়িয়ে চলেছে। এটি আপনার সমস্যার সাথে সম্পর্কিত হতে পারে। আমি এখন এটি ঠিক করছি।
ক্যালভিনের শখ 2

নিঃসন্দেহে
ক্যালভিনের শখ

@ মিঃলোর রিজেক্সসগুলি কিছু মিথ্যা ইতিবাচক অনুমতি দেয়, হ্যাঁ। ট্রিপল কোটের অভ্যন্তরে ব্যাকস্ল্যাশগুলির সমস্যা সমাধানের জন্য, কাঁচা স্ট্রিং ( r'''CODE''') ব্যবহার করুন ।
ভেন্টোরো

1
@ মিঃলোর ফিক্সড অচিহ্নবিহীন বিন্দুসমূহ। দেখার জন্য ধন্যবাদ!
ক্যালভিনের শখ 3

উত্তর:


2

সিজেম - 189

{`"_~"+:T;"Besides unquoted numbers, my output has &It's good to be a program.&My source has & characters.
"'&/~_]:X2=T,X3=3i({T_&:B{TI/,(" are ":AM`I*N}fIXK=]o
XBA`N+f+2*+s:T,X3=}fK'q];}_~

এটি http://cjam.aditsu.net/ এ চেষ্টা করুন

আউটপুট:

My source has 189 characters.
3 are "{"
3 are "`"
6 are """
4 are "_"
3 are "~"
4 are "+"
5 are ":"
5 are "T"
2 are ";"
3 are "B"
8 are "e"
9 are "s"
2 are "i"
3 are "d"
17 are " "
6 are "u"
2 are "n"
2 are "q"
8 are "o"
6 are "t"
3 are "m"
2 are "b"
7 are "r"
4 are ","
2 are "y"
2 are "p"
3 are "h"
7 are "a"
5 are "&"
4 are "I"
3 are "'"
2 are "g"
2 are "."
2 are "M"
3 are "c"
2 are "
"
2 are "/"
3 are "]"
5 are "X"
2 are "2"
4 are "="
3 are "3"
2 are "("
2 are "A"
2 are "*"
2 are "N"
3 are "}"
3 are "f"
2 are "K"
Besides unquoted numbers, my output has 988 characters.
3 are "B"
108 are "e"
11 are "s"
3 are "i"
5 are "d"
214 are " "
8 are "u"
4 are "n"
3 are "q"
9 are "o"
9 are "t"
5 are "m"
4 are "b"
108 are "r"
3 are ","
4 are "y"
4 are "p"
6 are "h"
108 are "a"
3 are "I"
3 are "'"
4 are "g"
5 are "."
3 are "M"
7 are "c"
102 are "
"
2 are "{"
198 are """
2 are "`"
2 are "_"
2 are "~"
2 are "+"
2 are ":"
2 are "T"
2 are ";"
2 are "&"
2 are "/"
2 are "]"
2 are "X"
2 are "2"
2 are "="
2 are "3"
2 are "("
2 are "A"
2 are "*"
2 are "N"
2 are "}"
2 are "f"
2 are "K"
It's good to be a program.

11

রুবি, 269 (311, 367) অক্ষর

এই চ্যালেঞ্জের জন্য আমার কাছে তিনটি আলাদা সমাধান রয়েছে। তাদের প্রত্যেকটি আলাদা আলাদা কৌশল ব্যবহার করে:

"যথাযথ" সমাধান, 367 টি অক্ষর:

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

eval r="S='eval r=%p'%r;O=-~$.;q=\"My source has \#{S.size}\"+(X=' characters.\n')+S.chars.uniq.map{|c|[k=S.count(c),k>O ? :are: :is,?\"+c+?\"]*' '}*$/+'\nBesides unquoted numbers, my output has ';r=(w=q+X+s=\"It's good to be a program.\").scan(D=/\\D/).uniq;$><<q<<(w+v=r.map{|c|j=' are \"\n\"';(-~(w+j*r.size).count(c)).to_s+(j[~O]=c;j)}*$/+$/).scan(D).size<<X+v+s"

আংশিকভাবে হার্ডকোডযুক্ত আউটপুট, ৩১১ টি অক্ষর:

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

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

#


eval R="I=$/+$/+'eval R=%p'%R;?\\4>w='%d are \"%s\"';B=\"My source has \#{I.size}\#{X=\" characters.\n\"}\#{z=(m=I.chars.uniq).map{|x|w%[I.count(x),x]}*$/}\nBesides unquoted numbers, my output has 1114\"+X;$><<B+m.map{|c|w%[(B+z+$M=\"\nIt's good to be a program.\").gsub!(/\\d++(?!\")/,'').count(c),c]}*$/+$M"

সংক্ষিপ্ততম সমাধান, 269 টি অক্ষর:

সংক্ষিপ্ততম সমাধান অতিরিক্তভাবে নিজের উত্সের দৈর্ঘ্যকে হার্ডকোড করে। ভেরিয়েবল নামগুলি যা ইতিমধ্যে সোর্স কোডের অংশ নয় / ব্যবহার করে, এমন একটি "ফিক্সপয়েন্ট" পাওয়া সম্ভব যেখানে উত্স কোডের সমস্ত অক্ষর (হার্ডকোডযুক্ত দৈর্ঘ্যের অঙ্কগুলি সহ) অন্তত দু'বার প্রদর্শিত হয়।

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

U='%d are "%s"'
O=IO.read$0
?\126>B="My source has 269#{X=" characters.
"}#{z=(m=O.chars.uniq).map{|c|U%[O.count(c),c]}*$/}
Besides unquoted numbers, my output has 1096"+X
$><<B+m.map{|c|U%[(B+z+$M="
It's good to be a program.").gsub!(/\d++(?!")/,"").count(c),c]}*$/+$M

কোডটি যাচাই করার জন্য প্রয়োজনীয় কপি-পেস্টিং হ্রাস করার জন্যও আমি পরীক্ষার স্ক্রিপ্টটি কিছুটা সংশোধন করেছি। এর সংজ্ঞা CODEএবং OUTPUTসাথে প্রতিস্থাপন করে

import subprocess

CODE = open("packed.rb").read()
OUTPUT = subprocess.check_output(["ruby", "packed.rb"])

print CODE
print len(CODE)

স্ক্রিপ্টটি এখন স্বয়ংক্রিয়ভাবে আমার কোড চালায়, এর আউটপুট পড়ে এবং কোড ফাইল থেকে উত্স কোডটি ধরে।


এখানে সংক্ষিপ্ততম কোড দ্বারা উত্পাদিত আউটপুট:

My source has 269 characters.
3 are "U"
7 are "="
3 are "'"
4 are "%"
6 are "d"
17 are " "
11 are "a"
9 are "r"
9 are "e"
11 are """
11 are "s"
6 are "
"
4 are "O"
2 are "I"
10 are "."
6 are "$"
2 are "0"
2 are "?"
2 are "\"
2 are "1"
2 are "2"
3 are "6"
2 are ">"
4 are "B"
3 are "M"
2 are "y"
9 are "o"
10 are "u"
12 are "c"
4 are "h"
2 are "9"
2 are "#"
4 are "{"
2 are "X"
8 are "t"
4 are "}"
2 are "z"
6 are "("
7 are "m"
5 are "n"
2 are "i"
2 are "q"
6 are ")"
4 are "p"
4 are "|"
2 are "["
4 are ","
2 are "]"
2 are "*"
4 are "/"
3 are "b"
7 are "+"
2 are "<"
3 are "g"
2 are "!"
Besides unquoted numbers, my output has 1096 characters.
2 are "U"
2 are "="
3 are "'"
2 are "%"
5 are "d"
238 are " "
120 are "a"
120 are "r"
120 are "e"
222 are """
11 are "s"
114 are "
"
2 are "O"
3 are "I"
5 are "."
2 are "$"
2 are "0"
2 are "?"
2 are "\"
2 are "1"
2 are "2"
2 are "6"
2 are ">"
3 are "B"
3 are "M"
4 are "y"
9 are "o"
8 are "u"
7 are "c"
6 are "h"
2 are "9"
2 are "#"
2 are "{"
2 are "X"
9 are "t"
2 are "}"
2 are "z"
2 are "("
5 are "m"
4 are "n"
3 are "i"
3 are "q"
2 are ")"
4 are "p"
2 are "|"
2 are "["
3 are ","
2 are "]"
2 are "*"
2 are "/"
4 are "b"
2 are "+"
2 are "<"
4 are "g"
2 are "!"
It's good to be a program.

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

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

নিশ্চিত বিষয়, আমি স্রেফ আপডেট করেছি।
ক্যালভিনের শখ 3

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