गोल्फ ए ब्रेन-फ्लैक इंटेगर


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 तक के सभी इनपुट के लिए एक कार्यशील ब्रेन-फ्लैक प्रोग्राम को वापस करने में सक्षम होना चाहिए, विजेता वह प्रोग्राम या फ़ंक्शन होगा जो 1,000 के बीच सभी 1061 प्राइम संख्याओं के लिए उपयुक्त ब्रेन-फ्लैक कार्यक्रमों का सबसे छोटा सेट उत्पन्न करता है। 10,000 रु । आपको अपने सबमिशन के कुल साइज़ को अपने सबमिशन के हिस्से के तौर पर उन 1061 इनपुट्स के लिए नोट करना चाहिए। आपका प्रोग्राम या फ़ंक्शन पूर्णांक को स्वीकार कर सकता है और (स्ट्रिंग) ब्रेन-फ्लैक प्रोग्राम को सामान्य स्वीकार्य I / O प्रारूपों में से किसी में भी लौटा सकता है। आपके प्रोग्राम या फ़ंक्शन के आकार का उपयोग करके संबंध टूट जाएंगे।


4
बस एक नोट के रूप में: लंबाई के वैध कार्यक्रमों की संख्या 2nहै 4^n catalan(n)
लीक

2
हम्म, मुझे चुनौती पसंद है, लेकिन मुझे लगता है कि इसे अज्ञात पूर्णांक पर बनाया जाना चाहिए। अन्यथा, पूर्णांकों के कार्यक्रमों पर रन बनाए जाते हैं, उन्हें मजबूर किया जा सकता है और अन्य पूर्णांकों को वैसे ही छोड़ दिया जाता है (()()()...())। इसके अलावा, अगर आप सिर्फ प्राइम नंबरों का उपयोग करते हैं, तो कंपोजिट के लिए कुछ अनुकूलन संभव हो सकते हैं।
DJMcMayhem

इसके अलावा, []इस चुनौती के लिए अपरिभाषित क्यों है ? मुझे 8 में से 7 ऑपरेटरों को लागू करना अजीब लगता है। किसी भी तरह से, शांत चुनौती, मैं सम्मानित हूं कि कोई मेरी भाषा से प्रेरित चुनौती लिखेगा!
DJMcMayhem

2
@DJMcMayhem मैं चाहता हूं कि लोग अपने स्वयं के स्कोर की गणना करने में सक्षम हों। सभी संबंधित अभाज्य संख्याएँ एक समग्र संख्या से अधिक हैं, इसलिए इसमें बहुत सारे संभावित अनुकूलन होने चाहिए। इसके अलावा, मैं नहीं चाहता कि लोग []अपने उत्तर के किसी विशेष मूल्य पर भरोसा करें ।
नील

1
@YetiCGN स्क्रिप्ट का आकार केवल टाई-ब्रेकर के रूप में गिना जाता है।
नील

जवाबों:


16

अजगर 2, 59,394 59,244 58,534 58416 58,394 58,250

ठीक है यहाँ मेरा समाधान है।

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)का {}मान n है।

बड़ी संख्या के लिए इस सरल विचार को और अधिक जटिल बनाया जा सकता है। उदाहरण के लिए ले लो 5 यह कुछ समय पहले पता चला था कि पांच से गुणा करने का सबसे अच्छा तरीका था (((n)){}){}{}। यह कोड n गुणक की दो प्रतियों को 4 से एक बनाता है और दोनों को जोड़ता है। एक ही रणनीति का उपयोग करके मैं प्रत्येक गुणन को एक संख्या के बाइनरी प्रतिनिधित्व के आधार पर बनाता हूं। मैं इस विवरण में नहीं आता कि यह अभी कैसे काम करता है, लेकिन मैं द्विआधारी प्रतिनिधित्व के पहले एक को काटकर ऐसा करता हूं और 0 के साथ ){}और 1 को प्रतिस्थापित करता हूं।){}{}। फिर यह सुनिश्चित करता है कि n को उचित संख्या में धकेला जाए और सभी कोष्ठकों को संतुलित किया जाए। (यदि आप जानना चाहते हैं कि यह कैसे किया जाता है तो आप मेरे कोड को देख सकते हैं)। यदि आप यह जानना चाहते हैं कि यह काम सिर्फ मुझसे टिप्पणी में क्यों पूछा जाता है। मुझे नहीं लगता कि वास्तव में किसी ने मेरे पोस्ट के सभी अपडेट पढ़े हैं इसलिए मैंने स्पष्टीकरण छोड़ दिया।

जब एल्गोरिथ्म एक गुणन हार्डकोड को खोजने का प्रयास करता है तो यह सभी संख्याओं के प्रमुख कारकों का प्रयास करता है। यह समग्र कारकों को नजरअंदाज करता है क्योंकि एक बिंदु पर समग्र कारकों को हमेशा अपने स्वयं के प्रमुख कारकों के रूप में व्यक्त किया जा सकता है क्योंकि यह ज्ञात नहीं है कि यह अभी भी सच है।

अन्य बाइट बचत तंत्र एक बहुपद समाधान खोजक है। बहुपद के कुछ निश्चित रूप होते हैं, जो डिक्रिप्टिंग लूप के साथ प्रतिनिधित्व करना आसान होते हैं। इन बहुपद में शामिल हैं, लेकिन पॉलीगोनल संख्या तक सीमित नहीं हैं। यह अनुकूलन उन बहुपदों को खोजता है जो फ़ॉर्म को फिट करते हैं और कोड बनाते हैं जो उन्हें बनाता है।

उत्पादन

पेस्ट-बिन


"क्या n, n + 1 से बड़ा या छोटा है" ??
21

@Sparr कि क्या की व्याख्या nबड़ा या से छोटी हैn+1
गेहूं जादूगर

आपको if n % 3 == 2: उस फ़ंक्शन के अंत से एक स्तर तक लाइनों को एक करना चाहिए ।
user202729

13

ब्रेन-फ्लैक, 64664

इसे ऑनलाइन आज़माएं!

यहाँ मेरा एनोटेट कोड है

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

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

व्याख्या

यह केवल दो नियमों को लागू करता है:

  • यदि n दो रिटर्न से विभाज्य है (n/2){}

  • यदि n दो रिटर्न से विभाज्य नहीं है n-1()

यह 6 से छोटे सभी नंबरों को हार्डकोड भी करता है।


तीन की विभाज्यता के लिए एक चेक की तरह लगता है, स्कोर को काफी कम करना चाहिए
ASCII-only

@ ASCII- केवल मैंने वास्तव में इसे लागू किया और इसने बाइट की गिनती में वृद्धि की। मैं तीन से विभाज्यता के एक बेहतर संस्करण को लागू करने के तरीके पर काम कर रहा हूं।
गेहूं जादूगर

ठीक है, एक प्रोग्राम बनाने के लिए ब्रेन-फ्लैक का उपयोग करके, जो ब्रेन-फ़्राक संख्या उत्पन्न करता है। अच्छा लगा।
ड्रेको १।

10

पर्ल, 59,222 ५९,१५६ 58,460 वर्ण

  • n() (11322660 अक्षर)
  • (n){}() (64664 अक्षर)
  • ((n)){}{} (63610 अक्षर)
  • ((n)()){}{} (६३४ .४ अक्षर) - यह एक उपन्यास गणना है
  • (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

@DJMcMayhem ओह, मैंने गलती से अपने चरित्र की गिनती को अमान्य करते हुए, मेरी सूची की चोरी कर ली थी।
नील

@Linus ((X) ()) {} {} X को धक्का देता है, फिर 1 जोड़ता है, परिणाम को धक्का देता है, फिर X + 1 और X. कुल 3X + 2 को पॉप करता है। मुझे लगता है कि मैंने ट्राई इट ऑनलाइन पर दूसरे सूत्र की कोशिश की, लेकिन अगर आप चाहें तो मैं दोबारा जांच कर सकता हूं।
नील

@ मेरी गलती ... ये अच्छे लग रहे हैं लेकिन क्या वास्तव में अपने primes भ्रष्ट?
लिनस

1
@ जब मैं जोड़ता हूं तो मुझे 58158 मिलता है &try($i * $i, "$numbers[$i]{({})({}[()])}{}");, जो कि 58032 तक नीचे चला जाता है जब मैं भी जोड़ता हूं &try((3 * $i * $i - $i) / 2, "$numbers[$i]{({})({}[()])({})}{}");(वर्ग / पंचकोणीय संख्या) - यह यहां
ASCII-only

5

पायथन, 59136 58676 वर्ण

Brainflak नंबर गोल्फ समारोह:

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 को एक प्रतिनिधित्व सौंपा गया है, और यह कि इन अभ्यावेदन का उपयोग पहले से ही नए संख्याओं का उत्पादन करने के लिए किया गया है। यदि l से कम मूल्य का एक छोटा प्रतिनिधित्व मिलता है, तो हमें वापस जाना चाहिए और उस बिंदु से शुरू होने वाली संख्याओं को पुन: उत्पन्न करना चाहिए। समारोह कोष्ठक को जोड़कर संख्या को स्टैक पर सहेजने वाला एक प्रोग्राम तैयार करता है।

जब मैंने इसे शुरू किया तो मुझे कोई ब्रेनफ्लैक नहीं पता था, और त्रिकोण संख्याओं के लिए सूत्र को इंगित करने के लिए ईमोन ओलिव के जवाब की बहुत सराहना की । ज्यादातर मैंने योग को सामान्य किया है और रकम और अंतर की जाँच के बारे में अथक प्रयास कर रहा हूं। बहुत से गुणकों के जोड़ देने से बहुत प्रभाव पड़ा है।

देखभाल करने वालों के लिए, यहां वह स्क्रैच कोड है जो मैंने देखा कि कौन से फॉर्मूले इसके लायक थे।

प्रतिनिधित्व सूत्र:

  1. छोटे अपराधों द्वारा गुणा:
    (X){}
    ((X)){}{}
    ((((X)))){}{}{}{}
    ((((((X)))))){}{}{}{}{}{}
  2. अतिरिक्त X + Y :
    XY
  3. घटाव X - Y :
    X[Y]
  4. करने के लिए योग और सहित एक्स वेतन वृद्धि की Y :
    (X){({}[Y])}{}
  5. करने के लिए summations के गुणकों एक्स वेतन वृद्धि की Y , प्लस एक्स :
    (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)

अन्य उत्तरों के लिए समान विचार जहां ज्ञात-उपयोगी कार्यों का उपयोग सरल संख्याओं के अच्छे अभ्यावेदन से बड़ी संख्या के निर्माण के लिए किया जाता है।

एक अंतर यह है कि मैं छोटी संख्या के संदर्भ में उप-प्रश्न को हल करने के बजाय छोटी संख्या के साथ संख्याओं के संदर्भ में उप-प्रश्न हल कर रहा हूं। मुझे लगता है कि यह नकारात्मक संख्याओं के साथ-साथ उस मामले को संभालने के लिए और अधिक सुरुचिपूर्ण बनाता है जहां बड़ी संख्या के संदर्भ में छोटी संख्या का प्रतिनिधित्व किया जाता है।

इसके अलावा, उन सभी नंबरों को खोजने की कोशिश की जा सकती है जिन्हें एक निश्चित आकार में दर्शाया जा सकता है, बल्कि किसी विशेष संख्या को जितनी जल्दी हो सके प्रतिनिधित्व करने की कोशिश करना वास्तव में कुछ गणनाओं को सरल बनाता है। किसी फॉर्मूले को रिवर्स में काम करने के बजाय यह देखने के लिए कि क्या इसे किसी नंबर पर लागू किया जा सकता है, फॉर्मूला को आगे बढ़ाकर हर नंबर पर लागू किया जा सकता है।

एक और अंतर यह है कि ज्ञात समाधान दो टुकड़ों में जमा होते हैं - (वैकल्पिक) "उपसर्ग" और एक "प्रत्यय" (एक इन्फिक्स की तरह)। दी गई संख्या की गणना करते समय उपसर्ग के मूल्यांकन को नजरअंदाज करने की उम्मीद की जाती है - उपसर्ग में बस कोड होता है जो प्रत्यय को चलाने के लिए सेट करता है (आमतौर पर स्टैक के लिए एक या अधिक चीजों को धक्का देकर)। इसलिए, एक उपसर्ग और एक प्रत्यय दिए जाने पर, संबंधित संख्या को स्टैक पर धकेला जा सकता है prefix(suffix)

यह विभाजन मूल रूप से unpackगेहूं जादूगर के जवाब में फ़ंक्शन के समान समस्या को हल करता है । <...>केवल बाद में इसे पूर्ववत करने के लिए कोड को लपेटने के बजाय , ऐसा कोड केवल उपसर्ग में जोड़ा जाता है।

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

मैं कल्पना करता हूं कि बाइट की गिनती को और अधिक मामलों में जोड़कर नीचे फेंकना आसान होगा, लेकिन मैं इस समय के लिए पर्याप्त था।

मैं १०००००० तक चला गया हूं, लेकिन केवल १००००० तक की जाँच की गई।

दिए गए primes पर आउटपुट का Pastebin।


क्या करें k_limitऔर क्या न k_max_lenकरें? मुझे यकीन नहीं है कि मैं हेडर को समझ पा रहा हूं।
गेहूं जादूगर

1
विशेष संख्याओं की गणना करने की कोशिश करने के बजाय, मैं एक निश्चित लंबाई तक सभी उपयोगी (यानी किसी भी अन्य पाया गया प्रोग्राम की तुलना में बहुत बड़ी संख्या को कम करके) गणना कर रहा हूं - k_max_len। यह आसानी से जांच सकता है कि यह प्रत्येक लंबाई को संसाधित करने के बाद आपके द्वारा मांगे गए सभी नंबरों को मिल गया है, लेकिन यह मेरे लिए उपयोगी था कि मैं परीक्षण के दौरान अधिकतम लंबाई को बाध्य करने में सक्षम हो ताकि कार्यक्रम तेजी से चले। (बड़ी लंबाई को संसाधित करना बहुत धीमा हो सकता है।) k_limitमूल रूप से इनपुट पैरामीटर है - यह इस तक की संख्या के लिए प्रोग्राम आउटपुट करेगा - यह मानकर k_max_lenउन्हें खोजने के लिए काफी बड़ा था।
तहमी

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

मैं एक हैश का उपयोग करता हूं। मैं किसी दिए गए नंबर के लिए सबसे अच्छा गोल्फ ढूंढता हूं और छोटे लोगों का उपयोग बड़े लोगों को खोजने के लिए करता हूं।

रिकर्सिव हैश बहुत मज़ा आता है!


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)

pastebin पर उत्पादन


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