কোড: গণিত, আউটপুট: জুলিয়া, ~ 98.9457% (20177/20392 বাইট)
optimise[n_] :=
Module[{bits, trimmedBits, shift, unshifted, nString, versions,
inverted, factorised, digits, trimmedDigits, exponent, base,
xored, ored, anded},
nString = ToString@n;
versions = {nString};
(* Try bitshifting *)
bits = IntegerDigits[n, 2];
trimmedBits = bits /. {x___, 1, 0 ..} :> {x, 1};
shift = ToString[Length[bits] - Length[trimmedBits]];
unshifted = ToString@FromDigits[trimmedBits, 2];
AppendTo[versions, unshifted <> "<<" <> shift];
(* Try inverting *)
inverted = ToString@FromDigits[1 - PadLeft[bits, 32], 2];
AppendTo[versions, "~" <> inverted];
(* Try invert/shift/invert *)
trimmedBits = bits /. {x___, 0, 1 ..} :> {x, 1};
shift = ToString[Length[bits] - Length[trimmedBits]];
unshifted = ToString@FromDigits[trimmedBits, 2];
AppendTo[versions, "~(~" <> unshifted <> "<<" <> shift <> ")"];
(* Try factoring *)
factorised = Riffle[
FactorInteger[n]
/. {a_, 1} :> ToString@a
/. {a_Integer, b_Integer} :> ToString[a] <> "^" <> ToString[b]
, "+"] <> "";
AppendTo[versions, factorised];
(* Try scientific notation *)
digits = IntegerDigits[n, 10];
trimmedDigits = digits /. {x___, d_ /; d > 0, 0 ..} :> {x, d};
exponent = ToString[Length[digits] - Length[trimmedDigits]];
base = ToString@FromDigits[trimmedDigits, 10];
AppendTo[versions, base <> "e" <> exponent];
(* Don't try hexadecimal notation. It's never shorter for 32-bit uints. *)
(* Don't try base-36 or base-62, because parsing those requires 12 characters for
parseint("...") *)
SortBy[versions, StringLength][[1]]
];
mathpack[n_] :=
Module[{versions, increments},
increments = Range@9;
versions = Join[
optimise[#2] <> "+" <> ToString@# & @@@ ({#, n - #} &) /@
Reverse@increments,
{optimise@n},
optimise[#2] <> "-" <> ToString@# & @@@ ({#, n + #} &) /@
increments,
optimise[#2] <> "*" <> ToString@# & @@@
Cases[({#, n / #} &) /@ increments, {_, _Integer}],
optimise[#2] <> "/" <> ToString@# & @@@ ({#, n * #} &) /@
increments
];
SortBy[versions, StringLength][[1]]
];
ফাংশনটি একটি সংখ্যা নেয় এবং এটি খুঁজে পাওয়া সংক্ষিপ্ততম স্ট্রিংটি দেয়। বর্তমানে এটি চারটি সহজ অপ্টিমাইজেশন প্রয়োগ করে (আমি আগামীকাল আরও সংযুক্ত করতে পারি)।
আপনি এটি পুরো ফাইলটিতে প্রয়োগ করতে পারেন (এর স্কোর পরিমাপ করতে):
input = StringSplit[Import["path/to/benchmark.txt"]];
numbers = ToExpression /@ input;
output = mathpack /@ numbers;
N[StringLength[output <> ""]/StringLength[input <> ""]]
মনে রাখবেন যে এই কয়েকটি অপ্টিমাইজেশন ধরে নিয়েছে যে আপনি Jul৪-বিট জুলিয়ায় রয়েছেন, যেমন পূর্ণসংখ্যার অক্ষর আপনাকে int64
ডিফল্টরূপে দেয়। অন্যথায়, আপনি 2 31 এর বেশি সংখ্যক পূর্ণসংখ্যার জন্য উপচে পড়বেন । এই অনুমানটি ব্যবহার করে আমরা কয়েকটি অপ্টিমাইজেশন প্রয়োগ করতে পারি যার মধ্যবর্তী পদক্ষেপগুলি আসলে 2 32 এর চেয়েও বড় ।
সম্পাদনা করুন: আমি অপ্টিমাইজেশান ওপি এর উদাহরণ প্রস্তাব bitwise যোগ করা XOR বৈজ্ঞানিক স্বরলিপি দুটি বৃহৎ সংখ্যা (আসলে সব জন্য XOR , বা এবং এবং )। নোট করুন যে প্রসারিত করা xormap
, ormap
এবং andmap
2 32 এরও বেশি অপারেশনগুলি অন্তর্ভুক্ত করা অতিরিক্ত অপ্টিমাইজেশনগুলি সন্ধান করতে সহায়তা করতে পারে তবে প্রদত্ত পরীক্ষার ক্ষেত্রে এটি কাজ করে না এবং কেবল 10 এর ফ্যাক্টরের মতো কিছুতে রান সময় বাড়ায়।
সম্পাদনা: আমি অন্য 16 টি বাইটগুলি শেভ করেছিলাম n-9, n-8, ..., n+8, n+9
, সেগুলির মধ্যে কোনওটি সংক্ষিপ্ত করা যায় কিনা, তা যাচাই করে আমি এই ক্ষেত্রে ভিত্তি করে সংখ্যাটি উপস্থাপন করে, পার্থক্যটি যোগ বা বিয়োগ করেছিলাম all কয়েকটি কেস রয়েছে, যেখানে 18 টির মধ্যে একটির n
নিজের থেকে 3 বা ততোধিক অক্ষর উপস্থাপন করা যায়, এই ক্ষেত্রে আমি কিছু অতিরিক্ত সঞ্চয় করতে পারি। এটি সমস্ত পরীক্ষার কেসগুলিতে চালাতে এখন প্রায় 30 সেকেন্ড সময় লাগে, তবে অবশ্যই যদি কেউ এই ফাংশনটি "ব্যবহৃত" হয় তবে তিনি কেবল এটি একটি সংখ্যায় চালাতেন, তাই এটি এখনও এক সেকেন্ডের অধীনে ভাল।
সম্পাদনা: গুণ এবং বিভাগের জন্য একই কাজ করে আরও একটি অবিশ্বাস্য 4 বাইট। ৫০ সেকেন্ড এখন (বিভক্ত ব্যক্তিরা যতক্ষণ সময় নেয় না, কারণ আমি কেবলমাত্র এগুলি পরীক্ষা করে দেখছি যদি সংখ্যাটি আগ্রহের ফ্যাক্টর দ্বারা ভাগ করে নেওয়া যায়)।
সম্পাদনা: আরেকটি অপ্টিমাইজেশন যা প্রদত্ত পরীক্ষার সেটটিতে আসলে সহায়তা করে না। এইটি 2 30 বা 2 31 এর মতো জিনিসগুলির জন্য একটি বাইট সংরক্ষণ করতে পারে । পরিবর্তে আমাদের যদি uint64s থাকে তবে প্রচুর সংখ্যা থাকত যেখানে এটি একটি বিশাল সঞ্চয় হতে পারে (মূলত, যখনই বিটের উপস্থাপনা 1s এর মধ্যে শেষ হয়)।
সম্পাদনা করুন: সরানো হয়েছে XOR , বা , এবং পুরাপুরি optimisations। আমি কেবল লক্ষ্য করেছি যে তারা জুলিয়াতেও কাজ করে না, কারণ (বেশ স্পষ্টতই) বৈজ্ঞানিক স্বরলিপি আপনাকে এমন একটি ভাসা দেয় যেখানে বিট-ওয়াইজ অপারেটরগুলি এমনকি সংজ্ঞায়িতও হয় না। মজার বিষয় হল, এক বা একাধিক নতুন প্রত্যাশা এই সমস্ত অপটিমাইজেশন দ্বারা সংক্ষিপ্ত হওয়া সমস্ত ক্ষেত্রেই ধরা পড়েছে, কারণ স্কোরটি মোটেও পরিবর্তন হয়নি।