সিলোন / সিলোন, 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 পয়েন্টে নেমে যায় তবে আমি এটি শিরোনামের লাইনে রাখব না কারণ কেবলমাত্র 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
যেমন আপনি দেখতে পাচ্ছেন, -
positive ণাত্মকগুলি সর্বদা সংশ্লিষ্ট ধনাত্মকগুলির চেয়ে এক বাইট (শীর্ষস্থানীয় ) দীর্ঘ হয়।
মূল ধারণাটি পূর্ববর্তী প্রোগ্রামের মতোই: আমাদের লক্ষ্য সংখ্যার কাছে একটি বর্গক্ষেত্র সন্ধান করুন এবং এর মূল এবং বাকীটি পুনরাবৃত্তভাবে উপস্থাপন করুন। তবে এখন আমরা আমাদের বর্গক্ষেত্রকে লক্ষ্য সংখ্যার চেয়ে কিছুটা বড় হওয়ার অনুমতি দিই যা পরে বাকীটিকে negativeণাত্মক করে তোলে। ( +0.5
অ্যালগরিদমটি টুইট করার জন্য এটিকে অন্য ধ্রুবক হিসাবে পরিবর্তিত করা যেতে পারে, তবে মনে হয় আমি ইতিমধ্যে এখানে সর্বোত্তমকে আঘাত করেছিলাম - 0.4 এবং 0.6 উভয়ই খারাপ ফলাফল দেয়))
নেতিবাচক মানগুলিকে নেতিবাচক করে তুলতে (এবং অন্যথায় ধনাত্মক মানগুলির মতো একই কাঠামো থাকতে, আমরা অপারেটরটিকে sign
আমাদের পুনরাবৃত্ত ফাংশনে পাস করি p
- এটি হয় "+"
বা হয় "-"
। আমরা তুচ্ছ মামলায় সংযোজকের জন্যও এটি ব্যবহার করতে পারি (যেমন এন <9) বাকিটি ইতিবাচক হলে, এবং যদি এটি negativeণাত্মক হয় তবে অবশিষ্টগুলির জন্য বিপরীত চিহ্নটি ব্যবহার করুন।
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 = (3 ^ 2 + 1) ^ 3, এর পরিবর্তে 1000 = (6 ^ 2-4) -5 2-5 ^ 2 + 1।
0
বা1
ডিফল্টরূপে?