ওওপি: ওভারল্যাপিং ওরিয়েন্টেড প্রোগ্রামিং


32

কোড গল্ফিংয়ের জন্য বরং উপযুক্ত বলে মনে হচ্ছে এমন একটি কম পরিচিত প্রোগ্রামিং দৃষ্টান্ত হ'ল ওভারল্যাপিং ওরিয়েন্টেড প্রোগ্রামিং (ওওপি) *। আংশিকভাবে অভিন্ন কোড লেখার সময়, অনেকগুলি বাইটগুলি কেবল অভিন্ন অংশগুলিকে ওভারল্যাপ করে এবং দুটি মূল কোড লাইন শুরু হয় এমন কোনও উপায়ে স্মরণ করে সংরক্ষণ করা যায়। আপনার কাজটি দুটি ওভারল্যাপিং প্রোগ্রাম বা ফাংশন compressএবং decompressনিম্নলিখিত স্পেসিফিকেশন সহ লিখতে হয় :

* সম্ভবত উত্পাদন কোড ব্যবহার করবেন না।

compress

compressযে কোনও সুবিধাজনক বিন্যাসে দুটি স্ট্রিং লাগে এবং এটিকে যথাসম্ভব ওভারল্যাপ করে। এটি sন্যূনতম দৈর্ঘ্যের একটি স্ট্রিং এমনভাবে ফিরে আসে যে উভয় ইনপুট স্ট্রিংগুলি সাবস্ট্রিং হয় s। অতিরিক্তভাবে, উভয় স্ট্রিংয়ের সূচনা এবং শেষ সূচকগুলি চিহ্নিত করে এমন কিছু আউটপুট ফিরে আসে।

উদাহরণ: (সঠিক আইও-ফর্ম্যাটটি আপনার উপর নির্ভর করে)

compress("abcd", "deab") -> "deabcd" ((2,5),(0,3))
compress("abcd", "bc")   -> "abcd" ((0,3),(1,2))
compress("abc", "def")   -> "abcdef" ((0,2),(3,5)) or "defabc" ((3,5),(0,2))

decompress

decompressএর বিপরীত কার্যটি গণনা করে compress, এটি একটি স্ট্রিং এবং দুটি সূচনা এবং শেষ সূচক দেওয়া হয় (যে ফর্ম্যাটটিতে তারা আপনার দ্বারা ফিরানো হয় compress), দুটি মূল স্ট্রিং ফিরিয়ে দিন return আপনার কেবল বৈধ ইনপুটগুলি পরিচালনা করতে হবে। নিম্নলিখিত সমতা সব স্ট্রিং জন্য রাখা উচিত s1, s2:

(s1, s2) == decompress (compress (s1, s2))

উদাহরণ: ( উদাহরণগুলির বিপরীতে compress)

decompress "deabcd" ((2,5),(0,3)) -> "abcd" "deab" 
decompress "abcd" ((0,3),(1,2))   -> "abcd" "bc"

decompress "abcdef" ((0,2),(3,5)) -> "abc" "def"   
 or (whichever version your "compress" generates)
decompress "defabc" ((3,5),(0,2)) -> "abc" "def"

স্কোরিং

আপনার স্কোর কল করে ফিরে আসা স্ট্রিংয়ের আকার compress("<code of compress>", "<code of decompress>")। এটি একটি কম স্কোর ভাল।

উদাহরণ:

কোড ধরে জন্য আপনার ফাংশন compressহয় c=abcdএবং কোড decompressহল d=efghi। তারপরে compress("c=abcd", "d=efghi")ফলন হয় "c=abcd=efghi"(এবং সূচকগুলি, তবে সেগুলি স্কোরিংকে প্রভাবিত করে না) সুতরাং স্কোরটি length "c=abcd=efghi" = 12

অতিরিক্ত বিধি

  • এই চ্যালেঞ্জের চেতনায় আপনার compressএবং কমপক্ষে একটি চরিত্রের decompress ওভারল্যাপ হওয়া উচিত । আপনি একটি মন্তব্য যুক্ত করে এই তুচ্ছভাবে অর্জন করতে পারেন, তবে নোট করুন যে এটি করা আপনার স্কোর বাড়িয়ে তুলবে এবং সহজাতভাবে ওভারল্যাপিং কোড ব্যবহার করে সংক্ষিপ্ত সমাধান হতে পারে।
  • compressএবং যে decompressকোনও মুদ্রণযোগ্য ASCII অক্ষর পাশাপাশি আপনি সংজ্ঞায়িত করতে compressএবং ব্যবহার করেছেন এমন সমস্ত অক্ষর যুক্ত স্ট্রিংগুলি পরিচালনা করতে সক্ষম হওয়া উচিত decompress
  • সূচকগুলি শূন্য বা এক-সূচকযুক্ত হতে পারে।
  • আপনার প্রোগ্রাম বা ফাংশনগুলির আসলে নামকরণ করতে হবে না compressএবং decompress

আপনি কোডটি সঙ্কুচিত করতে এবং সংক্ষেপিত করতে চালাতে আপনি বিভিন্ন কমান্ড লাইন যুক্তি ব্যবহার করতে পারেন?
মাইল্ডলি মিল্কিওয়েস্ট

অবশ্যই। আপনাকে দুটি প্রোগ্রাম দিতে হবে এবং সাইট পলিসি যতক্ষণ না কমান্ড লাইন আর্গুমেন্টগুলি গণনা করা যায় ততক্ষণ আপনি আপনার প্রতিটি প্রোগ্রামের জন্য বিভিন্ন কমান্ড লাইন আর্গুমেন্ট দিতে পারেন।
লাইকনি

উত্তর:


25

জিএনইউ প্রোলগ, 105 পয়েন্ট

s(U,L/M,C):-prefix(A,C),length(A,M),suffix(U,A),length(U,L).
o(A-B,C-X-Y):-length(C,_),s(A,X,C),s(B,Y,C).

(এই গনুহ Prolog প্রয়োজন কারণ prefixএবং suffixপোর্টেবল নয়।)

এই চ্যালেঞ্জের জন্য প্রোলোগের একটি আকর্ষণীয় এবং প্রধান সুবিধা রয়েছে; আপনি একাধিক কল প্যাটার্নগুলি পরিচালনা করতে একটি ফাংশন লিখতে পারেন (অর্থাত্ আপনি কেবল একই আউটপুট পেতে ফাংশনটিকে একটি ইনপুট দিতে পারবেন না, সংশ্লিষ্ট ইনপুটটি পেতে ফাংশনটিকে আউটপুট দিতে পারেন)। এর মতো, আমরা এমন একটি ফাংশন সংজ্ঞায়িত করতে পারি যা সংক্ষিপ্তকরণ এবং ডিকম্প্রেশন উভয়ই পরিচালনা করতে পারে, যার ফলে 105-বাইট জমা দেওয়া যায় যা একটি ফাংশন সংজ্ঞা দেয় oযা উভয় দিক দিয়ে কাজ করে। (ঘটনাক্রমে, আমি বেশিরভাগই এটি একটি সংক্ষেপক হিসাবে লিখেছিলাম - এটি সহজ - এবং একটি সংক্ষেপকটি "বিনামূল্যে" পেয়েছি)) সাধারণভাবে, আমরা এই কাজের জন্য প্রোলোগের একটি খুব ছোট প্রোগ্রাম আশা করতে পারি, যদি এটি এতটা খারাপ না হয় তবে স্ট্রিং হ্যান্ডলিংয়ে (দু'টি অনুপস্থিত আদিম পদগুলির ক্ষেত্রে, এবং ভীষণ দীর্ঘ নাম থাকা প্রশ্নে আদিম পদগুলির ক্ষেত্রে)

প্রথম যুক্তিটি oহল স্ট্রিংগুলির একটি টুপল, যেমন "abcd"-"deab"। দ্বিতীয় যুক্তির মতো রূপ রয়েছে "deabcd"-4/6-4/4; এটি মোটামুটি স্ট্যান্ডার্ড নেস্টেড টুপল, এবং এর অর্থ স্ট্রিংটি "ডিএবিসিডি", প্রথম স্ট্রিংটির দৈর্ঘ্য 4 এবং শেষ হয় ষষ্ঠ অক্ষরে, দ্বিতীয় স্ট্রিংটির দৈর্ঘ্য 4 এবং চতুর্থ অক্ষরটিতে শেষ হয়। (নোট করুন যে জিএনইউ প্রোলগের একটি স্ট্রিং হ'ল অক্ষর কোডগুলির একটি তালিকা যা ডিবাগিংকে বিরক্তিকর করে তোলে কারণ প্রয়োগটি পূর্বনির্ধারিতভাবে পরবর্তী ব্যাখ্যাটিকে পছন্দ করে)) আপনি যদি দেনoএকটি যুক্তি, এটি আপনার জন্য অন্যটিকে আউটপুট দেবে (এভাবে আপনি প্রথম যুক্তি দিলে একটি সংক্ষেপক হিসাবে কাজ করেন এবং দ্বিতীয়টি দিলে একটি সংক্ষেপক)। যদি আপনি এটি উভয় যুক্তিই দেন তবে এটি যাচাই করবে যে সংকোচিত উপস্থাপনটি প্রদত্ত স্ট্রিংগুলির সাথে মেলে। আপনি যদি এটি শূন্য আর্গুমেন্ট দেন তবে এটি এর মতো আউটপুট উত্পন্ন করবে:

| ?- o(X,Y).
X = []-[]
Y = []-0/0-0/0 ? ;

X = []-[]
Y = [_]-0/0-0/0 ? ;

X = []-[A]
Y = [A]-0/0-1/1 ? ;

many lines later

X = [A]-[B,A,C]
Y = [B,A,C]-1/2-3/3 ? ;

আই / ও ফর্ম্যাটটির উপরের বর্ণনাটি পুরোপুরি পুরোপুরি প্রোগ্রামের একটি বিবরণ; প্রোগ্রামে খুব বেশি কিছু নেই। মূল্যায়ন আদেশের ইঙ্গিতগুলির সাথে একমাত্র সূক্ষ্মতা; আমাদের নিশ্চিত করতে হবে যে প্রোগ্রামটি এমন কোনও অনুসন্ধান কৌশল ব্যবহার করবে না যা সমাপ্তির গ্যারান্টিযুক্ত, তবে সংক্ষিপ্ততম আউটপুট স্ট্রিং উত্পাদন করে।

সংকোচন করার সময়, আমরা length(C,_)(" Cএকটি দৈর্ঘ্য আছে") দিয়ে শুরু করি , এটি এমন কৌশল যা আমি অনেক প্রোলগ এবং ব্র্যাচেলগ উত্তরগুলিতে ব্যবহার করেছি; প্রোলোগ যদি এই প্রথম জিনিসটি দেখেন তবে এটি Cঅন্য যে কোনও কিছুর দৈর্ঘ্য হ্রাসকে অগ্রাধিকার দেবে । এটি নিশ্চিত করে যে আমাদের ন্যূনতম দৈর্ঘ্য রয়েছে C। সীমাবদ্ধতার ক্রমটি sসাবধানে বেছে নেওয়া হয়েছে যাতে অনুসন্ধানের প্রতিটি সম্ভাব্য প্রার্থীর দৈর্ঘ্যের জন্য সীমাবদ্ধ সময় লাগবে C; Aদ্বারা সীমাবদ্ধ C(আমরা জানি না C, কিন্তু আমরা লক্ষ্য মান আমরা তার দৈর্ঘ্যের জন্য আছে জানি না), Mদ্বারা A, Uদ্বারা A, এবং Lদ্বারা U, তাই অনুসন্ধানসমূহ কেউই সীমাহীন সময় নিতে পারে।

সঙ্কোচন করার সময়, আমরা Cসরাসরি ব্যবহারকারী দ্বারা দেওয়া হয় by এটি আবারও নিশ্চিত করে যে একই সীমাবদ্ধতার সীমাবদ্ধতার কারণে প্রোগ্রামটি সীমাবদ্ধ সময়ে চলবে। (প্রোলোগের মূল্যায়নের আদেশ সম্পর্কে সচেতন লোকেরা নোট করবেন যে সংক্ষেপন করার সময় সংজ্ঞাটি sখুব অদক্ষ ছিল; স্থাপন করা length(A,M)এবং length(U,L)প্রথমটি দ্রুততর হবে তবে length(A,M)সংক্ষেপণের সময় শুরুতে অগ্রসর হওয়া অসীম লুপের কারণ হতে পারে কারণ না তখনও কোনও কিছুর দ্বারা আবদ্ধ হয় Aনা M) ।)


13

ব্র্যাচল্যাগ , 50 46 বাইট

{Ċ∧Lċ₂l∧Lgj:?z{tT∧?h~cṪhlI∧ṪbhTl:I+-₁:I↔}ᵐ:L}

এটি অনলাইন চেষ্টা করুন!

ডিকম্প্রেস:

~{Ċ∧Lċ₂l∧Lgj:?z{tT∧?h~cṪhlI∧ṪbhTl:I+-₁:I↔}ᵐ:L}

এটি অনলাইন চেষ্টা করুন!

@ আইস 523 এর জন্য 5 বাইট সংরক্ষণ করা হয়েছে

ব্যাখ্যা

ঘোষিত ভাষাগুলির ভাল দিকটি হ'ল আমরা উভয় সংকোচনের এবং সংক্ষেপিত করার জন্য একই কোডটি পুনরায় ব্যবহার করতে পারি। এই হিসাবে, সংকোচনের জন্য কোডটি ডিকম্প্রেস করার মতো ঠিক একই রকম , শুরুতে অতিরিক্ত সহ ।~

এটি ~ব্র্যাচল্যাগকে আর্গুমেন্টের ক্রমকে বিপরীত করতে বলে (যা ইনপুট হিসাবে আউটপুট এবং ইনপুট হিসাবে আউটপুট ব্যবহার করে)। যেহেতু সংকোচনের কোনও নেই ~, এটি স্ট্যান্ডার্ড অর্ডারে প্রকটটি চালায়। যেহেতু ডিকম্প্রেসের কেবল একটি রয়েছে, এটি এটি আউটপুট হিসাবে ইনপুট এবং ইনপুট হিসাবে আউটপুট দিয়ে চালায়।

এইভাবে, আমরা ~উভয় সংক্ষেপে এবং সংক্ষেপিত করতে একই কোড (সেই অতিরিক্ত অতিরিক্ত মডুলো ) ব্যবহার করতে পারি : সংক্ষিপ্তকরণ দুটি স্ট্র্যাপকে ইনপুট হিসাবে এবং আউটপুট হিসাবে একটি ভেরিয়েবল সরবরাহ করে, এবং ডিকম্প্রেসিং ইনডেক্স হিসাবে সূচকগুলি এবং সংক্ষেপিত স্ট্রিং সরবরাহ করে এবং ইনপুট হিসাবে একটি ভেরিয়েবল সরবরাহ করে ।

স্পষ্টতই এর অর্থ হ'ল আমাদের সংকোচনকারী কোড সম্পর্কে আমাদের কিছুটা স্পষ্ট থাকতে হবে, যাতে দোভাষী তাকে "পিছনের দিকে" চালাতে সক্ষম হয়। এজন্য কমপ্রেসার নিজেই কিছুটা দীর্ঘ।

সংক্ষিপ্তকরণের কোড (এবং এইভাবে ডিকম্প্রেসও এর) এর একটি বিচ্ছেদের কথা এখানে রয়েছে:

{……………………………………………………………………}   Call that predicate the normal way (with swapped arguments
                                 for decompress)
   Ċ                           Input has two elements
   ∧Lċ₂l                       L is a string of any length (measuring its length forces it to
                                 take a specific length from 0 to +inf)
   ∧Lgj                        The list [L,L]
       :?z                     The list [[L, First elem of Input],[L,second elem of input]]
          {………………………………}ᵐ:L    Final output is the [M,L] where M is the result of mapping
                                 the predicate below on both elements of the zip
           tT                  The second element of the input is T
           ∧?h~cṪ              Anticoncatenate the first element of the input into [A,B,C]
           hlI                 I = length(A)
           ∧ṪbhTl:I+-₁         J = length(T) + I - 1
           :I↔                 Output = [I,J]

4

জেলি , 58 50 বাইট

আইস 523 -1 বাইট ধন্যবাদ ( দ্বি-বাইট স্ট্রিংয়ের জন্য ব্যবহার করুন )

এটি বেশ গল্ফযোগ্য হতে পারে ...

সংক্ষেপণ দুটি স্ট্রিং আর্গুমেন্ট নেয় এবং একটি তালিকা দেয়:
[[[startA, lengthA], [startB, lengthB]], compressedString]

w³;w⁴$
0;J⁸ḣ;€
ç;ç@ÑẠ$ÐfLÐṂṪµ³,⁴L€ż@Ñ,

Decompression একটি আর্গুমেন্ট লাগে (যেমন একটি তালিকা) এবং দুটি * স্ট্রিং প্রদান করে:

,
⁾ṫḣżFv
Ḣç€Ṫ

ওভারল্যাপেড কোড:

w³;w⁴$
0;J⁸ḣ;€
ç;ç@ÑẠ$ÐfLÐṂṪµ³,⁴L€ż@Ñ,
⁾ṫḣżFv
Ḣç€Ṫ

এক-ইন্ডেক্স।

* এটি জেলির অন্তর্নিহিত মুদ্রণ বিন্যাসের কারণে সুস্পষ্ট নাও হতে পারে, তাই উপরের সাথে লিঙ্কিত ট্রাইআইটঅনলাইনে কোডটির Yমুদ্রিত আউটপুটটিতে দুজনের মধ্যে একটি লাইন ফিড toোকানোর জন্য একটি অতিরিক্ত বাইট ( শেষে একটি) রয়েছে।

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

কিভাবে?

ç;ç@ÑẠ$ÐfLÐṂṪµ³,⁴L€ż@Ñ, - Compression: stringA, stringB
ç                       - call the last link (2) as a dyad
  ç@                    - call the last link (2) as a dyad with reversed arguments
 ;                      - concatenate (gives all overlapping strings)
       Ðf               - filter keep:
      $                 -     last two links as a monad
    Ñ                   -         call the next link (1) as a monad
     Ạ                  -         All? (no zeros exist in that result)
          ÐṂ            - filter keep with minimal:
         L              -     length
            Ṫ           - tail (for when more than one exists)
             µ          - monadic chain separation (we now have the compressed string)
              ³,⁴       - [stringA, stringB]
                 L€     - length of €ach
                   ż@   - zip with reversed arguments with
                     Ñ  - next link (1) as a monad with the compressed string
                      , - paired with the compressed string

J0;⁸ḣ;€ - Link 2, possible overlaps: stringL, stringR
J       - range(length(stringL)) - [1,2,...,length(stringL)]
 0;     - zero concatenate       - [0,1,2,...,length(stringL)]
   ⁸    - stringL
    ḣ   - head (vectorises)      - [empty string, first char, first two, ..., stringL]
     ;€ - concatenate €ach with stringR

w³;w⁴$ - Link 1, substring indexes: stringX
w³     - first index of first program argument in stringX or 0 if not found
  ;    - concatenated with
     $ - last two links as a monad
   w⁴  -     first index of second program argument in stringX or 0 if not found
Ḣñ€Ṫ - Decompression: [[[startA, lengthA], [startB, lengthB]], compressedString], ?
Ḣ    - head - [[startA, lengthA], [startB, lengthB]]
   Ṫ - tail - compressedString
 ç€  - call the last link (2) as a dyad for €ach of the left list
     -- extra Y atom at TIO joins the resulting list of two strings with a line feed.

⁾ṫḣżFv - Link 2, extract a substring: [start, length], string
⁾ṫḣ    - string "ṫḣ"
   ż   - zip with [start, length] to yield [['ṫ', start],['ḣ', length]]
    F  - flatten, making a list of characters
     v - evaluate as Jelly code with the string as an argument
       - this evaluates as string.tail(start).head(length) yielding the substring

, - Link 1: only here to make an overlap with the compression program.

“ṫḣ”2-চরিত্রের স্ট্রিংয়ের জন্য জেলির সিনট্যাক্স ব্যবহার করে 1 বাইট দ্বারা গল্ফ করা যায়।

এটি প্রতি সেউকের উত্তরের সাথে সম্পূর্ণ সম্পর্কিত নয় এমন একটি প্রশ্ন, তবে আপনি কি কোডটির ব্যাখ্যা হাত দিয়ে লিখেছেন বা কোড থেকে কোড তৈরি করার কোনও সরঞ্জাম আছে?
tfrascaroli

@tfrascaroli আমি হাতে হাতে এটি লিখেছি
জোনাথন অ্যালান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.