सीलोन / सीलोन, 49.86 40.95 अंक
तीसरा संस्करण जनरेटर के लिए सीलोन 1.2 और कोड के 509 बाइट्स का उपयोग करता है:
import ceylon.language{S=String,I=Integer,e=expand}S q(I n)=>n==0then"0"else(n<0then"-"+p(-n,"-")else p(n,"+"));variable Map<[I,S],S>c=map{};S p(I n,S s){S v=c[[n,s]]else(n<8then s.join([1].repeat(n)))else(let(a="+-".replace(s,""))e(e{for(x in 2..8)let(l=(n^(1.0/x)).integer){for(r in l:2)if(r>1)let(w=r^x){if(w-n<n)"("+p(r,"+")+")^("+p(x,"+")+")"+(w<n then s+p(n-w,s)else(n<w then a+p(w-n,a)else""))}}}).reduce<S>((x,y)=>x.size<y.size then x else y))else"";c=[n,s]in c then c else map{[n,s]->v,*c};return v;}
यह 35.22 अंक हो जाता है, लेकिन मैं इसे शीर्षक पंक्ति में नहीं रखूंगा क्योंकि Celyon 1.2 केवल 29 अक्टूबर को प्रकाशित किया गया था। मुझे नहीं लगता कि मैं इस एल्गोरिथ्म को सीलोन 1.1 में इस आकार में लागू कर पाऊंगा।)। अधिक विवरण नीचे, यहां मैं दूसरे संस्करण का वर्णन करूंगा। (इतिहास में पहला संस्करण देखा जा सकता है - इसने केवल सकारात्मक संख्याओं का समर्थन किया, लेकिन 256 बाइट्स में फिट हुआ।)
दूसरा संस्करण
अब दूसरा संस्करण, जो नकारात्मक पूर्णांक (और 0) का समर्थन करता है, और आम तौर पर इसके अतिरिक्त उपयोग करके थोड़ा छोटा आउटपुट बनाता है -
। (यह संस्करण वास्तव में अनुमत लंबाई का उपयोग करता है, पहले वाले ने 512 के बजाय 256 बाइट्स के नीचे रहने की कोशिश की।)
String proof(Integer n) {
if (n == 0) { return "0"; }
if (n < 0) { return "-" + p(-n, "-"); }
return p(n, "+");
}
String p(Integer n, String sign) {
if (n < 9) {
return sign.join([1].repeat(n));
}
value anti = (sign == "+") then "-" else "+";
value root = ((n^0.5) + 0.5).integer;
return "(" + p(root, "+") + ")^(1+1)" +
( (root^2 < n) then sign + p(n - root^2, sign) else
((n < root^2) then anti + p(root^2 - n, anti) else ""));
}
कोड की लंबाई 487 है, इसलिए बाद में अधिक अनुकूलन के लिए अभी भी कुछ जगह है। (व्हॉट्सएप और लॉन्ग वैरिएबल नामों के रूप में भी बहुत सारे रिजर्व हैं।)
स्कोरिंग:
Total positive: 42652
Average positive:42.652
Total negative: 43653
Average negative: 43.60939060939061
With bonus:39.24845154845155
Overall score: 40.95022577422577
कुछ नमूना आउटपुट:
27: 21: (1+1+1+1+1)^(1+1)+1+1
28: 23: (1+1+1+1+1)^(1+1)+1+1+1
29: 25: (1+1+1+1+1)^(1+1)+1+1+1+1
30: 27: (1+1+1+1+1)^(1+1)+1+1+1+1+1
31: 29: (1+1+1+1+1+1)^(1+1)-1-1-1-1-1
32: 27: (1+1+1+1+1+1)^(1+1)-1-1-1-1
33: 25: (1+1+1+1+1+1)^(1+1)-1-1-1
34: 23: (1+1+1+1+1+1)^(1+1)-1-1
-27: 22: -(1+1+1+1+1)^(1+1)-1-1
-28: 24: -(1+1+1+1+1)^(1+1)-1-1-1
-29: 26: -(1+1+1+1+1)^(1+1)-1-1-1-1
-30: 28: -(1+1+1+1+1)^(1+1)-1-1-1-1-1
-31: 30: -(1+1+1+1+1+1)^(1+1)+1+1+1+1+1
-32: 28: -(1+1+1+1+1+1)^(1+1)+1+1+1+1
-33: 26: -(1+1+1+1+1+1)^(1+1)+1+1+1
-34: 24: -(1+1+1+1+1+1)^(1+1)+1+1
993: 65: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1+1)^(1+1)+1+1+1+1+1
994: 63: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)-1-1-1-1-1
995: 61: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)-1-1-1-1
996: 59: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)-1-1-1
997: 57: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)-1-1
998: 55: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)-1
999: 53: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)
1000: 55: ((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)-(1+1+1+1+1)^(1+1)+1
-993: 66: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1+1)^(1+1)-1-1-1-1-1
-994: 64: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)+1+1+1+1+1
-995: 62: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)+1+1+1+1
-996: 60: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)+1+1+1
-997: 58: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)+1+1
-998: 56: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)+1
-999: 54: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)
-1000: 56: -((1+1+1+1+1+1)^(1+1)-1-1-1-1)^(1+1)+(1+1+1+1+1)^(1+1)-1
1: 1: 1
2: 3: 1+1
3: 5: 1+1+1
4: 7: 1+1+1+1
5: 9: 1+1+1+1+1
6: 11: 1+1+1+1+1+1
7: 13: 1+1+1+1+1+1+1
8: 15: 1+1+1+1+1+1+1+1
9: 13: (1+1+1)^(1+1)
10: 15: (1+1+1)^(1+1)+1
0: 1: 0
-1: 2: -1
-2: 4: -1-1
-3: 6: -1-1-1
-4: 8: -1-1-1-1
-5: 10: -1-1-1-1-1
-6: 12: -1-1-1-1-1-1
-7: 14: -1-1-1-1-1-1-1
-8: 16: -1-1-1-1-1-1-1-1
-9: 14: -(1+1+1)^(1+1)
-10: 16: -(1+1+1)^(1+1)-1
जैसा कि आप देख सकते हैं, नकारात्मक हमेशा एक बाइट (अग्रणी) होते हैं -
) होते हैं जो कि संबंधित सकारात्मक लोगों की तुलना में अधिक लंबे होते हैं।
आधार विचार पिछले कार्यक्रम के समान है: हमारे लक्ष्य संख्या के पास एक वर्ग ढूंढें, और इसकी जड़ और शेष पुनरावर्ती का प्रतिनिधित्व करें। लेकिन अब हम अपने वर्ग को लक्ष्य संख्या से कुछ बड़ा होने देते हैं, जो तब शेष नकारात्मक बनाता है। (+0.5
एल्गोरिथ्म को ट्विक करने के लिए एक अलग स्थिरांक में बदला जा सकता है, लेकिन ऐसा लगता है कि मैंने पहले से ही यहां इष्टतम हिट किया था - 0.4 और 0.6 दोनों खराब परिणाम देते हैं।)
नकारात्मक मानों को नकारात्मक बनाने के लिए (और अन्यथा सकारात्मक लोगों के समान संरचना है, हम ऑपरेटर sign
को अपने पुनरावर्ती कार्य के लिए पास करते हैं p
- "+"
या तो या"-"
हम तुच्छ मामलों में योजक के लिए इसका उपयोग कर सकते हैं (यानी n <9) साथ ही। शेष के लिए के रूप में अगर यह सकारात्मक है, और शेष के लिए विपरीत संकेत का उपयोग करें यदि यह नकारात्मक है।
proof
समारोह हैंडल प्रारंभिक साइन (0 के लिए एक विशेष मामले के साथ), p
समारोह प्रत्यावर्तन के साथ, वास्तविक काम करता है।
तीसरा संस्करण, सीलोन 1.2 के लिए
import ceylon.language { S=String, I=Integer,e=expand }
// output a base-proof Ceylon expression for an integer
// (i.e. using only 0 and 1 as digits).
//
// Question: http://codegolf.stackexchange.com/q/58084/2338
// My Answer: http://codegolf.stackexchange.com/a/58122/2338
//
// The goal is to produce an expression as short as possible, with
// the code staying under 512 bytes in length.
//
// This approach is to represent a positive integer as a square
// of a positive integer plus some remainder (where the remainder
// can be negative), and for negative integers replace the + on the
// outer level by -.
S q(I n) =>
n == 0 then "0"
else (n < 0 then "-" + p(-n, "-")
else p(n, "+"));
// cache for values of p
variable Map<[I, S],S> c = map { };
// Transforms a positive number into a base-proof term, using
// the given sign for the summation on the outer level.
S p(I n, S s) {
S v =
// look into the cache
c[[n, s]] else (
// hard-code small numbers
n < 8 then s.join([1].repeat(n)))
else
// do the complicated stuff
(let (a = "+-".replace(s,""))
e(e {
for (x in 2..8) // try these exponents
let (l = (n ^ (1.0 / x)).integer) // \[ sqrt[exp]{n} \] in LaTeX
{ for (r in l:2) // lowerRoot, lowerRoot + 1
if (r > 1)
let (w = r ^ x)
{ if (w-n < n) // avoid recursion to larger or same number
// format the string as r^x + (n-w)
"(" + p(r, "+") + ")^(" + p(x, "+") + ")" +
(w < n then s + p(n - w, s)
else (n < w then a + p(w - n, a)
else ""))
} } })
// and now find the shortest formatted string
.reduce<S>((x, y) => x.size < y.size then x else y))
// this should never happen, but we can't tell the compiler
// that at least some of the iterables are non-empty due to the if clause.
else "";
// this builds a new cache in each step – quite wasteful,
// as this also happens when the value was found in the cache,
// but we don't have more characters remaining.
//// c = map { [n, s] -> v, *c };
///better way:
c = [n,s] in c then c else map{[n,s]->v, *c};
return v;
}
गोल्फ संस्करण (यानी टिप्पणियाँ और व्हॉट्सएप हटा दिया गया) शीर्ष पर पोस्ट किया गया है, बिल्कुल कोड के 509 बाइट्स पर।
यह दूसरे संस्करण के रूप में एक ही आधार सिद्धांत का उपयोग करता है, लेकिन सिर्फ वर्गों के बजाय, यह संख्याओं की उच्च शक्तियों (2 से 8 तक के घातांक की कोशिश करता है) का उपयोग करने की कोशिश करता है, और सबसे कम परिणाम का उपयोग करता है। यह परिणामों को भी कैश करता है, अन्यथा यह कई पुनरावर्ती कॉलों के साथ बड़ी संख्या में अस्वीकार्य रूप से धीमा होगा।
स्कोरिंग:
Total positive: 36622
Average positive: 36.622
Total negative: 37623
Average negative: 37.58541458541458
With bonus:33.826873126873124
Overall score: 35.22443656343656
बीच में बड़े इंडेंट किए गए निर्माण तीन नेस्टेड इटरेबल कॉम्प्रिहेंशन हैं, आंतरिक दो एक लेट एक्सप्रेशन के अंदर। फिर दो बार विस्तार फ़ंक्शन का उपयोग करके उन्हें अनावश्यक किया जाता है, और reduce
फ़ंक्शन उन स्ट्रिंग्स में सबसे कम पाता है।
मैंने एक सुविधा अनुरोध दर्ज किया है जो एक ही समझ में ऐसा करने में सक्षम है।
समझ के अंदर, हम मूल r
, घातांक x
और शेष ( n-w
या) से एक स्ट्रिंग का निर्माण कर रहे हैंw-n
) ।
let
अभिव्यक्ति और map
समारोह सीलोन 1.2 में नए हैं। map
द्वारा प्रतिस्थापित किया जा सकता था HashMap
(जिसे आयात के लिए अधिक वर्णों की आवश्यकता होगी, हालाँकि यह शायद और भी तेज़ होगा, क्योंकि मैं प्रत्येक नई प्रविष्टि के लिए मानचित्र को नया नहीं बनाऊंगा)। let
जैसे भाव let (w = r ^ x)
एक का उपयोग करके प्रतिस्थापित किया जा सकता था if
की तरह खंड if(exists w = true then r ^ x)
(और फिर मैं दो की जरूरत नहीं होताexpand
कॉल या तो), लेकिन यह अभी भी थोड़ा अधिक समय हो सकता है, 511 की अनुमति दी बाइट्स अंदर फिटिंग नहीं।
यहां नमूना उन चयनित लोगों के अनुरूप है, जो वास्तव में छोटी संख्याओं को छोड़कर सभी छोटे हैं:
27: 15: (1+1+1)^(1+1+1)
28: 17: (1+1+1)^(1+1+1)+1
29: 19: (1+1+1)^(1+1+1)+1+1
30: 21: (1+1)^(1+1+1+1+1)-1-1
31: 19: (1+1)^(1+1+1+1+1)-1
32: 17: (1+1)^(1+1+1+1+1)
33: 19: (1+1)^(1+1+1+1+1)+1
34: 21: (1+1)^(1+1+1+1+1)+1+1
-27: 16: -(1+1+1)^(1+1+1)
-28: 18: -(1+1+1)^(1+1+1)-1
-29: 20: -(1+1+1)^(1+1+1)-1-1
-30: 22: -(1+1)^(1+1+1+1+1)+1+1
-31: 20: -(1+1)^(1+1+1+1+1)+1
-32: 18: -(1+1)^(1+1+1+1+1)
-33: 20: -(1+1)^(1+1+1+1+1)-1
-34: 22: -(1+1)^(1+1+1+1+1)-1-1
993: 39: ((1+1+1)^(1+1)+1)^(1+1+1)-1-1-1-1-1-1-1
994: 37: ((1+1+1)^(1+1)+1)^(1+1+1)-1-1-1-1-1-1
995: 35: ((1+1+1)^(1+1)+1)^(1+1+1)-1-1-1-1-1
996: 33: ((1+1+1)^(1+1)+1)^(1+1+1)-1-1-1-1
997: 31: ((1+1+1)^(1+1)+1)^(1+1+1)-1-1-1
998: 29: ((1+1+1)^(1+1)+1)^(1+1+1)-1-1
999: 27: ((1+1+1)^(1+1)+1)^(1+1+1)-1
1000: 25: ((1+1+1)^(1+1)+1)^(1+1+1)
-993: 40: -((1+1+1)^(1+1)+1)^(1+1+1)+1+1+1+1+1+1+1
-994: 38: -((1+1+1)^(1+1)+1)^(1+1+1)+1+1+1+1+1+1
-995: 36: -((1+1+1)^(1+1)+1)^(1+1+1)+1+1+1+1+1
-996: 34: -((1+1+1)^(1+1)+1)^(1+1+1)+1+1+1+1
-997: 32: -((1+1+1)^(1+1)+1)^(1+1+1)+1+1+1
-998: 30: -((1+1+1)^(1+1)+1)^(1+1+1)+1+1
-999: 28: -((1+1+1)^(1+1)+1)^(1+1+1)+1
-1000: 26: -((1+1+1)^(1+1)+1)^(1+1+1)
1: 1: 1
2: 3: 1+1
3: 5: 1+1+1
4: 7: 1+1+1+1
5: 9: 1+1+1+1+1
6: 11: 1+1+1+1+1+1
7: 13: 1+1+1+1+1+1+1
8: 13: (1+1)^(1+1+1)
9: 13: (1+1+1)^(1+1)
10: 15: (1+1+1)^(1+1)+1
0: 1: 0
-1: 2: -1
-2: 4: -1-1
-3: 6: -1-1-1
-4: 8: -1-1-1-1
-5: 10: -1-1-1-1-1
-6: 12: -1-1-1-1-1-1
-7: 14: -1-1-1-1-1-1-1
-8: 14: -(1+1)^(1+1+1)
-9: 14: -(1+1+1)^(1+1)
-10: 16: -(1+1+1)^(1+1)-1
उदाहरण के लिए, अब हमारे पास 1000 = (6 ^ 2-4) ^ 2-5 ^ 2 + 1 के बजाय 1000 = (3 ^ 2 + 1) ^ 3 है।
0
या होल्ड1
करता है?