প্রায় মোবি ডিক লিখুন


297

এখানে হারমান মেলভিলির মবি-ডিকের পাঠ্য সম্বলিত একটি 1.2Mb ASCII পাঠ্য ফাইল রয়েছে ; বা, হোয়েল । আপনার কাজটি হ'ল একটি প্রোগ্রাম বা ফাংশন (বা শ্রেণি ইত্যাদি) - নীচে দেখুন) যা এই ফাইলটিকে একবারে একটি করে অক্ষর দেওয়া হবে এবং প্রতিটি পদক্ষেপে অবশ্যই পরবর্তী অক্ষরটি অনুমান করতে হবে।

এটি । আপনার স্কোর হবে

2*L + E

Lবাইটগুলিতে আপনার জমা দেওয়ার আকারটি কোথায় এবং Eএটির দ্বারা ভুলভাবে অনুমান করা অক্ষরের সংখ্যা। সর্বনিম্ন স্কোর জয়।

আরও বিশদ

আপনার জমাটি কোনও প্রোগ্রাম বা ফাংশন (ইত্যাদি) হবে যা ডাকা বা ডাকা হবে বা একাধিকবার ডেটা প্রেরণ করা হবে। (1215235 বার যথার্থ হওয়ার জন্য।) যখন এটি n তম বারের জন্য বলা হয় তখন এটি n তম অক্ষর দেওয়া হবে whale.txtবা whale2.txtএটি অবশ্যই তার অনুমানের ( এন + 1 ) তম অক্ষরের জন্য আউটপুট দিতে হবে । Eতার স্কোর এর কম্পোনেন্ট অক্ষরের মোট সংখ্যা এটি ভুল অনুমান করা হবে।

বেশিরভাগ সাবমিশনগুলিকে অনুরোধগুলির মধ্যে কিছু স্থিতি সংরক্ষণ করতে হবে, যাতে তারা জানতে পারে যে তাদের কতবার ডাকা হয়েছিল এবং পূর্ববর্তী ইনপুটগুলি কী ছিল track আপনি কোনও বাহ্যিক ফাইলে লিখে staticবা বৈশ্বিক ভেরিয়েবলগুলি লিখে ফাংশন না করে একটি ক্লাস জমা দিয়ে, রাষ্ট্রীয় মোনাড ব্যবহার করে বা আপনার ভাষার জন্য অন্য যে কোনও কাজ করে তা করতে পারেন। আপনার দাখিলের ক্ষেত্রে প্রথম প্রার্থনার আগে তার রাজ্যকে আরম্ভ করার জন্য প্রয়োজনীয় কোনও কোড অবশ্যই অন্তর্ভুক্ত করতে হবে।

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

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

আপনার জমা দেওয়া এবং এই স্কোর-গণনার প্রোগ্রামের মধ্যে ইন্টারফেস সম্পর্কে, যতক্ষণ না আপনার প্রোগ্রামটি সর্বদা তার পরবর্তী ইনপুট বাইট পাওয়ার আগে আউটপুট একটি বাইট দেয় anything (সুতরাং, উদাহরণস্বরূপ, আপনি কেবল এটি সমস্ত ইনপুট যুক্ত স্ট্রিংটি পাস করতে পারবেন না এবং আউটপুটের সমস্তটি সম্বলিত একটি স্ট্রিং ফিরে পাবেন না))

আপনাকে অবশ্যই আপনার পরীক্ষা প্রোগ্রামটি চালাতে হবে এবং আপনার প্রবেশ জমা দেওয়ার আগে আপনার স্কোরটি গণনা / যাচাই করতে হবে। যদি আপনার জমাটি আপনার স্কোরটি যাচাই করার জন্য খুব ধীরে চলে তবে তা প্রতিযোগিতায় নেওয়ার যোগ্য নয়, এমনকি যদি আপনি জানেন যে এর স্কোরটি নীতিগতভাবে কী হবে would

Lআপনার স্কোর এর কম্পোনেন্ট কোড গলফ চ্যালেঞ্জ জন্য স্বাভাবিক নিয়ম অনুযায়ী গণনা করা হবে। যদি আপনার জমাতে একাধিক ফাইল থাকে তবে দয়া করে সেই ক্ষেত্রে স্কোরিং এবং ডিরেক্টরি কাঠামো সম্পর্কিত নিয়মগুলি নোট করুন । আপনার কোড ব্যবহার করে এমন কোনও ডেটা অবশ্যই আপনার Lস্কোরের মধ্যে অন্তর্ভুক্ত থাকতে হবে ।

আপনি বিদ্যমান লাইব্রেরি আমদানি হতে পারে কিন্তু অন্য কোন বাহ্যিক ফাইল লোড করা হতে পারে, এবং আপনার কোড অ্যাক্সেস করতে পারেন না whale.txtবাwhale2.txtউপরে বর্ণিত ব্যতীত অন্য কোনওভাবে ফাইল করুন। আপনি কোনও প্রাক-প্রশিক্ষিত নিউরাল নেটওয়ার্ক বা পরিসংখ্যান সম্পর্কিত ডেটার অন্যান্য উত্স লোড করতে পারবেন না। (নিউরাল নেটওয়ার্কগুলি ব্যবহার করা ভাল, তবে আপনাকে আপনার জমা দেওয়ার ক্ষেত্রে ওজন সম্পর্কিত ডেটা অন্তর্ভুক্ত করতে হবে এবং এটি আপনার বাইট গণনা অনুসারে গণনা করতে হবে)) যদি কোনও কারণে আপনার ভাষা বা গ্রন্থাগারগুলিতে এমন কোনও বৈশিষ্ট্য অন্তর্ভুক্ত থাকে যা মবি ডিকের কিছু বা সমস্ত পাঠ্য সরবরাহ করে If , আপনি এই বৈশিষ্ট্যটি ব্যবহার নাও করতে পারেন। এগুলি বাদ দিয়ে আপনি যে কোনও বিল্ট-ইন বা লাইব্রেরি বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন যা আপনি পছন্দ মতো পাঠ্য প্রক্রিয়াকরণ, ভবিষ্যদ্বাণী বা সংক্ষেপণ সম্পর্কিত, যতক্ষণ না তারা আপনার ভাষা বা এর আদর্শ লাইব্রেরির অংশ হয়। আরও বিদেশী, বিশেষায়িত রুটিনগুলির জন্য যা পরিসংখ্যান সংক্রান্ত তথ্যের উত্স অন্তর্ভুক্ত করে, আপনাকে সেগুলি নিজেই প্রয়োগ করতে হবে এবং সেগুলি আপনার বাইট গণনায় অন্তর্ভুক্ত করতে হবে।

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

Reasonsতিহাসিক কারণে, ফাইলটির দুটি সংস্করণ রয়েছে এবং আপনি সেগুলির কোনও একটি উত্তরে ব্যবহার করতে পারেন। ইন whale2.txt(উপরে লিঙ্ক) টেক্সট আবৃত করা নেই, তাই নতুন লাইন অনুচ্ছেদের শেষে শুধুমাত্র প্রদর্শিত হবে। মূল whale.txtটেক্সট 74 অক্ষরের একটি প্রস্থ সম্পৃক্ত রয়েছে, তাই আপনি প্রতিটি লাইনের শেষে ভবিষ্যদ্বাণী করা এবং সেইসাথে টেক্সট পূর্বাভাসের আছে। এটি চ্যালেঞ্জটিকে আরও whale2.txtস্পষ্ট করে তোলে, তাই নতুন উত্তরগুলির জন্য প্রস্তাবিত। দুটি ফাইলই একই আকারের, 1215236 বাইট।


সংক্ষিপ্তসার হিসাবে, সমস্ত উত্তরের নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত করা উচিত:

  • আপনার জমা। (কোডটি, প্লাস এটির যে কোনও ডেটা ফাইল ব্যবহার করে - সেগুলি বৃহত্তর হলে লিঙ্ক হতে পারে))
  • আপনার কোড কীভাবে কাজ করে তার একটি ব্যাখ্যা। I / O পদ্ধতিটি পাশাপাশি পরবর্তী অক্ষরটি কীভাবে ভবিষ্যদ্বাণী করে তা ব্যাখ্যা করুন। আপনার অ্যালগরিদমের ব্যাখ্যা গুরুত্বপূর্ণ, এবং ভাল ব্যাখ্যা আমার কাছ থেকে উপার্জন করবে।
  • আপনার স্কোরকে মূল্যায়নের জন্য আপনি যে কোডটি ব্যবহার করেছিলেন তা। (এটি যদি পূর্বের উত্তরের মতো হয় তবে আপনি কেবল এটির সাথে লিঙ্ক করতে পারেন))
  • আপনি যে কোডটি জমা দেওয়ার জন্য ব্যবহার করেছিলেন সে কোডটির ব্যাখ্যা সহ। এর মধ্যে এমন কোড অন্তর্ভুক্ত রয়েছে যা আপনি প্যারামিটারগুলি অনুকূল করতে, ডেটা ফাইল তৈরি করতে পারেন ইত্যাদি ((এটি আপনার বাইট গণনা অনুসারে গণনা করে না তবে আপনার উত্তরে অন্তর্ভুক্ত করা উচিত))

লিডারবোর্ড

অনুগ্রহ

সময়ে সময়ে আমি বিভিন্ন পদ্ধতির উত্সাহ দেওয়ার জন্য অনুদানের অফার করব।

প্রথমটি, ৫০ পয়েন্ট, এ সময়ের সেরা স্কোরিং উত্তরের জন্য এ। রেক্সকে ভূষিত করা হয়েছিল।

দ্বিতীয়, 100 পয়েন্টগুলি একই উত্তরের জন্য এ। রেক্সকেও ভূষিত করা হয়েছিল, কারণ তারা তাদের বিদ্যমান উত্তরের একটি খুব ভাল ব্যাখ্যা যুক্ত করেছে।

পরের অনুগ্রহ, 200 পয়েন্ট , হয় পুরস্কৃত করা হবে

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

বা:

  • অন্য যিনি যেকোন পদ্ধতি ব্যবহার করে এ। রেক্সের শীর্ষ স্কোরকে (বর্তমানে 444444) পরাজিত করেন।

একবার যদি 200 পয়েন্টের অনুগ্রহ দাবি করা হয় তবে আমি সম্ভবত 400 পয়েন্ট এক অফার করব, সেই অনুযায়ী প্রয়োজনীয়তা আপডেট করে।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

9
xkcd.com/1960 এই চ্যালেঞ্জের একটি রেফারেন্স হিসাবে উপস্থিত হবে!
এ রেক্স

আমি এই সংকুচিত চিন্তা ... কিন্তু একটু অত্যন্ত দীর্ঘ যে আমার কম্পিউটার ক্র্যাশ হয় অসহায়তা
Naruyoko

উত্তর:


135

/// , 2 * 1 + 1020874 = 1020876

 

একটি স্থান মুদ্রণ।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডেনিস

এটি হ'ল কিছু চরম স্মার্ট পুরষ্কার হ্যাকিং! আপনার অবশ্যই একটি এজিআই হতে হবে;)
অ্যালেক্স

97

নোড.জেএস, 2 * 224 + 524279 = 524727

স্কোর আপডেটের জন্য দয়া করে এই পোস্টের শেষে পরিবর্তন লগটি দেখুন।

একটি বাইট গ্রহণ এবং ফিরিয়ে ফাংশন।

a=[...l='14210100'],m={},s={},b={}
f=c=>a.some((t,n)=>x=s[y=l.slice(n)]>t|/^[A-Z '"(]/.test(y)&&b[y],l+=String.fromCharCode(c),a.map((_,n)=>(m[x=l.slice(n)]=-~m[x])<s[y=l.slice(n,8)]||(s[y]=m[x],b[y]=c)),l=l.slice(1))&&x||32

এটি একটি সাধারণ পিপিএম মডেল নিয়ে গঠিত যা পরবর্তী একটিটির পূর্বাভাস দেওয়ার জন্য শেষ 8 টি অক্ষর দেখে looks

আমরা কমপক্ষে টি [এল] বার এটির মুখোমুখি হওয়ার সময় L দৈর্ঘ্যের একটি প্যাটার্নটিকে বিশ্বাস করি , যেখানে টি স্বেচ্ছাসেবী প্রান্তিকের একটি অ্যারে: [1,1,2,1,2,3,5,2] । তদুপরি, আমরা সর্বদা এমন প্যাটার্নটিতে বিশ্বাস করি যার প্রথম চরিত্রটি মেলে ।[A-Z '"(]

আমরা দীর্ঘতম বিশ্বস্ত প্যাটার্নটি নির্বাচন করি এবং কল করার সময় এই প্যাটার্নটির সাথে সর্বাধিক স্কোরের সাথে পূর্বাভাসটি ফিরিয়ে আনি।

নোট

  • এটি স্পষ্টতই গতির জন্য অনুকূলিত নয়, তবে এটি আমার ল্যাপটপে প্রায় 15 সেকেন্ডে চলে।

  • আমাদের যদি মডেলটি পুনরায় সেট না করেই একাধারে একাধিকবার প্রক্রিয়া পুনরাবৃত্তি করার অনুমতি দেওয়া হয়, তবে ত্রুটির সংখ্যা 5 টি পুনরাবৃত্তির পরে 268000 ডলারে রূপান্তরিত হবে।

  • পূর্বাভাস ফাংশনের বর্তমান সাফল্যের হার ~ 56.8%। মন্তব্যগুলিতে @ এমমিবিসের দ্বারা লক্ষ্য করা গেছে, খারাপ এবং সঠিক অনুমানগুলি যদি একসাথে মিশ্রিত করা হয় তবে ফলাফলটি সবেমাত্র পাঠযোগ্য নয়।

    উদাহরণস্বরূপ, বইয়ের শেষের নিকটে এই স্নিপেট:

    Here be it said, that this pertinacious pursuit of one particular whale,[LF]
    continued through day into night, and through night into day, is a thing[LF]
    by no means unprecedented in the South sea fishery.
    

    হয়ে:

    "e e be it said, that thes woacangtyous sarsuet of tie oort cular thale[LF][LF]
     orsinued toeough tir on e togh   and sheough toght an o ters af t shin[LF][LF]
    be to means insrocedented tn hhe sputh Sevsaonh ry,
    

    খারাপ অনুমানগুলি আন্ডারস্কোর দিয়ে প্রতিস্থাপনের মাধ্যমে, ফাংশনটি কী সঠিক হয়েছিল তা সম্পর্কে আমাদের আরও ভাল ধারণা রয়েছে:

    _e_e be it said, that th_s _____n___ous __rsu_t of __e __rt_cular _hale_[LF]
    _o__inued t__ough ___ _n__ __gh__ and _h_ough __ght _n_o ____ __ _ _hin_[LF]
    b_ _o means _n_r_cedented _n _he __uth _e_____h_ry_
    

    এনবি : উপরের উদাহরণটি কোডটির পূর্ববর্তী সংস্করণ দিয়ে তৈরি করা হয়েছিল, ইনপুট ফাইলের প্রথম সংস্করণে কাজ করে।

পরীক্ষার কোড

/**
  The prediction function f() and its variables.
*/
a=[...l='14210100'],m={},s={},b={}
f=c=>a.some((t,n)=>x=s[y=l.slice(n)]>t|/^[A-Z '"(]/.test(y)&&b[y],l+=String.fromCharCode(c),a.map((_,n)=>(m[x=l.slice(n)]=-~m[x])<s[y=l.slice(n,8)]||(s[y]=m[x],b[y]=c)),l=l.slice(1))&&x||32

/**
  A closure containing the test code and computing E.
  It takes f as input.
  (f can't see any of the variables defined in this scope.)
*/
;
(f => {
  const fs = require('fs');

  let data = fs.readFileSync('whale2.txt'),
      len = data.length,
      err = 0;

  console.time('ElapsedTime');

  data.forEach((c, i) => {
    i % 100000 || console.log((i * 100 / len).toFixed(1) + '%');

    if(i < len - 1 && f(c) != data[i + 1]) {
      err++;
    }
  })

  console.log('E = ' + err);
  console.timeEnd('ElapsedTime');
})(f)

লগ পরিবর্তন করুন

  • 524727 - whale2.txt (চ্যালেঞ্জ আপডেট) এ স্যুইচ করে 19644 পয়েন্ট সংরক্ষণ করা হয়েছে
  • 544371 - বড় ধরণের অক্ষর, একটি উদ্ধৃতি, একটি ডাবল-উদ্ধৃতি বা একটি উদ্বোধনী বন্ধনী দিয়ে শুরু করার ধরণকে জোর করে 327 পয়েন্ট সংরক্ষণ করা হয়েছে এবং সর্বদা বিশ্বাসযোগ্য হতে পারে
  • 544698 - সর্বদা বিশ্বাসযোগ্য স্থান হতে শুরু করে নিদর্শনগুলি জোর করে 2119 পয়েন্ট সংরক্ষণ করা
  • 546817 - থ্রেশহোল্ডগুলি সামঞ্জস্য করে এবং পূর্বাভাস ফাংশন গল্ফ করে 47 পয়েন্ট সাশ্রয় করেছে
  • 546864 - সর্বোচ্চ প্যাটার্ন দৈর্ঘ্য 8 টি অক্ষরে বাড়িয়ে 1496 পয়েন্ট সংরক্ষণ করা হয়েছে
  • 548360 - তাদের দৈর্ঘ্যের উপর নির্ভর করে প্রান্তিকের সাহায্যে বিশ্বস্ত নিদর্শনগুলির ধারণা প্রবর্তন করে 6239 পয়েন্ট সংরক্ষণ করা হয়েছে
  • 554599 - লাইন ফিডের পূর্বাভাস উন্নত করে 1030 পয়েন্ট সংরক্ষণ করা হয়েছে
  • 555629 - ভবিষ্যদ্বাণী ফাংশন গল্ফ করে 22 পয়েন্ট সংরক্ষণ করা
  • 555651 - ভবিষ্যদ্বাণী ফাংশন গল্ফ করে 40 পয়েন্ট সংরক্ষণ করা হয়েছে
  • 555691 - প্রাথমিক স্কোর

44
কৌতূহলের জন্য, না, এটি মবি ডিকের মতো কিছু তৈরি করে না। এটি পুরোপুরি sidg tlanses,oeth to, shuld hottut tild aoersors Ch, th! Sa, yr! Sheu arinning whales aut ihe e sl he traaty of rrsf tg homn Bho dla tiasot a shab sor ty, af etoors tnd hocket sh bts ait mtubb tiddin tis aeewnrs, dnhost maundy cnd sner aiwt d boelh cheugh -aaieiyns aasiyns taaeiins! th, tla। এটি কখনও কখনও কয়েকটি সম্পূর্ণ শব্দ পেতে পরিচালনা করে। লাইক whales
ইমিগ্রিস

23
@ ইমিবিস চ্যালেঞ্জটির শিরোনামটি বুদ্ধিমানের সাথে নির্বাচিত হয়েছিল। এটি প্রায় মবি ডিক । :-)
আরনাউল্ড

3
@ নাথানিয়েল এখানে অনেকগুলি আপডেট হয়েছে, সুতরাং এটি সবে পঠনযোগ্য এবং সত্যই তথ্যবহুল নয়। আমি উন্নতি সম্পর্কে সংক্ষিপ্ত ব্যাখ্যা দিয়ে পরিবর্তে একটি পরিবর্তন লগ যুক্ত করেছি।
আরনাউল্ড

45
আমি মনে করি আপনার প্রোগ্রামটি আসলে গ্যালিকের একটি নিখুঁত অনুবাদ করছে।
বেসকা 20

1
@ ড্রাকো 18 গুলি এই কমাটি ভাল বা খারাপ অনুমান কিনা তা বলা শক্ত। যদি এটি একটি খারাপ অনুমান হয়, ভবিষ্যদ্বাণী ফাংশনটি বৈধভাবে কোনও কমা পাওয়ার পরে, অন্যটি-চিঠি-যে-আসলে-সেখানে-পরিবর্তে-কমা পেয়েছিল তার পরে কোনও চিঠি দেওয়ার চেষ্টা করেছিল ।
আর্নল্ড

91

পার্ল, 2 · 70525 + 326508 = 467558

predictor

$m=($u=1<<32)-1;open B,B;@e=unpack"C*",join"",<B>;$e=2903392593;sub u{int($_[0]+($_[1]-$_[0])*pop)}sub o{$m&(pop()<<8)+pop}sub g{($h,%m,@b,$s,$E)=@_;if($d eq$h){($l,$u)=(u($l,$u,$L),u($l,$u,$U));$u=o(256,$u-1),$l=o($l),$e=o(shift@e,$e)until($l^($u-1))>>24}$M{"@c"}{$h}++-++$C{"@c"}-pop@c for@p=($h,@c=@p);@p=@p[0..19]if@p>20;@c=@p;for(@p,$L=0){$c="@c";last if" "ne pop@c and@c<2 and$E>99;$m{$_}+=$M{$c}{$_}/$C{$c}for sort keys%{$M{$c}};$E+=$C{$c}}$s>5.393*$m{$_}or($s+=$m{$_},push@b,$_)for sort{$m{$b}<=>$m{$a}}sort keys%m;$e>=u($l,$u,$U=$L+$m{$_}/$s)?$L=$U:return$d=$_ for sort@b}

এই প্রোগ্রামটি চালানোর জন্য আপনার এখানে এই ফাইলটি দরকার যা নামকরণ করা উচিত B। ( উপরের অক্ষরের দ্বিতীয় উদাহরণে আপনি এই ফাইলের নামটি পরিবর্তন করতে পারেন B)) কীভাবে এই ফাইলটি তৈরি করা যায় তার জন্য নীচে দেখুন।

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

প্রোগ্রামটি 582 বাইট দীর্ঘ (একটি অপ্রয়োজনীয় চূড়ান্ত নিউলাইন সহ) এবং বাইনারি ফাইলটি B69942 বাইট দীর্ঘ, তাই একাধিক ফাইলগুলি স্কোর করার নিয়ম অনুসারে আমরা L582 + 69942 + 1 = 70525 হিসাবে স্কোর করি ।

প্রোগ্রামটি প্রায় অবশ্যই একটি 64-বিট (লিটল এন্ডিয়ান?) আর্কিটেকচারের প্রয়োজন। m5.largeঅ্যামাজন ইসি 2 তে একটি দৃষ্টান্ত চালাতে প্রায় 2.5 মিনিট সময় নেয় ।

পরীক্ষার কোড

# Golfed submission
require "submission.pl";

use strict; use warnings; use autodie;

# Scoring length of multiple files adds 1 penalty
my $length = (-s "submission.pl") + (-s "B") + 1;

# Read input
open my $IN, "<", "whale2.txt";
my $input = do { local $/; <$IN> };

# Run test harness
my $errors = 0;
for my $i ( 0 .. length($input)-2 ) {
    my $current = substr $input, $i, 1;
    my $decoded = g( $current );

    my $correct = substr $input, $i+1, 1;
    my $error_here = 0 + ($correct ne $decoded);
    $errors += $error_here;
}

# Output score
my $score = 2 * $length + $errors;
print <<EOF;
length $length
errors $errors
score  $score
EOF

পরীক্ষার জোতা ফাইলটি জমা দেওয়ার অনুমান করে submission.plতবে এটি সহজেই দ্বিতীয় লাইনে পরিবর্তন করা যায়।

পাঠ্য তুলনা

"And did none of ye see it before?" cried Ahab, hailing the perched men all around him.\\"I saw him almost that same instant, sir, that Captain 
"And wid note of te fee bt seaore   cried Ahab, aasling the turshed aen inl atound him. \"' daw him wsoost thot some instant, wer, that Saptain 
"And _id no_e of _e _ee _t _e_ore__ cried Ahab, _a_ling the __r_hed _en __l a_ound him._\"_ _aw him ___ost th_t s_me instant, __r, that _aptain 

Ahab did, and I cried out," said Tashtego.\\"Not the same instant; not the same--no, the doubloon is mine, Fate reserved the doubloon for me. I 
Ahab aid  ind I woued tut,  said tashtego, \"No, the same instant, tot the same -tow nhe woubloon ws mane. alte ieserved the seubloon ior te, I 
Ahab _id_ _nd I ___ed _ut,_ said _ashtego__\"No_ the same instant_ _ot the same_-_o_ _he _oubloon _s m_ne_ __te _eserved the __ubloon _or _e_ I 

only; none of ye could have raised the White Whale first. There she blows!--there she blows!--there she blows! There again!--there again!" he cr
gnly  towe of ye sould have tersed the shite Whale aisst  Ihere ihe blows! -there she blows! -there she blows! Ahere arains -mhere again!  ce cr
_nly_ _o_e of ye _ould have ___sed the _hite Whale _i_st_ _here _he blows!_-there she blows!_-there she blows! _here a_ain__-_here again!_ _e cr

এই নমুনা ( অন্য উত্তরে নির্বাচিত ) পাঠ্যের পরিবর্তে দেরীতে দেখা দেয়, সুতরাং মডেলটি এই বিন্দু দ্বারা বেশ উন্নত। মনে রাখবেন যে মডেলটি "ইঙ্গিতগুলি" এর 70 কিলোবাইট দ্বারা বাড়ানো হয়েছে যা অক্ষরগুলি অনুমান করতে সরাসরি সহায়তা করে; এটি কেবল উপরের কোডের সংক্ষিপ্ত স্নিপেট দ্বারা চালিত নয়।

উত্সাহ জেনারেট করা হচ্ছে

নিম্নলিখিত প্রোগ্রামটি উপরের সঠিক জমা কোড গ্রহণ করে (স্ট্যান্ডার্ড ইনপুটটিতে) এবং Bউপরের সঠিক ফাইলটি তৈরি করে (স্ট্যান্ডার্ড আউটপুটে):

@S=split"",join"",<>;eval join"",@S[0..15,64..122],'open W,"whale2.txt";($n,@W)=split"",join"",<W>;for$X(0..@W){($h,$n,%m,@b,$s,$E)=($n,$W[$X]);',@S[256..338],'U=0)',@S[343..522],'for(sort@b){$U=($L=$U)+$m{$_}/$s;if($_ eq$n)',@S[160..195],'X<128||print(pack C,$l>>24),',@S[195..217,235..255],'}}'

এটি অনুরূপ গণনা সম্পাদন করার সাথে সাথে সাবমিশনটি চালাতে প্রায় দীর্ঘ সময় নেয়।

ব্যাখ্যা

এই বিভাগে, আমরা এই সমাধানটি পর্যাপ্ত বিশদে কীভাবে বর্ণনা করে যা আপনি নিজে "বাড়িতে এটি চেষ্টা" করতে পারতেন তা বর্ণনা করার চেষ্টা করব। এই উত্তরটি অন্যগুলির থেকে পৃথক করার মূল কৌশলটি "রিওয়াইন্ড" প্রক্রিয়া হিসাবে কয়েকটি বিভাগ নীচে রয়েছে তবে সেখানে পৌঁছানোর আগে আমাদের বেসিকগুলি সেট আপ করতে হবে।

মডেল

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

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

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

সামগ্রিক স্থাপত্য

বোঝার উদ্দেশ্যে, সামগ্রিক আর্কিটেকচারটি কয়েকটি টুকরো টুকরো টুকরো করা ভাল। সর্বোচ্চ-স্তরের দৃষ্টিকোণ থেকে, রাষ্ট্র পরিচালনার কোডের কিছুটা দরকার। এটি বিশেষ আকর্ষণীয় নয়, তবে সম্পূর্ণতার জন্য আমরা জোর দিয়ে বলতে চাই যে প্রতিটি পর্যায়ে প্রোগ্রামটি পরবর্তী অনুমানের জন্য জিজ্ঞাসা করা হয়, এটি এটি মবি ডিকের একটি সঠিক উপসর্গ উপলব্ধ করেছে। আমরা আমাদের অতীতের ভুল অনুমানগুলি কোনওভাবেই ব্যবহার করি না। দক্ষতার জন্য, ভাষা মডেল সম্ভবত প্রথম এন অক্ষর থেকে তার রাষ্ট্রটিকে প্রথম (এন + 1) অক্ষরের জন্য তার রাজ্যটি গণনা করতে পুনরায় ব্যবহার করতে পারে, তবে নীতিগতভাবে, এটি প্রতিবার যখনই অনুরোধ করা হয় তখন স্ক্র্যাচ থেকে জিনিসগুলি পুনরুদ্ধার করতে পারে।

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

যদি এই উত্তর হিসাবে কোনও স্ট্যান্ডার্ড সংকোচনের পদ্ধতি যেমন bzip2 ব্যবহার করে থাকে তবে "ইঙ্গিতগুলি" ফাইলটি সংকোচিত ফাইলের সাথে মিলে যায়। "দোভাষী" ডিকম্প্রেসারের সাথে সম্পর্কিত, যখন "ভাষার মডেল" কিছুটা অন্তর্নিহিত (উপরে বর্ণিত হিসাবে)।

কেন একটি ইঙ্গিত ফাইল ব্যবহার করবেন?

আরও বিশ্লেষণ করার জন্য একটি সাধারণ উদাহরণ বেছে নেওয়া যাক। মনে করুন যে পাঠ্যটি Nঅক্ষরগুলি দীর্ঘ এবং একটি মডেলের দ্বারা সান্নিধ্যযুক্ত যেখানে প্রতিটি অক্ষর (স্বতন্ত্রভাবে) Eসম্ভবত অর্ধেকের চেয়ে সামান্য কম অক্ষরযুক্ত, Tঅনুরূপভাবে অর্ধেকের চেয়ে সামান্য কম এবং Aসম্ভাবনার সাথে 1/1000 = 0.1% রয়েছে। আসুন ধরে নেওয়া যাক অন্য কোনও অক্ষর সম্ভব নয়; যে কোনও ক্ষেত্রে, Aনীল রঙের বাইরে পূর্বের অদেখা একটি চরিত্রের ক্ষেত্রে একই রকম।

যদি আমরা এল 0 পদ্ধতিতে পরিচালনা করি (তবে বেশিরভাগই নয়, তবে এই প্রশ্নের অন্যান্য উত্তরগুলির মধ্যে সবচেয়ে বেশি রয়েছে), দোভাষীর পক্ষে একটি বেছে নেওয়ার চেয়ে ভাল কৌশল Eআর নেই T। গড়ে, এটি প্রায় অর্ধেক অক্ষর সঠিক পাবে। সুতরাং E ≈ N / 2 এবং স্কোর ≈ N / 2ও। তবে, যদি আমরা একটি সংক্ষেপণ কৌশল ব্যবহার করি, তবে আমরা চরিত্রের জন্য এক বিট থেকে কিছুটা কমপ্রেস করতে পারি। এলকে বাইটে গণনা করা হওয়ায় আমরা L ≈ N / 8 পাই এবং এভাবে আগের কৌশল হিসাবে দ্বিগুণ ভাল ≈ N / 4 অর্জন করি।

এই মডেলটির জন্য চরিত্রের জন্য এক বিটের চেয়ে কিছু বেশি এই হার অর্জন করা কিছুটা অযৌক্তিক, তবে একটি পদ্ধতি হ'ল গাণিতিক কোডিং।

পাটিগণিত কোডিং

যেমনটি সাধারণভাবে জানা যায়, একটি এনকোডিং বিট / বাইট ব্যবহার করে কিছু উপাত্ত উপস্থাপনের একটি উপায়। উদাহরণস্বরূপ, ASCII হ'ল ইংরেজি পাঠ এবং সম্পর্কিত অক্ষরের একটি 7 বিট / চরিত্রের এনকোডিং এবং এটি বিবেচনাধীন মূল মবি ডিক ফাইলের এনকোডিং। কিছু অক্ষর যদি অন্যের চেয়ে বেশি সাধারণ হয়, তবে ASCII এর মতো একটি নির্দিষ্ট-প্রস্থের এনকোডিং অনুকূল নয়। এমন পরিস্থিতিতে, অনেকে হাফম্যান কোডিংয়ের জন্য পৌঁছায় । আপনি যদি প্রতিটি চরিত্রের বিট সংখ্যার পূর্ণ সংখ্যা সহ একটি স্থির (উপসর্গ-মুক্ত) কোড চান তবে এটি সর্বোত্তম।

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

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

এই মূলত-অনুকূল এনকোডিং-এ, আমরা সম্ভাব্যতা পি সহ একটি চরিত্রের জন্য -log_2 (p) বিট ব্যয় করি এবং এনকোডিংয়ের সামগ্রিক বিট-রেট শ্যানন এনট্রপি । এর অর্থ হ'ল 1/2 এর কাছাকাছি সম্ভাব্যতার একটি অক্ষর এনকোড করতে প্রায় এক বিট সময় নেয়, যখন সম্ভাব্যতার সাথে 1/1000 প্রায় 10 বিট লাগে (কারণ 2 ^ 10 মোটামুটি 1000)।

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

ত্রুটি কেন?

আমরা কেন "ইচ্ছাকৃতভাবে" ত্রুটি করতে চাইছি তা অনুপ্রাণিত করার জন্য উদাহরণটি আগে থেকেই বিশ্লেষণ করা যাক। আমরা যদি সঠিক চরিত্রটি এনকোড করার জন্য গাণিতিক কোডিং ব্যবহার করি, তবে আমরা একটি Eবা এর ক্ষেত্রে প্রায় এক বিট ব্যয় করব T, তবে এর ক্ষেত্রে দশ বিট A

সামগ্রিকভাবে, এটি বেশ ভাল এনকোডিং, তিনটি সম্ভাবনা থাকা সত্ত্বেও চরিত্রের জন্য সামান্য ব্যয় করা; মূলত, এটি Aমোটামুটি অসম্ভব এবং এর সাথে সম্পর্কিত দশ বিট আমরা প্রায়শই ব্যয় করি না। যাইহোক, এটি কি যদি আমরা এর ক্ষেত্রে পরিবর্তে কেবল একটি ত্রুটি করতে পারি তবে কি ভাল লাগবে না A? সর্বোপরি, সমস্যার মেট্রিকটি 1 বাইট = 8 বিট দৈর্ঘ্যের 2 টি ত্রুটির সমতুল্য বলে বিবেচনা করে; সুতরাং এটির মতো মনে হচ্ছে যে কোনও চরিত্রের উপর 8/2 = 4 বিটের বেশি ব্যয় করার পরিবর্তে কোনও ত্রুটি পছন্দ করা উচিত। একটি ত্রুটি বাঁচাতে বাইটের বেশি ব্যয় করা অবশ্যই সাবটটিমাল মনে হচ্ছে!

"রিওয়াইন্ড" প্রক্রিয়া

এই বিভাগটি এই সমাধানটির মূল চতুর দিকটি বর্ণনা করে, যা কোনও ব্যয় ছাড়াই ভুল অনুমানগুলি পরিচালনা করার উপায়।

আমরা যে সাধারণ উদাহরণটি বিশ্লেষণ করেছি তার জন্য, রিওয়াইন্ড প্রক্রিয়াটি বিশেষত সোজা। দোভাষী ইঙ্গিত ফাইল থেকে এক বিট পড়েন। যদি এটি 0 হয় তবে এটি অনুমান করে E। এটি যদি 1 হয় তবে এটি অনুমান করে T। পরের বার যখন এটি বলা হয়, এটি সঠিক চরিত্রটি কী তা দেখায়। যদি ইঙ্গিত ফাইলটি ভালভাবে সেট আপ করা থাকে তবে আমরা তা নিশ্চিত করতে পারি যে কোনও Eবা এর ক্ষেত্রে Tদোভাষীর সঠিকভাবে অনুমান করা যায়। তবে কি A? রিওয়াইন্ড মেকানিজমের ধারণাটি কেবল কোড Aনয় । আরও স্পষ্টভাবে বলতে গেলে, যদি দোভাষী পরে জানতে পারেন যে সঠিক চরিত্রটি একটি A, এটি রূপকভাবে " টেপটি রিওয়াইন্ডস করে": এটি পূর্বে পড়া বিটটি ফিরিয়ে দেয়। এটি যে বিটটি পড়েছে তা কোডের উদ্দেশ্যে EবাT, কিন্তু এখন না; এটি পরে ব্যবহার করা হবে। এই সহজ উদাহরণে, এই মূলত মানে এটি রাখে একই অক্ষর (মনন Eবা T) পর্যন্ত এটি ডান পায়; তারপরে এটি আরও কিছু পড়ে এবং চালিয়ে যায়।

এই ইঙ্গিতগুলি ফাইলের এনকোডিংটি খুব সহজ: সমস্তগুলি Es কে 0 বিট এবং Tএসকে 1 বিটে পরিণত করুন, সমস্ত কিছু Aসম্পূর্ণ উপেক্ষা করার সময় । পূর্ববর্তী বিভাগের শেষে বিশ্লেষণ করে, এই স্কিমটি কিছু ত্রুটি করে তবে কোনও এসকে এনকড না করে সামগ্রিকভাবে স্কোর হ্রাস করে A। একটি ছোট প্রভাব হিসাবে, এটি প্রকৃতপক্ষে ইঙ্গিতগুলি ফাইলের দৈর্ঘ্যেও সংরক্ষণ করে, কারণ আমরা প্রতিটিটির জন্য ঠিক একটি বিট ব্যবহার করি Eএবং Tকিছুটা বাদ দিয়ে কিছুটা বেশি।

একটু উপপাদ্য

আমরা কীভাবে সিদ্ধান্ত নেব কখন ত্রুটি করা যায়? মনে করুন আমাদের মডেল আমাদের পরবর্তী অক্ষরের জন্য সম্ভাব্যতা বিতরণ পি দেয়। আমরা সম্ভাব্য অক্ষরগুলিকে দুটি শ্রেণিতে বিভক্ত করব: কোডড এবং কোডড নয় । যদি সঠিক চরিত্রটি কোডড না করা হয় তবে আমরা ব্যয় ছাড়াই কোনও ত্রুটি স্বীকার করার জন্য "রিওয়াইন্ড" প্রক্রিয়াটি ব্যবহার করব। যদি সঠিক চরিত্রটি কোডিং করা থাকে, তবে আমরা গাণিতিক কোডিং ব্যবহার করে এটিকে এনকোড করতে অন্য কিছু বিতরণ Q ব্যবহার করব।

কিন্তু আমাদের কি বিতরণ প্রশ্ন নির্বাচন করা উচিত? কোডেড অক্ষরগুলির সকলের কোডড না হওয়া অক্ষরের চেয়ে উচ্চতর সম্ভাবনা (পিতে) হওয়া উচিত তা দেখতে খুব বেশি কঠিন নয়। এছাড়াও, বিতরণ প্রশ্নটিতে কেবল কোডেড অক্ষর অন্তর্ভুক্ত থাকতে হবে; সর্বোপরি, আমরা অন্যগুলি কোডিং করছি না, সুতরাং তাদের উপর আমাদের "ব্যয়" করা উচিত নয়। সম্ভাব্যতা বন্টন Q কোড করা অক্ষরগুলিতে P এর সমানুপাতিক হওয়া উচিত তা দেখতে এটি একটু কৌশলযুক্ত। এই পর্যবেক্ষণগুলি একসাথে রাখার অর্থ হল যে আমাদের সর্বাধিক সম্ভাব্য অক্ষরগুলি কোড করা উচিত তবে সম্ভবত কম সম্ভাব্য অক্ষরগুলি নয় এবং সেই প্রশ্নটি কেবল কোড করা অক্ষরগুলিতে পি উদ্ধারযোগ্য।

এটি আরও প্রমাণিত করে যে একটি দুর্দান্ত উপপাদ্য যা সম্পর্কিত "কাট অফ" কে কোডিং চরিত্রগুলির জন্য বেছে নেওয়া উচিত: আপনার যতক্ষণ না অন্য কোডেড অক্ষরগুলি সংযুক্ত হওয়ার সম্ভাবনা কমপক্ষে কমপক্ষে 1 / 5.393 এর মধ্যে একটি অক্ষর কোড করা উচিত। 5.393উপরের প্রোগ্রামটির সমাপ্তির কাছাকাছি মনে হচ্ছে এলোমেলো ধ্রুবক উপস্থিতি এটি "ব্যাখ্যা করে" । সংখ্যা 1 / 5.393 ≈ 0.18542 সমীকরণ -p লগ (16) - পি লগ পি + (1 + পি) লগ (1 + পি) = 0 এর সমাধান

কোডটিতে এই পদ্ধতিটি লেখার পক্ষে এটি যুক্তিসঙ্গত ধারণা। এই স্নিপেটটি সি ++ এ রয়েছে:

// Assume the model is computed elsewhere.
unordered_map<char, double> model;

// Transform p to q
unordered_map<char, double> code;
priority_queue<pair<double,char>> pq;
for( char c : CHARS )
    pq.push( make_pair(model[c], c) );
double s = 0, p;
while( 1 ) {
    char c = pq.top().second;
    pq.pop();
    p = model[c];
    if( s > 5.393*p )
        break;
    code[c] = p;
    s += p;
}
for( auto& kv : code ) {
    char c = kv.first;
    code[c] /= s;
}

সবগুলোকে একত্রে রাখ

পূর্ববর্তী বিভাগটি দুর্ভাগ্যক্রমে কিছুটা প্রযুক্তিগত, তবে আমরা অন্যান্য সমস্ত টুকরা একসাথে রাখলে কাঠামোটি নিম্নরূপ। প্রোগ্রামটি যখনই কোনও প্রদত্ত সঠিক চরিত্রের পরে পরবর্তী চরিত্রটির পূর্বাভাস দিতে বলা হয়:

  1. মবি ডিকের পরিচিত সঠিক উপসর্গটিতে সঠিক চরিত্রটি যুক্ত করুন।
  2. পাঠ্যের (মার্কভ) মডেলটি আপডেট করুন।
  3. গোপন সস : যদি পূর্ববর্তী অনুমান ভুল ছিল, রিওয়াইন্ড পূর্ববর্তী অনুমান আগে তার রাষ্ট্র গাণিতিক ডিকোডার এই হাল!
  4. মার্কভ মডেলটিকে পরবর্তী চরিত্রের জন্য সম্ভাব্যতা বন্টন পি সম্পর্কে ভবিষ্যদ্বাণী করতে বলুন।
  5. পূর্ববর্তী বিভাগ থেকে সাবরুটাইন ব্যবহার করে পি তে কি রূপান্তর করুন।
  6. ডিস্ট্রিবিউশন Q অনুসারে অঙ্কগুলি ফাইলের অবশিষ্ট অংশ থেকে একটি চরিত্রকে ডিকোড করতে গাণিতিক ডিকোডারকে বলুন Q
  7. ফলাফলের চরিত্রটি অনুমান করুন।

ইঙ্গিত ফাইলের এনকোডিং একইভাবে কাজ করে। সেক্ষেত্রে প্রোগ্রামটি জানে সঠিক পরবর্তী চরিত্রটি কী। যদি এটি এমন একটি চরিত্র যা কোড করা উচিত তবে অবশ্যই এটির গাণিতিক এনকোডারটি ব্যবহার করা উচিত; তবে এটি যদি কোডিং না হওয়া অক্ষর হয় তবে এটি পাটিগণিত এনকোডারটির অবস্থা আপডেট করে না।

আপনি যদি সম্ভাব্যতা বন্টন, এনট্রপি, সংক্ষেপণ এবং গাণিতিক কোডিংয়ের মতো তথ্য-তাত্ত্বিক পটভূমি বুঝতে থাকেন তবে এই পোস্টটি বোঝার চেষ্টা করেছেন এবং ব্যর্থ হয়েছেন (তাত্ত্বিকটি কেন সত্য) তবে আমাদের জানান এবং আমরা বিষয়গুলি পরিষ্কার করার চেষ্টা করতে পারি। পড়ার জন্য ধন্যবাদ!


8
বাহ, চিত্তাকর্ষক উত্তর। আমি ধরে নিই যে Bফাইল তৈরি করার জন্য অতিরিক্ত কোড দরকার ? যদি তা হয় তবে দয়া করে আপনার উত্তরটিতে এটি অন্তর্ভুক্ত করতে পারেন?
নাথানিয়েল

8
অসাধারণ! 500k স্কোর বাধা ভাঙার প্রথম (এবং এখনও অবধি একমাত্র) উত্তর।
শ্রীভাতসার

5
"ছিঁড়ে ছিটিয়ে তিমি" ওএমজি আমি কাঁদছি
ফিল করুন

5
যেহেতু অনুগ্রহকালীন সময়ে কোনও নতুন উত্তর পোস্ট করা হয়নি, তাই আমি সেরা স্কোরিং এবং সর্বাধিক পরিশীলিত পদ্ধতির হিসাবে উভয়ই আপনার উত্তরে এটি প্রদান করছি। আপনার যদি কখনও সময় থাকে তবে আমি এই উত্তরটি কীভাবে কাজ করে তার বিশদ ব্যাখ্যার আরও সত্যিকারের প্রশংসা করব, অর্থাৎ অ্যালগরিদমটি ঠিক কী?
নাথানিয়েল

2
@ নাথানিয়েল: আমি এই পোস্টে একটি ব্যাখ্যা যুক্ত করেছি। আপনি নিজেই সমাধানটি পুনরুত্পাদন করার জন্য যথেষ্ট বিশদ বলে মনে করেন কিনা আমাকে জানান।
এ রেক্স

77

পাইথন 3, 2 · 267 + 510193 = 510727

predictor

def p():
 d={};s=b''
 while 1:
  p={0:1};r=range(len(s)+1)
  for i in r:
   for c,n in d.setdefault(s[:i],{}).items():p[c]=p.get(c,1)*n**b'\1\6\f\36AcWuvY_v`\270~\333~'[i]
  c=yield max(sorted(p),key=p.get)
  for i in r:e=d[s[:i]];e[c]=e.get(c,1)+1
  s=b'%c'%c+s[:15]

এটি ওজন সহ 1, 6, 12, 30, 65, 99, 87, 117, 118, 89, 95, 118, 96, 184, 126, এর সাথে 0,…, 16 মার্কভ মডেলগুলির একটি ভারী বায়েশিয়ান সংমিশ্রণ ব্যবহার করে 219, 126]।

ফলাফলটি এই ওজনগুলির নির্বাচনের ক্ষেত্রে খুব স্পর্শকাতর নয়, তবে আমি সেগুলি অপ্টিমাইজ করেছি কারণ আমি একই দেরিতে গ্রহণযোগ্যতা পাহাড়-আরোহী অ্যালগরিদমকে ব্যবহার করেছিলাম যেটা আমি আমার জবাবকে "সিনেটের সংখ্যাগরিষ্ঠতা একসাথে রাখি" , যেখানে প্রতিটি প্রার্থীর মিউটেশন হয় একটি একক ওজনের মাত্র 1 ডলার বৃদ্ধি।

পরীক্ষার কোড

with open('whale2.txt', 'rb') as f:
    g = p()
    wrong = 0
    a = next(g)
    for b in f.read():
        wrong += a != b
        a = g.send(b)
    print(wrong)

2
কাজের জন্য সঠিক সরঞ্জাম। দুর্দান্ত স্কোর। সুন্দর.
পুরো 22

1
সম্ভাব্য স্পষ্টতা: b"\0\3\6\r\34'&-20'\22!P\n[\26"ওজনগুলির আসকি প্রতিনিধিত্ব, যেখানে ছোট অ-মুদ্রণযোগ্য মানগুলি অক্টালে পালিয়ে যায়।
সিউর

আমি ফাইলটি এমন একটি সংস্করণ দিয়ে প্রশ্নটি আপডেট করেছি যেখানে পাঠ্যটি মোড়ানো হয়নি - আপনি নিজের কোডটি আবার চালানোর চেষ্টা করতে পারেন (এটি কিছুটা আরও ভাল করতে পারে)
নাথানিয়েল

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

1
@ ক্রিসটফ আমার মডেল সংমিশ্রণটি আসলে একটি ভারিত জ্যামিতিক গড়। তবে লজিস্টিক ডোমেনে PAQ এর গড় গড় কিছুটা আলাদা — এটি আরও ভাল কিনা তা আমাকে দেখতে হবে।
অ্যান্ডারস ক্যাসরগ

55

পাইথন 3 , 2 * 279 + 592920 = 593478 2 * 250 + 592467 = 592967 2 * 271 + 592084 = 592626 2 * 278 + 592059 = 592615 2 * 285 + 586660 = 587230 2 * 320 + 585161 = 585801 2 * 339 + 585050 = 585728

d=m={}
s=1
w,v='',0
def f(c):
 global w,m,v,s,d
 if w not in m:m[w]={}
 u=m[w];u[c]=c in u and 1+u[c]or 1;v+=1;q=n=' ';w=w*s+c;s=c!=n
 if w in m:_,n=max((m[w][k],k)for k in m[w])
 elif s-1:n=d in'nedtfo'and't'or'a'
 elif'-'==c:n=c
 elif"'"==c:n='s'
 elif'/'<c<':':n='.'
 if v>4*(n!=q)+66:n='\n'
 if s:d=c
 if c<q:w=w[:-1]+q;v=s=0
 return n

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

গ্লোবাল ভেরিয়েবল ব্যবহার করে একটি ফাংশন। শব্দের স্তরে একটি মডেল তৈরি করার সময় এটি শিখেছে: এই শব্দটিতে এখন পর্যন্ত যা দেখা গেছে তা দেওয়া , পরবর্তী সাধারণ চরিত্রটি কী? আরও ইনপুট আসার সাথে সাথে এটি পাঠ্য থেকে সাধারণ শব্দগুলি বেশ ভালভাবে শিখেছে এবং পরবর্তী শব্দটি শুরু করার জন্য এটি সবচেয়ে সাধারণ চরিত্রও শিখছে ।

উদাহরণ স্বরূপ:

  • এখন পর্যন্ত যা দেখা গেছে তা যদি 'ক্যাপ্টেন' হয় তবে এটি একটি "এন" এর পূর্বাভাস দেয়
  • যদি এটি "ক্যাপ্টেন" থাকে তবে এটি কোনও স্থানের পূর্বাভাস দেয়
  • যদি এটি কোনও শব্দের শুরু হয় এবং শেষ শব্দটি "ক্যাপ্টেন" হয় তবে এটি একটি 'এ' ভবিষ্যদ্বাণী করে
  • যদি এ পর্যন্ত শব্দটি 'এ' হয় তবে এটি একটি 'এইচ' এর পূর্বাভাস দেয় (এবং তারপরে 'এ' এবং 'বি'; একইভাবে 'সি' এর জন্য)।

এটি শুরুতে খুব ভাল করে না, তবে শেষ পর্যন্ত আসল শব্দের বিশাল অংশগুলি বেরিয়ে আসছে। ফ্যালব্যাক বিকল্পটি একটি স্থান এবং একক স্থানের পরে এটি "একটি" হয়, যদি না পূর্ববর্তী অক্ষরটি "নেডফো", একটি অঙ্ক, বা হাইফেন বা অ্যাস্টোস্ট্রোফ না হত। এটি আক্রমণাত্মকভাবে characters১ টি অক্ষরের পরে লাইন বিচ্ছেদের পূর্বাভাস দেয় বা space 66 এর পরেও যদি কোনও স্থান প্রত্যাশিত হয় those ক "এই ছয়টি বিশেষ মামলার বাইরে একটি ভাল অনুমান)।

কী শব্দের জোড়গুলি একসাথে হয়েছিল তা শিখতে এবং ম্যাপিংয়ের প্রাক-প্রেরণ করা সার্থক নয় turned


এটি এর মতো পাঠ্য সহ শেষ হয়:

nl tneund his    I woi tis tnlost ahet toie tn tant  wod, ihet taptain Ahab ses
 snd t
oeed Sft   aoid thshtego    Io, fhe soie tn tant  tot the soie      ahe sewbtoon
swn tagd  aoths eatmved fhe sewbtoon wor ta  I sfey  aote of totsonld nive betse
d ahe
hate Whale iorst  Ihe e ioi beaos! -there soi beaos! -there soi beaos!

যা ইনপুটটির এই অংশের সাথে মিলে যায়:

তার চারপাশে।

"আমি তাকে প্রায় একই তাত্ক্ষণিকভাবে দেখেছি, স্যার, ক্যাপ্টেন আহাব করেছিলেন এবং আমি চিৎকার করেছিলাম," তাশতেগো বলেছিলেন।

"একই তাত্ক্ষণিক নয়; একই নয় - না, দ্বিগুনটি আমার, ভাগ্য আমার জন্য দ্বিগুণ সংরক্ষণ করেছিলেন I আমি কেবল; তোমাদের মধ্যে কেউই প্রথমে হোয়াইট হোয়েল তুলতে পারত না There সেখানে সে ফুঁক দিয়েছে! - সেখানে সে ফুঁক দিয়েছে!" -তিনি উড়ে!

আপনি দেখতে পাবেন যেখানে বিশেষত যথাযথ বিশেষ্যগুলি বেশ ভালভাবে বেরিয়ে আসে তবে শব্দের শেষগুলি বেশিরভাগ ক্ষেত্রেই সঠিক right "ডু" দেখা গেলে এটি "সন্দেহ" প্রত্যাশা করে, তবে একবার "এল" উপস্থিত হলে এটি "ডাবলুন" হয়ে যায়।

যদি আপনি এটি একই মডেলটি দিয়ে দ্বিতীয়বার চালান তবে এটি ঠিক নির্মিত এটি তাত্ক্ষণিকভাবে আরও একটি 92 কে সঠিক (51.7% -> 59.3%) পায় তবে এটি দ্বিতীয় বারবার থেকে কেবল সর্বদা 60% এর নীচে থাকে।


পরিমাপের কোডটি টিআইও লিঙ্কে রয়েছে, বা এখানে কিছুটা ভাল সংস্করণ রয়েছে:

total = 0
right = 0
with open('whale.txt') as fp:
    with open('guess.txt', 'w') as dest:
        for l in fp.readlines():
            for c in l:
                last = c
                if p == c: right += 1
                n = f(c)
                p = n
                total += 1
                dest.write(n)
                if total % 10000 == 0:
                    print('{} / {} E={}\r'.format(right, total, total-right), end='')
print('{} / {}: E={}'.format(right, total, total - right))

guess.txt শেষে অনুমান করা ফলাফল আছে।


3
এটি একটি দুর্দান্ত পদ্ধতি!
স্কাইলার 15

2
খুব বেশি <s> </s>;)
ফ্যানটাসি

1
+1 কারণ এই পদ্ধতিরটি আমাকে এলজেডব্লিউ সংক্ষেপণের অ্যালগরিদমের কথা মনে করিয়ে দেয়।
মার্কোস

25

সি ++, স্কোর: 2 * 132 + 865821 = 866085

217 বাইট সংরক্ষণের জন্য কুইন্টিনকে ধন্যবাদ!

int f(int c){return c-10?"t \n 2  sS \n  -  08........       huaoRooe oioaoheu thpih eEA \n   neo    enueee neue hteht e"[c-32]:10;}

একটি খুব সহজ সমাধান যা একটি অক্ষর দেওয়া হলেও কেবলমাত্র ইনপুট চরিত্রের পরে দেখা যায় এমন অক্ষরটিকে আউটপুট করে।

এর সাথে স্কোর যাচাই করুন:

#include <iostream>
#include <fstream>

int f(int c);

int main()
{
    std::ifstream file;
    file.open("whale2.txt");

    if (!file.is_open())
        return 1;

    char p_ch, ch;
    file >> std::noskipws >> p_ch;
    int incorrect = 0;
    while (file >> std::noskipws >> ch)
    {
        if (f(p_ch) != ch)
            ++incorrect;
        p_ch = ch;
    }

    file.close();

    std::cout << incorrect;
}

সম্পাদনা: ব্যবহার whale2.txtকরা আরও ভাল স্কোর দেয়।


5
আপনি এই অ্যারেটিকে স্ট্রিং আক্ষরিক হিসাবে অনুবাদ করতে পারেন এবং Lএকগুচ্ছ অক্ষর সংরক্ষণের জন্য এটি সরাসরি ইনলাইন করতে পারেন :)
কোয়ান্টিন

@ কুইন্টিন ধন্যবাদ! এখন আমি ভাবছি কেন আমি কেন প্রথম স্থানে এটি মনে করিনি ...
স্টিডিবক্স

20

পাইথন, 2 * 516 + 521122 = 522154

অ্যালগরিদম:

তবুও অন্য একটি অজগর জমা দেওয়া, এই অ্যালগরিদমটি সম্ভবত দৈর্ঘ্য 1, ..., l এর ক্রমগুলির দিকে তাকানো পরবর্তী চিঠিটি গণনা করে। সম্ভাবনার যোগফল ব্যবহৃত হয়, এবং আরও ভাল ফলাফল পেতে কয়েকটি কৌশল রয়েছে।

from collections import Counter as C, defaultdict as D
R,l=range,10
s,n='',[D(C) for _ in R(l+1)]
def A(c):
 global s;s+=c;
 if len(s)<=l:return ' '
 P=D(lambda:0)
 for L in R(1,l+1):
  w=''.join(s[-L-1:-1]);n[L][w].update([c]);w=''.join(s[-L:])
  try:
   q,z=n[L][w].most_common(1)[0];x=sum(list(n[L][w].values()))
  except IndexError:continue
  p=z/x
  if x<3:p*=1/(3-x)
  P[q]+=p
 if not P:return ' '
 return max(P.items(),key=lambda i:i[1])[0]
import this, codecs as d
[A(c) for c in d.decode(this.s, 'rot-13')]

ফলাফল:

বেশিরভাগ জিব্রিশ, যদিও আপনি দেখতে পাচ্ছেন এটি "ফাদার ম্যাপল" এর মতো মাঝে মাঝে বাক্যগুলিকে তুলে ধরে।

errors: 521122
TRAINING:
result:  tetlsnowleof the won -opes  aIther Mapple,woneltnsinkeap hsd   lnd the  thth a shoey,aeidorsbine ao
actual: ntal knobs of the man-ropes, Father Mapple cast a look upwards, and then with a truly sailor-like bu
FINAL:
result: mnd wnd round  ahe   ind tveryaonsracting th ards the sol ens-ike aeock tolblescn the sgis of thet t
actual: und and round, then, and ever contracting towards the button-like black bubble at the axis of that s

পরীক্ষার কোড:

খুব সহজ, বিভিন্ন পয়েন্টে পাঠ্যের কয়েকটি উদাহরণ আউটপুট করে। Whale2.txt ব্যবহার করে, কারণ এটি নিউলাইনগুলি গণনা করতে কিছু অতিরিক্ত যুক্তি এড়ায়।

from minified import A

def score(predict, text):
    errors = 0
    newtext = []
    for i, (actual, current) in  enumerate(zip(text[1:], text[:-1])):
        next = predict(current)
        errors += (actual != next)
        newtext.append(next)
        if (i % (len(text) // 100) == 0):
            print ('.', end='', flush=True)
    return errors, ''.join(newtext)

t = open('whale2.txt')
text = t.read()
err2, text2 = score(A, text)
print('errors:', err2)
print("TRAINING:")
print(text2[100000:100100].replace('\n', '\\n'))
print(text1[100001:100101].replace('\n', '\\n'))
print("FINAL:")
print(text2[121400:1215500].replace('\n', '\\n'))
print(text[121401:1215501].replace('\n', '\\n'))

3
সাইটে স্বাগতম! এটি একটি চমত্কার প্রথম জমা। :)
DJMcMayhem

@ ডিজেএমসিমেহেম, স্বাগত জানার জন্য ধন্যবাদ। আমি কিছুক্ষণ দেখার জন্য উপভোগ করেছি, এন্ট্রি করার জন্য আমার দৃষ্টি আকর্ষণ করার এটি প্রথম প্রতিযোগিতা।
ব্যবহারকারী 2699

19

সি ( জিসিসি ) , 679787 652892

84 76 বাইট, 679619 652740 ভুল অনুমান

p[128][128][128][128];a,b,c,d;g(h){p[a][b][c][d]=h;h=p[a=b][b=c][c=d][d=h];}

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

আপডেট: একটি ভাল-গল্ফযুক্ত ক্রিয়াকলাপ সহ আপডেট হওয়া ফাইলের সাথে 000 27000 পয়েন্ট অফ, 16 পয়েন্ট (8 বাইট)।

ব্যাখ্যা

এটি যেভাবে কাজ করে তা হ'ল কোডটি পাঠ্যের মধ্য দিয়ে চলার সাথে সাথে এটি সর্বশেষ অক্ষরটি মুখস্থ করে যা প্রদত্ত 4-বর্ণের ক্রমটি শেষ করে এবং সেই মানটি দেয়। কিছুটা উপরে আর্নল্ডের পদ্ধতির সাথে অনুরূপ, তবে দুটি প্রদত্ত 4-চরিত্রের ক্রম একইভাবে বন্ধ হওয়ার সহজাত সম্ভাবনার উপর নির্ভর করে।

ডি-golfed:

p[128][128][128][128];
a,b,c,d;
g(h){
    p[a][b][c][d]=h; // Memorize the last character.
    h=p[a=b][b=c][c=d][d=h]; // Read the guess. We save several
                             // bytes with the assignments inside indices.
}

... টিআইও লিঙ্কটি অকেজো। সুতরাং ফাংশনটি শেষ অ্যাসাইনমেন্টের মান দেয়?
ব্যবহারকারী 202729

আমি উত্তরটি একটি ব্যাখ্যা দিয়ে সম্পাদনা করি, তারপরে :)

1
@ রোজেম আমি একটি ডি-গল্ফযুক্ত সংস্করণ যুক্ত করেছি (যা আমি এটি অনুসরণ করতে পারি না বলেই করেছি) - আশা করি এটি আপনাকে বিরক্ত করবে না তবে দয়া করে ইচ্ছা করলে ফিরে যান।
অ্যাডাম ডেভিস

@ অ্যাডামডাভিস সি এর বেশিরভাগ প্রয়োগের ক্ষেত্রে সমস্ত বৈশ্বিক চলক শূন্য থেকে শুরু হয়। এটি অপরিবর্তিত আচরণ, সুতরাং এটি কেবল কোড-গল্ফেই ব্যবহৃত হয়।
নিডজেজেকোব

1
@ নিডজেজেকোব আহ, আপনি ঠিক বলেছেন, ধন্যবাদ! "এএনএসআই-সি প্রয়োজন যে সমস্ত অবিচ্ছিন্ন স্ট্যাটিক / গ্লোবাল ভেরিয়েবলগুলি 0 দিয়ে শুরু করা উচিত" "
অ্যাডাম ডেভিস

16

sh + bzip2, 2 * 364106 = 728212

2 * 381249 + 0 = 762498

dd if=$0 bs=1 skip=49|bunzip2&exec cat>/dev/null

এর পরে bzip2- সংক্ষেপিত তিমি 2 টেক্সট প্রথম বাইট অনুপস্থিত

এর ইনপুট উপেক্ষা করে; সঠিক উত্তর আউটপুট। এটি এক প্রান্তে একটি বেসলাইন সরবরাহ করে; ডানিরো অন্য প্রান্তে একটি বেসলাইন সরবরাহ করে।

নির্মাতা লিপি:

#!/bin/sh
if [ $# -ne 3 ]
then
    echo "Usage $0 gen.sh datafile output.sh"
    exit 1
fi

cat $1 > $3
dd ibs=1 if=$2 skip=1 | bzip2 -9 >> $3
chmod +x $3

আই / ও পরীক্ষার জোতা (টিসিসি; জিসিসির জন্য প্রথম লাইনটি কেটে দেওয়া)। এই পরীক্ষার জোতাটি কোনও উপযুক্ত প্ল্যাটফর্মের যে কোনও একটি সম্পূর্ণ প্রোগ্রাম জমা দেয় যা পড়তে / লিখতে I / O প্রত্যাশা করে can প্রতারণা এড়াতে এটি বাইট-এ-এ-টাইম আই / ও ব্যবহার করে। ব্লকিং এড়ানোর জন্য চাইল্ড প্রোগ্রামে প্রতি বাইটের পরে আউটপুট ফ্লাশ করতে হবে।

#!/usr/bin/tcc -run
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char **argv)
{
    volatile int result;
    int readfd[2];
    int writefd[2];
    int cppid;
    int bytecount;
    char c1, c2, c3;
    if (argc != 2) {
        printf("write X approximately -- service host\n");
        printf("Usage: %s serviceprocessbinary < source.txt\n", argv[0]);
        return 1;
    }
    /* Start service process */
    if (pipe(readfd)) {
        perror("pipe()");
        return 3;
    }
    if (pipe(writefd)) {
        perror("pipe()");
        return 3;
    }
    result = 0;
    if (!(cppid = vfork())) {
        char *argtable[3];
        argtable[0] = argv[1];
        argtable[1] = NULL;
        dup2(readfd[0], 0);
        dup2(writefd[1], 1);
        close(readfd[1]);
        close(writefd[0]);
        close(readfd[0]);
        close(writefd[1]);
        execvp(argv[1], argtable);
        if (errno == ENOEXEC) {
            argtable[0] = "/bin/sh";
            argtable[1] = argv[1];
            argtable[2] = NULL;
            /* old standard -- what isn't an executable
             * can be exec'd as a /bin/sh script */
            execvp("/bin/sh", argtable);
            result = ENOEXEC;
        } else {
            result = errno;
        }
        _exit(3);
    } else if (cppid < 0) {
        perror("vfork()");
        return 3;
    }
    if (result) {
        errno = result;
        perror("execvp()");
        return 3;
    }
    close(readfd[0]);
    close(writefd[1]);
    /* check results */
    read(0, &c2, 1);
    bytecount = 1;
    errno = 0;
    while (read(0, &c1, 1) > 0) {
        write(readfd[1], &c2, 1);
        if (read(writefd[0], &c3, 1) <= 0) {
            printf("%d errors (%d bytes)\n", result, bytecount);
            if (errno == 0)
                fprintf(stderr, "pipe: unexpected EOF\n");
            else
                perror("pipe");
            return 3;
        }
        if (c3 != c1)
            ++result;
        c2 = c1;
        ++bytecount;
    }
    printf("%d errors (%d bytes)\n", result, bytecount);
    return 0;
}

6
আমি মনে করি তিনি যা জিজ্ঞাসা করছেন তা: এটি কীভাবে এই ধারাটিকে লঙ্ঘন করে না but may not load any other external files, and your code may not access the whale.txt file in any way other than described above.?

8
@ রোজেম সংক্ষিপ্ত বিবরণ এখানে যা দেখানো হয়েছে তার পরে এবং কোডটি নিজেই অ্যাক্সেস করে।
ব্যবহারকারী 202729

4
প্রশ্নটি বলে: "আপনার জমা দেওয়া হবে এমন একটি প্রোগ্রাম বা ফাংশন (ইত্যাদি) যা একাধিকবার ডাকা বা আহ্বান করা হবে it যখন সময়টির জন্য বলা হয় তখন এটির nthনবম চরিত্র দেওয়া হবে whale.txtবা whale2.txtঅবশ্যই তার অনুমানের ফলাফল নির্ধারণ করা উচিত (n+1)thচরিত্র। " - এই প্রয়োজনীয়তা কীভাবে সম্পন্ন হয়? কোডটি whale.txtপ্রতিটি সময় কার্যকর করা হলে পুরো পাঠ্য প্রদর্শন করে।
axiac

1
@axiac "কিছু ঠিক আছে, যতক্ষণ না আপনার প্রোগ্রামটি সর্বদা তার পরবর্তী ইনপুট বাইট পাওয়ার আগে একটি বাইট আউটপুট দেয়" "
ব্যবহারকারী 202729

5
@ অ্যাক্সিয়াক পরীক্ষার জোড় দিয়েছি, এসটিডিএন থেকে প্রোগ্রামটিকে "কলিং বা আহবান" হিসাবে পাঠানোর বিষয়ে আমি সন্তুষ্ট। আমদানি জিনিসটি হ'ল প্রোগ্রামটি পরীক্ষার জোয়ারের মধ্য দিয়ে চলাকালীন প্রতিটি ইনপুট বাইটের পরে আউটপুটের একটি বাইট দেয়, যা আসলে এটি করে। প্রশ্নটি যেমন বলে, "যতক্ষণ না আপনার প্রোগ্রামটি তার ইনপুট পরবর্তী বাইট পাওয়ার আগে সর্বদা এক বাইট আউটপুট দেয় ততক্ষণ ঠিক আছে" "
নাথানিয়েল

13

পাইথন 3 , 879766

F=[[0]*123for _ in range(123)]
P=32
def f(C):global P;C=ord(C);F[P][C]+=1;P=C;return chr(max(enumerate(F[C]),key=lambda x:x[1])[0])

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


... যে ///স্থানটি একটি স্থান মুদ্রণ করে তার উত্তর 10 টি আপভোট পায়, যখন আমার কোডটি কেবল 3 পেতে পারে ...

ব্যাখ্যা:

প্রতিটি চরিত্রের জন্য, প্রোগ্রাম:

  • বৃদ্ধি frequency[prev][char]
  • যে চরিত্রটি সবচেয়ে বেশি প্রদর্শিত হয় তা সন্ধান করুন frequency[char]
  • এবং এটি আউটপুট।

  • টিআইও লিঙ্কে অবরুদ্ধ কোড, মন্তব্য করেছে।
  • কোডটি 131 বাইট।
  • আমার মেশিনে চালিত কোডটি রিপোর্ট করেছে:
879504 / 1215235
Time: 62.01348257784468

যার মোট স্কোর আছে

2*131 + 879504 = 879766

টিআইও-তে কোনও বড় ফাইল আপলোড করার কোনও উপায় নেই বলে (ডেনিসকে জিজ্ঞাসা করা ব্যতীত), টিআইও লিঙ্কে চালিত উদাহরণটি কেবল পাঠ্যের একটি ছোট অংশের জন্য প্রোগ্রাম চালায়।

পুরানো উত্তরের সাথে তুলনা করে, এইটির আরও 362 টির মতো ভুল অক্ষর রয়েছে তবে কোডটি 255 বাইট দ্বারা সংক্ষিপ্ত। গুণক আমার জমাটি কম স্কোর করে তোলে।


13

সি #, 378 * 2 + 569279 = 570035

using System.Collections.Generic;using System.Linq;class P{Dictionary<string,Dictionary<char,int>>m=new
Dictionary<string,Dictionary<char,int>>();string b="";public char N(char
c){if(!m.ContainsKey(b))m[b]=new Dictionary<char,int>();if(!m[b].ContainsKey(c))m[b][c]=0;m[b][c]++;b+=c;if(b.Length>4)b=b.Remove(0,1);return
m.ContainsKey(b)?m[b].OrderBy(k=>k.Value).Last().Key:' ';}}

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

এই সংস্করণটি whale2.txtফাইলটি ব্যবহার করে , কারণ এটি সফল অনুমানের সংখ্যাটিকে ব্যাপকভাবে উন্নত করে।

ক্লাসটি পরীক্ষা করতে ব্যবহৃত কোডটি নিম্নলিখিত:

using System;
using System.IO;
using System.Text;

public class Program
{
    public static void Main(string[] args)
    {
        var contents = File.OpenText("whale2.txt").ReadToEnd();
        var predictor = new P();

        var errors = 0;
        var generated = new StringBuilder();
        var guessed = new StringBuilder();
        for (var i = 0; i < contents.Length - 1; i++)
        {
            var predicted = predictor.N(contents[i]);
            generated.Append(predicted);
            if (contents[i + 1] == predicted)
                guessed.Append(predicted);
            else
            {
                guessed.Append('_');
                errors++;
            }
        }

        Console.WriteLine("Errors/total: {0}/{1}", errors, contents.Length);
        File.WriteAllText("predicted-whale.txt", generated.ToString());
        File.WriteAllText("guessed-whale.txt", guessed.ToString());

        Console.ReadKey();
    }
}

কোডটি সবেমাত্র 2 সেকেন্ডের মধ্যে চলে। কেবল রেকর্ডের জন্য, আমি লক-আপ টেবিলের কীগুলির আকারটি সংশোধন করার সময় এটি পাই (মডেলটি পুনরায় সেট না করে দ্বিতীয় রানের ফলাফলগুলি অন্তর্ভুক্ত করে):

Size   Errors   Errors(2)
-------------------------
1      866162   865850
2      734762   731533
3      621019   604613
4      569279   515744
5      579446   454052
6      629829   396855
7      696912   335034
8      765346   271275
9      826821   210552
10     876471   158263

এটি জানতে আকর্ষণীয় হবে কেন 4 টি বর্ণের কী আকার এই অ্যালগরিদমের সেরা পছন্দ।

পাঠ্য তুলনা

মূল:

"And did none of ye see it before?" cried Ahab, hailing the perched men all around him.

"I saw him almost that same instant, sir, that Captain Ahab did, and I cried out," said Tashtego.

"Not the same instant; not the same--no, the doubloon is mine, Fate reserved the doubloon for me. I only; none of ye could have raised the White Whale first. There she blows!--there she blows!--there she blows! There again!--there again!"

recreated:

"Tnd tes note of to seamtn we ore  
sried thab  wedleng the srriead te  a l tneund tes  
"T day tim t lost shet toie tn tand  aor, ahet taptain thab sid  tnd t waued tnt   said teshtego  
"To, ahe shme tn tand  aot the shme whot nhe sewbteodsan tagd  althsteatnved the sewbteodsaor te, I hncy  aote of to sanld bave beised the shate Whale iorst  Bhe e ati boaos  -the   ati boaos  -the   ati boaos  the e anains -ahe   anains 

অনুমান:

"_nd ___ no_e of __ se____ _e_ore____ried _hab_ ___l_ng the __r___d _e_ a_l ___und _____
"_ _a_ _im ___ost _h_t ___e _n_tan__ __r, _h_t _aptain _hab _id_ _nd _ ___ed __t__ said __shtego__
"_o_ _he s_me _n_tan__ _ot the s_me___o_ _he ___b__o____ _____ __t___e___ved the ___b__o___or _e_ I _n_y_ _o_e of __ ___ld _ave __ised the _h_te Whale __rst_ _he_e ___ b___s__-the__ ___ b___s__-the__ ___ b___s_ _he_e a_ain__-_he__ a_ain__

লগ পরিবর্তন করুন

  • 569279 - এ পরিবর্তিত হয়েছে whale2.txtএবং এইভাবে অপটিমাইজেশন সরানো।
  • 577366 - কোডটি দিয়ে অনুকূলিত করা হয়েছে যে কখন কোনও লাইন ফিড ফিরবে অনুমান করার চেষ্টা করেছিল।
  • 590354 - আসল সংস্করণ।

4
আপনি কী আকার এবং কলাম থ্রেশহোল্ড পরিবর্তন করার সাথে বৈকল্পিকতা দেখানোর জন্য ধন্যবাদ!
জেরেমি ওয়েইরিচ

আমি ফাইলটি এমন একটি সংস্করণ দিয়ে প্রশ্ন আপডেট করেছি যেখানে পাঠ্যটি মোড়ানো হয়নি - আপনি সম্ভবত এটি ব্যবহার করে কিছু পয়েন্ট সংরক্ষণ করতে পারবেন
নাথানিয়েল

@ নাথানিয়েল এটি সত্যিই করে। আমি উত্তর আপডেট করেছি।
চার্লি

প্রকারগুলি ঘোষণার পরিবর্তে আপনি কিছু বাইট সংরক্ষণ করতে পারেন save
এডি টি

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

11

জাভা 7, 1995 অক্ষর, (1995 * 2 + 525158) 529148

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

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

আমি 9 টি অক্ষর ব্যবহার করে এবং সম্ভব হলে পূর্ববর্তী 9 টি অক্ষরের মধ্যে পুরো শব্দের সাথে মেলে দেখার চেষ্টা করেছি। আপনি যখন স্ট্রিংয়ের মধ্যে শব্দের সাথে মিল রাখার চেষ্টা করবেন না, তখন সর্বোত্তম দৈর্ঘ্যটি 6 টি অক্ষর, আরও কয়েক হাজার আরও ভুল ধারণা তৈরি করে।

একটি আকর্ষণীয় পর্যবেক্ষণটি হ'ল 20 টি অক্ষর ব্যবহারের ফলে প্রথমবারের মতো খারাপ ভবিষ্যদ্বাণী হয়েছিল তবে পরবর্তী পাসগুলিতে 99.9 শতাংশ নির্ভুলতা তৈরি হয়েছিল। অ্যালগরিদমটি মূলত 20 বাইট খণ্ডকে ওভারল্যাপ করে বইটি মুখস্ত করতে সক্ষম হয়েছিল এবং এটি পুরোপুরি একসাথে পুরো বইটিকে একটি চরিত্রের স্মৃতি মনে করার অনুমতি দেওয়ার পক্ষে যথেষ্ট ছিল।

  • (1950 * 2 + 532919) 536819
  • (2406 * 2 + 526233) আরও ভাল অনুমান করার জন্য বিরামচিহ্নের জন্য 531045 চেক করা
  • (1995 * 2 + + 525158) 529148 আরো টোয়েকিং, কিছু শব্দবাহুল্য দূরে golfed

package mobydick; import java.util.HashMap; public class BlindRankedPatternMatcher { String previousChars = ""; int FRAGLENGTH = 9; HashMap > patternPredictor = new HashMap<>(); void addWordInfo(String key, String prediction) { HashMap predictions = patternPredictor.get(key); if (predictions == null) { predictions = new HashMap(); patternPredictor.put(key, predictions); } WordInfo info = predictions.get(prediction); if (info == null) { info = new WordInfo(prediction); predictions.put(prediction, info); } info.freq++; } String getTopGuess (String pattern) { if (patternPredictor.get(pattern) != null) { java.util.List predictions = new java.util.ArrayList<>(); predictions.addAll(patternPredictor.get(pattern).values()); java.util.Collections.sort(predictions); return predictions.get(0).word; } return null; 
} String mainGuess() { 
if (trimGuess(",") != null) return trimGuess(","); if (trimGuess(";") != null) return trimGuess(";"); 
if (trimGuess(":") != null) return trimGuess(":"); 
if (trimGuess(".") != null) return trimGuess("."); if (trimGuess("!") != null) return trimGuess("!"); if (trimGuess("?") != null) return trimGuess("?"); if (trimGuess(" ") != null) return trimGuess(" "); for (int x = 0;x< previousChars.length();x++) { String tg = getTopGuess(previousChars.substring(x)); if (tg != null) { return tg; } } return "\n"; } String trimGuess(String c) { if (previousChars.contains(c)) { 
String test = previousChars.substring(previousChars.indexOf(c)); return getTopGuess(test); } return null; } public String predictNext(String newChar) { if (previousChars.length() < FRAGLENGTH) { previousChars+= newChar; } else { for (int x = 0; x addWordInfo(previousChars.substring(x), newChar); } previousChars = previousChars.substring(1) + newChar; } return mainGuess(); 
} class WordInfo implements Comparable { public WordInfo (String text) { this.word = text; } 
String word; int freq = 0; @Override public int compareTo(WordInfo arg0) { return Integer.compare(arg0.freq, this.freq); }

এ জাতীয় ভার্চুজের ভাষার জন্য এটি বেশ ভাল স্কোর।
DJMcMayhem

1
আমি বুঝতে পেরেছিলাম যে এটি ফাইলের আকার প্রোগ্রামের আকারের তুলনায় উন্নতির জন্য প্রচুর জায়গা দেয় সেহেতু এটি একটি শটের জন্য মূল্যবান।
জিম ডব্লিউ

3
এটি জাভা 7 এর অধীনে (বা কোনও জাভা সংস্করণ, এটির মূল্যের জন্য) সংকলনযোগ্য নয়। আপনি কি দয়া করে আপনার কোড ঠিক করবেন? এটি শেষ হয়ে গেলে, আমি আনন্দের সাথে এটি গল্ফ করব যাতে আপনার স্কোর আরও উন্নত হয়।
অলিভিয়ের গ্রাগোয়ার 16'18

স্বীকৃত, তবে এটিতে আপনার ঠিক একই কোডটি সামান্য গল্ফ হওয়া উচিত: 950 বাইট । আপনার বর্তমান কোডটিতে বেশ কয়েকটি ত্রুটি রয়েছে, সুতরাং আমি নিশ্চিত না যে আমি সবকিছুতে সঠিকভাবে পূরণ করেছি। আবার, অনির্ধারিত, সুতরাং আমি কী পরিবর্তন / পুনরায় নামকরণ করেছি তা দেখার জন্য কেবল সংস্করণগুলি তুলনা করুন এবং দেখুন যে সমস্ত কিছু এখনও আপনার মূল কোড হিসাবে একই রকম কাজ করে। অবশ্যই আরও কিছু গল্ফ করা যেতে পারে, যদিও।
কেভিন ক্রুইজসেন 14

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

10

পাইথন 3, 2 × 497 + 619608 = 620602 2 × 496 + 619608 = 620600

import operator as o
l=''
w=''
d={}
p={}
s=0
def z(x,y):
 return sorted([(k,v) for k,v in x.items() if k.startswith(y)],key=o.itemgetter(1))
def f(c):
 global l,w,d,p,s
 r=' '
 if c in' \n':
  s+=1
  if w in d:d[w]+=1
  else:d[w]=1
  if w:
   if l:
    t=l+' '+w
    if t in p:p[t]+=1
    else:p[t]=1
   n=z(p,w+' ')
   if n:g=n[-1];l=w;w='';r=g[0][len(l)+1]
   else:l=w;w='';r='t'
 else:
  w=w+c;m=z(p,w)
  if m:
   g=m[-1]
   if g[0]==w:
    if s>12:s=0;r='\n'
   else:r=g[0][len(w)]
 return r

আমি এটি স্বাধীনভাবে চেষ্টা করেছি, তবে মাইকেল হোমারের উত্তরের নিকৃষ্টতম সংস্করণটি কার্যকরভাবে শেষ করেছি। আমি আশা করি যে আমার উত্তর সম্পূর্ণ অপ্রচলিত রেন্ডার না।

এটি সময়ের সাথে সাথে শব্দের একটি অভিধান তৈরি করে (অসম্পূর্ণভাবে স্ট্রিং হিসাবে সংজ্ঞায়িত বা \nকেস সংবেদনশীল এবং বিরামচিহ্ন সহ অন্তর্ভুক্ত) defined এরপরে এটি শব্দটি অভিধানের জন্য এটি অনুসন্ধান করে যা এটি এখন পর্যন্ত বর্তমান শব্দের সম্পর্কে কী জানে, ঘটনার ফ্রিকোয়েন্সি অনুসারে ফলাফলের তালিকাটি সাজায় (ধীরে ধীরে) এবং অনুমান করে যে পরের অক্ষরটি সর্বাধিক সাধারণ মিলিত শব্দের পরবর্তী অক্ষর। যদি ইতিমধ্যে আমাদের কাছে সর্বাধিক প্রচলিত মিল রয়েছে তবে শব্দটি আর মিলছে না, এটি ফিরে আসে

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

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

কোডটি হুবহু দ্রুত নয় (আমার মেশিনে ~ 2 ঘন্টা) তবে সামগ্রিকভাবে প্রায় অর্ধেক অক্ষর পায় (49%)। আমি আশা করি রান চালিয়ে গেলে স্কোরটি প্রান্তিকভাবে ভাল হবে whale2.txt, তবে আমি এটি করিনি।

আউটপুটটির সূচনাটি এরকম দেখাচ্ছে:

T t t t t t t t t L t t t tsher t t t ty t to t t te t t t t t tem t t t d b ta tnL te t tv tath a to tr t tl t l toe g to tf ahe gi te we th austitam ofd laammars, tn te to t tis nf tim oic t t th tn cindkth ae tf t d bh ao toe tr ai tat tnLiat tn to ay to tn hf to tex tfr toe tn toe kex te tia t l t l ti toe ke tf hhe kirl tou tu the tiach an taw th t t Wh tc t d t te the tnd tn tate tl te tf teu tl tn oan. HeAL. tn nn tf r t-H ta t WhALE.... S tn nort ts tlom rhe ka tnd Dr t t tALL th teuli th tis t-H taCTIONARY " t r t o t a t A t . t eALT t I t HLW t I t e t w t AO t t t AOLE, I T t t t ALE t w t t R t EK t T t R tSupplied by wnLw t t iit ty cce thet whe to tal ty tnd

তবে শেষ অবধি, এটি দেখতে আরও কিছুটা ... এমন কিছু দেখাচ্ছে। বইয়ের শেষের কাছাকাছি থেকে আমার প্রিয় প্যাসেজ,

এবং যেহেতু উভয়ই আমার হতে পারে না, তাই আমাকে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো আমি, বর্শা ছেড়ে দিলাম! "

হিসাবে আসে

I dhrnery oyay ooom the woc Ihal iiw chshtego -tit my ti ddohe bidmer Hh, ho sheee opdeprendera toetis of tygd ahesgapdo tnep tnd tf y arosl tinl ahesgaorsltoak, and tidlhty ai p, cnd telas taep toip syst ho she tachlhe tnd tith ut ay Rnet hor bf toom the wist tord oaeve of ty nsst toip recked,hontain th, tingly toadh af tingly tike 'h, tot a hoet ty oh ost sreat ess iik in ty oh ost sremf Hew hiw"aoom tnl tou oolthert tyand . taoneoo sot an ao syad tytlows of ty oii e oor hoi tike and th ohes if oaped uoueid tf ty ooadh Ih ards the t houle lhesganl p tyt tpdomsuera tiile ah the wist t hrenelidtith the Ioom ti p s di dd o hoinbtn the Ior tid toie o hoetefy oist tyoakh on the Opr tnl toufin and tnl ti dd .mh tf ooueon gaor tnd todce tovther lon by tygd ait my the th aih tapce ciice toill moaneng she thesgh thmd th the thesgaoy d jiile YhE t hrve tpothe woerk "

এটি খানকে রাগ অফ খানকে আরও বিভ্রান্ত করে তুলেছে । এবং "নিঃসঙ্গ" t "স্নেহস্বরূপ" একটি বিশেষত সন্তুষ্ট বিকল্প itution

সম্পাদনা করুন: একটি বহির্মুখী স্থান মোছা করে একটি বাইট সংরক্ষণ করা

স্কোরিং

#! /usr/bin/env python3
import sys
import os
import mobydick as moby


def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

total = 0
right = 0
real_char = ''
guess_char = 'T'
print('T',end='')
with open("whale.txt") as whale:
    while True:
        if real_char == guess_char:
            right += 1
        real_char = whale.read(1)
        if not real_char:
            eprint(str(right) + " / " + str(total) + " (" +
                str(right/total*100) + "%)")
            size = os.path.getsize("mobydick.py")
            eprint("Source size: " + str(size) + "B")
            eprint("Score: " + str(2*size + total - right))
            sys.exit(0)
        guess_char = moby.f(real_char)
        print(guess_char,end='')
        total += 1

এটি মবি ডিকের পাঠ্যক্রমের জন্য প্রোগ্রামটি চালায় এবং স্কোরটি লেখার জন্য "পূর্বাভাসিত" পাঠ্যপুস্তককে স্ট্যান্ডআউট এবং স্ট্যাডারকে আপত্তি জানায়। আমি আউটপুটটিকে কোনও ফাইলে পুনঃনির্দেশ করার পরামর্শ দিই।


2
পিপিসিজিতে আপনাকে স্বাগতম!
মার্টিন এেন্ডার

1
lambda i:i[1]মোকাবেলা করার চেয়ে সস্তা হবে না operator?
ড্রাকনিস

@ ড্রাকনিস প্রায় অবশ্যই
জর্জিওয়টসন

9

সি ++, 2 · 62829 + 318786 = 444444

এই প্রোগ্রামটি চালানোর জন্য আপনার এখানে এই ফাইলটি দরকার যা নামকরণ করা উচিত C

প্রোগ্রামটি আমাদের আগের উত্তরের মতো মার্কভ মডেলের একই সংমিশ্রণটি ব্যবহার করে । আগের মত, এই সংমিশ্রণটি মূলত ব্যবহারকারীর দ্বারা এই উত্তরটির মডেল 2699 , তবে কয়েকটি ছোট ছোট পরিবর্তন রয়েছে mod

এই উত্তরটি ঠিক আগের মতো একই মডেলটি কীভাবে ব্যবহার করে তা দেখে, উন্নতিটি পূর্বে বর্ণিত "রিওয়াইন্ড" পদ্ধতির চেয়ে আরও ভাল তথ্য-তাত্ত্বিক প্রক্রিয়া । এটি একটি কম সংযুক্ত দৈর্ঘ্য থাকার সময় কম ত্রুটি করতে সহায়তা করে। প্রোগ্রামটি খুব বেশি গল্ফ হয় না কারণ এটি স্কোরের প্রধান অবদানকারী নয়।

প্রোগ্রামটি 2167 বাইট দীর্ঘ (ইনডেন্টেশনের জন্য সমস্ত ট্যাব এবং প্রচুর অন্যান্য অপ্রয়োজনীয় অক্ষর সহ, তবে পরীক্ষার কোডের আগে) এবং বাইনারি ফাইলটি C60661 বাইট দীর্ঘ, সুতরাং একাধিক ফাইল স্কোর করার নিয়ম অনুসারে , আমরা L2167 + হিসাবে স্কোর করি 60661 + 1 = 62829।

m5.4xlargeঅ্যামাজন ইসি 2 এ ইনস্ট্যান্স চালাতে প্রোগ্রামটি প্রায় 8 মিনিট সময় নেয় এবং 16 গিগাবাইটের চেয়ে বেশি মেমরি ব্যবহার করে। (এই অতিরিক্ত মেমরির ব্যবহারের প্রয়োজন নেই - আমরা কেবল এটি অপ্টিমাইজ করি নি))

#include <map>
#include <queue>
#include <vector>
using namespace std;

FILE *in;
unsigned int a, b = -1, c, d;
string s, t;
double l, h = 1, x[128][129], y[129], m[128];
map<string, int> N;
map<string, double[128]> M;
int G, S;

int f(int C)
{
    int i, j;
    for (i = 0; i <= 20 && i <= S; i++) {
        t = s.substr(S - i);
        N[t]++;
        M[t][C]++;
    }
    s += C;
    S++;

    for (i = 0; i < 128; i++)
        m[i] = 0;

    int E = 0;
    for (i = 20; i >= 0; i--) {
        if (i > S)
            continue;
        t = s.substr(S - i);
        if (i <= 2 && E >= 100 && (i == 0 || t[0] != ' '))
            break;
        if (M.find(t) == M.end())
            continue;
        for (j = 0; j < 128; j++) {
            m[j] += M[t][j] / N[t];
        }
        E += N[t];
    }

    double r = 0;
    for (i = 0; i < 128; i++)
        r += m[i];
    for (i = 0; i < 128; i++)
        m[i] = m[i] / r;

    if (!in) {
        in = fopen("C", "r");
        for (i = 0; i < 4; i++)
            c = c << 8 | getc(in);
    } else {
        l = x[C][G]
            + (l - y[G]) * (x[C][G + 1] - x[C][G]) / (y[G + 1] - y[G]);
        h = x[C][G]
            + (h - y[G]) * (x[C][G + 1] - x[C][G]) / (y[G + 1] - y[G]);
    }

    priority_queue<pair<double, int>> q;
    for (i = 0; i < 128; i++) {
        q.push(make_pair(m[i], i));
    }

    int n = 0;
    double s = 0;
    while (q.size()) {
        i = q.top().second;
        q.pop();
        if (m[i] < s / (n + 15))
            break;
        s += m[i];
        n++;
    }

    r = 0;
    for (i = 0; i < 128; i++) {
        y[i + 1] = m[i] - s / (n + 15);
        if (y[i + 1] < 0)
            y[i + 1] = 0;
        r += y[i + 1];
    }
    for (i = 0; i < 128; i++)
        y[i + 1] /= r;

    for (i = 0; i < 128; i++) {
        r = 0;
        for (j = 0; j < 128; j++) {
            x[i][j + 1] = y[j + 1];
            if (i == j)
                x[i][j + 1] *= 16;
            r += x[i][j + 1];
        }
        for (j = 0; j < 128; j++)
            x[i][j + 1] /= r;
        x[i][0] = 0;
        for (j = 0; j < 128; j++)
            x[i][j + 1] += x[i][j];
    }

    y[0] = 0;
    for (i = 0; i < 128; i++)
        y[i + 1] += y[i];

    for (G = 0; G < 128; G++) {
        if (y[G + 1] <= l)
            continue;
        if (y[G + 1] < h) {
            d = a + (b - a) * ((h - y[G + 1]) / (h - l));
            if (c <= d) {
                b = d;
                l = y[G + 1];
            } else {
                a = d + 1;
                h = y[G + 1];
            }
            while ((a ^ b) < (1 << 24)) {
                a = a << 8;
                b = b << 8 | 255;
                c = c << 8 | getc(in);
            }
        }
        if (h <= y[G + 1])
            return G;
    }
}
// End submission here.  Test code follows.
int main()
{
    FILE *moby = fopen("whale2.txt", "r");

    int E = 0;
    int c = getc(moby);
    while (c != EOF) {
        int guess = f(c);
        c = getc(moby);
        if (c != guess)
            E++;
    }

    printf("E=\t%d\n", E);

    return 0;
}

7

পাইথন 3, 526640

274 বাইট, 526092 ত্রুটি (ব্যবহার করে whale2.txt)। এটি অবশ্যই আরও উন্নতি করতে সক্ষম, তবে এটি "পোস্ট করার পক্ষে যথেষ্ট ভাল" পর্যায়ে পৌঁছেছে।

from collections import*
D=defaultdict
M=[D(lambda:D(int))for i in range(10)]
X=""
def f(c):
 global X;G=D(int)
 for L in range(10):
  M[L][X[:L]][c]+=1;N=M[L][(c+X)[:L]]
  if N:g=max(N,key=lambda k:(N[k],k));G[g]+=N[g]*L**8
 X=(c+X)[:10]
 return max(G,key=lambda k:(G[k],k))

ধারণাটি 2, 3, 4, ..., 10 টি অক্ষরের সমস্ত রানের ফ্রিকোয়েন্সি সঞ্চয় করতে হবে store এই প্রতিটি দৈর্ঘ্যের এল এর জন্য, আমরা সর্বাধিক সাম্প্রতিক এল -1 অক্ষর একটি সঞ্চিত প্যাটার্নের সাথে মেলে কিনা তা পরীক্ষা করে দেখি; যদি তা হয় তবে আমাদের অনুমান g এল সেই ধরণটি অনুসরণ করে সবচেয়ে ঘন ঘন পরবর্তী অক্ষর। আমরা এইভাবে নয়টি অনুমান সংগ্রহ করি। কোন অনুমানটি ব্যবহার করবেন তা নির্ধারণ করার জন্য, আমরা প্রতিটি প্যাটার্নের ফ্রিকোয়েন্সিটির দৈর্ঘ্য দ্বারা 8 তম শক্তিকে ওজন করি। ওজনযুক্ত ফ্রিকোয়েন্সিগুলির বৃহত্তম অঙ্কের অনুমানটি বেছে নেওয়া হয়েছে। যদি কোনও নিদর্শন মেলে না, তবে আমরা স্থান অনুমান করি।

(সর্বাধিক প্যাটার্ন দৈর্ঘ্য এবং ওজন সূচক সবচেয়ে কম ভুল অনুমান দিতে ট্রায়াল-এবং-ত্রুটি দ্বারা নির্বাচিত ছিল।)

এখানে আমার অসম্পূর্ণ কাজ-প্রগতি সংস্করণ:

from collections import defaultdict

PATTERN_MAX_LEN = 10
prev_chars = ""
patterns = [defaultdict(lambda:defaultdict(int))
            for i in range(PATTERN_MAX_LEN)]
# A pattern dictionary has entries like {" wh": {"i": 5, "a": 9}}

def next_char(c):
    global prev_chars
    guesses = defaultdict(int)
    for pattern_len in range(PATTERN_MAX_LEN):
        # Update patterns dictionary based on pattern and c
        pattern = prev_chars[:pattern_len]
        patterns[pattern_len][pattern][c] += 1
        # Make a guess at the next letter based on pattern (including c)
        pattern = (c + prev_chars)[:pattern_len]
        if pattern in patterns[pattern_len]:
            potential_next_chars = patterns[pattern_len][pattern]
            guess = max(potential_next_chars,
                        key=lambda k:(potential_next_chars[k], k))
            frequency = potential_next_chars[guess]
            # Exact formula TBD--long patterns need to be heavily
            # advantaged, but not too heavily
            weight = frequency * pattern_len ** 8
            guesses[guess] += weight
    # Update prev_chars with the current character
    prev_chars = (c + prev_chars)[:PATTERN_MAX_LEN]
    # Return the highest-weighted guess
    return max(guesses, key=lambda k:(guesses[k], k))

এবং পরীক্ষার জোতা:

from textPredictorGolfed import f as next_char
# OR:
# from textPredictor import next_char

total = 0
correct = 0
incorrect = 0

with open("whale2.txt") as file:
    character = file.read(1)
    while character != "":
        guess = next_char(character)
        character = file.read(1)
        if guess == character:
            correct += 1
        else:
            incorrect += 1
        total += 1

print("Errors:", incorrect, "({:.2f}%)".format(100 * incorrect / total))

এখানে পাঠ্যের শুরুর কাছাকাছি কিছু নমুনা আউটপুট's ইতিমধ্যে আমরা তাদের প্রথম চিঠি দেখার পর সাধারণ শব্দ শেষ করার ক্ষমতা দেখা শুরু ( in, to, and, by; এছাড়াও, দৃশ্যতঃ school)।

 you take in hand to school others, and to teach them by what name a whale-fish
xU wshhlnrwn cindkgo dooool)tfhe -; wnd bo so rhoaoe ioy aienisotmhwnqiatl t n 

শেষের কাছে, এখনও প্রচুর ভুল রয়েছে, তবে খুব ভাল ক্রমগুলিও রয়েছে ( shmage seashawksউদাহরণস্বরূপ)।

savage sea-hawks sailed with sheathed beaks. On the second day, a sail drew near
shmage seashawks wtidod oith tua dh   tyfr.  Tn the shaond tay, wnltiloloaa niar

কিছু ভুল দেখতে এবং এটি অনুমান করা আকর্ষণীয় যে অ্যালগরিদমটি কোন শব্দটি "প্রত্যাশিত"। উদাহরণস্বরূপ, পরে sail, প্রোগ্রাম উভয় বার অনুমান o--for sailor, আমি অনুমান করে। বা আবার, , aএটি প্রত্যাশার পরে - nসম্ভবত সম্ভবত এর সাধারণ ঘটনার কারণে , and


পরিবর্তণের:

  • 274 * 2 + 526092 = 526640 কয়েকটি অতিরিক্ত ত্রুটির বিনিময়ে অ্যালগরিদম গল্ফ করেছে
  • 306 * 2 + 526089 = 526701 আসল সংস্করণ

6

পাইথন 2, স্কোর: 2 * (407 + 56574) + 562262 = 676224

পাঠ্যটিতে ব্যবহৃত  সমস্ত  শব্দের একটি তালিকা থেকে পূর্বের অক্ষরগুলির সাথে শব্দের সাথে মিল রেখে শব্দগুলির সন্ধান করে, তার উপস্থিতির সংখ্যা অনুসারে বাছাই করা।

কোড:

import zlib
f=open("d","rb")
l=zlib.decompress(f.read()).split()
w=""
def f(c):
 global w
 if c.isalpha():
  w+=c
  try:n=next(x for x in l if x.startswith(w))
  except StopIteration:return" "
  if len(n)>len(w):
   return list(n)[len(w)]
  return" "
 w="";
 n=ord(c)
 if n>31:
  return list("t \n 2  sS \n  -  08........       huaoRooe oioaoheu thpih eEA \n   neo    enueee neue hteht e")[n-32]
 return"\n"

ডেটা: https://www.DPboxbox.com/s/etmzi6i26lso8xj/d?dl=0

পরীক্ষা স্যুট:

incorrect = 0

with open("whale2.txt") as file:
    p_ch = ch = file.read(1)
    while True:
        ch = file.read(1)
        if not ch:
            break
        f_ch = f(p_ch)
        if f_ch != ch:
            incorrect += 1
        p_ch = ch

print incorrect

সম্পাদনা: ব্যবহার whale2.txtকরা আরও ভাল স্কোর দেয়।


5

সি ++ (জিসিসি), 725 × 2 + 527076 = 528526

তবুও আরেকটি উপসর্গ-ফ্রিকোয়েন্সি জমা। চালিয়ে যান whale2.txtএবং অন্যের তুলনায় সমান (সামান্য খারাপ) স্কোর পান।

#import<bits/stdc++.h>
char*T="\n !\"$&'()*,-.0123456789:;?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz";
int I[124];std::string P(7,0);struct D{int V=0;std::array<int,81>X{{0}};};std::vector<D>L(1);D
init(){for(int i=81;i--;)I[T[i]]=i;}int
f(int c){P=P.substr(1)+(char)I[c];for(int i=7;i--;){int D=0;for(char
c:P.substr(i)){if(!L[D].X[c]){L[D].X[c]=L.size();L.push_back({});}D=L[D].X[c];}++L[D].V;}std::vector<int>C(81);for(int
i=81;i--;)C[i]=i;for(int
i=0;i<7;++i){int D=0;for(char c:P.substr(i)){D=L[D].X[c];if(!D)break;}if(!D)continue;int M=0;for(int
x:C)M=std::max(M,L[L[D].X[x]].V);C.erase(std::remove_if(C.begin(),C.end(),[&](int
x){return L[L[D].X[x]].V!=M;}),C.end());if(C.size()<2)break;}return T[C[0]];}

এটি লোভের সাথে ইতিহাসের প্রত্যয় দিয়ে শুরু হওয়া দীর্ঘতম স্ট্রিংটি আবিষ্কার করে এবং একাধিক প্রার্থী থাকলে সংক্ষিপ্ত স্ট্রিংয়ের সাথে টাইব্রেক হয়।

উদাহরণস্বরূপ: যদি গত 7 অক্ষর abcdefgh, এবং স্ট্রিং abcdefghiএবং abcdefghjফর্ম সব স্ট্রিং সর্ববৃহৎ ফ্রিকোয়েন্সি সঙ্গে প্রদর্শিত হবে abcdefgh*, আউটপুট পারেন হবে iবা j, (খাটো প্রত্যয় সঙ্গে tiebreak bcdefgh, cdefgh, ...)।

অজানা কারণে, 7 টিরও বেশি কিছু এবং আমার কম্পিউটারে এটি চালানোর জন্য পর্যাপ্ত র‍্যাম নেই। এমনকি 7 সহ, এটি চালানোর জন্য আমার সমস্ত ওয়েব ব্রাউজার বন্ধ করতে হবে।


পরীক্ষার কোড:

int main() {
    init(); 

    std::cout << "Start ---\n";
    std::time_t start = std::clock();

    std::ifstream file {"whale2.txt"};
    // std::ofstream file_guess {"whale_guess.txt"};
    std::ofstream file_diff {"whale_diff.txt"};
    if (!file.is_open()) {
        std::cout << "File doesn't exist\n";
        return 0;
    }

    char p_ch, ch;
    file >> std::noskipws >> p_ch;
    int incorrect = 0, total = 0;
    // file_diff << p_ch;

    int constexpr line_len = 80;
    std::string correct, guess_diff;
    correct += p_ch;
    guess_diff += '~';

    while (file >> ch) {
        char guess = f(p_ch);

        // file_guess << guess;
/*        if (guess != ch) {
            if (ch == '\n') {
                file_diff << "$";
            } else if (ch == ' ') {
                file_diff << '_';
            } else {
                file_diff << '~';
            }
        } else {
            file_diff << ch;
        }*/
        incorrect += (guess != ch);
        total += 1;
        p_ch = ch;

        if (guess == '\n') guess = '/';
        if (ch == '\n') ch = '/';
        correct += ch; guess_diff += (ch == guess ? ch == ' ' ? ' ' : '~' : guess);
        if (correct.length() == line_len) {
            file_diff << guess_diff << '\n' << correct << "\n\n";
            guess_diff.clear();
            correct.clear();
        }
    }

    file_diff << guess_diff << '\n' << correct << "\n\n";

    file.close();
    file_diff.close();

    std::cout << (std::clock() - start) 
    / double(CLOCKS_PER_SEC) << " seconds, "
    "score = " << incorrect << " / " << total << '\n';
}

Ungolfed:

size_t constexpr N = 7;

int constexpr NCHAR = 81;

std::array<int, NCHAR> const charset = {{
'\n', ' ', '!', '"', '$', '&', '\'', '(', ')', '*', ',', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', ']', '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
}}; // this actually contains a lot of information, may want to golf it
// (may take the idea of using AndersKaseorg's algorithm, late acceptance hill climbing)

std::array<int, 'z' + 1> const char_index = [](){
    std::array<int, 'z' + 1> char_index;
    for (size_t i = NCHAR; i --> 0;) 
        char_index[charset[i]] = i;
    return char_index;
}(); // IIFE ?

std::string past (N, 0); 
// modifying this may improve the score by a few units

struct node {
    int value = 0;
    std::array<size_t, NCHAR> child_index {{0}};
};
std::vector<node> node_pool (1); // root

int f(int c) {
    past = past.substr(1) + (char) char_index[c];

    for (size_t i = 0; i < N; ++i) {
        // add past.substr(i) to the string
        size_t node = 0;
        for (char c : past.substr(i)) {
            if (node_pool[node].child_index[c] == 0) {
                node_pool[node].child_index[c] = node_pool.size();
                node_pool.emplace_back();
            }
            node = node_pool[node].child_index[c];
        }
        assert(node != 0); // the substring is non-empty
        ++node_pool[node].value;
    }

    std::vector<size_t> candidates (NCHAR);
    std::iota(candidates.begin(), candidates.end(), 0);
    for (size_t i = 0; i < N; ++i) {
        size_t node = 0;
        for (char c : past.substr(i)) {
            node = node_pool[node].child_index[c];
            if (node == 0) break;
        }
        if (node == 0) continue;

        assert(node_pool[0].value == 0);
        int max_value = 0;
        for (size_t x : candidates)
            max_value = std::max(max_value, node_pool[node_pool[node].child_index[x]].value);

        candidates.erase(
            std::remove_if(candidates.begin(), candidates.end(), [&](size_t x){
                return node_pool[node_pool[node].child_index[x]].value != max_value;
            }), candidates.end()
        );

        if (candidates.size() == 1) 
            break;
    }

    return charset[candidates[0]];
}

উদাহরণ আউটপুট:

~ ~s  ta~ hard ts tt~~~~~~~ ~doam ~~ ar~ ~ i~~~ ~~~ ~he~~~~,a~ t~~~~ t~ ho~si~  
n--as his wont at intervals--stepped forth from the scuttle in which he leaned, 

~~~ thr~ ~~ t~~ crp~~~~~~~~ a~ wap~~~~~ a~eo~~ h~~ o~~ s~~~ or~~y~ ~  boog~e~~ t
and went to his pivot-hole, he suddenly thrust out his face fiercely, snuffing u

~ a~~ ~h~ ~n~ onitn~oi~~~~~~ ~~a~ ~ cewsoat~  a~ tae~~~~ ~e~~t~~ te~~ ouc~s~i~~ 
p the sea air as a sagacious ship's dog will, in drawing nigh to some barbarous 

ct as I~ iisk~~~~ ~~e~ tls~~~~ i~~~ ~~ soe~e Ae ~ ~~e~ tar~~~~~ trd~  ot ~ h~~~ 
isle. He declared that a whale must be near. Soon that peculiar odor, sometimes 

এটি পাঠ্যের শেষের নিকটে। সর্বাধিক দীর্ঘ শব্দ বেশ সঠিকভাবে পূর্বাভাস করা হয় ( intervals, pivot-hole, distance)

 au t  tf weu~i~ aor~ mre~g~~~ m~t~~ ~~~  ~"NC~X~t~ti~  ~~n~ SNsh A FNECnSERTR O
 on as it rolled five thousand years ago./////Epilogue//"AND I ONLY AM ESCAPED A

NL~~,S~ ~HR~ yO~ -/s~n "~A~~ laeu~ta Vew~, S~e s~~  s~ ~ ain~ t~d ~t~ oirept~~ ~
LONE TO TELL THEE" Job.//The drama's done. Why then here does any one step forth

আপার কেস ভাল লাগছে না।



... এবং প্রয়োগ করা আরও কঠিন।
ব্যবহারকারী 202729

4

পাইথন 2, 756837

মারকভ চেইন হতে পারে এমন কিছু ব্যবহার করে?

import zlib
a=eval(zlib.decompress('x\x9cM\x9cis\xda\xcc\xd2\x86\xff\x8a2\xf5\xd4\x81\xb8,\x977l\'\xf9\x90\x12 \x02f\x11G\x02c||*%@,a\x11a1\xe0S\xef\x7f\x7fC\x13\xf75\xdf\xda\xaaa4\xd3\xcb\xddw\xf7\x8c\xfc\xbf\xcc\x8f\xd7E\xe6\xab\x93if\xce\x9d\xcc\x8f\xefG\xd1\x11\xf1\x1b\xa2At\x8e\xa2\'\xe2\xc5Q\xfc,\xa2{\x14+"\x9e3\xf63b\x87\x9f\xb5\x8fb$b\xeb(\x96E\x8c\x18\x1b2\xb6{\x14/D\xfcq\x14\x03\x11}\xc6zG\xb1.b\xc0\xd3\x06\xcb\xa9\xf1\xb3\xcaQl\x88X>\x8a-\x11\xb7G1\x11q\x85\x98\x1c\xc5\x95\x88\xf1Q\xec\x89\x98\x1e\xc5\x81\x88\xa2\xb3X\xc4\x19\xe2\xe4(\xbe\x898\xd6\xc9F\xa8\xe4E\x16\x19\x8a\xc8r^|U\xc9\x8b\xc7\xd8\xfcQ\xf4\x8f\xe2\xbf\x1c\x06\xbc\xa8v6\xef\xba\xb2\x17V\xf6\x92\xe8r6\x07\x9d\xcc\x95EN\xe4\xe9FW\xb6\xd9\xea6M\xa2K\xdf\xact\x86\xf9\xc976Gy\xf2\xce\xef\x96G1\x15q\xf1\xf1\xd4\xcc3\xe6\x8f\xb8\x96\xdf}\xd27\xcf\x1d\x9da\x8e\x1f\xcd\xc5c\\\x11Q\xcf\xfc\x02Q\x9c\xe7\\\xd6\xbe;\x8acY\xe5\x8c\x17\xcfu9F\xc4\x83\xfc\x0c\x076\x0b\x1d;\xc7\x97\xe7_U\x9c\xacT\xfc\xc2\x1a\xbe\xb0\x06\x83\r7b\xd9\x85<\x9d\xe8\x86\xbe|Q\xff\xfc\xf2\xa0\xe2d\xa7?\xfbr\xc5\xbc\x97\x8c\xbd\xd1\xbd}\xb9f@\x8e\x01\xb7\x88\xf7\x88w*\xce\x13v1\xc1ZCv\x1c\xebz\xe7=]\xce\x1c\x9d\xcdg\xe8,U/\x98/\x18`\xed\xf8\x8d\xa7\xe21\'\x1bo\xd4,sk\x80\xb8\xc6L\xc45Oq\xa9M\xac\x9e8\xc7?k\xb8\x9fY\xe9\x80\x9a\x8c\x9d\x8a\x98\xea\xde\x8c\xcc\xbb\x94\xa7\x13\x06\xc8\xca\xfa"\x1e\x98\xa1\xa4\xe1R\xfb\xa1\xb1W+\xf2b\xc0\xa4\x96W\xac\xa8\x15\x10=\x8d\xd3ZC#\xb2F \xd7j\xccP\xd78\xadU\x8fbWD"\xbd\xd6Q\xb7\xaf\xb5\x98\x0cH\xac\x85\xfc\x0cH\xac5\x15(k\xdd\x8f\xa7\xa6&\xf1v\xfa\x19\x00Q\xc3\x7fkxuM\xe2\xad(\xa2D\xd6\xabX\xb6&\xfeyy\x14\x1d\xdc\xa4v\x8azY\xdbU\xa4P\xf9\xc4\xcc?\x0fj\x8d\x9f\x135\xf8O\xde\xf7\xd3Q?Ym\xf4\xe9\n\xefY\xe12\xab\x9d:\xc7\n`Y\xfd>\x8a[\x11\xf1\x88\xd5\x9a\xc9\xf6\xcc\x80#\xad\xde\xd5+W\x03\x9e\x12/\xab!\xf3\x8e\x98\x81xY\xf5\x18\xd0g2\xe2e5g\xb2\x05+\x13\x07\x9d\x8b8fCD\xd1j\xca\xcf,X]\x81X+\xb0i\xa5\x88\xf5\'\x1c\x14VW`\xe9\n\x84]\x19u\xaa\x15\x16X\x81\xb0+\x0c\xb7"\'\xbf.N\xab0\xa7?n\xd5\x13^\x179\xb5\xf9\xebB<\xe4\xe1$_[c\x04\xc3\x06\'\x99W\xbd.\xb2\x1ap\xaf\x8b\xb3\x8fy\xcc\x9fW\x19\xe6t\xacE\x18\x1d\xffoR\xf1\xeb\xa2k\xc9/\x96\xfc\x1fk\xfa\x96Z\xe7u\xd1VLx]<\xa9Q^\x17\x1dkL\xd3\x9a\xe7\xdfj\xe4\xd7Eh\x8d\x8fT\xc3\xaf\x8b\x9a5\xben\xc9\ru\xd2\xd7E\xa0\xf6}]\x94\xad1\x15k\x8b\x8f\xd6\xf8\xaa\xf5\xae\xa25\xde\xb7\xe6)Y\xe3\x7fX\xb2g\x8d\xc9[\xeb/(:\xfc[\xd4P9=>X?}\xb7\xe4\x8d\xa5\x92\xad5\xe5\x9b\xb5\x9c\x9d5Fbru\x92\x7f[\xaf]Y\xe3\xd7\x96\xdaf\xd6\x16\xe7\x1a\t\xaf\x8b\x85\xb5\x06\t\x96\xe1I\x1e[\xf3L\xac\xf5\xfc\xb2~;\xb5\x9e\x0f\xac\xf1\x12\xd7\xfb\x93<\xb4\xe6\x1fYk\x8e\xad\xdf\xf6\xac\xdf\xf6u\xfc\x80\x00\x19\x10A\x03\xdcz\xa0ac\x06\x84\xe3\x00>3 2\x07D\xe6\x80\xd8\x1e\x10\xdb\x03\xd8\xc8\xc0\x02\x82\x01\xb9w \xea\xd9\x89\x08\xee\x0c\xe6\xaa\xd8\x01\xba\x19L\xf9\x19\x9a\x1c\xa0\xc8\x01\x807\x00\xf0\x06hq\x00\xd9\x1d\xf4\xd0\x89\xa5\x9e\x985\x80\xb4\x837\xd6\x00\x82\x0f\xf0\xae\x01\x19y\x80\xaf\x0c@\xf0\xc1\xf2cCf\x87Vw\xe8o\x87Vw\x98h\x87]vXk\x07a\xdc\xa1\xf6\x1d\xba\xdea\x81K\x012aR\x977\x88\x97\no\x97W<\x85u]\n\x17;e\xceK(\xda%\xc4\xed\x12\x16x\t7\xdcYV\xbe\x94-I\xba\xbcd\xa3\x97\xec\xee\xf2\\W\xb1\xc3r;l\xb4\xc3r\xbb\xbe\xea}\xd7C\x14s\x9dt\t\xb5\xdb-\xd0\x04>\xb5#)\xed\xe0\xb5;\x12\xd8\x0e\x84\xd8Q8\xec0\xe2\x8e\xe4\xbc[2\x00?\xb9\xc4#\nl\xb3\x80\xe5\n\xa2\x12![\x05\x81G!\x1e\x05AP)\xed\n\x02\xac\x02\xfa\x85\x80\xa75\xc5\xba\x02t\xad  )\xc5l\x01jW\xe8"\x86\xbcB\xd0RrR\xa1\xc5+\x08\x9d\xc2X\xd5W \xbd\x17f\xba\xcd\x82\xa8Z\xd2N!Q\xf5\x15\xdeU}\x85\x83\xc6@a\xa5\x01U\x10\xa5\x9e\xd8\xee@\x9fN 4\x06,3#\xd5\xaf\x01\xc9\x0c$\xc5\x10\xa8\x13\xe0y\xb2\xd4\x1dO0\x96I\xd5\x16\x93\xadnh\x82\x85\xcc/f \x1f\x18\x06L\xc6\xba\x9c\t\xc8c\xc8\x17\x13j\x8c\xc9L}}\x92\xea\xd2\'\xe2\x88#\x11\xd9\xd0\x04\xaa5\xe9\xf1\xb3D]\xd9\x90\xce&#\xc6\x0e\xd9[\x11\x9d\xf9\xe8\x97dj\xc8\xa5\xc6\xd3\x080dRSP\xbb\x99\x1ac\xeb<%\xf3\x9b\x00\x9d\x91\xf7\ri\xdf<2/I\xdf\xc0Y\x0c\x94\xc5<1\x03\x84\xc5\xc0W\x0ct\xc5\x84,\x07\xb2b\xe0KO\xb2\xb7\x9ah\x07\xf43\xaf\x19uv\x039\x7f\x12MI\x1d\xf3$k/\xc8\x80\x0b\xc5.s\x06\xe6=\xc9\x9e\xa58\x99\xb8\xea\xd7\x13"yr\x81\xed\x01\xb7\x89\xbcN\xb2\xd9\xc4\xe8l\x7f\xcah\x85|\xc3:\x9fp\x89\'0\xefi\xa2\xa29\x81\xe9\xdf\x15\xa5j\xc7\xc9\xe9\xb9\xbc&Gc)\x87\xeb\xe6@\xe4\x1c8\x9d\xcb)\xde\xe6\xc0\xf4\x1cew\x8e\x04\x90#-\xe4.u\xc99RHN\x12\x8b$\xa1\x1cj\xc9\x01{9\xf8w\x19L*\xd3\xf2*S\xf5\x95\x9fxJ\xff\xac\xdcb\x00uc\xb9\x82\xd8`\x00Uj\xb9\xce\x0c@d\x19\x88,\x1f\xd4ve\xca\xb4\xf2\x04\x11RR\x8e\xd5\x1ce*\xab\xb2m\x992&-\x7fV\xfd\x94/\xac\x11(\xa8\xec\xaac\x95\xb5\x92\xfd\x13VZ\xdf\xfeG\xb4\xd2\x16Q;d&\xf3\xcd\xe8l\xaf\x19\xcb\xb52\xce\x87k\x99\x8c{\x14]\x11\xcf\xcd\xc7\x0b\x17$8\x8br.\x00\xbf\x05yqA\xb6\xb4\xe8\xec\x02\xb6v"\xb3\x12\x86\'\xaey\x12\xa1R\'\xa6y\x1aKM\xba@s\'\xea*\x00qb\xae\xa7\xa7{\x9e\x92N\x17$\x97/\x04\x96E\xd2-\x8enQ\xf4\x05I`AA\xbe \tX\xf4\x7f\xa1t\xcedv\xe6o\xf8\x98\xcc\x9b\xf9;\xc0d\xb6\xe6\xef6Mf\xf3\xa1T\x93Y#\xae\x18\xfb\xdb\xfc]\x8e\xc9,\x8d\xce{`\xc0\x88\xa7C\xf3Wg&\x93\x98\xbf+3\x7fx\xb6\xce\xdb?\x8a3\x11{\xcc\x1b36\xe5\xe9\xe2\x8fh2\xe6(\xce\x99a\xc6\x0c\x13\xf3\xd7\xf2&3f9\x1dv\xfc\xc4\xd3\x16O#\xdc\x08&\xba\xb8\xc0-\x9bFm\x01\x81]\x00\x88\x0b\xc3\xd8\xae\xbe\xe2T!\x9f\x94\xea\x1f\xc5\xbd\x88E\xb4S@\xcc\xb3M\xcf\xa8{~g\xde\x80\xf56\xf8Y\xfdc\xac\xc9\xd4\xcc_\xe72\x99\n\xda)\x7f\x8c\xcd|eo_\x1du\xb9\xaf\xf4\x1a\xbeZ\xe1\xfe\'Gj\xac\xd6\x8f\x1b\x15\xbdg\xea\x8e\xe6\x9c:\xd3\xd5\t\xfc:\xc8X\x07%\xea\xf0\xf7\xfa\xe9%\x1d\x91\xe9l\xd7\xc9\x12u\x89>\xe9\x82\xd7\x01\xab:\xb5G}\xc3\xc4+D"\xaa\x0e\x08\xd6i\xf6\xd5\x0b\x9a\x0e\xeb4\x06\xeb\x02\xa3\xc2\x1e\xeb5\x05\xad:8[o(\xce\xd6+\xec\xbe\xcd\xcf\x9a\ne\xf5\x88\xe5\x90\x0c\xce_9[X[\x95\xc3\x1aD]S\xca\xac\xd1\xd59f:G\xdb\xe7g\x0c \xf9\x9c\xd3\xeeYgu\x99k\xcc\xb1f\x865\xf6ZS\xf1\xae\xf1\xe7\xb5z\xb9Yg48\xce\x1f\xf4\x15\xdfu2\xf3\x9d\x01\xdfA\xec\xccwG\xcd\xbc\xc62k@kM\x07y\r\xc0\xad\xa98\xd6t\xdd\xd7\x18\x7f\r\xd6\xad\xa1\xab\xeb_\x8a\xcdk\xe0\x7f\r\xb5]\xc3\xf6\xd7\x00\xfd\x1a\xf8_\x93\x14\xd6}\x85\xdeu\x8f\xa7\xb4\xb9\xd7#\xd6\x0b\xd0\xaf\x81\xff55@H\xb9\x15&\xba\x86P&\x93f[\xc8\xca\xc2\xb1\xbe-\x94]\x08\xa7\x0e\xe1\x07!\xdd\xa0\xf0\tQ\xb8\x84\x90\xa3\xb0\xa9\x8e\x1dBAB(H\x88[\x86\xf4\xccC\x02&\xfc\xa1\x8e\x1dz\x1a0a^}<\xa49\x15R\xb0\x85\xb0\x91P\x02F\x90#\xa4\xb8\x0b\xe9\x99\x87\xd4\x84!\xce\x1e\x12\x02!\xbd\xd2\x10\x18\n\xc5\xa3\xaeD\xc4\x81C\xf1\xc4\xbc\x888{\x08\xf6\x84\xa7\x88\x93pH(e\x12J\x99$Us&\xd4\xd4\t\x0c5\xa1\r\x93L\x15\x91\x12|.I\xd4\xc8\t| !\xf3\'\x94\x7f\tT+\xe9+\x16$\x90\x8b\x84pI\xf6\x0c\xe0\xb0.\x81\xcd%DC\xb2C$\xf3\'\x84VB\x01\x99\x10\x86\tgf\xc9\xcf\xa3(\\7\x01,\x12t\x9d\xa0\xe0\x84\xfeY\x02\xedO\x80\x90\x84\x92$!\xc5$\xd8;\x01\xfd\x12L\x7fA\xa1\x92\x9c\x0c\'S\xec\xa1w\xfb\x89jjO3dO\t\xbf\'\xa8\xf7\xf0\xb4}\xac\x10\xb2O4\xf8\xf6\xa2\xebO"\x82<{\x94\xb6\xa7E\xb2\xdf\xaa\xc7\\\xd1\x1d\xdd\xa3\x93=\x9a\xda\x8b\xfe$\x87\xedE\x11R\xaf\xecU=f\x8f\xd2\xf6\xec~om\xf9\xeaR\xadqE=rE\xa3\xeb\x8a:\xe7\x8a:\xe7J\xea\x9c{\x11\xa9s\xae\xa8\x94\xae\x04\xc5\xafE$\xbf\\\xd1l\xbb\xa2_u\xc5\xe6\x8a\x12\xca\x82\xe7\xc5\x9a\xc6z\xb1\xae\xb8P$\xc0\x8b`H\xb1\xa8\x10Q\xf4\x15N\x8ad\xe5"\x80T\xa4<*\xb6\x15\xc7\x8a\x1c\xa0\x15#\x85\x93"\xed\x87\xe2D-[\x84P\x14c\x05\xd0"\xa7\x87\xc5\xad\x1a\xaeH\xfe)\x9e\xd4.(S\xb4\xb6\xac\xf64\xc5\x8cr\xb2"\x14\xa8\x88\xbb\x17\xf1\xe6\x8e\xaf\x88\xd4\xa1r\xefp\x9b\xa1C=\xd7\x81rt\xd0_\x87\xf6X\x87\xc2\xb7#\xbb\xff&"-\xafN\x131Q\x07\xed\xd01\xec\x80n\x1d\x1a\x82\x1d\x02\xaa\xa3\x8a0\x1d\xd0\xb6\xe3\xb02\xee\x85t\xb8\x17\xd2\xb1N\x1d;\xec~\xcb\x81\xdf/p\xeaZ\xbc2\'O\'\x1a\x1a\xbf\x12\xb5\xdc/Y\xb0T>\xbfR5\xd7\x1d\xfc\xe6\x8e\xe0\xba\xc3Dw\x04\xc9\x1d\xa5\xfc\x1dArG\xe8\xdc\x11$w9\x8d\x81;\t\x129\x0e\xbb\x93EJ\x82\xb9\xa3\x9dp\xf7E\xc3\xa1\xc5\xed\x8a;\xab\x81F\xeb\xbeb\xc5o\x05\x9dT@\xbd\n\xc0ZaG\x15vT\xc1\xa7*\n\xa1\xa6\x92\xf9(r2\x95g\xf4^\xe1\xeeH\xa5\xc9\xefH\xf7\x95\x10\xb1\xad\xc1S\xc1\xa9*O\xea>\x95\x8a\xee\xb9R\xd7\xf0\xabp\xdf\xa6\x12\xa8\x87V\xc4\x85\x7f\x88\xc8\x8d\x9dJ\x81\xc9\xf2\xea(\x15\xc8E\xa5\xc8\x80\x1f\xac\xa1\xc4S*\xe4\n9\xaaB\xa3\xb5B\xc2\xab\x08\xceK\xbb\xadB2\xaf\x88\xf7\x08\xa2WH\xe6\x15\x12Ae\xa4\xc8Q\xa1\xd7\x98\xa5\xb0\xce\xaeu\rY\x8a\xf0,\r\xd1,\xb6\xf7\xb0a\x16\x92\x90\x85\x82f9O\xce\x92\xad\xb2\x9c\xa8e\xa1$Y\xc8f\x96s\x80,\xa1\x9c\x85E\\\x8b\x01\xe4\xf8?\x0b\xad\xcc\x82\x0b\xd9H\x8d\x95m\xf26i;\n^g\xe9@e\xf1\x87lU\xed\x96-3\x96.h\x96r(+\xfe \x80\x9e\xad\xf1b\n\xaa,\x9d\xd8l\x81\x9fy\n\xb6\xd9\x92:W\x96\xcb\x1c\xd9"/\xf6\xd9\x85\xc4\xf71\xb1\x99\xe3!\xb3\xc6@jUT\x0b\xfbv\x13\xa7*\x9eL\xf8$\xa3\x89\xb4\x94PL1c\n\xb1I\xc9\xd1)Q\x99\xd2\x01H\x89\xeb\x94hO\xc9\xe7\xdf\xa8\xae\xbei\xae5\xdf\xa8\x98\xbeQ\xcb}\xb3\x96#\x9e"\x97`R|8\xc5SR\xf1\x1fa0)EP\xfa\x0b\x11\x0fL\xc7\x1a\x10)\xa7\x85)\xae\x9f\xd2\x92O!\xafi\x9f5\xd0\xbeOi\x87y\xa1z`\n7M\x0f\xea\xb8\xe9\x9e\xc9\xe0\xa6\xdf\xacb8%\x1b\xa7\xc4u\xca-\xa3\x14r\x9a\xc2\xc9R\x98Z\x83}6\xe8f6h&4\x92\x8f\xa7\xa6Erk\xf0\xe2\x06i\xb7\x81\xef7\xa08\r*\x9b\x06\xd7\x85\x1a\xa4\xf3\x06d\xa6Am\xd4\xa0\xbaj\xf8\xfc\xec\x07O\x9f\x11\xe1@\r\x9a\t\r\x88O\x03Do\xb4\x18@\x0f\xa2\x01\x8c7:\xec\xc2J\xd1\r\\\xbcA\xc9\xd4\xb0\xda\xb7\x0b\x92m\x03\x8e\xd3\x80\xb36,\x05\xe2\xee\x0bk\xe2\x93me\xff16\x88\x01\xdf\x18W\x8aa+1n\x17\xe3\xa2\xf1P\x8d\x14c\xe6x\xccX\\?\xc6\xf5c\xc2$&-\xc4\x80o\xbc\xd0\xe0\x89q\xaax\xc9\xdb\xc8<\xf1\x8a\xb1\xb0\x99\x18g\x8d9(\x8f\xa9\xbabJ\xb8\x983\xc0\x980\xb9\x82\xac,\x80\x8b\x05Zm\x9dTy#\xbf\x03|b(A\x0c:\xc5\x90\xf7\x98c\x9c\x18\xc3\xc4\xa0^\xcc;b\xe0+\xb6\x88\x8b\xebk`\xbb\x9c\xc0\xb9\x9c\xb5\xb9\x82\xda\x92O\\\xf1}I\x85.G\xb6n\x9e\xb1u\xc4\x1a?\xe3\xac\xcd%\xa6\\\xb2\x8c[\xe6gD\xa5\xfb\xc8+\xda\xea\x11.\'p.gm.w\x86\\\xce\xda\xdc&\xf3r\xd6\xe6\x86\xfa\xd4!\xc5\xba\x9c\xc09\xdc>q)\xf5]2\x8ck\r\xa0#\xe4\x12\x03.g\xba.\xa5\xbeK\xa9\xba\xd9\xf1\x94\xbb4.Wl\\b`\x83\x83\xba\xdc\xa3q9\xecp\xc5W\x85\x1a\xb9\x90\x95\r5\xb2\x8b\xaf\xba\xc4\x80\x0bww\xd7h\x12\xf6\xb5\xe1\xfe\xc2\x86\x1do\xe8vm8\xe1s9~\xdap\x14\xecr\xd8\xe1\xda\xa7K\x1b+s;\xd6\xd5f\x1a\xe0\xaev\xd33\x1bBf\x83;\xbbV\xf7\xd1u1.a\xe0f\x99\x98\x88\xd80`\xe3\xa2,x\xc0\x86H\xdb\x90\xd07\xf0\x80\r\x01\xea\xa0\xee\x11\x17\\G4\x17#\x16\x1c\xb1\x8d\x88P\x8ch]E\x16:G\xb24\xc92\x11\x0b\x8e\xe4\xcdB\x1a"\xbd\xc8o"\x80::\xe9\xb5$\xf2A\x8d\x13a\xf4\x88l\x1a\x01f\x11\x1d\xd7h\xc3\xd8\xa9*0\xa2=\x16QKF)K#\xcfG@r\x84\x0fF\x84D$\x81"\x146J\x18\x10)4DT\xb9Q\x07Q@@\xca\xeb\x88\xcb\xb7\x11\x17u#\x92{TV\x18\x89\xe8JF\xa0OTg\x00\xd9?\x82\xb7Fy\xe6\xf5\x18Ku3\xc4\x9eC\xac<\x14\xd3\xca\x9d\xcc!.3\xc4e\x86\xda\x1e3C<mH6\x1eb\xef!$q\x88\x07\x8f\xf0\x9e\xa1\x15GC\x02w\x08b\x0c\xe9h\r\xe9h\ri\xb6\x0fi\x97\x0ci\x9a\r\xb1\xcb\x10\xee8\x04\x94\x86\xdc\xe4\x1f\x02kC\xcd\xbbf\xc4\xe6\x1c\xa9\xb4\xa5\xfe>\xb0\xcf\x03\x9b;\xb0\xe5\x03\xfb<\xa0\xb4\x03\xaa<\xa0\xbf\x03\xaf8`\x81\x03v9\xa0\xa9\x11o\xbb\xa63p\xcd\xd5\xafk\xdag\x07K\xab\xd7\\\xfb\xbf&\x8b_\xd3r\xb8\xa6\xe5pM\x1b\xe1\x9a\x0e\xdc\xb5\xac]: \xd7\xec\xf3\xda\xda\'Z=PU\x1e\xe6\xfa\xb3\x03\x08y\xa0\xbds\xe0`\xe3@\xf7\xeb\x00\xf8\x1e\xc8<\x07\x0e+\x0e\xc0\xf7\x81\xabI\x07\xa0\xfe\xb0d\x06\xfc\xe8@\xff\xec\x00\xe8\x1d(\x93}\x0bz|\xd0\xcbg\xcb\xbe\x85o\xbe\xc2\x9e\xf1\x81/\x1f\x8b\xfb\xdc\x88\xf7Aa\x1f\x83\xfaX\xdc\xa7\x7f\xe1\x13\xcb~\xa0p\xe1K\xdcK\xe9\xea\x83\x11~Y\xd1\xc0\x87u\xf8\x12\xe1/"B\xea}>_\xf2\xa9b}j\x01\xbf\xc0\x0cy\x96\x0e\xd5\xf7\xa5\x00\x10\x92\xed\xbf\xf0bN{\xfc\x0e?\x83\xdf\xfb\x94\xf0>=\x1f\x9f\n\xc1\xa7\xe7\xe3\xd3"\xf1q\x19\x9f\xfbZ>\xc7L>W\xe3|\xf1\x08a\xbd\xbex\x84d.\x9fF\x84Oq\xe8\xe3S\xfe\x9e\xb7Au}\x9af>\xd0\xe3C@|r\x91\xbfd\x91\xe2i\xbfE\xa47\xf3|\xf2)1\xe73\x01\xf3\x8co<\x8b9\x9fE\xa4_\xf5La\xf6\x0c\xbd}~V\x13\xfd#\x88$\x14\xfa\x1f.\xc5?\x8b1\xa4)\xf1\x0c\xb3\x99Zh0\xe5lc\x8a\xafN9?\x9d\x02ISh\xfa\x94\xb5O\xc1\xa1)\xa11\xc5\x99\xa7\xc0\xd7\x14o\xbfg\x86{\x1a\xf6\xf7\xf4Y\xef\xef\xf4m\xf79]\xef=Pw\x0fN\xdd\x83^\xf7|\xe0t\x0f\xd2\xdd\x0bzIk\xf4\x1eL\x9bb\xfb)\x1f\xd5Ma\x86\xd3\xa1b\xc4\x14\xc0\x99\x02oS\xe0mJG\x7f\n\xeb\x9d\x92J\xa6P\x87)04\xe5\xb6\xea\x14\xef\x99\xc2d\xa6$\xb9)e\xd9c\xa0\x0e\xf1\xe8+L=J\xf8J[\xf3\x99\xf3\xd5GV\xf6(K\x17\xa2\xf2\x88C<ri\xf4\x11k>b\xa1,*1\x0c\xf8\xafM\x80?c\xf0\xcf\x18\xfc3\xa3?\xe3\x1c\x9f/x\xca\x8d\xa1\xcf\xa0\xe2\x92\x88Y\xa2\xaa%Lo\x89~\x96\x1bDBu\x89\xaa\x96\\D^\xd2\x96\xfcl/~I\xd5\xb4D-K\xd8\xe2\x12;/\xb1\xfe\x92\x84\xb5D\xc7K>\xbf\\b\xfd\x1b\xf2\xe7\xd2\x8a\xbf%j[\x12\x1cK\xd8\xc1\x92\xfe\xc5\x92P\\\xc2:\x96\x98i\x89\x8a\x97(\xfe\x86\xa7\x01c\x03W!\'\xb0\x06h\x88\x9b\x80,\x16\x80\x0c\x01\x9d\x95\xe0\xb4\r\xf1\xb6\x806_@\x9a\x0fh\xf3\x05c\x8d\xe6\x00\xfa\x15\xd0Y\t\xf8\x10"\xe0\x849\x80\xd6\x05 n@\xfb+ u\x07DR@\xc6\x0f$P\xaa"rn\x15\xd4\x11\xb9\x04\x10Ty\xca\xf5\xc5\xa0\xac0\x1cH\xd2\x14\n\x1d\x94\x18\xcb\xd7\xb2\x01\x07\x04A\x01M\xf1\xe1l\xe0\xf1TR\xa9\xa4\x82\xa0\xc3+\xc8\x94\x01\xb7\xc1\x03:\xdc\x01UE\x10\xaaO\x05Z`\x98\x1en\xd2\xe3\x10\xbb\x87\r{\xd8\xbb\x87\x9b\xf4\xf0\x8d\x1e\xde\xd5\x83\xfd\xf7\xbe2\x16\xaf\xed\xbd\x02v\xbd\x81Z\xa0\x07\\\xf6F\x0c\x80\x8f\xf7z\x0c\x00\x18{TZ=\x82\xab\x97j\x18\xf5\xc6LF \xf6h\x9f\xf56\n\x97=\xdc\xa4\xf7\xc6\xcap\xa9\x1e\x05F\x8f\xa6m\x0f\xe8\xb8\xb0Ab{\xfaC\xc0\xd3\xa13ra5)\xb7\x84\xf0\x05J\xbe@\xc9[\x14wA$]X7E/2\x1c\rl\xad\x1f2\xdd\x96\x8b}[\x8e\xd5\xb6\xd8w\x0b\xa6n\x7f\xf2\xbe\xba:\xcbE\x11\xd1G,!\xfe\x97=]p\'\xec\xa2\xa3\xe2\x16%m\x856\t\xff\xd9\nmz\x17\x91\x8b\x9c[\xda\x8d[\x94\xbf\xc5$\x17\t\xf3\x02\xf7[\x92\xc0\x16\x1e\xb8\x05S\xb6|c\xbe\xa5\'\xba\xe5\x90xK\x83uK\xf9\xb7\xa5\xed\xb5\xe5\xde\xfeVPI\x9aV\xdbX]hK\xf1\xb1\xed)\xae\xb5\x0e\xba\x9c\x16m/\xcf\xeaA\xb6V\xaa\x93{\x0b\xed[\xb4\x17Zd\x94\x16I\xb9ES\xb9\x05]\xf5\x08\xe3\x960\xedc\xef\xdbx\x1c\xc3\xb4\xba\x8a\t-\xb1\x91\x90\xf9\x96\x80\x86\xd4\x0b-\x81\x12\xa9\x17<q*\xb9l\xdd\x82t{\xe2T\xc2*[\xfc\xb3\x82\x16\xa7\x04-N\xc8Z\x94\x19\xad\no\xa3\xa0hq\x87\xbf\x05qm\t\xf4\xc9)\x96WPP\xf6\xf2\xac\xc1\xfa\x19q\xe2q\x19\xc3\x13\x0f\x15\xa6\xe3Uto\x1e\xb7\r<\xaa\x1e\x0f\x84\xf7X\xba\xc7\xb1c\xcb*\xde\xbc\xa6\xc6\xa2\x17\xb1`\xce\x19<\xa0\xd8\xa3\xc0\xf1:<}\xd2\xdd{\x94H\xde3O_P\x8f\xa3\x9e\xdf"j\xbd\xbeb\xa3\x07/\xf5\x06\n}\xde\x08\x91\xa3\x05\x0f\x14\xf4\xe8cyP\x97\x16\xf7\xe8<\xd0\xd5\xe3h\xc1#v<J\x19\x8f\xa3c\x8f\x98\xf4V,\x92\xf3\x04\x8f\x00\xf7 f\x1e\x9f\xe3y\xf4R=>\xfc\x1c1\xd6\xa1\x976\x82\xef\x8e\xacf$k\x18\x81\x0b\x0e\xa1\xec\xf0\xbd\xbeC#\xd9\xa1\xbd\xecp\x99\xd2Ag\x0e\xd9\xcb\xa1m=\x02\xdd\x1c(\xdc\x88\xb3\x9d\xd1P\xb53"\xd3\x8d\xe8D8\xb0\x15\x87\x96\xc2\x88;\x98\x0e-n\xc7R\t\xc7\xed#\x8c\xe5\xf0\xa5\xd1\x88\xa5\x8f\xc6\xea\x04\x0e\x07\xd5\x0e\x9f\x0c9\x1cn8|t\xe4p\x10\xe2p<\xe2\xf0\xb9\xaf\xc3\xd7\xc1\x0e\xdf\t9|S\xe4p\xce\xe1\xf0\xfd\x91\xc3\x99\x88\xc3\xb7J\x0e\xe7\'\x0e\xdf\t9\x9c]8|S\xe4p\xce\xe1p\xfa\xe1p&\xe2pR\xe2\xf0\xad\x92\xf3\xc2+\x9e\x99\x8c\xd3\x8f\x11\xe1\xe4H>\x94v\x80c\x14+\x1c>\xffv\xfe\xf5!\x1a\'ct\xb2\x7f\x8eO\xa5\xdf\xe7\xc8\x89\xb7\x90=\'\x8b\xc8\xb5\xbf\x11\xd5\x8fC\xfev\xa4B\x95km\x0eu\xab\xc3\xb7\xec\x8e\x94\xbbR\x04\x8f(\x84\x1c)w\x856;R\x04Ki<\x82\xaa9R\xcd~\x11\x91\nc\x04\x81\x1bY\xe9\xe7\x1d\xa2\xf5N\xbd\xf2N&z\xc7\xbb\xde\xb9d\xf8\x0e\x1f\x7f\x87\xa5\xbf\x13#\xef\xef\x1a\xb2\xef\x94`74\x9b\x1cB\xf6f\xa0;z\x87\xd3\xbc\xbb\xbc\xcd\xda\xdcZ\r\xf7\x0ef\xbe\x83\x99m\x0e|\x1c\xf0\xea\x86\n\xff\x06]\xdf\xd0#\xb8\xa1\xefyC\x8f\xe0\x86/\xacnh\x9d\xde\xd0P\xbd\xa1\xf7pC+\xe4\x86\xf5>nu\x17\x0eHZ\x12\xbf\x17\xe4/\xd1\xe5/\xd1\xfb/q\x03\xa9D7\xbeTR\xff,q\xd7\xa8D]R\xa23X\xe2\xba\x7f\tU\x97\xb0E\x89{\x0f%\x0c[\xe2\xf3\x84\x12Ek\x89\xa3\xe6\x92u ^\x82\xaf\x96\xc4\x02R\x14\x948\xed)\xb9\xcc\xc6\x8d\xbb.\xed\xc9.]\xcd\xae,X\x9a\x80]z\x16]v\xdf\xa5\x90\xea\xc2R\xba\xa2\xbfS\xce\xee\xd28\xee\xe2\xa0].\x83t\xed\xcfA\xce!K)\xd0|N\xa4u\t\x99\xae\xab\xf6\xe8\xe2\xa2]\x8b/t\xf5\x03a\xd3\xa5L\xeeBZ\xba\x14\x02c\x9e\xce\xa8|g\xe4\x92\x19\xb7\x07f\xe4\x92\x19]\x8bY_w:\xa3\xee\x98Q\x1f\xcd\xb8:2\x9b1\xc3\\\x83c\xcd\xe6f\x84\xf8\x0cE\xccH\xc53\x92\xf9\x0c\x7f\x9e\xe1V3R\xf1\x8c+\xd93:\xa63\x90\xe1\x9c/\xd8g\x00\x91\x99Q\xa2\xce0\xc1\x8c\xae\xc7\x8c\x18\x9f\x11_3\xac1\x03Zg\xd6\xe6P\xfb\x0c\x18\x9ea\x81\x07&{`\xb2\x07y\xb1$\x93\x87\x07\x9erq\xf2\xe1Zq\xfa\xe1F\x01\xf7\x81\xcd=\\\xf1\x14\xecx\x00Q\x1e\x04;$\x83<\x08\xa2H/\xb2\xea|\xc4\xb8\xa9\xe2GUb\xaaj9]\x95\x05W\xd9Q\xf5\xa4V\x89\xaaj\xacJ\xa9R\xefT\xb1x\x15\x86X%\xca\xab\x90\x8e*uK\xd5\xd7x\xaf\x12\xc3\xd5\x9a\x06n\x95\xb8\xac\x86\x8aUU\xae\xe5U\xb9\xb1Y\x85\x13\x9f\x91\xc4\xcf:\xfa\xe2\xb3\xa6\xae\xec\x0c\x1ap\x161\x00\xd2q\xc6\xbf$;\xcb\xeb\x80\xefv\xad~\x86{\x9cQ\r\x9f\xd9C.\xf1\x95\xdfh\xb6\x85\xf8\x9b\xff\xfe\xd2\xa4Q\xd0\xdc \xc2T\x9b\x07u\xdd&`\xd4\x14#\xc8\x19@\x13\xf6\xd9\x9c\xa8\xb75Sf\x00\x80\x9b\xdc\x82lF\xaa\xcd\xa6hH0\xbe\xd9A$\xa34\xf9\xf8\xb6\xd9U\xfcmr\xa2\xd3\xa4\xbejr7\xb2)\x8a\x95z\xb0I\x1ai\xd2\x15kr\x81\xac\xe9\xf06"\xa9\x89\xce\x9a\x94LM\xeb\xf8\xac\xcf\xc7\xab\xfd\x89j\xb5\xcfU\xa8>t\xa4\x0fI\xe9S\x15\xf4\xa9\xc9\xfb\x16HR\xe6\xf4\xb9\x98\xd1\x07\x7f\xfa`U\x1f\x04\xeb\x93\x9c\xfb\xd8\xb0\xbfa26\xd7\'\xab\xf5\xd9g\x1f|\xeaS\x9c\xf7\t\xcb>\xf0\xd3\xc7\xd1\xfaV\x8b\xe0\x8d\x1d\xbd\xd1s~#X\xdf\xf8\x94\xfc\x8d\xb5\xbf\xb1\xe07\xdd\xa7y\xcb\x18\xfd\x19k\xcfc\xf0<\xdfB\xe5\xa9\xb8\xf3T\xc6\xf9@a$O\xb8\xe7\xdb\xcc\x00\x8d\xc9\x13\xf9y\x02;O\xea\xcd\xd3\xe7\xcb\xe3\xd7y6\x94\xe7\x7ft\xe5\xe9\xd2\xe5\xe9\xe0\xe6\xb1\xe1F\x9b&&\x0fH\xe692\xcbc\x97\xbc\x85\x97yL\xd0fD\x1b\xf5\xb4\x15}3#,\xd7\xde\xe8z\\\x98q\x9b\xfbDm\xc9\xab\xc2\xfd\xda3\x1d\xdb\x06D7\xd6\xcf\xba\n\xa2m)S\xe4\x18\xb6M7\xb7\xcd1M\x9bo\xdf\xda(\xb8\r\x18\xb4\xeb\x1a\xa9m1\x9c\xb0\xc7\xb6\x18NZ\x1am\xba\x1bmxb\x9b\xeb\x9b\xed\xa2\x86r\xfb\x87"@\xdbS#\xb7i\xcc\xb4\xf3\x1a\xcac4\xf9\x89\x1c\xfd\xc9\xba\xaf4\xe6\x9e\xd3\'\x98\xd6\'2\xf3\'\xeb\xbf6|\x02\x9c\xc7\xf0\xe81\x86\x19c\xae\xb15\x96W\x8f9\x14\x19C%>\xd9\xf0>\xb6\x0fY\x80\xe41~5\x06\xd4\xc7\xc0\xc4\x98\x92b\x0cL\x8c\xe1Gc\xf8\xd1\x98o#\xc7\xf4\xa5\xc7\xb0\xea1\x1cm\x0c]\x1ds\x9bjLwaL\x95:\x86\xad\x8f\xb9\xc60\x16\xca(g\xdd\xe3\x01\x1b\x02\r7P\xc6[J\xa0[\xa11\xc2<n\xa1&\xb7P\x93[\xbe\xbc\xbd\xcd\xa99n\xf9\xc7\x11\xb7\x14Q\xb7\xfc\x93\x89[\x8a\xa8[Lw\xcbY\xee\x85e\xf2[<~\x04t\x8e\xfeZ\xf4\xff\xfe\x1f\xfa\xddI\x97'))
global t
t=' '
def f(k):
 global t
 r=a[t+k]if t+k in a else'e';t=k
 return r

1
কুইক ব্যাখ্যা: zlib.decompress('...')মূল্যায়ণ {'G?':' ', 'G;':' ','G"':' ',.......}এবং aএকটি অভিধান যা 2 অক্ষর থেকে 1 টি অক্ষরে মানচিত্র। মূলত স্টেডিবক্সের উত্তরের 2-বর্ণের বৈকল্পিক ।
ব্যবহারকারী 202729

1
আমি দেখতে পাচ্ছি, আক্ষরিক 17780 বাইট। আপনি ডিকম্প্রেসড কন্টেন্টের সাদা স্থানগুলি সরিয়ে 11619 চরগুলিতে এটি হ্রাস করতে পারেন, যা 12322 বাইট সংরক্ষণ করে। (যদি আমি সঠিকভাবে গণনা করি) এছাড়াও ... হেক্স এস্কেপ কোডগুলিকে প্রকৃত কাঁচা অক্ষরে রূপান্তর করা আরও বাইট বাঁচাতে পারে।
ব্যবহারকারী 202729

কাঁচা বাইট থাকলে এখানে আমি কীভাবে পোস্ট করব?
স্কাইলার 15

1
xxd, hexdump, uuencodeবা অনুরূপ
পিটার টেলর

@ user202729 শুধু লক্ষ করুন যে পাইথন কোডটিতে প্রকৃত কাঁচা NUL বাইট থাকতে পারে না।
mbomb007

4

হাস্কেল, (1904 + 1621 + 208548 + 25646) * 2 + 371705 = 847143

{-# LANGUAGE FlexibleInstances, DeriveGeneric #-}

import Control.Arrow
import Control.Monad
import Control.Monad.Trans.State
import Data.List

import System.IO
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Char8 as BC8
import Data.Ord
import Data.Char
import Data.Monoid
import Data.Maybe (fromJust, catMaybes)
import Data.Function
import qualified Data.Map as Map

import Codec.Compression.Lzma

import Data.Flat

import GHC.Word

maxWordLen :: Integral n => n
maxWordLen = 20

wordSeqDictSize :: Integral n => n
wordSeqDictSize = 255

predict :: [Trie] -> Char -> State ([Either Char Int], String) Char
predict statDict c = do
   (nextChar:future, begunWord) <- get
   case nextChar of
     Left p -> do
       put (future, [])
       return p
     Right lw -> do
       let wpre = begunWord++[c]
       put (future, wpre)
       return $ trieLook (tail wpre) (case drop lw statDict of{(t:_)->t;_->Trie[]})

newtype Trie = Trie [(Char,Trie)] deriving (Show, Generic)
instance Flat Trie

trieLook :: String -> Trie -> Char
trieLook [] (Trie ((p,_):_)) = p
trieLook (c:cs) (Trie m)
 | Just t' <- lookup c m  = trieLook cs t'
trieLook _ _ = ' '

moby :: IO (String -> String)
moby = do
    approxWSeq <- BSL.unpack . decompress <$> BSL.readFile "wordsseq"
    Right fallbackTries <- unflat <$> BS.readFile "dicttries"
    seqWords <- read <$> readFile "seqwords"
    let rdict = Map.fromList $ zip [maxWordLen..wordSeqDictSize] seqWords
    return $ \orig ->
      let reconstructed = approxWSeq >>= \i
             -> if i<maxWordLen then let l = fromIntegral i+1
                                     in replicate l $ Right l
                                else Left <$> rdict Map.! i
      in (`evalState`(reconstructed, ""))
              $ mapM (predict fallbackTries) (' ':orig)

উদাহরণ:

Call me Ishmael. Some years ago--never mind how long precisely--having
 ap  me ,nhmael.  Hme ?ears |ce--never  usd how long .aacesely--|ubing
little or no money in my purse, and nothing particular to interest me on
little or no ?ivey in my ?efse, and ,uwhing .hrticular to Bdaenest me on
shore, I thought I would sail about a little and see the watery part of
?neae, I thought I would  cfl about a little and see the |rkers part of
the world. It is a way I have of driving off the spleen and regulating
the world. It is a way I have of ,uiving off the |kli   and .ia       
the circulation. Whenever I find myself growing grim about the mouth;
the Ca         . B        I  rtd |yself ,haoing  eom about the ?ivlh;
whenever it is a damp, drizzly November in my soul; whenever I find
Baieever it is a  'mp, ,uiv    Bar      in my  cfl; Baieever I  rtd

তিনটি প্রাক-গণিত সহায়ক ফাইল ব্যবহার করে:

  • seqwords 236 সর্বাধিক প্রচলিত শব্দ রয়েছে।
  • wordsseq এই শব্দের একটি এলজেডএমএ-সংক্ষেপিত ক্রম রয়েছে এবং সমস্ত শব্দের জন্য 236 সবচেয়ে সাধারণ, দৈর্ঘ্যের মধ্যে নেই।
  • dicttriesপ্রতিটি শব্দের দৈর্ঘ্যের জন্য একটি সিদ্ধান্ত গাছ রয়েছে যাতে বাকী সমস্ত শব্দ থাকে। এই প্রচেষ্টা থেকে, এন্ট্রিগুলি আমরা যেতে যেতে বাছাই করা হয়।

এইভাবে, আমরা অন্যান্য সমস্ত ক্ষতিকারক প্রকল্পগুলির তুলনায় ত্রুটি হার উল্লেখযোগ্যভাবে কম অর্জন করেছি; দুর্ভাগ্যক্রমে, wordsseqফাইলটি এখনও প্রতিযোগিতামূলক হতে খুব বড়।

এখানে একটি সম্পূর্ণ সংস্করণ রয়েছে যা ফাইলগুলি তৈরি করে এবং বিশ্লেষণ করে:

depunct :: String -> [String]
depunct (p:l) = (p:take lm1 wordr) : depunct (drop lm1 wordr ++ srcr)
 where lm1 = maxWordLen-1
       (wordr, srcr) = (`span`l) $ if isAlpha p
                 then \c -> isLetter c || c=='\''
                 else not . isAlpha
depunct []=[]

mhead :: Monoid a => [a] -> a
mhead (h:_) = h
mhead [] = mempty

limit :: [Int] -> [Int]
limit = go 0
 where go z (n:l) | z<100 = n : go (z+n) l
       go _ l = take 1 l

packStr :: String -> Integer
packStr = go 0
 where go n [] = n
       go n (c:cs)
        | c>='a' && c<='z'  = go (28*n + fromIntegral
                                   (1 + fromEnum c - fromEnum 'a')) cs
        | otherwise         = go (28*n) cs


mkTrie :: [String] -> Trie
mkTrie [] = Trie []
mkTrie strs = Trie [ (c, mkTrie . filter (not . null) $ tail<$>l)
                   | l@((c:_):_) <- sortBy (comparing length)
                                  . groupBy ((==)`on`head)
                                  $ sortBy (comparing head) strs ]

mkTries :: [String] -> [Trie]
mkTries rsrc = [ mkTrie $ filter ((==l) . length) rsrc
               | l <- [0..maximum (length<$>rsrc)] ]

main :: IO ()
main = do
    orig <- readFile "whale.txt"
    let wordchopped = depunct orig
        dictRes
          = take 5000
          . map mhead
          . sortBy (comparing $ negate . length)
          . group . sort
          $ wordchopped
        dict = Map.fromList $ zip dictRes [maxWordLen..wordSeqDictSize]
        rdict = Map.fromList $ zip [maxWordLen..wordSeqDictSize] dictRes
        approxWSeq = [ case Map.lookup w dict of
                        Just i -> i
                        Nothing -> fromIntegral (length w - 1) :: Word8
                     | w <- wordchopped ]
        fallbackTries = mkTries . drop (wordSeqDictSize-maxWordLen) $ dictRes
        reconstructed = approxWSeq >>= \i
             -> if i<maxWordLen then let l = fromIntegral i+1
                                     in replicate l $ Right l
                                else Left <$> rdict Map.! i
        predicted = (`evalState`(reconstructed, ""))
              $ mapM (predict fallbackTries) (' ':orig)
        incorrects = length . filter id $ zipWith (/=) orig predicted
    putStrLn $ "longest word: "++show(maximum $ length<$>wordchopped)
    putStrLn $ show incorrects++" errors / "++show (length orig)++" chars"
    BSL.writeFile "wordsseq" . compress $ BSL.pack approxWSeq
    BS.writeFile "dicttries" $ flat fallbackTries
    writeFile "seqwords" . show $ take (256-maxWordLen) dictRes
    writeFile "whale-approx.txt" . unlines $ coLines orig predicted

coLines :: String -> String -> [String]
coLines [] _ = [[],[]]
coLines ('\n':l) (_:m) = []:[]:coLines l m
coLines l ('\n':m) = coLines l ('|':m)
coLines (c:l) (d:m) = case coLines l m of
   (lt:mt:r) -> (c:lt):(d:mt):r

3

সি ++ (ডাব্লুআইপি), 1923 * 2 + 1017344 = 1021190

#include <map>
#include <random>
#include <string>
#include <type_traits>
#include <vector>

using namespace std;

constexpr minstd_rand::result_type seed = 10087702;

template<typename T>
class discrete_mapped_distribution {
private:
    discrete_distribution<size_t> distr;
    vector<T> values;

public:
    discrete_mapped_distribution() :
            distr(), values() {
    }
    template<typename I, typename = typename enable_if<is_arithmetic<I>::value,
            I>::type>
    discrete_mapped_distribution(map<T, I> distribution) :
            values() {
        vector<I> counts;

        values.reserve(distribution.size());
        counts.reserve(distribution.size());

        for (typename map<T, I>::const_reference count : distribution) {
            values.push_back(count.first);
            counts.push_back(count.second);
        }

        distr = discrete_distribution<size_t>(counts.cbegin(), counts.cend());
    }

    discrete_mapped_distribution(const discrete_mapped_distribution&) = default;
    discrete_mapped_distribution& operator=(const discrete_mapped_distribution&) = default;

    template<typename URNG>
    T operator()(URNG& urng) {
        return values.at(distr(urng));
    }
};

class generator2 {
private:
    static map<char, discrete_mapped_distribution<char>> letters;

    minstd_rand rng;

public:
    static void initDistribution(const string& text) {
        map<char, map<char, uint64_t>> letterDistribution;

        string::const_iterator it = text.cbegin();
        char oldLetter = *it++;

        for (; it != text.cend();) {
            ++(letterDistribution[oldLetter][*it]);
            oldLetter = *it++;
        }

        generator2::letters = map<char, discrete_mapped_distribution<char>>();

        for (map<char, map<char, uint64_t>>::const_reference letter : letterDistribution) {
            generator2::letters[letter.first] = discrete_mapped_distribution<char>(letter.second);
        }
    }

    generator2() :
            rng(seed) {
    }

    char getNextChar(char in) {
        return letters.at(in)(rng);
    }
};

map<char, discrete_mapped_distribution<char>> generator2::letters;

যেহেতু এটি দাঁড়ায় এই সমাধানটি হ'ল ডাব্লুআইপি এবং সেইজন্য অবরুদ্ধ। এছাড়াও প্রকৃত কোড আকারের স্কোরের উপর সবেমাত্র কোনও প্রভাব আছে তা বিবেচনা করে আমি ভেবেছিলাম যে আমি আমার উত্তরটি মাইক্রো অপ্টিমাইজ করা শুরু করার আগে প্রথমে পোস্ট করি।
(এখানে সম্পূর্ণ কোড উপলব্ধ: https://github.com/BrainStone/MobyDickRNG - সম্পূর্ণ প্রোগ্রাম এবং বীজ অনুসন্ধান অন্তর্ভুক্ত)

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

তারপরে পাঠ্যটি মুদ্রণের চেষ্টা করার সময় আমি একটি অনুসন্ধান করি এবং সম্ভাব্যগুলির একটি এলোমেলো চরিত্র টান। যদিও এটি কেবলমাত্র সর্বাধিক সাধারণ নিম্নলিখিত চিঠির আউটপুট দেওয়ার চেয়ে খারাপ ফলাফল দেয়, সেখানে সম্ভবত godশ্বরের বীজ থাকতে পারে যা আরও ভাল ফলাফল করবে। এজন্য বীজ শক্তভাবে কোড করা হয়েছে। আমি বর্তমানে সেরা বীজের সন্ধান করছি। আরও ভাল বীজ পেলে আমি এই উত্তরটি আপডেট করব। তাই পোস্ট থাকুন!

যদি কেউ নিজেরাই বীজ অনুসন্ধান করতে চান বা বিভিন্ন আরএনজি ব্যবহার করতে চান তবে রেপো কাঁটাচামচ করতে পারেন।

স্কোর গণনা করার জন্য ব্যবহৃত পদ্ধতি: https://github.com/BrainStone/MobyDickRNG/blob/master/src/search.cpp#L15

নোট করুন যদিও মোট স্কোর এই মুহূর্তে সবচেয়ে খারাপ, এটি কেবল আউটপুটিং স্পেসগুলির ত্রুটি গণনাটিকে পরাজিত করে। এবং সম্ভাবনা ভাল যে স্কোর হ্রাস পাবে, আরও বীজ পরীক্ষা করে।

পরিবর্তণের

  • 2018/01/24 : অন্তর্ভুক্ত উত্তর পোস্ট।
    চেক করা বীজ: 0-50000। স্কোর: 2305 * 2 + 1017754 = 1022364
  • 2018/01/24 : কিছু ন্যূনতম গল্ফিং করেছেন। স্কোর গণনা পদ্ধতিতে লিঙ্ক যুক্ত করা হয়েছে।
    চেক করা বীজ: 0-80000। স্কোর: 1920 * 2 + 1017754 = 1021594 (-770)
  • 2018/02/02 : নতুন বীজ (10087702) (জমা ঠিক করার সময় খুঁজে পেল না)
    চেক করা বীজ: 0-32000000। স্কোর: 1923 * 2 + 1017344 = 1021190 (-404)

আপনি নিজের উত্তরে একটি পরীক্ষার জোড় অন্তর্ভুক্ত করতে পারেন যা স্কোরকে মূল্যায়ণ করে?
নাথানিয়েল

@ নাথানিয়েল আমি স্কোর কোডটি সরাসরি সংযুক্ত করেছি। সংগ্রহস্থলের পাশাপাশি আপনি কি এটিকে যথেষ্ট বিবেচনা করবেন?
ব্রেইনস্টোন

নিয়মগুলি পর্যালোচনা করে আমি লক্ষ্য করেছি যে আমি সেগুলির কয়েকটি লঙ্ঘন করেছি। সমস্যাগুলি সমাধান করার পরে আমি স্বাভাবিকভাবেই আমার উত্তর আপডেট করব
ব্রেইনস্টোন

তারপরে আপনি এলোমেলো বীজে পাঠ্যটি এনকোডিং শেষ করবেন। গুপ্ত প্রোগ্রামিং ভাষা বীজ দেখুন , এবং আপনি MT19937 প্রোগ্রাম বিপরীত ইঞ্জিনিয়ার এবং এই উত্তর (যদি আপনি পারেন) পিট করতে পারেন।
ব্যবহারকারী 202729

দুর্দান্ত ধারণা, তবে একটি ভাল স্কোর পেতে সাহায্য করবে না। যাইহোক +1।
ব্যবহারকারী 202729

3

রুবি, 1164418 (আউট)

আমি কেবল দেখতে চেয়েছিলাম যে অন্য কোনও উত্তর যাচাই না করে আমি কীভাবে ভাল করতে পারি।
আমি এটির অনুমতি পেয়েছি কিনা তা নিশ্চিত নই কারণ এতে ফাইল বিশ্লেষণের মাধ্যমে উত্পন্ন আক্ষরিক অন্তর্ভুক্ত রয়েছে, তবে এটি এমনটি না হলেও কারও মারধর করার ঝুঁকির মধ্যে ছিল।

x="\"ect,htabsdd,in,\\nodniwlrfydbulkm;f?ckgwvi0,.*pr;\\\"uz17klI\\n-c'WSpA\\nTwqu8.77!-BeWO5.4.CoP\\n\\\"UHEFu2.?-9.jo6.NI3.MaLYDOGoOAR'QUECziJoxp(\\nYa:\\nVI);K\\nUS*IZEX\\n&\\n$\\n_y[S\""
f=->n{(x.include? n)? x[x.index(n)+1] : ' '}

আমি কিভাবে উত্পন্ন x

প্রথমত, আমি a.txtনিম্নলিখিতটি দিয়ে তৈরি করেছি :

grep -o ".." whale2.txt | sort | uniq -c|sort -bn>a.txt

তারপরে আমি উত্পন্ন a.csv:

cat a.txt | awk '{ print $1","$2 }'|sort -n|tac>a.csv

তারপরে আমি xএটি নীচের রুবি লিপির সাথে পার্স করেছি :

f={}
File.open('./a.csv').each{|l|x=l.partition(',')
f[x.last[0..1]]=x.first}
n={}
r={}
f.each{|k,v|if((r.include? k[0]and v>n[k[0]])or not r.include? k[0])and not k[1].nil?
r[k[0]]=k[1]
n[k[0]]=v
end}
s=''
r.each{|k,v|s+=k+v}
puts s.inspect

আমি কিভাবে স্কোর

w=File.read('whale2.txt')
x="ect,htabsdd,in,\nodniwlrfydbulkm;f?ckgwvi0,.*pr;\"uz17klI\n-c'WSpA\nTwqu8.77!-BeWO5.4.CoP\n\"UHEFu2.?-9.jo6.NI3.MaLYDOGoOAR'QUECziJoxp(\nYa:\nVI);K\nUS*IZEX\n&\n$\n_y[S"
f=->n{(x.include? n)? x[x.index(n)+1] : ' '}

score = 235
w.each_line{|l|v=l[0];l[0..-3].each_char{|n|v+=f[n]};v.split(//).each_with_index{|c,i|if l[i]==c
print c
else
print '_'
score+=1

end}}

puts "FINAL SCORE: #{score}"

আমি নিশ্চিত যে এটি অনুমোদিত; আপনি যদি ফাইলটি বিশ্লেষণ করেন তবে ভাল কাজ! প্রোগ্রামটি যদি তা করে তবেই এটি অবৈধ।
এরিক দি আউটগল্ফার

@ এরিকথ আউটগল্ফার> _> (নিঃশব্দে একটি "(প্রতিদ্বন্দ্বী)" শিরোনামে স্লাইড করে)
NO_BOOT_DEVICE

কেন? এটি বৈধ হলে এটি প্রতিযোগিতা করে, যদিও এটি খুব বেশি না হারায়। যদি এটি অবৈধ হয় (এটি হ'ল আপনার সমাধানটি ফাইল থেকে পড়ে এবং কেবল একটি আক্ষরিক থাকে না), এটি মুছে ফেলা উচিত।
এরিক আউটগল্ফার

হুম। আমি ভেবেছিলাম যে কোনও প্রোগ্রাম ফাইলটি বিশ্লেষণ করেছে, এবং কেবলমাত্র সমাধান নয় you
NO_BOOT_DEVICE

1
আমি রুবি পড়তে পারি না, তবে আমার মনে হয় এটি বৈধ। প্রোগ্রামের অভ্যন্তরে আক্ষরিক উপস্থিতি পুরোপুরি ঠিক আছে, এটি কোনও সমস্যা নয়।
নাথানিয়েল

2

পাইথন 3 , (146 * 2 + 879757) 880049 বাইট

def f(c):return"\n                     t \n 2  sS \n  -  08........       huaoRooe oioaohue thpih eEA \n   neo    enueee neue hteht e"[ord(c)-10]

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

বেশ সোজা ফ্রিকোয়েন্সি টেবিল। স্ট্রিংয়ের প্রতিটি অবস্থান বর্তমান অক্ষরের এসকিআই কোড (মাইনাস 10 = 0x0a = '\ n', ফাইলের মধ্যে সর্বনিম্ন অক্ষর) এর সাথে মিলে যায় এবং প্রতিটি সূচীতে অক্ষরটি সর্বাধিক ঘন ঘন পরবর্তী অক্ষর। ধরে নিচ্ছি আমি ফ্রিকোয়েন্সিটি সঠিকভাবে গণনা করেছি…

ব্যবহারকারী 202729 এর পরীক্ষা থেকে কোড দিয়ে পরীক্ষিত


আপনি কিছু বাইট ব্যবহার করে সংরক্ষণ করতে পারেন def f(c):return(" ">c)*c or"t ... e"[ord(c)-32]?
নীল

0

[পাইথন 3] (644449 * 2 + 0) 1288898 পয়েন্ট

শুধুমাত্র 644449 বাইটে নিখুঁত নির্ভুলতা

import zlib,base64 as s
t=enumerate(zlib.decompress(s.b64decode(b'###')).decode());a=lambda c:next(t)[1]

পূর্ণ কোড কোনও উত্তরের সাথে মাপসই করা যায় না, তাই আমি এটি এখানে রেখেছি এবং উত্তর পাঠ্যে বড় 'বাইনারি স্ট্রিং' কে '###' দিয়ে প্রতিস্থাপন করেছি।

এটি নিম্নলিখিত কোডটি দিয়ে উত্পন্ন, যেখানে "modified.py" হ'ল উত্পন্ন ফাইল, এবং "cheatsheet.txt" হ'ল whale2.txt ফাইলটি দ্বিতীয় অক্ষর থেকে শুরু হয়।

import zlib, base64
with open("modified.py","w") as writer:
    writer.write("import zlib,base64 as s\nt=enumerate(zlib.decompress(s.b64decode(")
    with open("cheatsheet.txt","rb") as source:
        text = source.read()
        writer.write(str(base64.b64encode(zlib.compress(text,9))))
    writer.write(')).decode());a=lambda c:next(t)[1]')

কোডটি "Modified.py" এর শেষে যুক্ত করে সম্পাদন করা যেতে পারে। "whale2.txt" অবশ্যই "modified.py" এর মতো একই ডিরেক্টরিতে থাকতে হবে এবং আউটপুট "out.txt" এ লেখা হবে।

with open("out.txt","w") as writer:
    with open("whale2.txt","r") as reader:
        text = reader.read()
        for b in text:
            c = a(b)
            writer.write(c)

এই উত্তরটি সরাসরি whale.txt বা whale2.txt অ্যাক্সেস করে না। এটি বিদ্যমান মানক সংক্ষেপণ গ্রন্থাগারগুলিকে বিধিগুলিতে স্পষ্টভাবে অনুমোদিত হিসাবে ব্যবহার করে।


সেখানে একটি "\ r \ n" থাকতে পারে যে আমি উইন্ডোতে যখন সেগুলি গণনা করছিলাম তখন সেগুলি থেকে
মুক্তি পেতাম

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