ম্যাথপ্যাক সংখ্যাসূচক


10

মুখবন্ধ

খুব উত্তপ্ত পরিস্থিতিতে আপনাকে গল্ফ দিয়ে আরও এগিয়ে যেতে হবে।
(যেমন একটি চ্যালেঞ্জের ক্ষেত্রে যেখানে আপনার উত্তরটি 100 টি অক্ষর দীর্ঘ এবং এটি বিব্রতকর যে আপনি এটি 99 বানাতে পারেননি)
সেক্ষেত্রে এখন থেকে আপনি এই চ্যালেঞ্জটির বিজয়ীর অ্যালগরিদম ব্যবহার করেন :)

লক্ষ্য

আপনাকে এমন একটি প্রোগ্রাম লিখতে হবে যা একটি uint32 নেয় এবং সর্বাধিক সঙ্কুচিত ফর্মটি দেয়।

$ mathpack 147456
9<<14
  • একটি সংখ্যার জন্য একাধিক সমাধান হবে। সংক্ষিপ্ততম চয়ন করুন
  • সংকুচিত ফর্মটি যদি মূল সংখ্যার সাথে দীর্ঘ বা সমান হয় তবে মূল সংখ্যাটি ফিরিয়ে দিন

নিয়ম

  • যে কোনও ভাষায় লিখুন - যে কোনও ভাষায় আউটপুট
  • আমি সি যে সচেতন আছি 'abc'হয় 6382179এবং আপনি এই রূপান্তর সঙ্গে বেশ ভালো ফল অর্জন করতে পারেন। তবে ভাষাগুলি এই চ্যালেঞ্জের মধ্যে পৃথক হয়েছে তাই হতাশ হবেন না
  • এটি বাহ্যিক ভেরিয়েবল ব্যবহার নিষিদ্ধ। কেবলমাত্র অপারেটর এবং আক্ষরিক এবং গণিত সম্পর্কিত ফাংশন!

স্কোরিং

এখানে পরীক্ষার কেসগুলি রয়েছে: পেস্টবিন.কম / বিবিওয়াইপিজেউএইচএক্স
আপনার স্কোর (শতাংশ)
byte_size_of_your_output / byte_size_of_the_list লাইন ব্রেক ছাড়াই অনুপাত হবে ।
(আপনাকে নিজেরাই এটি করতে হবে কারণ আমি কেবলমাত্র সর্বাধিক কোডগুলি যাচাই করব)
বিজয়ীরা স্কোর এবং আউটপুটের ভাষা দ্বারা নির্বাচিত হবে !

উদাহরণ:

$ mathpack 147456 | mathpack 97787584 |  mathpack 387420489
            9<<14 |           9e7^9e6 |            pow(9,9)

সুন্দর চ্যালেঞ্জ, তবে আপনার হার্ড কোডিংয়ের বিরুদ্ধে একটি নিয়মে যুক্ত করা উচিত।
ɐɔıʇǝɥʇuʎs

y- আপনার মানে হার্ডকোডিং 10 কে কেস? যদিও আমি কিভাবে এই চ্যালেঞ্জ পরিমার্জন কিছু সমর্থন পেতে করার অনুমতি নেই
Bebe

স্বচ্ছতার জন্য সম্পাদিত (বার বার ...)। পরামর্শের জন্য ধন্যবাদ।
bebe

এও কি হবে না [রোসেটা পাথর]? এছাড়াও: write in any language - output in any language- দুটি ভাষা আলাদা হতে পারে, তাই না?
26 এ :26

@ হিউস [রোসেটা পাথর] আসলে আপনি যতটা সম্ভব ভাষায় এটি সমাধান করছেন solving এবং হ্যাঁ আপনার উত্তরোত্তর প্রশ্নের - যা আমাকে একই প্রশ্ন জিজ্ঞাসা করে জবাব দিয়ে সম্পাদনা করা হয়েছে।
মার্টিন ইন্ডার

উত্তর:


1

কোড: গণিত, আউটপুট: সি, ~ 62.1518% (12674/20392)

আমি ভেবেছিলাম আমি সেই মজার চরিত্রের আক্ষরিক কারণে সি কেও চেষ্টা করব। বর্তমানে এই উত্তরটি কেবল এই জিনিসটি চেষ্টা করছে এবং এটি বেশ ভালভাবে কাজ করছে।

mathpack[n_] := Module[{versions, charLiteral},
   charLiteral = "'" <> StringReplace[Map[
        Switch[#,
          (*d_ /; d < 32,
          "\\" <> IntegerString[#, 8],*)
          10,
          "\\n",
          13,
          "\\r"
          39,
          "\\'",
          92 ,
          "\\\\",
          _,
          FromCharacterCode@#] &,
        FromDigits[#, 
           2] & /@ (Partition[PadLeft[IntegerDigits[n, 2], 32], 
            8] //. {{0 ..} .., x__} :> {x})
        ] <> "",
      {(*"\\10" -> "\\b",
       "\\11" -> "\\t",
       "\\13" -> "\\v",
       "\\14" -> "\\f",*)
       RegularExpression["(?!<=\?)\?\?(?=[=/()!<>-]|$)"] -> "?\\?"
       }
      ] <> "'";
   versions = {ToString@n, charLiteral};
   SortBy[versions, StringLength][[1]]
 ];

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

অন্যান্য জমা দেওয়ার মতো এটিরও পরীক্ষা করুন

input = StringSplit[Import["path/to/benchmark.txt"]];
numbers = ToExpression /@ input;
output = mathpack /@ numbers;
N[StringLength[output <> ""]/StringLength[input <> ""]]

(আমার সিস্টেমে কমপক্ষে) জিসিসি 10 ( \n) এবং 13 ( \r) বাদে একক কোটগুলিতে কোনও বাইট গ্রহণ করবে । একটি শূন্য বাইট ঠিক আছে, কিন্তু ত্রুটি বার্তা সহ কম্পাইল করবে warning: null character(s) preserved in literal
r3mainer

@ স্কোয়ামিশোসিফ্রেজ ধন্যবাদ, স্থির!
মার্টিন ইন্ডার

3

কোড: গণিত, আউটপুট: জুলিয়া, ~ 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এবং andmap2 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। আমি কেবল লক্ষ্য করেছি যে তারা জুলিয়াতেও কাজ করে না, কারণ (বেশ স্পষ্টতই) বৈজ্ঞানিক স্বরলিপি আপনাকে এমন একটি ভাসা দেয় যেখানে বিট-ওয়াইজ অপারেটরগুলি এমনকি সংজ্ঞায়িতও হয় না। মজার বিষয় হল, এক বা একাধিক নতুন প্রত্যাশা এই সমস্ত অপটিমাইজেশন দ্বারা সংক্ষিপ্ত হওয়া সমস্ত ক্ষেত্রেই ধরা পড়েছে, কারণ স্কোরটি মোটেও পরিবর্তন হয়নি।


1

জে টু সি (অনির্ধারিত, তবে বেশিরভাগ ক্ষেত্রে কাজ করে, একধরণের বেসলাইন উত্তর))

    f=:(,~ (($&0) @: (8&-) @: (8&|) @: #)) @: #:
    g=:($~ ((,&8) @: (%&8) @: #))@:f
    toCString=:({&a.)@:#.@:g
    toCString 6382179
abc    

একটি স্ট্রিং আক্ষরিক আউটপুট দেয় যা সি-তে প্রবেশ করা হলে, সংখ্যাটি উপস্থাপন করে (ওপিতে উল্লিখিত হিসাবে)। এটি কোনও গুরুতর জমা নয়, বরং আমার জে দক্ষতা জোরদার করার জন্য এমন কিছু, যা আমি ভেবেছিলাম ভাগ করব।

বিকল্প ওয়ানলাইনার:

toCString=:({&a.) @: #. @: ($~ ((,&8) @: (%&8) @: #))@: (,~ (($&0) @: (8&-) @: (8&|) @: #)) @: #:

আপনি যখন ইনপুট করবেন তখন জে এটি তৈরি করার চেষ্টা করে:

{&a.@:#.@:($~ ,&8@:(%&8)@:#)@:(,~ $&0@:(8&-)@:(8&|)@:#)@:#:

ধন্যবাদ একটি গুচ্ছ, জে। এছাড়াও, জে সম্পর্কে 'জানেন' এমনদের জন্য, আরও জটিল ক্রিয়াকলাপ তৈরি করার জন্য ভিজিও শিলা:

এখানে চিত্র বর্ণনা লিখুন


যেহেতু আমি এটা কোন পড়তে পারে না কি এই যদি চরিত্র মুদ্রণযোগ্য নয় এমন হয়, অথবা চরিত্র যদি কাজ করে \ , ?বা '?
মার্টিন ইন্ডার

@ m.buettner কিছুই (এখনও), আমি এখনও যে জন্য বিল্ড কিছু আছে
ɐɔıʇǝɥʇuʎs

পরিবর্তে m&u@:v, m u vমূল্যবান অক্ষরগুলি সংরক্ষণ করতে এবং পঠনযোগ্যতা বাড়ানোর জন্য ব্যবহার করুন। আপনার কোড এই প্রয়োগ করা হচ্ছে, আমরা পেতে f =: [: (,~ 0 $~ 8 - 8 | #) #:এবং g =: [: ($~ 8 ,~ # % 8:) fএবং সর্বশেষে toCString =: a. {~ [: #. g। আমরা সম্মিলিত সমস্ত a. {~ [: #. [: ($~ 8 ,~ # % 8:) [: (,~ 0 $~ 8 - 8 | #) #:, যা পড়া সহজ সত্যিই।
FUZxxl
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.