গল্ফ একটি মস্তিষ্ক-ফ্ল্যাক পূর্ণসংখ্যার


28

পূর্ণসংখ্যা ব্রেন-ফ্ল্যাঙ্কে প্রতিনিধিত্ব করতে ক্লান্ত । 8 জন অপারেটর রয়েছে:

()      Evaluates to 1, but does not push anything on any stack
[]      Evaluates to an indeterminate value for the purposes of this question
{}      Removes the top of the stack and evaluates to it
<>      Switches to or back from the alternate stack and evaluates to zero
(foo)   Pushes the value of the expression foo to the stack and evaluates to it
[foo]   Evaluates to the negation of foo
{foo}   Evaluates the expression foo until the top of the stack is zero
<foo>   Evaluates to zero but executes foo anyway

fooএকাধিক অপারেটর সমন্বয়ে গঠিত হতে পারে, এক্ষেত্রে তাদের মূল্যায়ন ও সংমিশ্রণ করা হয়। উদাহরণস্বরূপ স্ট্যাকের (()())দিকে ধাক্কা দেয় 2(এবং 2এটিও মূল্যায়ন করে)।

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

যদিও আপনার প্রোগ্রাম বা ফাংশনটি অবশ্যই 1 থেকে 1,000,000 পর্যন্ত সমস্ত ইনপুটগুলির জন্য একটি ওয়ার্কিং ব্রেন-ফ্লাক প্রোগ্রাম ফিরিয়ে আনতে সক্ষম হতে হবে বিজয়ী এমন প্রোগ্রাম বা ফাংশন হবে যা 1000 এবং 1000 এর মধ্যে সমস্ত 1061 মূল সংখ্যার জন্য উপযুক্ত ব্রেন-ফ্লাক প্রোগ্রামগুলির মধ্যে সবচেয়ে ছোট সেট তৈরি করে winner 10,000 । আপনার জমা দেওয়ার অংশ হিসাবে সেই 1061 ইনপুটগুলির জন্য আপনার আউটপুটগুলির মোট আকার নোট করা উচিত। আপনার প্রোগ্রাম বা ফাংশনটি পূর্ণসংখ্যাকে গ্রহণ করতে পারে এবং স্বাভাবিকভাবে গ্রহণযোগ্য I / O ফর্ম্যাটগুলির কোনওটিতে (স্ট্রিং) ব্রেন-ফ্লাক প্রোগ্রামটি ফিরিয়ে দিতে পারে। আপনার প্রোগ্রাম বা ফাংশনের আকার ব্যবহার করে সম্পর্কগুলি ভেঙে ফেলা হবে।


4
শুধু একটি নোট হিসাবে: দৈর্ঘ্য বৈধ প্রোগ্রামের সংখ্যা 2nহয় 4^n catalan(n)
লিকি নুন

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

এছাড়াও, কেন []এই চ্যালেঞ্জের জন্য অপরিবর্তিত? 8 টি অপারেটরের মধ্যে 7 টি বাস্তবায়ন করা আমার কাছে অদ্ভুত বলে মনে হচ্ছে। যেভাবেই হোক, দুর্দান্ত চ্যালেঞ্জ, আমি সম্মানিত কেউ আমার নিজের ভাষা দ্বারা অনুপ্রাণিত একটি চ্যালেঞ্জ লিখবে!
ডিজেএমসিএমহেম

2
@ ডিজেএমসিএমহেম আমি চাই যে লোকেরা তাদের নিজস্ব স্কোর গণনা করতে সক্ষম হবে। সমস্ত প্রাসঙ্গিক মূল সংখ্যাগুলি একটি সংমিশ্রিত সংখ্যার চেয়ে আরও বেশি, তাই সম্ভাব্য অপটিমাইজেশন প্রচুর পরিমাণে হওয়া উচিত। এছাড়াও, আমি চাই না যে লোকেরা []তাদের উত্তরের কোনও নির্দিষ্ট মানের উপর নির্ভর করবে ।
নীল

1
@ ইয়েটিসিজিএন স্ক্রিপ্টের আকার কেবল টাই-ব্রেকার হিসাবে গণ্য।
নিল

উত্তর:


16

পাইথন 2, 59394 59244 58534 58416 58394 58250

ঠিক আছে এখানে আমার সমাধান।

import re
import math

cache = {0:"<()>"}

def find(x,i,j):
    return i*((x**2+x)/2)+(j+1)*((x**2-x)/2)

def solve(x, i, j):
    a = (i + j + 1)/2.
    b = (i - j - 1)/2.
    c = -x
    return (-b + math.sqrt(b**2 - 4*a*c))/(2*a)

def size(i,j=0):
    return 4*(i+j)+14

def polynomials(n):
    upperBound = int(4*math.log(n,2))
    i = 0
    answers = []
    while size(i) < upperBound:
        for j in range(i):
            sol = int(solve(n, i-j, j)+.5)
            if find(sol, i-j, j) == n:
                answers.append((sol, i-j, j))
        i += 1
    return answers

def complement(character):
        dict = {"(":")","{":"}","<":">","[":"]",")":"(","}":"{",">":"<","]":"["}
        return dict[character]

def findMatch(snippet, index):
        increment = 1 if snippet[index] in "({<[" else -1
        stack = []
        if snippet[index] in "(){}<>[]":
                stack.append(snippet[index])
        while len(stack) > 0 and index + increment < len(snippet):
                index += increment
                if snippet[index] in "(){}<>[]":
                        if complement(snippet[index]) == stack[-1]:
                                stack = stack[:-1]
                        else:
                                stack.append(snippet[index])
        return index

def isPrime(n):
    return not [0 for x in range(2,int(n**.5)+1) if n%x==0] and n>1

def getPrimeFactors(n):
    return [x for x in range(2,n/2) if n%x==0 and isPrime(x)]

def divHardcode(n,m):
    assert n%m == 0
    assert m != 1
    assert n != 1
    binary = bin(m)[3:]
    return (binary.count("1")+len(binary))*"("+getBF(n/m)+")"*binary.count("1")+binary.replace("1","){}{}").replace("0","){}")

def isTriangular(n):
    #Triangles must be between sqrt(2n) and cbrt(2n)
    if n < 0: return isTriangular(-n)
    for x in range(int((2*n)**(1/3.)),int((2*n)**.5)+1):
        if (x**2+x) == 2*n:
            return True
    return False

def getTriangle(n):
    if n < 0: return -getTriangle(-n)
    #Triangles must be between sqrt(2n) and cbrt(2n)
    for x in range(int((2*n)**(1/3.)),int((2*n)**.5)+1):
        if (x**2+x) == 2*n:
            return x
    #If we don't find one we made a mistake
    assert False

def getSimpleBF(n):
    if n in cache:return cache[n]
    if n < 0:
        # There is room for better solutions here
        return "["+getSimpleBF(-n)+"]"
    elif n == 0:
        return ""
    elif n < 6:
        return "()"*n
    #Non-edge cases
    solutions = []
    factors = getPrimeFactors(n)
    if n >= 78 and isTriangular(n):
        solutions.append(
           min([push(getTriangle(n))+"{({}[()])}{}","<"+push(getTriangle(n)+1)+">{({}[()])}{}"],key=len)
        )
    polynomialSolutions = polynomials(n)
    for polynomial in polynomialSolutions:
        solutions.append("<%s>{%s({}[()])%s}{}"%(push(polynomial[0]),"({})"*polynomial[1],"({})"*polynomial[2]))
        #Mod 3 tricks
    if n % 3 == 2:
       solutions.append(("((%s)()){}{}")%getBF(n/3))
    elif n % 3 == 1:
       solutions.append(("((%s)()()){}{}")%getBF(n/3-1))
    #Basic solutions
    if isPrime(n):
        solutions.append(getSimpleBF(n-1) + "()")
    else:
        #TODO multithread
        solutions += map(lambda m:divHardcode(n,m),factors)
    return min(solutions,key=lambda x:len(unpack(x)))

def getBF(n):
    if n in cache: return cache[n]
    result = getSimpleBF(n)
    index = n - 1
    while index > n-(len(result)/2):
        score = getSimpleBF(index)+getSimpleBF(n-index)
        if len(score) < len(result):result = score
        index -= 1
    index = n + 1
    while index < n+(len(result)/2):
        score = getSimpleBF(index)+getSimpleBF(n-index)
        if len(score) < len(result):result = score
        index += 1
    cache[n] = result
    return result

def unpack(string):
    reMatch = re.match("\(*<",string)
    if reMatch:
        location =reMatch.span()
        return string[location[1]:findMatch(string,location[1]-1)] +string[:location[1]-1] + string[findMatch(string,location[1]-1)+1:]
    return string

def push(n):
    return unpack("("+getBF(n)+")")

def kolmo(string):
    code = push(ord(string[-1]))
    stringVector = map(ord,string)
    for x,y in zip(stringVector[-1:0:-1],stringVector[-2::-1]):
        code = "("+code+getBF(y-x)+")"
    code = code.replace("<()>)",")")
    return code

def kolmo(stringVector):
    code = push(stringVector[-1])
    for x,y in zip(stringVector[-1:0:-1],stringVector[-2::-1]):
        code = "("+code+getBF(y-x)+")"
    code = code.replace("<()>)",")")
    return code


if __name__ == "__main__":
    import primes
    sum = 0
    for prime in primes.nums:
        print push(prime)
        sum += len(push(prime))
    print sum

প্রাসঙ্গিক কাজ হয় push(n)। এটিকে কল করার জন্য আপনি যে পূর্ণসংখ্যার প্রতিনিধিত্ব করতে চান তাতে চাপ দিন।

ব্যাখ্যা

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

এই সাধারণ ধারণাটি বৃহত সংখ্যার জন্য আরও জটিল করা যায়। উদাহরণস্বরূপ 5 ধরুন এটি কিছুক্ষণ আগে আবিষ্কার হয়েছিল যে পাঁচটি দিয়ে গুণ করার সর্বোত্তম উপায় ছিল (((n)){}){}{}। এই কোডটি এন এর দুটি অনুলিপি 4 দ্বারা এককে গুণ করে এবং দুটি যুক্ত করে। একই কৌশলটি ব্যবহার করে আমি প্রতিটি সংখ্যার বাইনারি উপস্থাপনার ভিত্তিতে প্রতিটি গুণ করি। আমি এখনই এটি কীভাবে কাজ করে তার বিশদে যাব না তবে বাইনারি উপস্থাপনার প্রথমটি কেটে ফেলে 0 দিয়ে ){}এবং 1 এর সাথে প্রতিস্থাপন করে আমি এটি করি){}{}। এরপরে এটি নিশ্চিত করে যে এন যথাযথ সংখ্যার দিকে ঠেলাঠেলি করে এবং সমস্ত বন্ধনীর ভারসাম্য বজায় রাখে। (আপনি কীভাবে এটি করা হয় তা জানতে চাইলে আপনি আমার কোডটি দেখতে পারেন)। আপনি যদি জানতে চান যে এটি কেন কাজ করে কেবল একটি মন্তব্যে আমাকে জিজ্ঞাসা করুন। আমি মনে করি না কেউ আমার পোস্টে সমস্ত আপডেটগুলি পড়ে তাই আমি ব্যাখ্যাটি বাদ দিয়েছি।

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

অন্যান্য বাইট সাশ্রয় প্রক্রিয়াটি একটি বহুপদী সমাধান সন্ধানকারী। পলিনোমিয়ালের কয়েকটি ফর্ম রয়েছে যা হ্রাসকারী লুপগুলির সাথে প্রতিনিধিত্ব করা সহজ। এই বহুবচনগুলির মধ্যে বহুভুজ সংখ্যা অন্তর্ভুক্ত রয়েছে তবে সীমাবদ্ধ নয়। এই অপ্টিমাইজেশানটি বহুবচনগুলি সন্ধান করে যা ফর্মের সাথে খাপ খায় এবং তাদের তৈরি করে এমন কোড তৈরি করে।

আউটপুট

পেস্ট-বিন


"এন + 1 এর চেয়ে বড় বা ছোট" ??
স্পার

@ স্পার এর ব্যাখ্যার nচেয়ে বড় বা ছোটn+1
গম উইজার্ড

আপনার if n % 3 == 2: এক স্তরের দ্বারা ফাংশনটির শেষ থেকে শেষ পর্যন্ত লাইনগুলি আনইন্ডেন্ট করা উচিত ।
ব্যবহারকারী 202729

13

ব্রেন-ফ্লাক, 64664 64

অনলাইনে চেষ্টা করে দেখুন!

এখানে আমার টীকাযুক্ত কোড

({}<
 ((((()()()()()){}){}){}()) #41
>)
{
 (({})[()()()()()()])
 ([({}<(())>)](<>)){({}())<>}{}<>{}{}<>(({})){(<{}({}<>)>)}{}({}<>)
 {((< #IF
  {} 
  {({}[()]< #FOR
   ((((()()()()()){}){}){}()) #41
   (({})[()])                 #40
  >)}{}
 >))}{}
 (({}))
 #MOD2
 {(<
  ({}<(())>)({<({}[()]<>)><>(()[{}])<><({}<>)>}{}<({}<>)><>)<>({}<>)
  {((<{}({}< #IF
   {}
   (((()()()()())({})({})({}){})({})({})({}){})  #125
   (({})[()()])                                  #123
   ((((()()()()()){}){}){}())                    #41
   <>
   ((((()()()()()){}){}){})                      #40
   <>
   >)

  >))}{}{}
 >)}{}
 #MOD2 (number 2)
 (({}))
 ({}(())){({}[()]<>)<>(()[{}])<>({}<>)}{}
 (({})<([{}]{})>)
 {
  ({}[()]<<>
    ((((()()()()()){}){}){}) #40
    (({})())                 #41
   <>>)
 }{}
}{}
<>{({}<>)<>}<>((((()()()()()){}){}){})

ব্যাখ্যা

এটি এখন পর্যন্ত কেবল দুটি নিয়ম প্রয়োগ করে:

  • N যদি দুটি রিটার্ন দ্বারা বিভাজ্য হয় (n/2){}

  • যদি দুটি রিটার্ন দ্বারা এন বিভাজ্য হয় না n-1()

এটি 6 এর চেয়ে ছোট সমস্ত সংখ্যাকে হার্ডকোড করে।


তিনটি দ্বারা বিভাজ্যতার জন্য চেক করার মতো মনে হচ্ছে স্কোরটি কিছুটা কমিয়ে দেওয়া উচিত
ASCII- কেবল

@ হওয়া ASCII শুধুমাত্র আমি আসলে এটি প্রয়োগ এবং এটি বর্ধিত বাইট গণনা। আমি তিনটি দ্বারা বিভাজ্যতার একটি স্মার্ট সংস্করণ বাস্তবায়নের পথে কাজ করছি।
গম উইজার্ড

ঠিক আছে, ব্রেন-ফ্র্যাক নম্বর তৈরি করে এমন একটি প্রোগ্রাম তৈরি করতে ব্রেইন-ফ্ল্যাক ব্যবহার করে। খুশী হলাম।
ড্রাকো 18

10

পার্ল, 59222 59156 58460 অক্ষর

  • n() (১১৩২২660০ অক্ষর)
  • (n){}() (64664 অক্ষর)
  • ((n)){}{} (63610 টি অক্ষর)
  • ((n)()){}{} (4৩৪৮৪ অক্ষর) - এটি একটি অভিনব গণনা
  • (n){({}[()])}{} (60748 টি অক্ষর)
  • n[m] (62800 অক্ষর)
  • (n){m({}[l])}{} (58460 অক্ষর) - এটি একটি অভিনব গণনা

সর্বশেষ গণনার সূত্রটি হ'ল n(n/l+1)/2+mn/l। আমি অন্য কয়েকটি গণনার চেষ্টা করেছি তবে প্রদত্ত আউটপুটটির জন্য সেগুলি আর সহায়ক হবে না। প্রোগ্রামটি প্রকৃতপক্ষে 9999 পর্যন্ত সমস্ত মান উত্পন্ন করে তবে প্রদত্ত মৌলিক সংখ্যা এবং তাদের মোট দৈর্ঘ্য তালিকাভুক্ত করে।

@primes = (<list of the 4-digit prime numbers here>);
@numbers = ();
for ($i = 1; $i < 10000; $i++) {
  $numbers[$i] = "()" x $i; # default calculation
}
for ($i = 2; $i < 10000; $i++) {
  for ($j = 1; $j < 8; $j++) {
    &try($i, "$numbers[$i+$j]\[$numbers[$j]]");
  }
  &try($i + 1, "$numbers[$i]()");
  &try($i * 2, "($numbers[$i]){}");
  &try($i * 3, "(($numbers[$i])){}{}");
  &try($i * 3 + 2, "(($numbers[$i])()){}{}");
  for ($l = 1; $l * $l < $i; $l++) { 
    unless ($i % $l) { 
      for ($j = 0; ($k = (($i + $j + $j) * $i / $l + $i) / 2) < 10000; $j++) { 
        &try($k, "($numbers[$i]){$numbers[$j]({}[$numbers[$l]])}{}");
      } 
    } 
  } 
}
$len = 0;
foreach (@primes) {
  print "($numbers[$_])\n";
  $len += 2 + length $numbers[$_];
}
print "$len\n";
sub try {
  ($n, $s) = @_;
  $numbers[$n] = $s if (length($numbers[$n]) > length $s);
}

আপনি আউটপুট একটি লিঙ্ক প্রদান করতে পারেন?
DJMcMayhem

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

@ লিনাস ((এক্স) ())}} {} এক্সকে ধাক্কা দেয়, তারপরে 1 যোগ করে, ফলাফলটি ধাক্কা দেয়, তারপরে এক্স + 1 এবং এক্স পপ করেন মোট 3 এক্স + 2। আমি মনে করি চেষ্টা করে অনলাইনে অন্য সূত্রটি চেষ্টা করেছিলাম তবে আপনার পছন্দ হলে আমি ডাবল-চেক করতে পারি।
নিল

@ নীল আমার ভুল ... এগুলি দেখতে ভাল লাগছে তবে আপনার প্রাইমগুলিকে ঠিক কী দূষিত করে?
লিনাস

1
@ নীল আমি যুক্ত করার সাথে সাথে আমি 58158 পাই &try($i * $i, "$numbers[$i]{({})({}[()])}{}");, যা আমি যোগ করলে &try((3 * $i * $i - $i) / 2, "$numbers[$i]{({})({}[()])({})}{}");(5 বর্গ / পঞ্চভুজ সংখ্যা) নেমে যায় - এটি এখান
ASCII- কেবল

5

পাইথন, 59136 58676 টি অক্ষর

ব্রেনফ্ল্যাক নম্বর গল্ফিং ফাংশন:

m=11111
R=range(0,m)
R[1]="()"
R[2]="()()"
l=2
def a(v,r):
 if v>0 and v<m:
  if isinstance(R[v],int) or len(r)<len(R[v]):
   R[v]=r
   if v<R[0]:
    R[0]=v
def s(v,k):
 S=0
 while v>0:
  S+=v
  v-=k
 return S
p=lambda r:"("+r+")"
w=lambda r:"{({}["+r+"])}{}"
def q(r,v):
 for i in range(1,v):
  r="("+r+")"
 for i in range(1,v):
  r+="{}"
 return r
def e(r,v,k):
 for i in range(0,k):
  r=q(r,v)
 return r
while l<m:
 R[0]=l+1
 a(l*2,q(R[l],2)) 
 a(l*3,q(R[l],3))
 a(l*5,q(R[l],5))
 a(l*7,q(R[l],7))
 for i in range(1,l):
  a(l+i,R[l]+R[i])
  a(l-i,R[l]+"["+R[i]+"]")
  if l%i==0:
   t=s(l-i,i)
   a(s(l,i),p(R[l])+w(R[i]))
   a(l+2*t,p(R[l])+q(w(R[i]),2))
   a(l+4*t,p(R[l])+e(w(R[i]),2,2))
   a(l+8*t,p(R[l])+e(w(R[i]),2,3))
   a(l+16*t,p(R[l])+e(w(R[i]),2,4))
   a(l+32*t,p(R[l])+e(w(R[i]),2,5))
   a(l+64*t,p(R[l])+e(w(R[i]),2,6))
   a(l+128*t,p(R[l])+e(w(R[i]),2,7))
   a(l+3*t,p(R[l])+q(w(R[i]),3))
   a(l+9*t,p(R[l])+e(w(R[i]),3,2))
   a(l+27*t,p(R[l])+e(w(R[i]),3,3))
   a(l+5*t,p(R[l])+q(w(R[i]),5))
   a(l+6*t,p(R[l])+q(q(w(R[i]),3),2))
   a(l+10*t,p(R[l])+q(q(w(R[i]),5),2))
   a(l+15*t,p(R[l])+q(q(w(R[i]),5),3))
   a(l+12*t,p(R[l])+q(q(q(w(R[i]),3),2),2))
   a(l+18*t,p(R[l])+q(q(q(w(R[i]),3),3),2))
   a(l+20*t,p(R[l])+q(q(q(w(R[i]),5),2),2))
   a(l+24*t,p(R[l])+q(q(q(q(w(R[i]),3),2),2),2))
   a(l+36*t,p(R[l])+q(q(q(q(w(R[i]),3),3),2),2))
   a(l+40*t,p(R[l])+q(q(q(q(w(R[i]),5),2),2),2))
 l=R[0]
f=lambda v:p(R[v])

প্রধান সংখ্যা পুনরাবৃত্তি:

def isPrime(v):
 i=2
 while i*i<=v:
  if v%i==0:
   return False
  i+=1
 return True

for i in range(1000,10000):
 if isPrime(i):
  print f(i)

আউটপুট:

Pastebin

ব্যাখ্যা:

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

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

যারা যত্নশীল তাদের জন্য, আমি এখানে কোন সূত্রগুলি মূল্যবান তা দেখতে ব্যবহৃত স্ক্র্যাচ কোডটি

প্রতিনিধিত্ব সূত্র:

  1. ছোট প্রাইমস দ্বারা গুণ:
    (X){}
    ((X)){}{}
    ((((X)))){}{}{}{}
    ((((((X)))))){}{}{}{}{}{}
  2. সংযোজন এক্স + + ওয়াই :
    XY
  3. বিয়োগফল এক্স - ওয়াই :
    X[Y]
  4. এক্স ইনক্রিমেন্ট Y এর সমষ্টি এবং সহ :
    (X){({}[Y])}{}
  5. থেকে summations এর গুণিতক এক্স বৃদ্ধি এর ওয়াই , প্লাস এক্স :
    (X)({({}[Y])}{}){}
    (X)(({({}[Y])}{})){}{}
    (X)(({({}[Y])}{}){}){}
    ইত্যাদি ...

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

ইনক্রিমেন্ট প্লাস গুণমানের সংমিশ্রণগুলি আমাকে আরও 46 বাইট সাশ্রয় করে এবং তারপরেও আমি সেগুলি ধরার জন্য আমাকে তিনবার ধুয়ে ফেলতে হবে এবং পুনরাবৃত্তি করতে হবে।
নিল

দেখা যাচ্ছে যে আমি যদি বিয়োগ ব্যবহার করি তবে আমি আবার 5 * ব্যবহার করব না।
নীল

4

লুয়া 5.3, 57522

প্রশ্ন পোস্ট হওয়ার পরে আমি আসলে এই পিছনে কাজ শুরু করেছিলাম, তবে মস্তিষ্ক-ফ্ল্যাক বার্ষিকী পর্যন্ত এটি সম্পর্কে ভুলে গেছি।

-- 64 gives all results through 10000 (should run in about 1 second)
-- 78 gives all results through 100000 (should run in about 20 seconds)
-- 90 gives all results through 1000000 (should run in about 200 seconds)
-- Note: Timings may not be accurate, as the are not updated every time new cases are added.

local k_max_len = 64
local k_limit = 10000

local pre = os.clock()

local function compute_multiplier_helper(prefix, suffix, m)
  if m == 2 then
    prefix[#prefix + 1] = "("
    suffix[#suffix + 1] = "){}"
  elseif m % 2 == 0 then
    prefix[#prefix + 1] = "("
    compute_multiplier_helper(prefix, suffix, m // 2)
    suffix[#suffix + 1] = "){}"
  else
    suffix[#suffix + 1] = ")"
    compute_multiplier_helper(prefix, suffix, m - 1)
    prefix[#prefix + 1] = "("
    suffix[#suffix + 1] = "{}"
  end
end

local function compute_multiplier(m)
  local prefix = {}
  local suffix = {}
  compute_multiplier_helper(prefix, suffix, m)
  return table.concat(prefix), table.concat(suffix)
end

local multipliers = {}
for m = 2, k_limit do
  -- Including all factors, not just primes.
  -- This did improve a few numbers, although none in the ppcg test set.
  local prefix, suffix = compute_multiplier(m)
  local mult = {prefix = prefix, suffix = suffix, m = m, cost = #prefix + #suffix}
  table.insert(multipliers, mult)
end
table.sort(multipliers, function(a, b) return a.cost < b.cost end)

local poly_multipliers = {}
poly_multipliers[1] = {m = 1, s = "({})", l = 4}
for m = 2, k_limit do
  local prefix, suffix = compute_multiplier(m)
  local s = prefix .. "({})" .. suffix
  assert(#s <= 4 * m)
  poly_multipliers[m] = {m = m, s = s, l = #s}
end
poly_multipliers[k_limit + 1] = {m = 0, s = "", l = 0}

table.sort(poly_multipliers, function(a, b) return a.l < b.l end)

local pcache = {}
local plen_cache = {}

local function register_push(prefix, suffix, value, pvalue)
  if value > 1500000 or value < -1500000 then return end
  local old_res = pcache[value]
  if old_res == nil then
    local res = {prefix = prefix, suffix = suffix, value = value, pvalue = pvalue}
    pcache[value] = res
    local length = #prefix + #suffix
    local lcache = plen_cache[length]
    if lcache == nil then
      lcache = {}
      plen_cache[length] = lcache
    end
    lcache[#lcache + 1] = res
  end
end

local function get_pushes(length)
  return ipairs(plen_cache[length] or {})
end

register_push("", "()", 1, 0)
register_push("", "<()>", 0, 0)

local function triangle(n)
  return (n * (n + 1)) // 2
end

local function process(length)
  -- basic
  for _, res in get_pushes(length - 2) do
    register_push(res.prefix, res.suffix .. "()", res.value + 1, res.pvalue)
    register_push(res.prefix, "[" .. res.suffix .. "]", -res.value, res.pvalue)
  end

  -- multiplication by constant (precomputed)
  for _, mult in ipairs(multipliers) do
    local cost = mult.cost
    if length - cost >= 4 then
      local m, prefix, suffix = mult.m, mult.prefix, mult.suffix
      for _, pus in get_pushes(length - cost) do
        local name = prefix .. pus.suffix .. suffix
        register_push(pus.prefix, name, pus.value * m, pus.pvalue)
      end
    else
      break
    end
  end

  -- residue 2 mod3 trick (Neil)
  -- ((n)()){}{}
  --  (n)        -- push n
  -- (   ())     -- push n + 1
  --        {}{} -- (n + 1) + (n + 1) + n
  if length - 10 >= 2 then
    for _, res in get_pushes(length - 10) do
      local name = "((" .. res.suffix .. ")()){}{}"
      register_push(res.prefix, name, 3 * res.value + 2, res.pvalue)
    end
  end

  -- residue 1 mod3 trick (Wheat Wizard)
  -- ((n)()()){}{}
  --  (n)          -- push n
  -- (   ()())     -- push n + 2
  --          {}{} -- (n + 2) + (n + 2) + n
  -- not useful, but fast...
  if length - 12 >= 2 then
    for _, res in get_pushes(length - 12) do
      local name = "((" .. res.suffix .. ")()()){}{}"
      register_push(res.prefix, name, 3 * res.value + 4, res.pvalue)
    end
  end

  -- residue 2 mod5 trick (tehtmi)
  -- (((n)){}()){}{}
  --   (n)           -- push n
  --  (   )          -- push n
  -- (     {}())     -- push 2n + 1
  --            {}{} -- (2n + 1) + (2n + 1) + n
  -- [[
  if length - 14 >= 2 then
    for _, res in get_pushes(length - 14) do
      local name = "(((" .. res.suffix .. ")){}()){}{}"
      register_push(res.prefix, name, 5 * res.value + 2, res.pvalue)
    end
  end
  -- ]]

  -- residue 4 mod5 trick (tehtmi)
  -- (((n)()){}){}{}
  --   (n)           -- push n
  --  (   ())        -- push n + 1
  -- (       {})     -- push 2n + 2
  --            {}{} -- (2n + 2) + (2n + 2) + n
  -- [[
  if length - 14 >= 2 then
    for _, res in get_pushes(length - 14) do
      local name = "(((" .. res.suffix .. ")()){}){}{}"
      register_push(res.prefix, name, 5 * res.value + 4, res.pvalue)
    end
  end
  -- ]]

  -- residue 6 mod7 trick (tehtmi)
  -- ((((n)())){}{}){}{}
  --    (n)              -- push n
  --   (   ())           -- push n + 1
  --  (       )          -- push n + 1
  -- (         {}{})     -- push 3n + 3
  --                {}{} -- (3n + 3) + (3n + 3) + n
  -- [[
  if length - 18 >= 2 then
    for _, res in get_pushes(length - 18) do
      local name = "((((" .. res.suffix .. ")())){}{}){}{}"
      register_push(res.prefix, name, 7 * res.value + 6, res.pvalue)
    end
  end
  --]]

  -- residue 4 mod7 trick (tehtmi)
  -- ((((n))()){}{}){}{}
  --    (n)              -- push n
  --   (   )             -- push n
  --  (     ())          -- push n + 1
  -- (         {}{})     -- push 3n + 2
  --                {}{} -- (3n + 2) + (3n + 2) + n
  -- [[
  if length - 18 >= 2 then
    for _, res in get_pushes(length - 18) do
      local name = "((((" .. res.suffix .. "))()){}{}){}{}"
      register_push(res.prefix, name, 7 * res.value + 4, res.pvalue)
    end
  end
  --]]

  -- residue 2 mod7 trick (tehtmi)
  -- ((((n))){}{}()){}{}
  --    (n)              -- push n
  --   (   )             -- push n
  --  (     )            -- push n
  -- (       {}{}())     -- push 3n + 1
  --                {}{} -- (3n + 1) + (3n + 1) + n
  -- [[
  if length - 18 >= 2 then
    for _, res in get_pushes(length - 18) do
      local name = "((((" .. res.suffix .. "))){}{}()){}{}"
      register_push(res.prefix, name, 7 * res.value + 2, res.pvalue)
    end
  end
  --]]

  -- triangle numbers (?)
  --(n){({}[()])}{}
  --(n)              -- push n
  --   {        }    -- sum and repeat
  --    (      )     -- push
  --     {}[()]      -- top - 1
  --             {}  -- pop 0
  if length - 14 >= 2 then
    for _, res in get_pushes(length - 14) do
      if res.value > 0 then
        local code = "{({}[()])}{}"
        register_push(res.prefix .. "(" .. res.suffix .. ")", code, triangle(res.value - 1), res.pvalue + res.value)
        register_push(res.prefix, "(" .. res.suffix .. ")" .. code, triangle(res.value), res.pvalue)
        register_push("", res.prefix .. "(" .. res.suffix .. ")" .. code, triangle(res.value) + res.pvalue, 0)
      end
    end
  end

  -- negative triangle numbers (tehtmi)
  --(n){({}())}{}
  --(n)            -- push n
  --   {      }    -- sum and repeat
  --    (    )     -- push
  --     {}()      -- top + 1
  --           {}  -- pop 0
  if length - 12 >= 2 then
    for _, res in get_pushes(length - 12) do
      if res.value < 0 then
        local code = "{({}())}{}"
        register_push(res.prefix .. "(" .. res.suffix .. ")", code, -triangle(-res.value - 1), res.pvalue + res.value)
        register_push(res.prefix, "(" .. res.suffix .. ")" .. code, -triangle(-res.value), res.pvalue)
        register_push("", res.prefix .. "(" .. res.suffix .. ")" .. code, -triangle(-res.value) + res.pvalue, 0)
      end
    end
  end

  -- cubic (tehtmi)
  -- (n){(({}[()])){({}[()])}{}}{}
  -- (n^3-3*n^2+8*n-6)/6
  -- (-6 + n*(8 + n*(-3 + n)))/6
  --[[ superceded by negative cubic because 
       it is the same cost of -ncubic(-n)
  if length - 28 >= 2 then
    for _, res in get_pushes(length - 28) do
      if res.value > 0 then
        local code = "{(({}[()])){({}[()])}{}}{}"
        local v = res.value + 1
        v = (-6 + v*(8 + v*(-3 + v)))//6
        register_push(res.prefix .. "(" .. res.suffix .. ")", code, v - res.value, res.pvalue + res.value)
        register_push(res.prefix, "(" .. res.suffix .. ")" .. code, v, res.pvalue)
        register_push("", res.prefix .. "(" .. res.suffix .. ")" .. code, v + res.pvalue, 0)
      end
    end
  end
  --]]

  -- negative cubic (tehtmi)
  -- (n){(({}())){({}())}{}}{}
  -- (n^3-3*n^2+8*n-6)/6
  -- (-6 + n*(8 + n*(-3 + n)))/6
  -- [[
  if length - 24 >= 2 then
    for _, res in get_pushes(length - 24) do
      if res.value < 0 then
        local code = "{(({}())){({}())}{}}{}"
        local v = -res.value + 1
        v = (-6 + v*(8 + v*(-3 + v)))//6
        v = -v
        register_push(res.prefix .. "(" .. res.suffix .. ")", code, v - res.value, res.pvalue + res.value)
        register_push(res.prefix, "(" .. res.suffix .. ")" .. code, v, res.pvalue)
        register_push("", res.prefix .. "(" .. res.suffix .. ")" .. code, v + res.pvalue, 0)
      end
    end
  end
  --]]

  -- polynomial (Wheat Wizard, modified by tehtmi)
  -- <(n)>{A({}[()])B}{} where A, B are ({})({})({})... repeated a, b times
  -- <(n)>                -- push n (without adding)
  --      {          }    -- repeat until top is zero
  --       A              -- top * a
  --        ({}[()])      -- top = top - 1; += top - 1
  --                B     -- (top - 1) * b
  --                  {}  -- pop 0
  -- triangular numbers are with a = b = 0
  -- from B and base:
  -- (n - 1) * (B + 1) * (n - 2) * (B + 1) * ...
  -- (B + 1) * (1 + ... + n - 1)
  -- (B + 1) * n * (n - 1) / 2
  -- from A:
  -- n * A + (n - 1) * A + ...
  -- A * (1 + ... n)
  -- A * (n + 1) * n / 2
  -- total: (B + 1) * n * (n - 1) / 2 + A * (n + 1) * n / 2
  --        [(A + B + 1) * n^2 + (A - B - 1) * n] / 2
  -- S := 4 * (A + B)
  -- [[
  if length - 18 >= 2 then
    for S = 4, length - 14, 4 do
      for _, res in get_pushes(length - 14 - S) do
        if res.value > 0 then
          for _, A in ipairs(poly_multipliers) do
            if A.l > S then
              break
            end
            for _, B in ipairs(poly_multipliers) do
              if A.l + B.l < S then
                -- continue
              elseif A.l + B.l > S then
                break
              else
                local a = A.m
                local b = B.m

                local logic = "{" .. A.s .. "({}[()])" .. B.s .. "}{}"
                local v = res.value
                v = ((a + b + 1) * v * v + (a - b - 1) * v) // 2
                register_push(res.prefix .. "(" .. res.suffix .. ")", logic, v, res.pvalue + res.value)
                register_push(res.prefix, "(" .. res.suffix .. ")" .. logic, v + res.value, res.pvalue)
                register_push("", res.prefix .. "(" .. res.suffix .. ")" .. logic, v + res.value + res.pvalue, 0)
              end
            end
          end
        end
      end
    end
  end
  --]]

  -- negative polynomial (tehtmi)
  -- <(n)>{A({}())B}{}
  -- [[
  if length - 16 >= 2 then
    for S = 4, length - 12, 4 do
      for _, res in get_pushes(length - 12 - S) do
        if res.value < 0 then
          for _, A in ipairs(poly_multipliers) do
            if A.l > S then
              break
            end
            for _, B in ipairs(poly_multipliers) do
              if A.l + B.l < S then
                -- continue
              elseif A.l + B.l > S then
                break
              else
                local a = A.m
                local b = B.m

                local logic = "{" .. A.s .. "({}())" .. B.s .. "}{}"
                local v = -res.value
                v = ((a + b + 1) * v * v + (a - b - 1) * v) // -2

                register_push(res.prefix .. "(" .. res.suffix .. ")", logic, v, res.pvalue + res.value)
                register_push(res.prefix, "(" .. res.suffix .. ")" .. logic, v + res.value, res.pvalue)
                register_push("", res.prefix .. "(" .. res.suffix .. ")" .. logic, v + res.value + res.pvalue, 0)
              end
            end
          end
        end
      end
    end
  end
  --]]

  -- addition
  -- [[
  if length >= 4 then
    for part1 = 4, length // 2, 2 do
      for _, res1 in get_pushes(part1) do
        for _, res2 in get_pushes(length - part1) do
          register_push(res2.prefix .. res1.prefix, res1.suffix .. res2.suffix, res1.value + res2.value, res1.pvalue + res2.pvalue)
        end
      end
    end
  end
  --]]

  -- pseudo-exponentiation (tehtmi)
  -- (n)<>(m){({}[()])<>(({}){})<>}{}<>{}
  -- (n)<>(m)                             -- push n and m on opposite stacks
  --         {                    }       -- sum and repeat
  --          ({}[()])                    -- top(m) - 1
  --                  <>(({}){})<>        -- n = 2*n; += n
  --                               {}     -- pop 0
  --                                 <>   -- swap to result
  --                                   {} -- pop and add n
  -- [[
  if length - 34 >= 4 then
    local subl = length - 34
    for part1 = 2, subl - 2, 2 do
      for _, res2 in get_pushes(part1) do
        local b = res2.value
        if b > 0 and b < 55 then -- overflow could be a problem, so bound...
          for _, res1 in get_pushes(subl - part1) do
            -- 2n + 4n + 8n + ... + (2^m)*n + 2^m * n
            -- n( 2 + 4 + 8 + .. 2^m + 2^m)
            -- n( 3 * 2^m - 2 )
            local a = res1.value
            local body = "(" .. res1.suffix .. ")<>" .. res2.prefix .. "(" .. res2.suffix .. "){({}[()])<>(({}){})<>}{}<>{}"
            local v = a * (3 * (1 << b) - 2) + b * (b - 1) // 2 + a + b + res2.pvalue
            register_push(res1.prefix, body, v, res1.pvalue)
            register_push("", res1.prefix .. body, v + res1.pvalue, 0)
          end
        end
      end
    end
  end
  --]]
end

--print(os.clock(), "seconds (startup)")

local start = os.clock()
for i = 2, k_max_len - 2, 2 do
  --print(i)
  process(i)
end

plen_cache = nil

local final = {}
for i = 1, k_limit do
  if pcache[i] ~= nil then
    final[i] = pcache[i].prefix .. "(" .. pcache[i].suffix .. ")"
  end
end

pcache = nil

-- hard coded to 10000 for ppcg test
local sieve = {}
for i = 1, 10000 do sieve[i] = true end
for i = 2, 10000 do
  for j = i * i, 10000, i do
    sieve[j] = false
  end
end

--print(os.clock() - start, "seconds (calculation)")

--local bf = require("execute2")

local count = 0
local sum = 0
local sum2 = 0
local maxlen = 0
local pcount = 0
for i = 1, k_limit do
  local res = final[i]
  final[i] = nil
  --print(i, #res, res)
  --local ev = res and bf.eval1(bf.compile(res)) or -1; assert( res == nil or ev == i, string.format("Failed %d %s %d", i, res or "", ev))
  if sieve[i] and i > 1000 then
    sum = #res + sum
    pcount = pcount + 1
  end
  if res then
    sum2 = #res + sum2
    maxlen = math.max(maxlen, #res)
    count = count + 1
  end
end
print("sum", sum)
--print("coverage", count / k_limit, "missing", k_limit - count)
--print("sum2", sum2)
--print("maxlen", maxlen)
assert(pcount == 1061)

সরল সংখ্যার ভাল উপস্থাপনা থেকে বৃহত্তর সংখ্যা তৈরি করতে জ্ঞাত-দরকারী ফাংশনগুলি ব্যবহৃত হয় এমন উত্তরগুলিতে একই ধারণা।

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

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

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

এই বিভাজনটি মূলত unpackহুইট উইজার্ডের উত্তরের ফাংশন হিসাবে একই সমস্যার সমাধান করে । <...>কেবল পরে এটিকে পূর্বাবস্থায় ফেলার জন্য কোড মোড়কের পরিবর্তে, এই জাতীয় কোডটি কেবল উপসর্গটিতে যুক্ত করা হয়।

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

আমি ধারণা করি কেবল আরও কেস যুক্ত করে বাইট গণনাটি হিট করা সহজ হবে তবে আমি এই মুহুর্তটির জন্য যথেষ্ট পরিমাণে পেয়েছি।

আমি 1000000 এ চলেছি, তবে কেবল 100000 পর্যন্ত স্যানিটি পরীক্ষা করেছি।

প্রদত্ত প্রাইমগুলিতে আউটপুটের পেস্টবিন।


কি করবে k_limitআর k_max_lenকি করবে? আমি নিশ্চিত না যে আমি হেডারটি বুঝতে পেরেছি।
গম উইজার্ড

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

4

রুবি, 60246 বাইট

$brain_flak = Hash.new{|h, k|
    a = []
    a.push "()"*k
    if k > 1
        if k > 10
            # Triangle Numbers:
            n = (Math.sqrt(1+8*k).to_i-1)/2
            if (n*n+n)/2 == k
                a.push "("+h[n]+"){({}[()])}{}" 
                a.push  h[n+n]+")({({}[()])}{}"
            end
        end
        (k**0.51).to_i.downto(2){|i|
            # multiplication:
            if k%i==0
                a.push "("*(i-1) + h[k/i] + ")"*(i-1)+"{}"*(i-1)

            end
        }
        (k/2).downto(1){|i|
            # Addition
            a.push h[k-i] + h[i]
        }
    end

    h[k] = a.min_by{|x|x.length}
}
$brain_flak[0] = "<><>"

def get_code_for (i)
  "(#{$brain_flak[i]})"
end

আমি একটি হ্যাশ ব্যবহার করি আমি একটি প্রদত্ত সংখ্যার জন্য সেরা গল্ফটি খুঁজে পাই এবং আরও বড়গুলি খুঁজে পেতে ছোটগুলি ব্যবহার করি uses

রিকার্সিভ হ্যাশগুলি এত মজাদার!


2

পাইথন, 64014 অক্ষর

আমি এই চ্যালেঞ্জের আগে ব্রেইনফ্লাক সম্পর্কে কিছুই জানতাম না এবং কেবল চেষ্টা করেই এটি দিয়ে চেষ্টা করছিলাম, যাতে স্পষ্ট শর্টকাটগুলি আমি মিস করেছি। এটি একটি বেশ বিরক্তিকর সমাধান, কেবলমাত্র ইনপুটটি বিভক্ত করুন x=x/2+x%2বা x=x/3+x%3যাহা ছোট হয়।

k=lambda x:"(("+o(x/3)+")){}{}"+(x%3)*"()"if x>3else"()"*x
m=lambda x:"("+o(x/2)+"){}"+(x%2)*"()"if x>6else"()"*x
o=lambda x:min(k(x),m(x),key=len)
b=lambda x:"("+o(x)+")"

এটি যেমন কল: b(42)

পেস্টবিনে আউটপুট


1

লুয়া, 64664 বাইট

প্রোগ্রামটি প্রোগ্রামগুলির মোট দৈর্ঘ্য এবং 203 তম প্রাইমটির জন্য প্রোগ্রামটি মুদ্রণ করে (কোনটি মুদ্রিত হয় তা পরিবর্তন করতে আপনি পরিবর্তন করতে পারেন বা সমস্ত প্রোগ্রাম মুদ্রণের জন্য কোনও লাইনকে আপত্তিহীন করে)

এখনই একমাত্র অপটিমাইজেশন হ'ল x = 2 * n + 1

আশা করি স্কোর কমিয়ে আনতে আমার আরও কিছু অপ্টিমাইজেশন যুক্ত করার সময় হবে।

local primeS = [[<INSERT PRIMES HERE>]]

local primes = {}

for num in primeS:gmatch("%d+") do
    table.insert(primes, num+0)
end

local progs = {}
progs[0] = ""
progs[1] = "()"
progs[2] = "()()"

local function half(n)
    if progs[n] then return progs[n] end
    local p = ""
    local div = math.floor(n/2)
    local rem = n%2 == 1 and "()" or ""
    return "("..progs[div].."){}"..rem
end

for i = 3, 10000 do

    local bin = half(i)

    progs[i] = progs[i-1] .. "()"

    if #bin < #progs[i] then
        progs[i] = bin
    end

    if i % 1000 == 0 then
        print(i)
    end

end

local n = 203 -- This is the program it outputs
print(n..", ("..progs[203]..")")

local len = 0
for i,v in ipairs(primes) do
    len = len + #progs[v] + 2
    --print(v.." ("..progs[v]..")\n")
end
print("Total len: "..len)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.