এমন একটি প্রোগ্রামিং ভাষা তৈরি করুন যা কেবল ব্যবহারযোগ্য না বলে মনে হয়


85

ডাকাতদের চ্যালেঞ্জের থ্রেড এখানে

কপসের চ্যালেঞ্জ: এমন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ ডিজাইন করুন যা প্রোগ্রামিংয়ের জন্য অকার্যকর বলে মনে হয় তবে কিছু অ-স্পষ্টতন্ত্রের মাধ্যমে গণনা (বা কমপক্ষে টাস্কের সমাপ্তি) স্বীকার করে।

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

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

  • আপনার ভাষার শব্দার্থবিজ্ঞানের সঠিকভাবে ব্যাখ্যা করা
  • পঠনযোগ্য কোড লেখা

নিম্নলিখিত কৌশলগুলি দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছে:

  • এনক্রিপশন, হ্যাশ বা অন্যান্য ক্রিপ্টোগ্রাফিক পদ্ধতি ব্যবহার করে। আপনি যদি এমন কোনও ভাষা দেখেন যা আরএসএ এনক্রিপশন নিয়োগ করে, বা যদি কোনও প্রোগ্রামের এসএইএ -3 হ্যাশ 0x1936206392306 এর সমান না হয় তবে দয়া করে ডাউনওয়েতে দ্বিধা করবেন না।

ডাকাতদের চ্যালেঞ্জ: একটি প্রোগ্রাম লিখুন যা পুলিশদের দোভাষী দৌড়ানোর সময় ইনপুটটিতে তৃতীয় বৃহত্তম পূর্ণসংখ্যার সন্ধান করে।

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

আই / ও বিধি

  • দোভাষীদের প্রোগ্রামের জন্য কমান্ড লাইনে একটি ফাইলের নাম নেওয়া উচিত এবং এটি চলাকালীন স্ট্যান্ডার্ড ইনপুট এবং আউটপুট ব্যবহার করা উচিত।
  • ইনপুটটি অবিচ্ছিন্নভাবে দেওয়া হবে এবং কেবলমাত্র অক্ষর 0এবং 1(48 এবং 49 এএসসিআইআইতে) থাকবে। একটি নম্বর এন এন এর 1s পরে এন হিসাবে এনকোডড থাকে 00ফাইল শেষ হওয়ার আগে একটি অতিরিক্ত রয়েছে । উদাহরণ: অনুক্রমের জন্য (3, 3, 1, 14) ইনপুটটি 11101110101111111111111100
  • ইনপুটটিতে কমপক্ষে 3 নম্বর থাকার নিশ্চয়তা রয়েছে। সমস্ত সংখ্যা ধনাত্মক পূর্ণসংখ্যা।
  • 1প্রোগ্রামটি থামার আগে আউটপুট প্রিন্ট করা সংখ্যার দ্বারা বিচার করা হবে । অন্যান্য অক্ষর উপেক্ষা করা হয়।

নিম্নলিখিত উদাহরণগুলিতে, প্রথম লাইনটি দশমিক বিন্যাসে ইনপুট; দ্বিতীয়টি হ'ল আসল প্রোগ্রাম ইনপুট; তৃতীয়টি একটি নমুনা আউটপুট।

1, 1, 3
101011100
1

15, 18, 7, 2, 15, 12, 3, 1, 7, 17, 2, 13, 6, 8, 17, 7, 15, 11, 17, 2
111111111111111011111111111111111101111111011011111111111111101111111111110111010111111101111111111111111101101111111111111011111101111111101111111111111111101111111011111111111111101111111111101111111111111111101100
111111,ir23j11111111111u

247, 367, 863, 773, 808, 614, 2
<omitted>
<contains 773 1's>

পুলিশ জবাব দেওয়ার জন্য বিরক্তিকর নিয়ম:

  • অস্পষ্টতার মাধ্যমে সুরক্ষা রোধ করতে, দোভাষীকে এই টিআইওবি সূচকের শীর্ষ ১০০ এর একটি ভাষায় লিখতে হবে এবং একটি অবাধে উপলব্ধ সংকলক / দোভাষী দিতে হবে।
  • দোভাষীকে অবশ্যই এই চ্যালেঞ্জের আগে প্রকাশিত কোনও ভাষার অর্থ ব্যাখ্যা করতে হবে না।
  • দোভাষী আপনার পোস্টে ফিট করতে হবে এবং বাহ্যিকভাবে হোস্ট করা উচিত নয়।
  • দোভাষীকে নির্দোষ হতে হবে
  • দোভাষী পোর্টেবল হতে হবে এবং তার নিজস্ব ভাষার মান অনুসরণ করা উচিত; অপরিজ্ঞাত আচরণ বা বাগ ব্যবহার করবেন না
  • যদি সমাধান প্রোগ্রামটি উত্তরের সাথে মানানসই দীর্ঘ হয় তবে আপনাকে অবশ্যই এমন একটি প্রোগ্রাম পোস্ট করতে হবে যা এটি তৈরি করে।
  • সমাধান প্রোগ্রামে কেবল প্রিন্টযোগ্য এএসসিআইআই এবং নিউলাইনগুলি থাকা উচিত।
  • উপরের প্রতিটি উদাহরণ ইনপুটগুলির জন্য আপনার নিজের কম্পিউটারে 1 ঘণ্টারও কম সময়ে আপনার সমাধান প্রোগ্রামটি কার্যকর করতে হবে।
  • প্রোগ্রাম কোন কম 10 পূর্ণসংখ্যার জন্য কাজ করা উচিত 6 , এবং পূর্ণসংখ্যার কম 10 যে কোন সংখ্যার 6 (অগত্যা একটি ঘন্টা অধীন নয়), প্রদান করা মোট ইনপুট দৈর্ঘ্য কম 10 9
  • সুরক্ষিত হয়ে উঠতে, একটি পুলিশকে 8 দিন অতিবাহিত হওয়ার পরে সমাধান প্রোগ্রামটি উত্তরের মধ্যে সম্পাদনা করতে হবে।

স্কোরিং

যে পুলিশ সর্বোচ্চ স্কোর এবং একটি ইতিবাচক স্কোর নিয়ে নিরাপদ হয়ে যায়, এই প্রশ্নটি জিতেছে।


আপনি সুস্পষ্টভাবে এটি প্রকাশ করেন না তবে আমি কি ঠিক ধরে নিচ্ছি যে পুলিশকে তাদের উত্তরটিতে দোভাষী লিখতে হবে এবং পোস্ট করতে হবে?
নীল

@ মুদ্দিফিশ হ্যাঁ, দোভাষীটি হ'ল পুলিশকে জবাব দিতে হবে।
শুক্রবার

1
@ kirbyfan64sos আউটপুটটি কর্মসূচি বন্ধ হওয়ার আগে মুদ্রিত 1 টি সংখ্যা দ্বারা বিচার করা হবে। অন্যান্য অক্ষর উপেক্ষা করা হয়।
mbomb007


20
আমি এই চ্যালেঞ্জটি নিয়ে নিজেকে অহঙ্কারী করেছিলাম। আমি একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করেছি এবং তারপরে ভাষাটি এমনকি কেবল এটি ব্যবহারের অযোগ্য ছিল তা খুঁজে পেতে কেবল ভাষাটি কাজ করতে পারে কিনা তা দেখার জন্য টাস্কে প্রোগ্রামিংয়ের সময় ব্যয় করেছিল ।
515

উত্তর:


24

চেঞ্জিং (নিরাপদ)

ShapeScript

শেপস্ক্রিপ্ট একটি প্রাকৃতিকভাবে ঘটে যাওয়া প্রোগ্রামিং ভাষা। শেপ শিফটারগুলি (বা চেঞ্জলিংস , যেমন তারা পছন্দ করতে পছন্দ করে) নির্দেশাবলীর একটি সেটে রূপান্তর করতে পারে যা তাদের ডেটা প্রক্রিয়া করার অনুমতি দেয়।

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

  • 'এবং "একটি স্ট্রিং আক্ষরিক শুরু করুন।

    উত্স কোডে মিলে যাওয়া উদ্ধৃতিটি না পাওয়া পর্যন্ত এই মেলানো উদ্ধৃতিগুলির মধ্যে থাকা সমস্ত অক্ষর একটি স্ট্রিংয়ে সংগ্রহ করা হয়, যা পরে স্ট্যাকের উপর চাপ দেওয়া হয়।

  • 09পূর্ণসংখ্যা 0 থেকে 9 স্ট্যাকের দিকে ধাক্কা দিতে । লক্ষ্য করুন 10পাহাড় জমে দুই ইন্টিজার।

  • ! স্ট্যাক থেকে একটি স্ট্রিং পপ করে এবং এটিকে শেপস্ক্রিপ্ট হিসাবে মূল্যায়নের চেষ্টা করে।

  • ? স্ট্যাক থেকে একটি পূর্ণসংখ্যা পপ করে এবং সেই সূচীতে স্ট্যাক আইটেমের একটি অনুলিপি ঠেলে দেয়।

    সূচক 0 শীর্ষস্থানীয় স্ট্যাক আইটেমের সাথে মিলিত হয় (LIFO) এবং সূচী -1 নীচে-একের সাথে।

  • _ স্ট্যাক থেকে একটি পুনরাবৃত্ত পপস এবং তার দৈর্ঘ্য ধাক্কা।

  • @ স্ট্যাক থেকে দুটি আইটেম পপ করে এবং বিপরীত ক্রমে তাদের ধাক্কা দেয়।

  • $স্ট্যাক থেকে দুটি স্ট্রিং পপ করে এবং শীর্ষের একের উপস্থিতিতে নীচের অংশে সবচেয়ে বেশি বিভক্ত হয়। ফলস্বরূপ তালিকাটি পুশ করা হয়।

  • &স্ট্রাক থেকে একটি স্ট্রিং (শীর্ষস্থানীয়) এবং একটি পুনরাবৃত্তযোগ্য পপ করে এবং পৃথক হিসাবে স্ট্রিংটি ব্যবহার করে পুনরাবৃত্তকারীদের সাথে যোগ দেয়। ফলস্বরূপ স্ট্রিং বিনিময়ে ঠেলাঠেলি করা হয়।

  • যদি আমাদের গ্রহে শেপস্ক্রিপ্ট ব্যবহার করা হয়, যেহেতু অজগর পৃথিবীর নিকটতম আত্মীয়, তাই অন্য সমস্ত অক্ষর সি দুটি স্ট্যাক থেকে দুটি আইটেম x এবং y (শীর্ষস্থানীয়) পপ করে এবং পাইথন কোডটি মূল্যায়নের চেষ্টা করে x c y

    উদাহরণস্বরূপ, অক্ষরের ক্রম 23+মূল্যায়ন করবে 2+3, যখন অক্ষরের ক্রমটি "one"3*মূল্যায়ন করবে 'one'*3এবং অক্ষরের ক্রমটি 1''Aমূল্যায়ন করবে 1A''

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

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

শেপ শিফটিং

তাদের প্রাকৃতিক অবস্থায় চেংলিংস শেপস্ক্রিপ্টের আকার নেয় না। তবে তাদের মধ্যে কিছু একটি সম্ভাব্য উত্স কোডে রূপান্তর করতে পারে (যা প্রয়োজনীয়ভাবে দরকারী বা এমনকি সিনট্যাকটিক্যালি বৈধ নয়)।

সমস্ত যোগ্য পরিবর্তনকারীদের নিম্নলিখিত প্রাকৃতিক ফর্ম রয়েছে:

  • সমস্ত লাইনে অবশ্যই একই সংখ্যার অক্ষর থাকতে হবে।

  • সমস্ত লাইনে মুদ্রণযোগ্য ASCII অক্ষর থাকতে হবে এবং তারপরে একটি একক লাইনফিড থাকবে।

  • লাইনের সংখ্যা অবশ্যই প্রতি লাইনে মুদ্রণযোগ্য অক্ষরের সংখ্যার সাথে মেলে।

উদাহরণস্বরূপ, বাইট সিকোয়েন্সটি ab\ncd\nএকটি যোগ্য চেঞ্জলিং।

শেপস্ক্রিপ্টে স্থানান্তরিত করার প্রয়াসে, পরিবর্তনটি নিম্নলিখিত রূপান্তরের মধ্য দিয়ে চলেছে:

  • প্রাথমিকভাবে, কোনও উত্স কোড নেই।

  • প্রতিটি লাইনের জন্য নিম্নলিখিতটি ঘটে:

    • চেঞ্জিংয়ের সঞ্চালক শূন্যে সেট করা আছে।

    • রেখার প্রতিটি অক্ষরের এর জন্য (পিছনের লাইনফিড সহ) এর কোড পয়েন্টটি 2 দ্বারা বিভাজক সংযোজকের সাথে XORed হয়, এবং ইউনিকোড অক্ষর যা ফলাফল কোড পয়েন্টের সাথে মিলে যায় উত্স কোডে যুক্ত হয়।

      এর পরে, এর কোড পয়েন্ট এবং একটি স্পেসের কোড পয়েন্ট (32) এর মধ্যে পার্থক্য সংযোজকের সাথে যুক্ত করা হয়।

উপরের কোনও অংশ যদি ব্যর্থ হয়, চেঞ্জিং অভিযোগ করবে যে এটির বর্তমান আকারটি অপ্রীতিকর।

সমস্ত লাইন প্রক্রিয়া করার পরে, চেঞ্জলিংয়ের রূপান্তর (আশায় বৈধ) শেপস্ক্রিপ্ট সম্পূর্ণ হয়ে গেছে এবং ফলাফল কোড কার্যকর করা হয়।

সমাধান (শেপস্ক্রিপ্ট)

"0"@"0"$"0"2*&"0"@+0?_'@1?"0"$_8>"1"*+@1?"0"+$""&'*!#

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

আমি সামান্য পরিবর্তিত বাক্য গঠন এবং আরও ভাল I / O দিয়ে গিটহাবে আবার শেপস্ক্রিপ্ট প্রকাশ করেছি

কোড নিম্নলিখিতটি করে:

"0"@    Push "0" (A) and swap it with the input string (S).
"0"$    Split S at 0's.
"0"2*   Push "00".
&       Join the split S, using "00" as separator.
"0"@+   Prepend "0" to S.
        The input has been transformed into
        "0<run of 1's>000<run of 1's>0...0<run of 1's>0000".
0?_     Push a copy and compute its length (L).
'       Push a string that, when evaluated, does the following:
  @1?     Swap A on top of S, and push a copy of S.
  "0"$    Split the copy of S at 0's.
  _8>     Get the length of the resulting array and compare it with 8.
          If this returns True, there are more than eight chunks, so there are
          more then seven 0's. With two 0's surrounding each run of 1's and
          three extra 0's at the end, this means that there still are three or
          more runs of 1's in the string.
  "1"*    Push "1" if '>' returned True and "" if it returned False.
  +       Append "1" or "" to A.
  @1?     Swap S on top of A, and push a copy of A.
  "0"+    Append "0" to the copy of A.
  $       Split S at occurrences of A+"0".
  ""&     Flatten the resulting array of strings.
'       This removes all occurrences of "010" in the first iteration, all
        occurrences of "0110" in the second, etc., until there are less than
        three runs of 1's left in S. At this point, A is no longer updated,
        and the code inside the string becomes a noop.
*!      Repeat the code string L times and evaluate.
#       Drop S, leaving only A on the stack.

সমাধান (চেঞ্জিং)

"1+-.......................
""B1.......................
"" 2)+7....................
"" 2)=<....................
""( $86=...................
""B8=......................
""247......................
""]`b......................
""B1.......................
""%D1=.....................
""%500=....................
""%&74?....................
""%&#.2....................
""%[bdG....................
""%D1=.....................
""%<5?.....................
""%:6>.....................
""%&65?....................
""%&-%7>...................
""%D1=.....................
""%500=....................
""%&74?....................
""%&,)5>...................
""%&%,79...................
"" )$?/=...................
""),-9=....................
""# !......................

সমস্ত চেঞ্জিং প্রোগ্রামগুলির মতো, এই কোডটিতে একটি ট্রেলিং লাইনফিড রয়েছে।

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

উপরন্তু, আমাদের তিনটি ছোটখাটো বাধা অতিক্রম করতে হবে:

  • শেপস্ক্রিপ্ট কোডের দীর্ঘ স্ট্রিংটি একটি একক টোকেন, এবং আমরা এটি কোনও লাইনে ফিট করতে সক্ষম হব না।

    আমরা খন্ডে (ইন এই স্ট্রিং ধাক্কা হবে '@', '1?'ইত্যাদি), যা আমরা পরে কনক্যাটেনেট করব।

  • এর কোড পয়েন্টটি _বরং উচ্চতর এবং চাপ দেওয়া '_'সমস্যাযুক্ত হবে।

    তবে, আমরা '_@'স্বাচ্ছন্দ্যে '@'পূর্বাবস্থায় ফেরাতে অন্যের পরে অনায়াসে চাপ দিতে সক্ষম হব ।

আমাদের পরিবর্তনটি শেপস্ক্রিপ্ট কোডটি এই 1 টির মতো দেখায় :

"0""
"#@"
"#"0"$"
"#"0"2"
"#*&"0""
"#@+"
"#0?"
"#_@"
"#@"
"#'@'"
"#'1?'"
"#'"0'"
"#'"$'"
"#'_@'"
"#'@'"
"#'8'"
"#'>'"
"#'"1'"
"#'"*+'"
"#'@'"
"#'1?'"
"#'"0'"
"#'"+$'"
"#'""&'"
"#"+"77"
"#+*!*"
"#!#"

এই রূপান্তরকারীটির মাধ্যমে উপরের শেপসক্রিপ্ট কোডটি চালিয়ে আমি চেঞ্জিং কোডটি পেয়েছি । 2

দোভাষী (পাইথন 3)

#!/usr/bin/env python3

import fileinput

def error(code):
  print("This shape is " + ["unpleasant", "unpurposed", "inadequate"][code - 1] + ".")
  exit(code)

def interpret(code):
  global stack
  stringing = 0
  for char in code:
    quote = (char == "'") + 2 * (char == '"')
    if quote or stringing:
      if not stringing:
        string = ""
        stringing = quote
      elif stringing == quote:
        stack.append(string)
        stringing = 0
      else:
        string += char
    elif char in "0123456789":
      stack.append(int(char))
    else:
      x = stack.pop()
      if char == '!':
        interpret(x)
      else:
        if char == '?':
          y = stack[~x]
        elif char == "_":
          y = len(x)
        else:
          y = stack.pop()
          if char == '@':
            stack.append(x)
          elif char == '$':
            y = y.split(x)
          elif char == '&':
            y = x.join(map(str, y))
          else:
            try:
              y = eval(repr(y) + char + repr(x))
            except SyntaxError:
              error(2)
        stack.append(y)

source = ""
lengths = []

for line in fileinput.input():
  if not line or sorted(line)[:2][-1] < " " or max(line) > "~":
    error(1)
  lengths.append(len(line))
  accumulator = 0
  for char in line:
    value = ord(char)
    try:
      source += chr(value ^ (accumulator >> 1))
    except:
      error(1)
    accumulator += value - 32

lengths.append(len(lengths) + 1)

if min(lengths) != max(lengths):
  error(1)

stack = ""

for line in fileinput.input("-"):
  stack += line

stack = [stack]

try:
  interpret(source)
except:
  error(3)

print("".join(map(str, stack)))

1 প্রতিটি লাইন এলোমেলো আবর্জনা দিয়ে প্যাড করে লাইনের পরিমাণে, এবং লাইনফিডগুলি আসলে উপস্থিত হয় না।
2 নীচের সংখ্যাগুলি চেঞ্জিং কোডের সর্বনিম্ন এবং সর্বোচ্চ কোড পয়েন্ট নির্দেশ করে, যা অবশ্যই 32 এবং 126 এর মধ্যে থাকতে হবে।


1
Xor / রূপান্তর ব্যবহারের জন্য -1। শেপস্ক্রিপ্ট রূপান্তরকরণে পরিবর্তনটি আমার কাছে অনেকটা এনক্রিপশনের মতো দেখাচ্ছে।
মেগাটম

10
@ মেগাটাইম আপনি যেমন উপযুক্ত দেখেন আপনি ভোট দিতে পারেন, তবে প্রশ্নগুলি এনক্রিপশনের উপরে ভেসে ওঠে কারণ এটি একটি চাবি নেয় যা কেবল পুলিশকে জানা যায় যা ডাকাতদের একটি গুরুত্বপূর্ণ অসুবিধায় ফেলে uts রূপান্তরটি একটি অচেনা রূপান্তর।
ডেনিস

1
ShapeScript 67 বাইট: 0"#002?'+'&'0'$'0?2?-@2?>*+00'&!++'1'*'0'+@1?$0?''&@_2-2?*@+@"3*!@#। যদিও আমি এর জন্য একটি চেঞ্জিং সন্ধান ছেড়ে দিয়েছি। এমনকি বেশিরভাগ বেহুদা বিবৃতি সঙ্গে interspersed, আমি হয়েছে 20 টিরও বেশি বাইট পেতে সক্ষম হয়েছে।
primo

2
@ মেগা টম আমি প্রদত্ত সমাধানটি দ্বারা মোটামুটি হতাশ। আমি 92.9% অকেজো কোডের চেয়ে উল্লেখযোগ্যভাবে আরও চালাক কিছু আশা করছিলাম।
primo

2
@ প্রিমো এতে আরও কিছুটা ঝোঁক লেগেছিল, তবে আমি পাই এই পাইথন 2-র সাথেও কাজ করে এমন এই পরিবর্তনটি । আমার উত্তরটি কতটা চালাক তা আমি জানি না , তবে একটি লুফোলের সাথে একটি পুলিশ পোস্ট করার পরিকল্পনাটি যা ভেঙে ফেলার জন্য এটি খুঁজে পেতে হয়েছিল তা কার্যকর হয়েছে বলে মনে হয়।
ডেনিস

30

বদলানো (সি ++ তে লেখা), ক্র্যাকড! মার্টিন দ্বারা

এডিট মার্টিন এটি ফাটল। তার সমাধানটি দেখতে, লিঙ্কটি ক্লিক করুন। আমার সমাধানটিও যুক্ত হয়েছে।

নিবন্ধ এবং স্ট্যাক উভয়ই পরিচালনা করতে সক্ষম করার জন্য স্থির কমান্ডটি সম্পাদনা করুন যেহেতু এটি একটি ডিবাগিং কমান্ড যা সমাধানে অনুমোদিত নয়, এটি অনুবাদকের পূর্ববর্তী সংস্করণ ব্যবহার করে এমন কাউকে প্রভাবিত করবে নাprint-d

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

আমি কল্পনা করি না যে এটি খুব মারাত্মকভাবে কঠিন হবে, তবে আশা করি এটি একরকম চ্যালেঞ্জ সরবরাহ করবে। যেটি পরিবর্তনকে মোটামুটি অব্যবহারযোগ্য করে তোলে তা হ'ল এটি কেবল তখন প্রিন্ট হবে যখন জিনিসগুলি তাদের যথাযথ স্থানে থাকবে।

-> বুনিয়াদি:

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

ব্যবহারের জন্য 5 টি রেজিস্টার উপলব্ধ। তারা নামকরণ করা হয় Alberto, Gertrude, Hans, Leopold, ShabbySam। এগুলির প্রত্যেকটি একটি প্রোগ্রামের শুরুতে শূন্যে সেট করা হয়।

সুতরাং, যে কোনও প্রোগ্রামের শুরুতে, 24 টি স্ট্যাক রয়েছে, প্রতিটি স্ট্যাকের তালিকার সাথে তার সূচকের সাথে মিলেছে তার নম্বর রয়েছে। প্রতিটি স্ট্যাকের উপরে এক শূন্য থাকে। পাঁচটি রেজিস্ট্রারের প্রত্যেকটি শূন্যে শুরু করা হয়।

-> কমান্ড এবং সিনট্যাক্স :

এখানে 13 টি কমান্ড রয়েছে (+1 ডিবাগিং কমান্ড) যা শফলে উপলভ্য। অনুসরণ হিসাবে তারা

  • cinpushএই আদেশটি কোন যুক্তি লাগে না। এটি প্রশ্নের বর্ণিত ফ্যাশনে কমান্ড লাইন ইনপুটটির জন্য অপেক্ষা করছে (অন্যান্য ইনপুটটি অনির্দিষ্ট / অনির্ধারিত ফলাফলের দিকে নিয়ে যাবে)। এরপরে এটি ইনপুট স্ট্রিংটিকে পূর্ণসংখ্যায় বিভক্ত করে, যেমন 101011100-> 1,1,3। প্রাপ্ত প্রতিটি ইনপুটটির জন্য , এটি নিম্নলিখিতগুলি করে: (1) মানের ভিত্তিতে স্ট্যাকের তালিকাকে অনুমতি দেয়। প্রশ্নের পূর্ণসংখ্যার মানকে একটি বলা হোক । যদি একটি কম 10 এটা বিন্যাস করে তোমার দর্শন লগ করা । যদি একটি 9 এবং 30 এর মধ্যে হয় (অযৌক্তিক) তবে তা আদেশ দেয় d । অন্যথায় এটি আরমিটেশন r করে(2) তখনই পাহাড় জমে একটিতালিকায় প্রথম যে স্ট্যাকের উপরে। নোট করুন যে আমি বোঝাতে চাইছি না stack1(যদিও এটি stack1তালিকার প্রথম ক্ষেত্রে হতে পারে )। ক্রমবিকাশ নীচে সংজ্ঞায়িত করা হয়। যেহেতু cinpushব্যবহারকারীর ইনপুট পাওয়ার একমাত্র উপায় তাই এটি অবশ্যই কোনও সমাধানে উপস্থিত হতে পারে।
  • mov value registermovকমান্ড মূলত পরিবর্তনশীল নিয়োগ করা হয়। এটা তোলে নির্ধারণ valueকরতে registervalueবিভিন্ন ফরম নিতে পারেন: এটা হতে পারে (1) একটি পূর্ণসংখ্যা, যেমন 47 (2) একটি ভিন্ন রেজিস্টার নাম, যেমন Hans (3) একটি স্ট্যাক 'S', যেমন দ্বারা অনুসরণ সূচী 4s। নোট করুন যে এটি তালিকার সূচক, স্ট্যাকের সংখ্যা নয়। এই হিসাবে, সংখ্যাটি 24 এর বেশি হওয়া উচিত নয়।

    কিছু movউদাহরণ:

    mov 4s Hans 
    mov Hans ShabbySam
    mov 9999 Gertrude
    
  • movfs index registerএর অর্থ দাঁড়ায় 'স্ট্যাক থেকে মুভ'। এটি movআদেশের অনুরূপ similar এটি বিদ্যমান যাতে আপনি কোনও রেজিস্টার দ্বারা সূচিত একটি স্ট্যাক অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ, এর আগে যদি আপনি হান্সকে 4 ( mov 4 Hans) movfs Hans Gertrudeসমান সেট করে থাকেন তবে আপনি জের্ট্রুডকে স্ট্যাকের শীর্ষের সমান 4 সেট করতে ব্যবহার করতে পারেন This এই জাতীয় আচরণটি কেবল ব্যবহার করে অ্যাক্সেসযোগ্য নয় mov

  • inc register রেজিস্টার মান 1 দ্বারা বৃদ্ধি করে।
  • dec register 1 দ্বারা নিবন্ধকের মান হ্রাস।
  • compg value value registerএর অর্থ দাঁড়ায় 'তুলনা বৃহত্তর'। এটি দুটি মানের বৃহত্তর সমান নিবন্ধকে সেট করে। valueউপরের মত একটি পূর্ণসংখ্যা, একটি রেজিস্টার, বা স্ট্যাক সূচক 's' এর পরে হতে পারে।
  • compl value value register 'কম তুলনা করুন' উপরের মতো, ছোট মানটি বাদে।
  • gte value1 value2 registervalue1 >= value2তারপরে বুলিয়ান মানটিকে (1 বা 0 হিসাবে) রাখে কিনা তা পরীক্ষা করে register
  • POP!! indexindexস্ট্যাক তালিকার দ্বারা সূচিবদ্ধ স্ট্যাকের শীর্ষে পপস করে ।
  • jmp labelনিঃশর্ত লেবেলে লাফ দেয় label। লেবেল সম্পর্কে কথা বলার জন্য এটি ভাল সময়। একটি লেবেল ':' এর পরে শব্দ হয়। দোভাষীর লেবেলগুলির প্রাক পার্স করা হয়, সুতরাং আপনি লেবেলগুলির পাশাপাশি পিছনে পিছনে যেতে সক্ষম হন।
  • jz value labelশূন্য labelহলে লাফ দেয় value
  • jnz value labelলাফিয়ে লাফিয়ে labelদিলে valueযদি ননজারো হয়।

    লেবেল এবং জাম্পিং এর উদাহরণ:

    this_is_my_label:
         jmp this_is_my_label
    
    mov 10 Hans
    jnz Hans infinite_loop
    
    infinite_loop:
         jmp infinite_loop
    
  • "shuffle" permutationএখানে শিফল কমান্ডটি দেওয়া হচ্ছে। এটি আপনাকে স্ট্যাকের তালিকাটিকে অনুমতি দিতে সহায়তা করে। তিনটি বৈধ একাধিক বিন্যাসন যে যুক্তি হিসেবে ব্যবহার করা যেতে পারে l, fএবং b

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

-> এখানে দোভাষী কোড

সমস্ত পার্সিং মূল ফাংশনে ঘটে। এখানেই আপনি এটি সুনির্দিষ্ট কমান্ডের জন্য পার্সিং করতে পাবেন।

#include<fstream>
#include<iostream>
#include<string>
#include<stack>
#include<cmath>

using namespace std;

class superStack: public stack<long> {
    private:
        int m_place;
    public:
        static int s_index;


        superStack() {
            m_place = s_index;
            s_index++;
        }

        int place() {
            return m_place;
        }
};
int superStack::s_index=1;

superStack  stack1,stack2,stack3,stack4,stack5,stack6,stack7,stack8,stack9,stack10,stack11, \
            stack12,stack13,stack14,stack15,stack16,stack17,stack18,stack19,stack20,stack21,stack22,stack23,stack24;


superStack* stackptrs[]=    { \
                        &stack1,&stack2,&stack3,&stack4,&stack5,&stack6,&stack7,&stack8,&stack9,&stack10,&stack11, \
                        &stack12,&stack13,&stack14,&stack15,&stack16,&stack17,&stack18,&stack19,&stack20,&stack21,&stack22,&stack23,&stack24 \
                        };


long Gertrude=0;
long Hans=0;
long Alberto=0;
long ShabbySam=0;
long Leopold=0;


void SWAP( int i, int j) {    // 0 < i,j < 25

    i--;
    j--;


    superStack* tempptr = stackptrs[i];
    stackptrs[i]=stackptrs[j];
    stackptrs[j] = tempptr;



}

void u() {
    int list[3][4] = {
                        {1,9,6,13},
                        {2,10,5,14},
                        {17,19,20,18},
                    };

    for(int i=0;i<3;i++) {
        for(int j=1;j<4;j++) {
            SWAP( list[i][0], list[i][j] );         
        }
    }
}
void d() {
    int list[3][4] = {
                        {3,11,8,15},
                        {4,12,7,16},
                        {22,24,23,21},
                    };

    for(int i=0;i<3;i++) {
        for(int j=1;j<4;j++) {
            SWAP( list[i][0], list[i][j] );         
        }
    }
}
void r() {
    int list[3][4] = {
                        {2,17,8,24},
                        {4,18,6,23},
                        {9,10,12,11},
                    };

    for(int i=0;i<3;i++) {
        for(int j=1;j<4;j++) {
            SWAP( list[i][0], list[i][j] );         
        }
    }
}
void l() {
    int list[3][4] = {
                        {1,19,7,22},
                        {3,20,5,21},
                        {14,13,15,16},
                    };

    for(int i=0;i<3;i++) {
        for(int j=1;j<4;j++) {
            SWAP( list[i][0], list[i][j] );         
        }
    }
}
void f() {
    int list[3][4] = {
                        {20,9,24,16},
                        {18,11,22,14},
                        {1,2,4,3},
                    };

    for(int i=0;i<3;i++) {
        for(int j=1;j<4;j++) {
            SWAP( list[i][0], list[i][j] );         
        }
    }
}
void b() {
    int list[3][4] = {
                        {19,10,23,15},
                        {17,12,21,13},
                        {5,6,8,7},
                    };

    for(int i=0;i<3;i++) {
        for(int j=1;j<4;j++) {
            SWAP( list[i][0], list[i][j] );         
        }
    }
}

void splitpush(string input) {
    long value=0;

    for(long i=0;i<input.size();i++) {

        if(input[i]=='1'){
            value++;
        }
        else if(input[i]=='0' && value!=0 ) {
            if(value<10) {
                u();
            }
            else if (value<30) {
                d();

            }
            else {
                r();
            }
            (*stackptrs[0]).push(value);
            value=0;

        }
        else {
            break;
        }

    }

}

long strToInt(string str) { // IF STRING HAS NON DIGITS, YOU WILL GET GARBAGE, BUT NO ERROR
    long j=str.size()-1;
    long value = 0;
    for(long i=0;i<str.size();i++) {
        long x = str[i]-48;

        value+=x*floor( pow(10,j) );
        j--;
    }
    return value;
}

bool isEmpty(superStack stk) {
    if( stk.size()>0){return false; }
    else {return true;}

}    

long getValue(string str) {
    if(str=="ShabbySam") {
        return ShabbySam;
    }
    else if(str=="Hans") {
        return Hans;
    }
    else if(str=="Gertrude") {
        return Gertrude;
    }
    else if(str=="Alberto") {
        return Alberto;
    }   
    else if(str=="Leopold") {
        return Leopold;
    }
    else if(str[ str.size()-1 ]=='s'){
        str.pop_back();

        long index = strToInt(str)-1;

        if( !isEmpty( (*stackptrs[index]) ) ) {
            return (*stackptrs[index]).top();
        }
        else {
            cerr<<"Bad Expression or Empty Stack";


        }   
    }
    else {
        return strToInt(str);
    }

}

void printUnary(long i) {
    while(i>0) {
        cout<<1;
        i--;
    }
}

int main(int argc, char**argv) {

    if(argc<2){std::cerr<<"No input file given"; return 1;}
    ifstream inf(argv[1]);
    if(!inf){std::cerr<<"File open failed";return 1;}

    for(int i=0;i<24;i++) { 
        (*stackptrs[i]).push(0);         // Pre push a zero on every stack
    }

    string labels[20];
    unsigned labelPoints[20];
    int index=0;



    string str;
    while(inf) { //  parse for labels
        inf>>str;
        //cout<<inf.tellg()<<" ";
        if(inf) {
            if(str[str.size()-1]==':') {
                str.pop_back();
                bool alreadyExists = false;
                for(int i=0; i<index;i++){
                    if(labels[i] == str ) { alreadyExists=true;}
                }
                if(!alreadyExists) {
                    labels[index]=str;
                    labelPoints[index]= inf.tellg();
                    index++;
                }
            }

        }

    }
    inf.clear();
    inf.seekg(0,inf.beg);

    while(inf) { // parse for other commands 
        inf>>str;

        if(inf) {


            if(str=="cinpush") {
                string input;
                cin>>input;
                splitpush(input);
            }

            else if(str=="mov") {
                inf>>str;
                long value = getValue(str);

                inf>>str;
                if(str=="Gertrude"){Gertrude=value;}
                else if(str=="Hans"){Hans=value;}
                else if(str=="ShabbySam"){ShabbySam=value;}
                else if(str=="Alberto"){Alberto=value;}
                else if(str=="Leopold"){Leopold=value;}
                else {cerr<<"Bad register name. ";}

            }

            else if(str=="movfs") {
                inf>>str;
                long index = getValue(str);
                if(!isEmpty( *stackptrs[index-1] )) {
                    inf>>str;
                    long value = (*stackptrs[index-1]).top();
                    if(str=="Gertrude"){Gertrude=value;}
                    else if(str=="Hans"){Hans=value;}
                    else if(str=="ShabbySam"){ShabbySam=value;}
                    else if(str=="Alberto"){Alberto=value;}
                    else if(str=="Leopold"){Leopold=value;}
                    else {cerr<<"Bad register name.";}
                }
                else {
                    cerr<<"Empty Stack";
                }



            }

            else if(str=="inc") {
                inf>>str;
                if(str=="Gertrude"){Gertrude++;}
                else if(str=="Hans"){Hans++;}
                else if(str=="ShabbySam"){ShabbySam++;}
                else if(str=="Alberto"){Alberto++;}
                else if(str=="Leopold"){Leopold++;}
                else {cerr<<"Bad register name. ";}
            }
            else if(str=="dec") {
                inf>>str;
                if(str=="Gertrude"){Gertrude--;}
                else if(str=="Hans"){Hans--;}
                else if(str=="ShabbySam"){ShabbySam--;}
                else if(str=="Alberto"){Alberto--;}
                else if(str=="Leopold"){Leopold--;}
                else {cerr<<"Bad register name. ";}
            }


            else if(str=="compg") {
                inf>>str;
                long value1 = getValue(str);
                inf>>str;
                long value2 = getValue(str);
                inf>>str;
                long larger;
                if(value1>value2){larger = value1;}
                else {larger = value2;}

                if(str=="Gertrude"){Gertrude=larger;}
                else if(str=="Hans"){Hans=larger;}
                else if(str=="ShabbySam"){ShabbySam=larger;}
                else if(str=="Alberto"){Alberto=larger;}
                else if(str=="Leopold"){Leopold=larger;}
                else {cerr<<"Bad register name. ";}

            }
            else if(str=="compl") {
                inf>>str;
                long value1 = getValue(str);
                inf>>str;
                long value2 = getValue(str);
                inf>>str;
                long larger; //LARGER IS REALLY SMALLER HERE
                if(value1>value2){larger = value2;}
                else {larger = value1;}

                if(str=="Gertrude"){Gertrude=larger;}
                else if(str=="Hans"){Hans=larger;}
                else if(str=="ShabbySam"){ShabbySam=larger;}
                else if(str=="Alberto"){Alberto=larger;}
                else if(str=="Leopold"){Leopold=larger;}
                else {cerr<<"Bad register name. ";}

            }

            else if(str=="gte") {
                inf>>str;
                long value1= getValue(str);
                inf>>str;
                long value2= getValue(str);
                inf>>str;
                bool torf = value1 >= value2;

                if(str=="Gertrude"){Gertrude=torf;}
                else if(str=="Hans"){Hans=torf;}
                else if(str=="ShabbySam"){ShabbySam=torf;}
                else if(str=="Alberto"){Alberto=torf;}
                else if(str=="Leopold"){Leopold=torf;}
                else {cerr<<"Bad register name. ";}

            }

            else if(str=="lte") {
                inf>>str;
                long value1= getValue(str);
                inf>>str;
                long value2= getValue(str);
                inf>>str;
                bool torf = value1 <= value2;

                if(str=="Gertrude"){Gertrude=torf;}
                else if(str=="Hans"){Hans=torf;}
                else if(str=="ShabbySam"){ShabbySam=torf;}
                else if(str=="Alberto"){Alberto=torf;}
                else if(str=="Leopold"){Leopold=torf;}
                else {cerr<<"Bad register name. ";}

            }

            else if(str=="POP!!") {
                inf>>str;
                long index = getValue(str);
                index--; //because we (C++ and this interpreter) index differently
                if(!isEmpty( *stackptrs[index] )) {
                    (*stackptrs[index]).pop();
                }
                else {cerr<<"Can't POP!! from empty stack";}

            }

            else if(str=="push"){cerr<<" You can't. ";}

            /*
            else if(str[str.size()-1]==':') {
                str.pop_back();
                bool alreadyExists = false;
                for(int i=0; i<index;i++){
                    if(labels[i] == str ) { alreadyExists=true;}
                }
                if(!alreadyExists) {
                    labels[index]=str;
                    labelPoints[index]= inf.tellg();
                    index++;
                }
            }*/

            else if(str=="jmp") {
                inf>>str;
                for(int i=0;i<index;i++) {
                    if( labels[i]==str) {
                        inf.seekg( labelPoints[i], ios::beg);
                    }
                }
            }
            else if(str=="jz") {
                inf>>str;
                long value = getValue(str);

                if(value==0) {
                    inf>>str;
                    for(int i=0;i<index;i++) {
                        if( labels[i]==str) {
                            inf.seekg( labelPoints[i], ios::beg);
                        }
                    }
                }
            }

            else if(str=="jnz") {
                inf>>str;
                long value = getValue(str);

                if(value!=0) {
                    inf>>str;
                    for(int i=0;i<index;i++) {
                        if( labels[i]==str) {
                            inf.seekg( labelPoints[i], ios::beg);
                        }
                    }
                }
            }

            else if(str== "\"shuffle\"") {
                inf>>str;
                if(str=="l"){ l(); }
                else if(str=="f"){ f(); }
                else if(str=="b"){ b(); }
                else {cerr<<"Bad shuffle parameter";}

            }

            else if(str=="print") {

                for(int i=0;i<24;i++) {

                    if( (i+1) != (*stackptrs[i]).place() ) {
                        cerr<< "Sorry, your stacks are in the wrong place! You can't print unless you put them back! Exiting. ";
                        return 1;
                    }

                }
                inf>>str;
                if(str=="Gertrude"){printUnary(Gertrude);}
                else if(str=="Hans"){printUnary(Hans);}
                else if(str=="ShabbySam"){printUnary(ShabbySam);}
                else if(str=="Alberto"){printUnary(Alberto);}
                else if(str=="Leopold"){printUnary(Leopold);}
                else {cerr<<"Bad register name. ";}


            }

            else if(str=="done!") {return 0;}

            else if(str=="print-d" ){
                inf>>str;
                long value = getValue(str);
                cout<<str;
              }
        }

    }







    /*for(int i=1;i<25;i++) {
        (*(stackptrs[i-1])).push(i);
    }

    u();d();r();l();f();b();
    */

    cout<<"\n";
    for(int i=1;i<25;i++) {
        if( (*(stackptrs[i-1])).size()>0 ) {
            cout<<(*(stackptrs[i-1])).top()<<" "<<(*(stackptrs[i-1])).place()<<"\n";
            (*(stackptrs[i-1])).pop();
        }
    }
    /*
    for (int i=0;i<index;i++) {
        cout<<labels[i]<<": "<<labelPoints[i]<<"\n";
    }*/

    return 1;
}

-> অনুমতিগুলি নিম্নলিখিত ফ্যাশনে স্ট্যাক তালিকার উপাদানগুলিকে অনুমতি দেয়:

যেখানে মানে

(এগুলি ইন্টারপ্রিটার কোডেও উপস্থিত হয় a যদি কোনও তাত্পর্য হয় তবে দোভাষীটি সঠিক)

-> সাধারণ উদাহরণ

এই দুটি সহজ প্রোগ্রাম 24 থেকে 1 নম্বর পর্যন্ত মুদ্রণ করে (অরেণে) কোনও শ্বেতস্থান ছাড়াই।

mov 24 Hans
start:
    print Hans
    dec Hans
    jnz Hans start
done!

অথবা

mov 24 Hans start: print Hans dec Hans jnz Hans start done!

তারা একই প্রোগ্রাম।

ব্যাখ্যা এবং সমাধান:

মার্টিনের তার উত্তরেও ভাল ব্যাখ্যা রয়েছে ।

মার্টিন যখন আবিষ্কার করলেন, এই ভাষাটি পকেট কিউব দ্বারা উদ্বুদ্ধ হয়েছিল (ওরফে 2x2 রুবিকের কিউব) ube 24 টি স্ট্যাকগুলি কিউবের 24 টি পৃথক স্কোয়ারের মতো। ক্রমবিকাশ হ'ল অনুমোদিত প্রাথমিক চালগুলি: উপরে, নীচে, ডান, বাম, সামনের, পিছনে।

এখানে মূল সংগ্রামটি হ'ল যখন মানগুলি ধাক্কা দেওয়া হয় তখন কেবল তিনটি চালগুলি ব্যবহৃত হয়: উপরে, নীচে এবং ডানদিকে। যাইহোক, যখন স্ট্যাকগুলি "বদলানো" হয় তখন আপনার কাছে এই পদক্ষেপগুলিতে অ্যাক্সেস নেই। আপনার অন্য তিনটি চাল আছে।

দেখা যাচ্ছে যে তিনটি চালের দুটি সেটই পুরো গোষ্ঠীটি (যেমন জেনারেটর) স্প্যান করে, সুতরাং সমস্যাটি সমাধানযোগ্য। এর অর্থ হল যে আপনি কেবল 3 টি চালচলনের সাহায্যে 2x2 রুবিকের কিউবটি সমাধান করতে পারেন।

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

আদেশ বাতিল করার পরে, তৃতীয় বৃহত্তম সংখ্যা সন্ধান করা মোটামুটি তুচ্ছ।

cinpush
main:
    mov 1s ShabbySam
    POP!! 1
    jmp compare
    continue:
        gte 0 ShabbySam Leopold
        jnz Leopold end
        gte ShabbySam 9 Leopold
        jz Leopold uinverse
        gte ShabbySam 29 Leopold
        jz Leopold dinverse
        jnz Leopold rinverse
compare:
    gte ShabbySam Alberto Leopold
    jz Leopold skip
    mov Gertrude Hans
    mov Alberto Gertrude
    mov ShabbySam Alberto
    jmp continue
    skip:
        gte ShabbySam Gertrude Leopold
        jz Leopold skip_2
        mov Gertrude Hans
        mov ShabbySam Gertrude
        jmp continue
    skip_2:
        gte ShabbySam Hans Leopold
        jz Leopold continue
        mov ShabbySam Hans
        jmp continue
uinverse: 
    "shuffle" f
    "shuffle" f
    "shuffle" f
    "shuffle" l
    "shuffle" b
    "shuffle" l
    "shuffle" b
    "shuffle" b
    "shuffle" b
    "shuffle" l
    "shuffle" l
    "shuffle" l
    "shuffle" b
    "shuffle" b
    "shuffle" b
    "shuffle" l
    "shuffle" l
    "shuffle" l
    "shuffle" f
    jmp main
dinverse:
    "shuffle" f
    "shuffle" b
    "shuffle" l
    "shuffle" b
    "shuffle" b
    "shuffle" b
    "shuffle" f
    "shuffle" f
    "shuffle" f
    jmp main
rinverse: 
    "shuffle" b "shuffle" l "shuffle" f "shuffle" l "shuffle" b
    "shuffle" f "shuffle" f "shuffle" f "shuffle" b
    "shuffle" l "shuffle" l "shuffle" l
    "shuffle" b "shuffle" b "shuffle" b
    "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" f "shuffle" l "shuffle" f
    "shuffle" l "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l 
    "shuffle" f "shuffle" l "shuffle" l 
    "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l
    "shuffle" l "shuffle" l "shuffle" l "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l
    "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l
    "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l
    "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l
    "shuffle" f "shuffle" f "shuffle" f
    "shuffle" l "shuffle" f "shuffle" l "shuffle" f "shuffle" l "shuffle" f
    "shuffle" l "shuffle" l "shuffle" l
    jmp main
end:
    print Hans
    done!

2
কর্কশ। :) আমি সত্যিই ভাষা দ্বারা প্রভাবিত!
মার্টিন ইন্ডার

বাহ যেটি আমার প্রত্যাশার চেয়ে দ্রুত ছিল। ধন্যবাদ, আমি আনন্দিত যে এটি লেখার মতো নির্ধারণ করা যেমন মজাদার ছিল।
লিয়াম

আমি কৌতূহলী, যদি আমি রুবিকের কিউবগুলি সম্পর্কে স্পষ্টতই নামগুলির নাম পরিবর্তন করে কিছু পরিবর্তন করে দিতাম তবে তা কি ভদ্রভাবে শক্ত হত?
লিয়াম 11

তারা অবশ্যই একটি ক্লু ছিল, তবে আমি মনে করি তাদের আলাদা আলাদা নাম থাকলে এটি এত বেশি সময় নিতে পারত না ।
মার্টিন এন্ডার

হেই, দেখতে তিনটি ইনপুট ক্রিয়াকলাপকে উল্টানোর বিষয়ে জিএপি বিশেষভাবে চালাক হচ্ছিল না looks ;)
মার্টিন ইন্ডার

22

ব্রায়ান এবং চক , কার্ডবোর্ড_বক্স দ্বারা ফাটল

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

চরিত্রগুলি

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

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

  • ,( 44): বর্তমান মেমরি কোষে STDIN থেকে একটি বাইট পড়ুন। এটি কেবল ব্রায়ানই করতে পারেন। এই কমান্ডটি চকের জন্য কোনও বিকল্প নয়।
  • .( 46): বর্তমান মেমোরি সেল লিখুন, মডিউল 256, এসটিডিউটে বাইট হিসাবে। কেবল চকই এটি করতে পারে। এই কমান্ডটি ব্রায়ানের জন্য কোনও অন-অপশন।
  • +( 43): বর্তমান মেমরি সেল বৃদ্ধি।
  • -( 45): বর্তমান মেমরি সেলটি হ্রাস করুন।
  • ?( 63): বর্তমান মেমরি সেলটি যদি শূন্য হয় তবে এটি কোনও অপশন নয়। অন্যথায়, অন্যান্য প্রোগ্রামে হাত নিয়ন্ত্রণ করুন। যা ব্যবহার করে প্রোগ্রাম টেপ মাথা ?থাকবে ?। অন্যান্য প্রোগ্রামের টেপ শিরোনাম প্রথম কমান্ড কার্যকর করার আগে একটি ঘর ডান দিকে সরিয়ে নিয়ে যায় (সুতরাং যে ঘরটি পরীক্ষার জন্য ব্যবহৃত হয় সে নিজেই চালিত হয় না)।
  • <( 60): টেপ মাথাটি একটি ঘরে বাম দিকে সরান। টেপের মাথাটি ইতিমধ্যে টেপের বাম প্রান্তে থাকলে এটি কোনও অন-অপশন।
  • >( 62): টেপ মাথাটি একটি ঘরে ডানদিকে সরান।
  • {( 123): বর্তমান ঘরটি শূন্য বা টেপটির বাম প্রান্ত না পৌঁছানো পর্যন্ত বার বার টেপ মাথাটি বাম দিকে সরান।
  • }( 125): বর্তমান ঘরটি শূন্য না হওয়া পর্যন্ত বার বার টেপ মাথাটি ডানদিকে সরান।

যখন সক্রিয় প্রোগ্রামটির নির্দেশিকা পয়েন্টার এমন এক পর্যায়ে পৌঁছায় যেখানে ডানদিকে আর কোনও নির্দেশনা নেই তখন প্রোগ্রামটি বন্ধ হয়ে যায়।

উত্স কোড

উত্স ফাইলটি নিম্নরূপে প্রক্রিয়া করা হয়েছে:

  • যদি ফাইলটিতে স্ট্রিং থাকে তবে ফাইলটি প্রথম স্ট্রিংয়ের ```দুটি অংশে বিভক্ত হবে। সমস্ত নেতৃস্থানীয় এবং অনুসরণকারী শ্বেতস্পেস কেটে ফেলা হয় এবং প্রথম অংশটি ব্রায়ানের সোর্স কোড এবং দ্বিতীয় অংশ চকের জন্য ব্যবহৃত হয়।
  • যদি ফাইলটিতে এই স্ট্রিংটি না থাকে তবে ফাইলের প্রথম লাইনটি ব্রায়ানের উত্স হিসাবে এবং দ্বিতীয় অংশ চকের জন্য ব্যবহার করা হবে (সীমানাঙ্কিত নতুন লাইন বাদে কোনও সাদা স্থান অপসারণ করা হবে না)।
  • _উভয় প্রোগ্রামের সমস্ত উপস্থিতিগুলি NULL বাইট দ্বারা প্রতিস্থাপিত হয়।
  • দুটি মেমরি টেপ ফলাফল স্ট্রিংয়ের সাথে সম্পর্কিত অক্ষর কোডগুলি দিয়ে শুরু করা হয়।

উদাহরণ হিসাবে, নিম্নলিখিত উত্স ফাইল

  abc
```
0_1
23

নিম্নলিখিত প্রাথমিক টেপ উত্পাদন করতে হবে:

Brian: [97 98 99 0 0 0 0 ...]
Chuck: [48 0 49 10 50 51 0 0 0 0 ...]

দোভাষী

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

  • -d: এই পতাকাটি দিয়ে ব্রায়ান এবং চক আরও দুটি কমান্ড বুঝতে পারে। !উভয় মেমরি টেপের স্ট্রিং প্রতিনিধিত্ব মুদ্রণ করবে, সক্রিয় প্রোগ্রামটি প্রথম তালিকাভুক্ত হচ্ছে ( ^এটি বর্তমান টেপ শিরোনাম চিহ্নিত করবে)। @এটিও করবে তবে তত্ক্ষণাত্ প্রোগ্রামটি বন্ধ করে দিন। কারণ আমি অলস, সেগুলির কোনওটিই যদি প্রোগ্রামের শেষ কমান্ড না হয়, তবে আপনি যদি সেগুলিকে সেখানে ব্যবহার করতে চান, তাদের পুনরাবৃত্তি করুন বা তাদের পরে কোনও অপশন লিখুন।
  • -D: এটি হ'ল ভার্বোজ ডিবাগ মোড। এটি !প্রতি একক টিকের মতো একই ডিবাগ তথ্য মুদ্রণ করবে । @এছাড়াও এই মোডে কাজ করে।

কোডটি এখানে:

# coding: utf-8

class Instance
    attr_accessor :tape, :code, :ip

    OPERATORS = {
        '+'.ord  => :inc,
        '-'.ord  => :dec,
        '>'.ord  => :right,
        '<'.ord  => :left,
        '}'.ord  => :scan_right,
        '{'.ord  => :scan_left,
        '?'.ord  => :toggle,
        ','.ord  => :input,
        '.'.ord  => :output,
        '!'.ord  => :debug,
        '@'.ord  => :debug_terminate
    }

    OPERATORS.default = :nop

    def initialize(src)
        @code = src.chars.map(&:ord)
        @code = [0] if code.empty?

        @ip = 0
    end

    def tick
        result = :continue
        case OPERATORS[@code[@ip]]
        when :inc
            @tape.set(@tape.get + 1)
        when :dec
            @tape.set(@tape.get - 1)
        when :right
            @tape.move_right
        when :left
            @tape.move_left
        when :scan_right
            @tape.move_right while @tape.get != 0
        when :scan_left
            @tape.move_left while @tape.ip > 0 && @tape.get != 0
        when :toggle
            if @tape.get != 0
                @tape.move_right
                result = :toggle
            end
        when :input
            input
        when :output
            output
        when :debug
            result = :debug
        when :debug_terminate
            result = :debug_terminate
        end

        return :terminate if result != :toggle && @ip == @code.size - 1

        move_right if result != :toggle

        return result
    end

    def move_right
        @ip += 1
        if @ip >= @code.size
            @code << 0
        end
    end

    def move_right
        @ip += 1
        if @ip >= @code.size
            @code << 0
        end
    end

    def move_left
        @ip -= 1 if @ip > 0
    end

    def get
        @code[@ip]
    end

    def set value
        @code[@ip] = value
    end

    def input() end
    def output() end

    def to_s
        str = self.class.name + ": \n"
        ip = @ip
        @code.map{|i|(i%256).chr}.join.lines.map do |l|
            str << l.chomp << $/
            str << ' '*ip << "^\n" if 0 <= ip && ip < l.size
            ip -= l.size
        end
        str
    end
end

class Brian < Instance
    def input
        byte = STDIN.read(1)
        @tape.set(byte ? byte.ord : -1)
    end
end

class Chuck < Instance
    def output
        $> << (@tape.get % 256).chr
    end
end

class BrianChuck

    class ProgramError < Exception; end

    def self.run(src, debug_level=0)
        new(src, debug_level).run
    end

    def initialize(src, debug_level=false)
        @debug_level = debug_level

        src.gsub!('_',"\0")

        if src[/```/]
            brian, chuck = src.split('```', 2).map(&:strip)
        else
            brian, chuck = src.lines.map(&:chomp)
        end

        chuck ||= ""

        brian = Brian.new(brian)
        chuck = Chuck.new(chuck)

        brian.tape = chuck
        chuck.tape = brian

        @instances = [brian, chuck]
    end

    def run
        (puts @instances; puts) if @debug_level > 1

        loop do
            result = current.tick

            toggle if result == :toggle

            (puts @instances; puts) if @debug_level > 1 || @debug_level > 0 && (result == :debug || result == :debug_terminate)

            break if result == :terminate || @debug_level > 0 && result == :debug_terminate
        end
    end

    private

    def current
        @instances[0]
    end

    def toggle
        @instances.reverse!
    end
end

case ARGV[0]
when "-d"
    debug_level = 1
when "-D"
    debug_level = 2
else
    debug_level = 0
end

if debug_level > 0
    ARGV.shift
end

BrianChuck.run(ARGF.read, debug_level)

সমস্যাটির জন্য আমার নিজের (হস্তাক্ষর) সমাধান এখানে:

>}>}>
brace left: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
brace left: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
question mk: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>} Append a bunch of 1s as a dummy list element:
+>+>+>+>+>+>+>+>+>+
Append two 1s and some code to the list; the first is a marker for later; the latter will be the integer
1: >+
brace right: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
question mk: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1: >+
brace right: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow right: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
brace right: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
question mk: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_
{<<<<<<<<<{<{    Move back to the start
Read a character and subtract 48 to get actual 0 or 1
,------------------------------------------------
?   If 1 switch to Chuck otherwise continue
>}>}>>>>>>>>>}<<<<<<- Subtract 1 from the result to account for initial 1
?   If integer was positive switch to Chuck
@todo: process end
_
This code is run when reading 1:
}>}>>>>>>>>>}<<<<<<+ Move to the end of Chuck; skip one null cell; move to the end of the list
{<<<<<<<<<{<?   Move back to the code that resets this loop.
_
This code is run after finalising an integer:
change the code after the integer first
<<--<--<--}
Append two 1s and some code to the list; the first is a marker for later; the latter will be the integer
1: +
brace right: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
question mk: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1: >+
brace right: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow right: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
brace right: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
question mk: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
{<<<<<<<+<<{<{    Move back to the start; incrementing the list length
Read a character and subtract 48 to get actual 0 or 1
,------------------------------------------------
?   If 1 switch to Chuck otherwise continue
>}>}>>>>>>>>>}
Leave the resetting code, but remove the rest of the last list element:
<<<--<--<--
1: <-
question mk: <---------------------------------------------------------------
arrow left: <------------------------------------------------------------
brace right: <-----------------------------------------------------------------------------------------------------------------------------
1: <-
<{< Move back to the cell we reserved for the counter
<<<<<<-- decrement list size by two so we don't process the two largest elements
_

<{<<<<<<{<{<{<{<{>}>}>>>>>>> This is the beginning of the loop which decrements all list elements by 1
+ Add 1 to the running total
>>- Set marker of dummy list element to zero
_ Beginning of loop that is run for each list element
<{<<<<<<{<{<{<{<{>}>}>}>}+ set last marker back to 1
>>>>>>>>>> move to next marker
? Skip the next bit if we're not at the end of the list
<? Move back to the beginning of the loop
@ we should never get here
_
This is run when we're not at the end of the list
<<<- Set marker to 0 to remember current position
>>>>- Move to the current value and decrement it
? Move back to loop beginning if value is not zero yet
- Make element negative so it's skipped in the future
{<{<{>- Move to remaining list length and decrement it
? If it's nonzero switch to Chuck
>>>>>>>>->->->->->->->->->- Remove the dummy list to make some space for new code:
>}+ Fill in the marker in the list
{<<<<<<<<< Add some loop resetting code after the result:
brace left: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
arrow left: >++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
question mk: >+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_
This loop adds a print command to Chuck's code while decrementing the result
>>>>>>>>}>>>>>}>>>>>} Move to the very end of Chuck's code and leave some space to seek the 1
print: ++++++++++++++++++++++++++++++++++++++++++++++
{<<<<<{<<<<<{<<<<<<<{<
- decrement the result
? if nonzero run loop again
At this point we just need to make Chuck seek for the 1 at the end of this code print it often enough
>>}>>>>>>>}>>>>>}
arrow right: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<?1 Switch to Chuck which moves Brian's tape head onto the 1 and then prints it N times


```

_   Dummy cell to hold input
This code is run when reading a 1:
{<{<{<{ ensure we're at the start
}>}<? Skip 0 handling code and switch to Brian
_ This code is run after a 1 has been processed:
{<{<?

এই কোডটি যেমন চলছে তেমন চালানো যায়, কারণ সমস্ত টীকা নো-অপ্স ব্যবহার করে {এবং এড়িয়ে চলে }

মূল ধারণাটি হ'ল:

  1. তালিকায় একটি নতুন শূন্য-উপাদান যুক্ত করুন (চকের টেপের শেষে) এবং তালিকার দৈর্ঘ্য 1 দ্বারা বাড়ান।
  2. আমরা 1এস পড়ার সময় সেই উপাদানটিকে বাড়িয়ে দিই ।
  3. যখন আমরা একটি পড়ছি 0, তখন কিছু পরিষ্কার করুন। যদি ফলাফল পূর্ণসংখ্যা শূন্যের চেয়ে বেশি হয় তবে 1 এ ফিরে যান।

    এখন আমরা চকের টেপের শেষে ইনপুট সংখ্যার একটি তালিকা পেয়েছি এবং আমরা তালিকাটির দৈর্ঘ্য জানি।

  4. তালিকার দৈর্ঘ্য থেকে 2 বিয়োগ করুন (সুতরাং নিম্নলিখিত পদক্ষেপগুলি দুটি বৃহত্তম উপাদানকে উপেক্ষা করে), এটিকে কল করুন N

  5. যখন N > 0একটি চলমান মোট বৃদ্ধি এবং তারপরে সমস্ত তালিকা উপাদান হ্রাস। যখনই একটি তালিকা উপাদান শূন্য হিট, হ্রাস N

    এর শেষে, চলমান মোট ইনপুটটিতে তৃতীয় বৃহত্তম সংখ্যাটি অন্তর্ভুক্ত করবে M,।

  6. চকের টেপের শেষের Mকপি লিখুন .

  7. চক-এ, 1ব্রায়ানের টেপটিতে একটি অনুসন্ধান করুন এবং তারপরে .শেষে উত্পন্ন উত্সগুলি কার্যকর করুন ।

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

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

পরবর্তী সমস্যাটি হ'ল Nআমাদের প্রক্রিয়াটি চালানোর সময় তালিকাটি হ্রাস করতে হবে এবং আমাদের আগের জায়গায় ফিরে যেতে হবে। তবে {এবং }কেবল পুরো তালিকাটি এড়িয়ে যাবেন।

সুতরাং আমাদের চকের উপর গতিশীল কিছু কোড লিখতে হবে। আসলে, প্রতিটি তালিকার উপাদানগুলির iফর্ম রয়েছে:

[1 <Code A> i <Code B>]

1এমন একটি চিহ্নিতকারী যা আমরা তালিকাটি প্রক্রিয়াজাতকরণ বন্ধ করে দিয়েছি তা নির্দেশ করতে শূন্যতে সেট করতে পারি। এর উদ্দেশ্যটি ধরা {বা }যা কোড এবং কোডটি সবে পাস করবে i। আমরা প্রক্রিয়া চলাকালীন তালিকার শেষে থাকি কিনা তা পরীক্ষা করার জন্যও এই মানটি ব্যবহার করি, সুতরাং যখন আমরা না থাকি, এটি হবে 1এবং শর্তসাপেক্ষে ?চকের নিয়ন্ত্রণে চলে যাবে। Code Aসেই পরিস্থিতিটি পরিচালনা করতে এবং সে অনুযায়ী ব্রায়ানের উপর আইপি স্থানান্তর করতে ব্যবহৃত হয়।

এখন যখন আমরা হ্রাস iপাচ্ছি তখনই আমাদের পরীক্ষা করা দরকার যে iইতিমধ্যে শূন্য। এটি যখন না হয়, ?আবার নিয়ন্ত্রণ স্যুইচ করবে, তাই Code Bএটি পরিচালনা করার জন্য রয়েছে।



@ কার্ডবোর্ড_বক্সটি চমৎকার!
mbomb007

15

পাইথন 3 এ লিখিত এইচপিআর, ( দ্য নাম্বারওন দ্বারা ক্র্যাকড )

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

ভাষার স্পেসিফিকেশন

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

  • *পরিবেশের প্রতিটি খালি খালি তালিকার প্রথম উপাদানটি সরিয়ে দেয় এবং এটি পরিবেশে রাখে। খালি তালিকা প্রভাবিত হয় না। উদাহরণস্বরূপ, এটি রূপান্তর করে

    {4,1,[0,2],[1,3],[]} -> {4,1,0,[2],[3],[]}
    
  • -পরিবেশের সমস্ত সংখ্যা হ্রাস করে এবং তারপরে নেতিবাচক উপাদানগুলি সরিয়ে দেয়। উদাহরণস্বরূপ, এটি রূপান্তর করে

    {4,2,0,[0,2],[4,4,4]} -> {3,1,[0,2],[4,4,4]}
    
  • $পরিবেশের প্রতিটি তালিকা বাম দিকে এক ধাপ ঘোরায়। উদাহরণস্বরূপ, এটি রূপান্তর করে

    {4,1,[0,2],[3,4,1]} -> {4,1,[2,0],[4,1,3]}
    
  • !(A)(B), কোথায় Aএবং Bপ্রোগ্রামগুলি মূলত একটি whileলুপ। A"পরীক্ষা" Bখালি পরিবেশের ফলাফল না হওয়া পর্যন্ত এটি "ক্রিয়া" সম্পাদন করে । এটি অসীম লুপ তৈরি করতে পারে।
  • #(A)(B), কোথায় Aএবং Bপ্রোগ্রামগুলি হয় এবং বর্তমান পরিবেশে প্রয়োগ হয় Aএবং Bফলাফলগুলির প্রতিসাম্যগত পার্থক্য গ্রহণ করে।

কমান্ডগুলি বাম থেকে ডানে চালিত হয়। শেষে, পরিবেশের আকারটি আনারিতে মুদ্রিত হয়।

দোভাষী

এই দোভাষীটি ডিবাগ কমান্ড বৈশিষ্ট্যযুক্ত ?যা পরিবেশ পরিবর্তন না করে মুদ্রণ করে। এটি কাজের কোনও সমাধানে উপস্থিত হওয়া উচিত নয়। ব্যতীত অন্য কোনও অক্ষর *-$!#()?কেবল উপেক্ষা করা হয়, তাই আপনি সরাসরি কোডে মন্তব্য লিখতে পারেন। পরিশেষে, দোভাষা সেই প্রতিবাদটিকে !(A)(#(A)())" Aফলাফলটি আর পরিবর্তন না হওয়া পর্যন্ত সম্পাদন" হিসাবে স্বীকৃতি দেয় এবং অতিরিক্ত গতির জন্য এটি অনুকূল করে তোলে (শেষ পরীক্ষার ক্ষেত্রে আমার সমাধানটি এক ঘন্টার মধ্যে শেষ করতে আমার এটির প্রয়োজন ছিল)।

import sys

def parse(prog):
    "Parse a prefix of a string into an AST. Return it and the remaining input."
    ret = []
    while prog:
        if prog[0] in "#!":
            sub1, prog1 = parse(prog[2:])
            sub2, prog2 = parse(prog1[1:])
            ret += [prog[0],sub1,sub2]
            prog = prog2
        elif prog[0] == ')':
            prog = prog[1:]
            break
        else:
            ret += [prog[0]]
            prog = prog[1:]
    return ret, prog

def intp(ast, L_env, N_env):
    "Interpret the AST on an environment, return the resulting environment."
    ptr = 0
    while ptr < len(ast):
        cmd = ast[ptr]
        if cmd == '*':
            N_env = N_env | set(L[0] for L in L_env if L)
            L_env = set(L[1:] for L in L_env)
            ptr += 1
        elif cmd == '-':
            N_env = set(N-1 for N in N_env if N>0)
            ptr += 1
        elif cmd == '$':
            L_env = set(L[1:]+L[:1] for L in L_env)
            ptr += 1
        elif cmd == '!':
            # Speed optimization
            cond = ast[ptr+2]
            if cond == ['#', ast[ptr+1], []]:
                L_next, N_next = intp(ast[ptr+1], L_env, N_env)
                while L_next != L_env or N_next != N_env:
                    L_env, N_env = L_next, N_next
                    L_next, N_next = intp(ast[ptr+1], L_env, N_env)
            else:
                while True:
                    L_test, N_test = intp(cond, L_env, N_env)
                    if not L_test and not N_test:
                        break
                    L_env, N_env = intp(ast[ptr+1], L_env, N_env)
            ptr += 3
        elif cmd == '#':
            L_env1, N_env1 = intp(ast[ptr+1], L_env, N_env)
            L_env2, N_env2 = intp(ast[ptr+2], L_env, N_env)
            L_env = L_env1 ^ L_env2
            N_env = N_env1 ^ N_env2
            ptr += 3
        elif cmd == '?':
            print(L_env | N_env)
            ptr += 1
        else:
            ptr += 1
    return L_env, N_env

def main(p, L):
    "Run the program on the input, return the output."
    # Parse the input list
    L = ''.join(c for c in L if c in "01")
    while "00" in L:
        L = L.replace("00","0")
    L = [-2] + [i for i in range(len(L)-1) if L[i:i+2] == "10"]
    L = tuple(b-a-1 for (a,b) in zip(L, L[1:]))
    # Parse the program
    ast = parse(p)[0]
    L_env, N_env = intp(ast, set([L]), set())
    return '1'*(len(L_env) + len(N_env))

if __name__ == "__main__":
    filename = sys.argv[1]
    f = open(filename, 'r')
    prog = f.read()
    f.close()
    L = input()
    print(main(prog, L))

আমার সমাধান

আমার রেফারেন্স সলিউশনটি 484 বাইট দীর্ঘ, থনম্বারওয়ের 3271-বাইট প্রোগ্রামের তুলনায় বেশ সংক্ষিপ্ত। এটি সম্ভবত এইচপিআর প্রোগ্রামিংয়ের জন্য উন্নত পরিশীলিত এবং দুর্দান্ত ম্যাক্রো সিস্টেম TheNumberOne এর কারণেই সম্ভবত। আমাদের উভয় প্রোগ্রামের মূল ধারণাটি একই রকম:

  1. কীভাবে কোনও তালিকার সর্বাধিক উপাদান উত্পাদন করা যায় তা সন্ধান করুন।
  2. সর্বাধিক উপাদানটি সরাতে, প্রথম উপাদানটি সর্বাধিকের সমান না হওয়া পর্যন্ত তালিকাটি ঘোরান, তারপরে এটি পপ করুন।
  3. সর্বোচ্চ দু'বার সরিয়ে ফেলুন, তারপরে নতুন সর্বাধিক উপাদানটি মুদ্রণ করুন।

তবে যতদূর আমি বলতে পারি সঠিক প্রয়োগের বিশদটি একেবারেই আলাদা। এখানে আমার সমাধান:

!($)(!(-)(#(-)())#(!(-#(!(*)(#(*)())#(!(-)(#(-)()))())(!(-)(#(-)())))(#(-#(!(*)(#(*)())#(!(-)(#(-)()))())(!(-)(#(-)())))())#(-)(#(!(-)(#(-)()))()))(*)#(!(-)(#(-)()))())*!(-)(#(-)())!($)(!(-)(#(-)())#(!(-#(!(*)(#(*)())#(!(-)(#(-)()))())(!(-)(#(-)())))(#(-#(!(*)(#(*)())#(!(-)(#(-)()))())(!(-)(#(-)())))())#(-)(#(!(-)(#(-)()))()))(*)#(!(-)(#(-)()))())*!(-)(#(-)())!(-#(!(*)(#(*)())#(!(-)(#(-)()))())(!(-)(#(-)())))(#(-#(!(*)(#(*)())#(!(-)(#(-)()))())(!(-)(#(-)())))())-#(!(-)(#(-)()))()

এবং এখানে পাইথন প্রোগ্রামটি মন্তব্য করেছে যা এটি উত্পাদন করে (এখানে অভিনব কিছুই নয়, সমস্ত পুনরাবৃত্তি থেকে মুক্তি পেতে কেবল মৌলিক স্ট্রিং ম্যানিপুলেশন):

# No numbers in the environment
no_nums = "#(-)()"
# No non-empty lists in the environment
no_lists = "#(*)()"
# Remove all numbers from the environment
del_nums = "!(-)(" + no_nums + ")"
# Remove all lists from the environment
del_lists = "#(" + del_nums + ")()"
# Splat the list to the environment:
#  pop the list until it's empty and delete the empty list,
#  then take symmetric difference with all numbers removed
splat = "#(!(*)(" + no_lists + ")" + del_lists + ")(" + del_nums + ")"
# Put into the environment all numbers up to list maximum:
#  decrement and splat until a fixed point is reached.
#  Without the speed optimization, this is very slow if the list elements are large.
splat_upto = "!(-" + splat + ")(#(-" + splat + ")())"
# Copy maximum element to environment:
#  take all elements up to maximum,
#  then take symmetric difference of decrement and list deletion
copy_max = splat_upto + "#(-)(" + del_lists + ")"
# Delete maximum element from list:
#  rotate until first element is maximal, then pop and delete it
del_max = "!($)(" + del_nums + "#(" + copy_max + ")(*)" + del_lists + ")*" + del_nums
# Full program:
#  remove the maximum twice, then produce all numbers up to maximum,
#  then decrement and remove lists. The environment will contain exactly
#  the integers from 0 to third largest - 1, and their number is printed.
main = del_max + del_max + splat_upto + "-" + del_lists
print(main)


@TheNumberOne আমার সমাধান যুক্ত করেছে।
Zgarb

12

TKDYNS (ড্রাগনকে হত্যা করতে, আপনার একটি তরোয়াল দরকার) - মার্টিন বাটনার দ্বারা ক্র্যাকড

সম্পাদনা: আমি মূল পোস্টের নীচে আমার সমাধান এবং ব্যাখ্যা যুক্ত করেছি।

পটভূমি

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

...

ভাল, বেশ না। আপনি আপনার সাথে ডিসপোজেবল মাইনগুলির প্রায় সীমাহীন সরবরাহ নিয়ে এসেছেন এবং তারা নিরাপদ রুট আবিষ্কার করতে আপনাকে এগিয়ে যেতে ইচ্ছুক। দুর্ভাগ্যক্রমে, এগুলি দুটি দুটি ছোট তক্তার মতো মোটা এবং তারা আপনাকে যা করতে বলবে ঠিক তেমনই করবে। আপনার মাইনসটি সঠিক পথটি আবিষ্কার করে তা নিশ্চিত করার একটি চৌকস পদ্ধতি নিয়ে আসা আপনার পক্ষে up

আরও কিছু বিবরণ

ড্রাগনের লয়ার একটি 10x10 গ্রিড রূপ নেয়। গ্রিডে কিছু সংলগ্ন পয়েন্টগুলির মধ্যে একটি সরু ওয়াকওয়ে রয়েছে; অন্যদের মধ্যে একটি গভীর অগ্নিসংযোগ এবং নির্দিষ্ট মৃত্যু রয়েছে। 4x4 গ্রিডের উদাহরণ লেআউট নিম্নরূপ হতে পারে:

 0---1   2---3
     |   |   |
 4---5---6   7
 |           |
 8   9--10  11
     |       |
12--13--14--15

আপনি জানেন যে সর্বদা এক বিন্দু থেকে অন্য কোনও বিন্দুতে যাওয়ার উপায় রয়েছে, তবে এর বাইরে আর কোনও কিছুই আপনাকে প্রকাশ করা হয়নি।

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

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

কমান্ড

এখানে কেবল 5 টি বৈধ কমান্ড রয়েছে।

  • < - বাম দিকে একটি পদক্ষেপ নিন

  • > - ডানদিকে একটি পদক্ষেপ নিন

  • ^ - উপরে এক ধাপ নিন

  • v - এক ধাপ নিচের দিকে যান

  • c- আপনার বর্তমান অবস্থানে থাকা যে কোনও আইটেম সংগ্রহ করুন। যদি উপস্থিত আইটেম উপস্থিত থাকে তবে মস্তকের বিন্যাস পরিবর্তন হয়। উপরের মত সারিগুলিতে সংখ্যাযুক্ত অবস্থানের সাথে, আপনার অবস্থানের মডুলোটি 10 ​​নিয়ে নিন। দোভাষীর মধ্যে হার্ড-কোডড 10 লেআউট রয়েছে এবং লে-আউটটি সংশ্লিষ্টটিতে পরিবর্তিত হয়। উদাহরণস্বরূপ, আপনি যদি 13 অবস্থানে থাকেন তবে লেআউটটি পরিবর্তিত হয়layouts[3]

ইন্টারপেটারে প্রদর্শিত লেআউটগুলি নিম্নলিখিত উপায়ে পূর্ণসংখ্যায় এনকোড করা হয়েছে:

  • খালি লেআউটটি শূন্যে এনকোড করা হয়েছে।

  • বিন্যাসের প্রতিটি প্রান্তের জন্য, xএটি যে দুটি পদের সাথে যোগ দেয় তার চেয়ে ছোট হওয়া যাক ।

    • পদক্ষেপটি যদি অনুভূমিক 2^(2*x)হয় তবে এনকোডিংয়ে যুক্ত করুন (এটি পাওয়ারের, এক্সওআর নয়)

    • পদক্ষেপটি উল্লম্ব হলে, 2^(2*x + 1)এনকোডিংয়ে যুক্ত করুন।

ফাঁসি কার্যকর

ইন্টারপ্রেটার একটি কমান্ড-লাইন আর্গুমেন্ট হিসাবে উত্স ফাইলের নাম দিয়ে চালিত হয়।

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

প্রতিটি উত্স প্রোগ্রামে বিভিন্ন লাইন থাকে, প্রতিটি লাইন উপরের 5 টি বৈধ অক্ষরের কিছু ক্রম নিয়ে গঠিত। এই লাইনগুলি আপনার মাইনগুলি উপস্থাপন করে। আপনি, যোদ্ধা, সুরক্ষিত হিসাবে পরিচিত ক্রিয়াকলাপের ট্র্যাক রাখুন। প্রাথমিকভাবে, আপনি মস্তক সম্পর্কে কিছুই জানেন না, তাই এই ক্রমটি খালি। প্রতিটি মাইনিনকে ঘুরিয়ে নিলে, 0 অবস্থান থেকে শুরু করে নিম্নলিখিতটি করা হয়:

  • মাইনিয়নকে তার সমস্ত কোডের নিজস্ব লাইনে ক্রিয়াকলাপগুলি অনুসরণ করে, নিরাপদে থাকা সমস্ত কার্যকর ক্রিয়াকলাপ করার জন্য নির্দেশ দেওয়া হয়েছে।

    • যদি মাইননটি কোনও মুহুর্তে মারা যায়, আপনাকে এ সম্পর্কে অবহিত করা হবে এবং মস্তকটি এটির প্রাথমিক কনফিগারেশনটিতে পুনরায় সেট করে। সমস্ত আইটেম প্রতিস্থাপন করা হয়, এবং ওয়াকওয়েগুলি তাদের প্রারম্ভিক অবস্থানে ফিরে আসে।

    • যদি পরিবর্তে, মাইনানটি বেঁচে থাকে তবে আপনি যেভাবেই এটিকে বাষ্পে পরিণত করেন - সর্বোপরি এটি কেবল একটি মিনিয়ন। আগের মতোই, এটি লায়ারটিকে তার প্রারম্ভিক অবস্থায় পুনরুদ্ধার করতে ট্রিগার করে তবে এবার আপনি মাইনিয়ানের কোডের লাইন থেকে অজানা নিরাপদ ক্রিয়াকলাপগুলির ক্রমটিতে ক্রিয়াকলাপ যুক্ত করুন।

সমস্ত মিনিশনগুলি ক্লান্ত হয়ে যাওয়ার পরে, আপনি, যোদ্ধা, নিরাপদ হিসাবে পরিচিত সমস্ত ক্রিয়া সম্পাদন করুন, আবার অবস্থান 0 থেকে শুরু করে There দুটি সম্ভাব্য ফলাফল রয়েছে:

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

  • আপনি অস্ত্রের কয়েকটি টুকরো সংগ্রহ করতে ব্যর্থ হয়েছেন - এই ক্ষেত্রে ড্রাগনটি বেঁচে আছে, এবং আপনি আপনার অনুসন্ধানে ব্যর্থ হয়েছেন।

দোভাষী কোড (পাইথন 2)

import collections
import copy
import sys

size = 10
layouts = [108705550239329248440770931020110627243913363144548922111951,108386637020100924277694952798729434993885646706222210602969,133885860318189115027934177821170081234850573770998325845482,102397795295522647918061101991513921833376565032742993744791,131948019244359669407266662537098175265242405785636894694611,127512068876349726396523358265982765442984953916545984706958,106817519055019354200334114020150263381328246524221867629943,33472343358375525802921815863230485208221126168622186265959,133909781123963725874096031069972704024813281938330035579187,132244654022332695610020359820518831299843076834682749020986]

class Interpreter(object):

    def __init__(self, source_file):
        self.source_filename = source_file
        self.layout = layouts[0]
        self.position = 0
        self.ingredients = []
        self.quest_items = {}
        self.attempts = collections.deque()

        self.safe_position = 0
        self.safe_ingredients = []
        self.safe_quest_items = {}
        self.safe_layout = layouts[0]

    def get_input(self):
        s = raw_input("Which quest would you like to embark on today?")
        ind = s.find('00')
        s = s[:ind]
        items = map(len, s.split('0'))
        for item in items:
            if item not in self.safe_quest_items:
                self.safe_quest_items[item] = 1
            else:
                self.safe_quest_items[item] += 1

    def parse_attempts(self):
        with open(self.source_filename, 'r') as source:
            for line in source:
                self.attempts.append(line.strip())

    def enc(self, x, y):
        x, y = min(x, y), max(x, y)
        if x < 0:
            return 0
        if y == x + 1:
            return 1 << (2*x)
        elif y == x + size:
            return 1 << (2*x + 1)
        else:
            return 0

    def exec_command(self, char):
        if char == '<':
            if self.enc(self.position, self.position-1) & self.layout:
                self.position -= 1
            else:
                return False
        elif char == '>':
            if self.enc(self.position, self.position+1) & self.layout:
                self.position += 1
            else:
                return False
        elif char == '^':
            if self.enc(self.position, self.position-size) & self.layout:
                self.position -= size
            else:
                return False
        elif char == 'v':
            if self.enc(self.position, self.position+size) & self.layout:
                self.position += size
            else:
                return False
        elif char == 'c':
            for item in xrange(self.position, 10**6, size*size):
                if item in self.quest_items:
                    self.ingredients += ([item] * self.quest_items.pop(item))
                    self.ingredients.sort()
                    self.layout = layouts[self.position % 10]
        else:
            raise ValueError

        return True

    def run_minion(self):
        minion = self.attempts.popleft()
        self.position = self.safe_position
        self.ingredients = copy.copy(self.safe_ingredients)
        self.quest_items = copy.copy(self.safe_quest_items)
        self.layout = self.safe_layout
        dead = False

        for cmd in minion:
            if not self.exec_command(cmd):
                dead = True

        if not dead:
            self.safe_position = self.position
            self.safe_ingredients = copy.copy(self.ingredients)
            self.safe_quest_items = copy.copy(self.quest_items)
            self.safe_layout = self.layout

    def process_minions(self):
        while self.attempts:
            self.run_minion()

    def final_run(self):
        if len(self.safe_quest_items) == 0:
            print "You killed the dragon" + "!!1" * self.safe_ingredients[-3]
        else:
            print "The dragon lives on. Better luck next time..."

    def interpret(self):
        self.get_input()
        self.parse_attempts()
        self.process_minions()
        self.final_run()

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Wrong number of arguments"
    else:
        test = Interpreter(sys.argv[1])
        test.interpret()

শুভকামনা, বীর যোদ্ধা।

আমার সমাধান এবং ব্যাখ্যা

এখানে একটি পাইথন স্ক্রিপ্ট রয়েছে যা সমস্যা সমাধানের জন্য উত্স কোড উত্পন্ন করে। আগ্রহের জন্য, মার্টিনের চূড়ান্ত উত্স কোডটি আমার স্ক্রিপ্ট দ্বারা উত্পাদিত কোডের চেয়ে প্রায় 5 গুণ ছোট। অন্যদিকে, কোডটি উত্পন্ন করার জন্য আমার স্ক্রিপ্টটি মার্টিনের ম্যাথেমেটিকা ​​প্রোগ্রামের চেয়ে 15 গুণ কম ...

size = 10
layouts = [108705550239329248440770931020110627243913363144548922111951,108386637020100924277694952798729434993885646706222210602969,133885860318189115027934177821170081234850573770998325845482,102397795295522647918061101991513921833376565032742993744791,131948019244359669407266662537098175265242405785636894694611,127512068876349726396523358265982765442984953916545984706958,106817519055019354200334114020150263381328246524221867629943,33472343358375525802921815863230485208221126168622186265959,133909781123963725874096031069972704024813281938330035579187,132244654022332695610020359820518831299843076834682749020986]

def enc(edge):
    x,y = min(edge), max(edge)
    if x < 0:
        return 0
    if y == x + 1:
        return 1 << (2*x)
    elif y == x + size:
        return 1 << (2*x + 1)

def path(x, y, tree):
    stack = [(x,'')]
    while stack[-1][0] != y:
        vertex, path = stack.pop()
        if (enc((vertex, vertex+1))&tree) and ((not path) or path[-1] != '<'):
            stack.append((vertex+1, path+'>'))
        if (enc((vertex, vertex-1))&tree) and ((not path) or path[-1] != '>'):
            stack.append((vertex-1, path+'<'))
        if (enc((vertex, vertex+size))&tree) and ((not path) or path[-1] != '^'):
            stack.append((vertex+size, path+'v'))
        if (enc((vertex, vertex-size))&tree) and ((not path) or path[-1] != 'v'):
            stack.append((vertex-size, path+'^'))
    return stack[-1][1]

def reverse(path):
    rev = ''
    for i in xrange(len(path)-1, -1 ,-1):
        if path[i] == '<':
            rev += '>'
        if path[i] == '>':
            rev += '<'
        if path[i] == 'v':
            rev += '^'
        if path[i] == '^':
            rev += 'v'
    return rev

def assert_at(x, tree):
    path_ul = path(x, 0, tree)
    path_dr = path(x, size*size - 1, tree)
    return path_ul + reverse(path_ul) + path_dr + reverse(path_dr)

def safe_path(x, y, tree):
    return assert_at(x, tree) + path(x, y, tree)

with open('source.txt', 'w') as f:
    for x in xrange(size*size - 1):
        for tree in layouts:
            f.write(safe_path(x, x+1, tree) + 'c\n')

মৌলিক কাঠামো

এটি সূত্রের কোডের 990 লাইন উত্পন্ন করে, যা 10 টি দলে আসে The প্রথম 10 টি লাইনে সমস্ত নির্দেশাবলী রয়েছে যা একটি মিনিয়নকে অবস্থান থেকে পজিশনে 0নিয়ে যাওয়ার চেষ্টা করে 1এবং তারপরে একটি আইটেম সংগ্রহ করে - প্রতিটি সম্ভাব্য বিন্যাসের জন্য একটি সেট। পরবর্তী 10 টি লাইনে সমস্ত নির্দেশাবলী রয়েছে যা একটি মিনিশনকে অবস্থান থেকে পজিশনে 1নিয়ে যাওয়ার চেষ্টা করে 2এবং তারপরে একটি আইটেম সংগ্রহ করে। এবং এই জাতীয় ... এই পাথগুলি pathস্ক্রিপ্টের ফাংশনটির সাথে গণনা করা হয় - এটি কেবল একটি সাধারণ গভীরতা-প্রথম অনুসন্ধান করে।

যদি আমরা এটি নিশ্চিত করতে পারি যে, 10 টির প্রতিটি গোষ্ঠীতে, অবশ্যই এক মিনিট সফল হয়, তবে আমরা সমস্যার সমাধান করব।

পদ্ধতির সাথে বিষয়টি

এটা সবসময় ক্ষেত্রে যে অবিকল 10 গ্রুপ থেকে এক চাটুকার সফল নাও হতে পারে - যেমন, একটি চাটুকার অবস্থান থেকে পেতে পরিকল্পিত 0অবস্থানে 1ঘটনাক্রমে অবস্থান থেকে সরানোর সফল পারে 1অবস্থানে 2(লেআউট মধ্যে মিল কারণে), এবং যে বিভ্রান্তির মাধ্যমে সম্ভাব্য ব্যর্থতার কারণ হবে through

কিভাবে ঠিক হবে এটা

আমি যে ফিক্সটি ব্যবহার করেছি তা নিম্নরূপ:

প্রতিটি চাটুকার যে অবস্থান থেকে পেতে চেষ্টা করছে জন্য nকরতে n+1, প্রথম তাকে অবস্থান থেকে পদব্রজে ভ্রমণ করতে nঅবস্থানে 0অবস্থান থেকে আবার (উপরে বাম প্রান্তে) এবং পিছনে, তারপর nঅবস্থানে 99(নিচে ডান দিকের কোণায়) এবং ফিরে আবার। এই নির্দেশাবলী কেবল অবস্থান থেকে নিরাপদে সম্পাদন করা যেতে পারে n- অন্য কোনও শুরুর অবস্থান এবং মাইনটি প্রান্ত থেকে চলে যাবে।

এই অতিরিক্ত নির্দেশাবলী মাইনসগুলি দুর্ঘটনাক্রমে কোথাও যেতে যেতে বাধা দেয় যা তাদের বোঝানো হয় না এবং এটি নিশ্চিত করে যে 10 টির প্রতিটি গ্রুপ থেকে ঠিক একটি মিনিয়ন সফল। নোট করুন যে আপনি যে মিনিয়নটি আশা করেছেন তা অগত্যা নয় - এটি এমন ক্ষেত্রে হতে পারে যে যে মাইনিয়ান বিশ্বাস করে যে সে 0 লেআউটে রয়েছে সে সাফল্য পেয়েছে, এমনকি আমরা সত্যই 7 লেআউটে থাকাকালীন - তবে যে কোনও ক্ষেত্রে আমাদের কাছে সত্যটি রয়েছে এখন পরিবর্তিত অবস্থানের অর্থ গ্রুপে থাকা অন্য সমস্ত মাইনগুলি অগত্যা মরে যাবে। এই অতিরিক্ত পদক্ষেপগুলি assert_atফাংশন দ্বারা গণনা করা হয় , এবং safe_pathফাংশনটি এমন একটি পথ দেয় যা সাধারণ পাথের সাথে এই অতিরিক্ত পদক্ষেপের সংমিশ্রণ।


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

আমি এই উত্তরটি মূলত তৈরি করেছি কারণ আমি লক্ষ্য করেছি যে সমস্যাটির অস্তিত্ব রয়েছে - এবং তার জায়গায় সত্যিকারের শক্ত গণনামূলক সমস্যা ব্যবহার করে কাউকে বাধা দেওয়ার কিছু নেই বলে মনে হচ্ছে। 'নো ক্রিপ্টো' নিষেধাজ্ঞাকে নির্বিচারে সংকীর্ণ বলে মনে হচ্ছে ...
স্যাম ক্যাপলম্যান-লিনিস

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

সুদের জন্য আমার সমাধান যোগ। আগ্রহের জন্য, আমি প্রাথমিকভাবে ধাঁধাটি 1000x1000 গ্রিডের সাথে ডিজাইন করেছি, তবে lay 600000-সংখ্যার এনকোডযুক্ত লেআউট না রাখার স্বার্থে আমি ছোট আকারের জন্য বেছে নিয়েছি।
স্যাম ক্যাপলম্যান-লেনিস

8

ফায়ারটাইপ, মার্টিন বাটনার ক্র্যাকড

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

দ্রষ্টব্য : দয়া করে এই বিবরণটিতে যে কোনও অস্পষ্টতার জন্য আমাকে ক্ষমা করুন। আমি সেরা লেখক নই ...: ও

মার্টিন সত্যিই তাড়াতাড়ি কর্কশ! সমস্যাটি সমাধান করার জন্য এটিই ছিল আমার আসল প্রোগ্রাম:

_
,
^
~
+
|
|
-
%
+
_
+
=











`
~
+
|
%

_
=

\
@
-
-
!
<
>
>
>

_
+
.
<
-
`
~
~
+
|
|
-
#
%

বাক্য গঠন

একটি ফায়ারটাইপ স্ক্রিপ্ট মূলত লাইনের একটি তালিকা। প্রতিটি লাইনের প্রথম অক্ষরটি চালানো আদেশ। খালি লাইনগুলি মূলত এনওপিগুলি।

শব্দার্থবিদ্যা

আপনার কাছে একটি পূর্ণসংখ্যার অ্যারের এবং একটি পয়েন্টার রয়েছে (বিএফ ভাবেন)। আপনি বাম এবং ডান স্থানান্তর করতে পারেন বা অ্যারেতে "চাপুন" উপাদানগুলি।

ঠেলাঠেলি

আপনি যখন কোনও উপাদানকে "চাপুন" এবং আপনি অ্যারের শেষে থাকবেন, শেষে একটি অতিরিক্ত উপাদান যুক্ত হবে। আপনি যদি শেষে না হন তবে পরবর্তী উপাদানটি ওভাররাইড হয়ে যাবে। নির্বিশেষে, পয়েন্টারটি সর্বদা বাড়ানো হবে।

কমান্ড

_

অ্যারেতে একটি শূন্য চাপুন।

+

বর্তমান পয়েন্টারে উপাদান বৃদ্ধি করুন।

-

বর্তমান পয়েন্টারে উপাদানকে হ্রাস করুন।

*

বর্তমান পয়েন্টারে উপাদান দ্বিগুণ করুন।

/

বর্তমান পয়েন্টারে অর্ধেক উপাদান।

%

বর্তমান পয়েন্টারে উপাদানটি নিন এবং সেই বহু লাইন ধরে এগিয়ে যান এবং পয়েন্টারটি বাম দিকে সরান। মানটি যদি নেতিবাচক হয় তবে তার পরিবর্তে পিছন দিকে ঝাঁপুন।

=

বর্তমান পয়েন্টারে উপাদানটি ধরুন এবং সেই লাইনে + ১ টিতে লাফ দিন instance উদাহরণস্বরূপ, যদি বর্তমান উপাদানটি থাকে তবে এটি 0লাইনে লাফিয়ে যাবে 1। এটি পয়েন্টারটিকে বাম দিকেও সরিয়ে দেয়।

,

স্ট্যান্ডার্ড ইনপুট থেকে একটি অক্ষর পড়ুন এবং এর ASCII মান টিপুন।

^

বর্তমান পয়েন্টারে উপাদানটি নিন, কোনও চরিত্রের জন্য এটি ASCII মান হিসাবে ব্যাখ্যা করুন এবং এটি একটি পূর্ণসংখ্যায় রূপান্তর করুন। উদাহরণস্বরূপ, যদি বর্তমান মান হয় 49 (এর ASCII মান 1) তবে বর্তমান পয়েন্টারে উপাদানটিকে পূর্ণসংখ্যায় সেট করা হবে 1

.

স্ক্রিনে বর্তমান নম্বরটি লিখুন।

!

বর্তমান পয়েন্টারে উপাদানটি নিন এবং পরবর্তী লাইনে বহুবার পুনরাবৃত্তি করুন। পয়েন্টারটি বাম দিকেও সরায়।

<

পয়েন্টারটি বাম দিকে সরান। আপনি যদি ইতিমধ্যে শুরুতে থাকেন তবে একটি ত্রুটি নিক্ষেপ করা হয়।

>

পয়েন্টারটি ডানদিকে সরান। আপনি ইতিমধ্যে শেষে থাকলে, একটি ত্রুটি নিক্ষেপ করা হয়।

~

যদি বর্তমান উপাদানটি ননজারো হয় তবে এটির সাথে প্রতিস্থাপন করুন 0; অন্যথায়, এটি সঙ্গে প্রতিস্থাপন 1

|

বর্তমান উপাদানটিকে স্কোয়ার করুন।

@

অ্যারের দৈর্ঘ্যে বর্তমান উপাদানটি সেট করুন।

`

বর্তমান উপাদানটির সদৃশ করুন।

\

নির্দেশকের কাছে এবং তার আগে উপাদানগুলিকে সাজান।

#

বর্তমান উপাদান নেতিবাচক।

দোভাষী

গিথুব এও উপলব্ধ ।

#!/usr/bin/env python

# The FireType interpreter.
# Runs under Python 2 and 3.
import sys

class Array(object):
    def __init__(self):
        self.array = []
        self.ptr = 0

    def push_zero(self):
        if self.ptr == len(self.array):
            self.array.append(0)
        else:
            self.array[self.ptr] = 0
        self.ptr += 1

    def left(self):
        self.ptr -= 1
        assert self.ptr >= 0 and self.array, 'pointer underflow (at %d)' % i

    def right(self):
        self.ptr += 1
        assert self.ptr <= len(self.array), 'pointer overflow (at %d)' % i

    def sort(self):
        lhs = self.array[:self.ptr-1]
        rhs = self.array[self.ptr-1:]
        lhs.sort()
        lhs.reverse()
        self.array = lhs + rhs

    def __call__(self, *args):
        args = list(args)
        assert self.array, 'out-of-bounds (at %d)' % i
        if not args:
            return self.array[self.ptr-1]
        self.array[self.ptr-1] = args.pop()
        assert not args

    def __len__(self):
        return len(self.array)

    def __str__(self):
        return 'Array(array=%s, ptr=%s)' % (self.array, self.ptr)

    def __repr__(self):
        return 'Array(array=%r, ptr=%r)' % (self.array, self.ptr)

def execute(lines):
    global i, array
    i = 0
    array = Array()
    rep = 0
    while i < len(lines):
        line = lines[i]
        if not line:
            i += 1
            continue
        line = line[0]
        if line == '_':
            array.push_zero()
        elif line == '+':
            array(array() + 1)
        elif line == '-':
            array(array() - 1)
        elif line == '*':
            array(array() * 2)
        elif line == '/':
            array(int(array() / 2))
        elif line == '%':
            i += array()
            array.left()
        elif line == '=':
            i = array()-1
            array.left()
        elif line == ',':
            array.push_zero()
            array(ord(sys.stdin.read(1)))
        elif line == '.':
            sys.stdout.write(str(array()))
        elif line == '!':
            rep = array()
            array.left()
            i += 1
        elif line == '<':
            array.left()
        elif line == '>':
            array.right()
        elif line == '^':
            array(int(chr(array())))
        elif line == '~':
            array(int(not array()))
        elif line == '|':
            array(array() ** 2)
        elif line == '@':
            array(len(array))
        elif line == '`':
            top = array()
            array.push_zero()
            array(top)
        elif line == '\\':
            array.sort()
        elif line == '#':
            array(-array())

        if rep:
            rep -= 1
        else:
            i += 1

def main(args):
    try:
        _, path = args
    except ValueError:
        sys.exit('usage: %s <file to run, - for stdin>')

    if path == '-':
        data = sys.stdin.read()
    else:
        with open(path) as f:
            data = f.read()

    try:
        execute(data.split('\n'))
    except:
        print('ERROR!')
        print('Array was %r' % array)
        print('Re-raising error...')
        raise

if __name__ == '__main__':
    main(sys.argv)

আমি মনে করি অ্যারের নীচের সীমানার জন্য দৃ bu়তা বগি। যেহেতু আপনি self.ptr-1অ্যাক্সেসের জন্য ব্যবহার করছেন, আপনার সম্ভবত এটি পরীক্ষা করা উচিত self.ptr>0নয় >=0। (এটি কোনও বৈধ প্রোগ্রামকে অকার্যকর করে তুলবে না তবে কিছু প্রোগ্রাম দুর্ঘটনাক্রমে কাজ করতে পারে যা করা উচিত নয়))
মার্টিন এন্ডার

আরও একটি বিষয়: কোড =বলায় মান সেট করে array() - 1, ডকুমেন্টেশন বলে +1?
মার্টিন ইন্ডার

কর্কশ। (ধরে নিচ্ছি যে দোভাষী অনুবাদকের ভিত্তিতে আদর্শিক, বিবরণ নয়))
মার্টিন এণ্ডার

@ মার্টিনব্যাটনার ডাং, এটি আমার ধারণা থেকে দ্রুত ছিল! : ওআই আপনার উল্লেখ করা দস্তাবেজের সমস্যাগুলি স্থির করেছে।
kirbyfan64sos

7

Acc !! (নিরাপদ)

এটা ...

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

... এবং আশা করি অবশ্যই আরও লুথোল-প্রুফ

আমি ইতিমধ্যে অ্যাকটি পড়েছি ! বৈশিষ্ট। কেমন আছে অ্যাক !! ভিন্ন?

এ্যাক ইন !! লুপটি প্রস্থান করলে লুপ ভেরিয়েবলগুলি সুযোগের বাইরে চলে যায়। আপনি এগুলি কেবল লুপের অভ্যন্তরে ব্যবহার করতে পারেন। বাইরে, আপনি একটি "নাম সংজ্ঞায়িত নয়" ত্রুটি পাবেন। এই পরিবর্তন ব্যতীত ভাষাগুলি অভিন্ন ident

বিবৃতি

কমান্ডগুলি লাইন দ্বারা পার্স করা হয়। কমান্ডের তিন প্রকার রয়েছে:

  1. Count <var> while <cond>

সি ++ এর সমতুল্য ননজারো <var>হিসাবে 0 থেকে উপরে গণনা করা । লুপ কাউন্টার যে কোনও একক ছোট হাতের অক্ষর হতে পারে। শর্তটি কোনও অভিব্যক্তি হতে পারে, অগত্যা লুপ পরিবর্তনশীল জড়িত না। শর্তের মান 0 হয়ে গেলে লুপটি থামে।<cond>for(int <var>=0; <cond>; <var>++)

লুপগুলিকে কে ও আর-স্টাইলের কোঁকড়ানো ধনুর্বন্ধনী প্রয়োজন (বিশেষত স্ট্রস্ট্রপ রূপে ):

Count i while i-5 {
 ...
}

উপরে উল্লিখিত হিসাবে, লুপ ভেরিয়েবলগুলি কেবল তাদের লুপের ভিতরেই উপলব্ধ ; পরে তাদের উল্লেখ করার চেষ্টা করার ফলে একটি ত্রুটি ঘটে।

  1. Write <charcode>

প্রদত্ত ASCII / ইউনিকোড মানকে স্টডআউটে একটি একক অক্ষর আউটপুট দেয়। চারকোড যে কোনও এক্সপ্রেশন হতে পারে।

  1. অভিব্যক্তি

নিজেই দাঁড়িয়ে থাকা যে কোনও অভিব্যক্তি মূল্যায়ন করা হয় এবং সঞ্চয়ে সংস্থাকে (যা অ্যাক্সেসযোগ্য _) হিসাবে ফিরে দেওয়া হয় । সুতরাং, যেমন, 3একটি বিবৃতি যা সঞ্চালককে 3 তে সেট করে; _ + 1সংযোজক বৃদ্ধি; এবং _ * Nএকটি অক্ষর পড়ে এবং তার চারকোড দ্বারা সংযোজককে গুণ করে।

দ্রষ্টব্য: সঞ্চয়ের একমাত্র ভেরিয়েবল যা সরাসরি নির্ধারিত হতে পারে; লুপ ভেরিয়েবল এবং Nগণনায় ব্যবহৃত হতে পারে তবে পরিবর্তিত হয় না।

সংগ্রহকারী প্রাথমিকভাবে 0 হয়।

প্রকাশ

একটি অভিব্যক্তি সংযোজকের জন্য পূর্ণসংখ্যার আক্ষরিক, লুপ ভেরিয়েবল ( a-z) _এবং বিশেষ মান অন্তর্ভুক্ত করতে পারে N, যা একটি অক্ষর পড়ে এবং প্রতিবার ব্যবহৃত হওয়ার সাথে সাথে তার চারকোডে মূল্যায়ন করে। দ্রষ্টব্য: এর অর্থ প্রতিটি অক্ষর পড়ার জন্য আপনি কেবল একটি শট পান; পরের বার আপনি ব্যবহার করবেন N, আপনি পরেরটি পড়তে হবে।

অপারেটররা হলেন:

  • +, সংযোজন
  • -, বিয়োগ; একাত্মতা অবহেলা
  • *, গুণ
  • /, পূর্ণসংখ্যা বিভাগ
  • %, মডুলো
  • ^, exponentiation

অভিভাবকরা অপারেশনের অগ্রাধিকার প্রয়োগ করতে ব্যবহার করতে পারেন। এক্সপ্রেশনটিতে অন্য কোনও অক্ষর একটি বাক্য গঠন ত্রুটি।

সাদা জায়গা এবং মন্তব্য

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

# একটি একক লাইন মন্তব্য শুরু।

ইনপুট আউটপুট

Acc !! ইনপুট হিসাবে অক্ষরের একক লাইন প্রত্যাশা করে। প্রতিটি ইনপুট চরিত্র ক্রমানুসারে পুনরুদ্ধার করা যায় এবং এর চারকোড ব্যবহার করে প্রক্রিয়া করা যায় N। লাইনের শেষ অক্ষরটি পড়ার চেষ্টা করার ফলে একটি ত্রুটি ঘটে। একটি চরিত্র Writeবিবৃতিতে তার চারকোড পাস করে আউটপুট হতে পারে ।

অনুবাদক

দোভাষী (পাইথন 3 এ লিখিত) এসি অনুবাদ করে !! পাইথন কোড এবং execএটি।

import re, sys

def main():
    if len(sys.argv) != 2:
        print("Please supply a filename on the command line.", file=sys.stderr)
        return
    codeFile = sys.argv[1]
    with open(codeFile) as f:
        code = f.readlines()
    code = translate(code)
    exec(code, {"inputStream": (ord(char) for char in input())})

def translate(accCode):
    indent = 0
    loopVars = []
    pyCode = ["_ = 0"]
    for lineNum, line in enumerate(accCode):
        if "#" in line:
            # Strip comments
            line = line[:line.index("#")]
        line = line.strip()
        if not line:
            continue
        lineNum += 1
        if line == "}":
            if indent:
                loopVar = loopVars.pop()
                pyCode.append(" "*indent + loopVar + " += 1")
                indent -= 1
                pyCode.append(" "*indent + "del " + loopVar)
            else:
                raise SyntaxError("Line %d: unmatched }" % lineNum)
        else:
            m = re.fullmatch(r"Count ([a-z]) while (.+) \{", line)
            if m:
                expression = validateExpression(m.group(2))
                if expression:
                    loopVar = m.group(1)
                    pyCode.append(" "*indent + loopVar + " = 0")
                    pyCode.append(" "*indent + "while " + expression + ":")
                    indent += 1
                    loopVars.append(loopVar)
                else:
                    raise SyntaxError("Line %d: invalid expression " % lineNum
                                      + m.group(2))
            else:
                m = re.fullmatch(r"Write (.+)", line)
                if m:
                    expression = validateExpression(m.group(1))
                    if expression:
                        pyCode.append(" "*indent
                                      + "print(chr(%s), end='')" % expression)
                    else:
                        raise SyntaxError("Line %d: invalid expression "
                                          % lineNum
                                          + m.group(1))
                else:
                    expression = validateExpression(line)
                    if expression:
                        pyCode.append(" "*indent + "_ = " + expression)
                    else:
                        raise SyntaxError("Line %d: invalid statement "
                                          % lineNum
                                          + line)
    return "\n".join(pyCode)

def validateExpression(expr):
    "Translates expr to Python expression or returns None if invalid."
    expr = expr.strip()
    if re.search(r"[^ 0-9a-z_N()*/%^+-]", expr):
        # Expression contains invalid characters
        return None
    elif re.search(r"[a-zN_]\w+", expr):
        # Expression contains multiple letters or underscores in a row
        return None
    else:
        # Not going to check validity of all identifiers or nesting of parens--
        # let the Python code throw an error if problems arise there
        # Replace short operators with their Python versions
        expr = expr.replace("^", "**")
        expr = expr.replace("/", "//")
        # Replace N with a call to get the next input character
        expr = expr.replace("N", "inputStream.send(None)")
        return expr

if __name__ == "__main__":
    main()

সমাধান

মূল এ্যাকের পতন ! লুপ ভেরিয়েবলগুলি ছিল যা তাদের লুপগুলির বাইরে অ্যাক্সেসযোগ্য ছিল। এটি সঞ্চয়কারীদের অনুলিপিগুলি সংরক্ষণের অনুমতি দেয়, যা সমাধানটিকে অনেক সহজ করে তুলেছে।

এখানে, এই লুপহোলটি ছাড়া (দুঃখিত), আমাদের কাছে কেবল স্টাফ রাখার জন্য সঞ্চয়কারী রয়েছে। কার্যটি সমাধান করার জন্য, আমাদের চারটি নির্বিচারে বৃহত মানগুলি সংরক্ষণ করা উচিত। 1 সমাধান: তাদের বিটগুলি ইন্টারলিভ করুন এবং ফলাফল সংশ্লেষ নম্বরটি সঞ্চয়ের মধ্যে সংরক্ষণ করুন। উদাহরণস্বরূপ, 37৪3737 এর সঞ্চয়ের মান নিম্নলিখিত ডেটাগুলি সংরক্ষণ করবে (একক-বিট পতাকা হিসাবে সর্বনিম্ন-ক্রম বিটটি ব্যবহার করে):

1100100100101  Binary representation of accumulator
321032103210F  Key

The flag is 1 and the four numbers are
Number 0: 010 = 2
Number 1: 001 = 1
Number 2: 100 = 4
Number 3: 110 = 6

2, 2 মডের যথাযথ শক্তি দ্বারা সংযোজককে বিভাজন করে আমরা যে কোনও সংখ্যার যে কোনও বিট অ্যাক্সেস করতে পারি This এটি স্বতন্ত্র বিট সেট বা ফ্লিপ করারও অনুমতি দেয়।

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

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

আমি সন্দেহ করি যে এসি !! এটি টুরিং-সম্পূর্ণ, তবে আমি নিশ্চিত নই যে আমি এটি প্রমাণ করার সমস্যায় যেতে চাই।

মন্তব্য সহ আমার সমাধান এখানে:

# Read and process numbers until the double 0

Count y while N-48 {
    # Read unary number and store it (as binary) in number 0
    # The above loop header consumed the first 1, so we need to add 1 to number 0

    _ + 2

    # Increment number 0 for each 1 in input until next 0

    Count z while N-48 {
        # In this context, the flag indicates a need to carry; set it to 1
        _ - _%2 + 1

        # While carry flag is set, increment the next bit in line
        Count i while _%2 {
            # Set carry flag to 1 if i'th bit is 1, 0 if it's 0
            # Set i'th bit to 1 if it was 0, 0 if it was 1
            _ - _%2 + _/2^(i*4+1)%2 + (-1)^(_/2^(i*4+1)%2)*2^(i*4+1)
        }
    }

    # Bubble number 0 upwards

    Count n while n-3 {
        # The flag (rightmost bit of accumulator) needs to become 1 if we want to swap
        # numbers (n) and (n+1) and 0 if we don't
        # Iterate over bit-groups of accumulator, RTL
        Count i while _/2^(i*4+1) {
            # Adjust the flag as follows:
            # _/2^(i*4+n+1)%4 is the current bit of number (n+1) followed by the current
            # bit of number (n), a value between 0 and 3
            # - If this quantity is 1 (01), number (n) is bigger so far; set flag to 1
            # - If this quantity is 2 (10), number (n+1) is bigger so far; set flag to 0
            # - If this quantity is 0 (00) or 3 (11), the two bits are the same; keep
            #   current value of flag
            _ + (_/2^(i*4+n+1)%4%3 + 1)/2*(_/2^(i*4+n+1)%4%3%2 - _%2)
        }

        # Now swap the two if the flag is 1
        Count i while (_%2)*(_/2^(i*4+1)) {
            # _/2^(i*4+n+1)%2 is the current bit of number (n)
            # _/2^(i*4+n+2)%2 is the current bit of number (n+1)
            _ - (_/2^(i*4+n+1)%2)*2^(i*4+n+1) - (_/2^(i*4+n+2)%2)*2^(i*4+n+2) + (_/2^(i*4+n+2)%2)*2^(i*4+n+1) + (_/2^(i*4+n+1)%2)*2^(i*4+n+2)
        }
    }

    # Discard number 0, setting it to all zeros for the next iteration
    Count i while _/2^(i*4+1) {
        _ - _/2^(i*4+1)%2*2^(i*4+1)
    }
}

# Once the loop is over, all input has been read and the result is in number 1
# Divide by 2 to get rid of flag bit

_ / 2

# Zero out numbers 2 and 3

Count i while _/2^(i*4) {
    _ - _/2^(i*4+2)%2*2^(i*4+2)
}

Count i while _/2^(i*4) {
    _ - _/2^(i*4+3)%2*2^(i*4+3)
}

# Move bits of number 1 down to their final locations

Count i while _/2^i {
    _ - _/2^(i*4+1)%2*2^(i*4+1) + _/2^(i*4+1)%2*2^i
}

# _ now contains the correct answer in decimal; to output in unary:

Count z while z-_ {
    Write 49
}

1 প্রশ্ন অনুসারে, কেবলমাত্র 1 মিলিয়ন অবধি মানগুলি সমর্থন করা প্রয়োজন। আমি খুশি যে এর সহজ সমাধানের জন্য কেউ এর সদ্ব্যবহার করেন নি - যদিও আপনি কীভাবে তুলনা করবেন তা পুরোপুরি নিশ্চিত নই।


বিল দ্য বিড়ালের ছবিটি @ এলওএল করুন
একটি স্প্যাগেটো

7

পিকোফাক (নিরাপদ)

Picofuck অনুরূপ Smallfuck । এটি একটি বাইনারি টেপটিতে পরিচালনা করে যা ডানদিকে আনবাউন্ড, বাম দিকে আবদ্ধ। এটিতে নিম্নলিখিত আদেশগুলি রয়েছে:

  • > পয়েন্টারটি ডানদিকে সরান

  • <পয়েন্টার বাম দিকে সরান। যদি পয়েন্টারটি টেপ থেকে পড়ে তবে প্রোগ্রামটি সমাপ্ত হয়।

  • * পয়েন্টারে বিট ফ্লিপ করুন

  • (যদি পয়েন্টারে কিছুটা থাকে 0তবে পরের দিকে ঝাঁপুন)

  • )কিছুই করবেন না - পিকোফাকের প্রথম বন্ধনীগুলি ifব্লক, whileলুপ নয় ।

  • .ascii হিসাবে পয়েন্টারে বিট stdout লিখুন 0বা 1

  • ,স্টিডিন থেকে পড়ুন যতক্ষণ না আমরা একটি 0বা এর মুখোমুখি হব 1এবং এটি পয়েন্টারে কিছুটা রেখে store

পিকোফাক কোড মোড়ক - একবার প্রোগ্রামের শেষ হয়ে গেলে এটি শুরু থেকে অব্যাহত থাকে।

তদ্ব্যতীত, পিকোফাক নেস্টেড বন্ধনীকে সম্মতি দেয় না। একটি Picofuck প্রোগ্রাম প্রদর্শনে মধ্যে বিকল্প আবশ্যক প্রথম বন্ধনী (এবং ), দিয়ে শুরু (এবং দিয়ে শেষ )

অনুবাদক

পাইথনে লিখিত 2.7

ব্যবহার: python picofuck.py <source_file>

import sys

def interpret(code):
    # Ensure parentheses match and are not nested.
    in_if_block = False
    for c in code:
        if c == '(':
            if in_if_block:
                print "NESTED IFS DETECTED!!!!!"
                return
            in_if_block = True
        elif c == ')':
            if not in_if_block:
                print "Unmatched parenthesis"
                return
            in_if_block = False
    if in_if_block:
        print "Unmatched parenthesis"
        return


    code_ptr = 0
    array = [0]
    ptr = 0

    while 1:
        command = code[code_ptr]
        if command == '<':
            if ptr == 0:
                break
            ptr -= 1
        elif command == '>':
            ptr += 1
            if ptr == len(array):
                array.append(0)
        elif command == '*':
            array[ptr] = 1-array[ptr]
        elif command == '(':
            if array[ptr] == 0:
                while code[code_ptr] != ')':
                    code_ptr = (code_ptr + 1) % len(code)
        elif command == ',':
            while True:
                c = sys.stdin.read(1)
                if c in ['0','1']:
                    array[ptr] = int(c)
                    break
        elif command == '.':
            sys.stdout.write(str(array[ptr]))
        code_ptr = (code_ptr+1)%len(code)

if __name__ == "__main__":
    with open(sys.argv[1]) as source_file:
        code = source_file.read()
    interpret(code)

সমাধান

নিম্নলিখিত পাইথন ২.7 প্রোগ্রামটি আমার সমাধানটিকে আউটপুট করে যা এখানে পাওয়া যাবে

এটি কীভাবে কাজ করে তার আরও বিশদ ব্যাখ্যার সাথে আমি পরে এই পোস্টটি সম্পাদনা করতে পারি, তবে দেখা যাচ্ছে যে পিকোফাক টিউরিং-সম্পূর্ণ।

states = {
    "SETUP":(
        "*>",
        "GET_NUMBER",
        "GET_NUMBER"
    ),

    "GET_NUMBER":(
        ",",
        "CHANGE_A",
        "PREPARE_PRINT_C"
    ),

    "GET_DIGIT":(
        ",",
        "CHANGE_A",
        "GOT_DIGIT"
    ),

    "GOT_DIGIT":(
        ">>>>",
        "GO_BACK",
        "GO_BACK"
    ),

    "CHANGE_A":(
        ">",
        "CHANGE_B",
        "SET_A"
    ),

    "SET_A":(
        "*>>>>",
        "GET_DIGIT",
        "GET_DIGIT"
    ),

    "CHANGE_B":(
        ">",
        "CHANGE_C",
        "SET_B"
    ),

    "SET_B":(
        "*>>>",
        "GET_DIGIT",
        "GET_DIGIT"
    ),

    "CHANGE_C":(
        ">",
        "CONTINUE_GET_NUMBER",
        "SET_C"
    ),

    "SET_C":(
        "*>>",
        "GET_DIGIT",
        "GET_DIGIT"
    ),

    "CONTINUE_GET_NUMBER":(
        ">>",
        "GET_DIGIT",
        "GET_DIGIT"
    ),

    "GO_BACK":(
        "<<<<<",
        "FINISH_GO_BACK",
        "GO_BACK"
    ),

    "FINISH_GO_BACK":(
        ">",
        "GET_NUMBER",
        "GET_NUMBER"
    ),

    "PREPARE_PRINT_C":(
        ">>>",
        "PRINT_C",
        "PRINT_C"
    ),

    "PRINT_C":(
        ".>>>>>",
        "PRINT_C",
        "TERMINATE"
    ),

    "TERMINATE":(
        "<",
        "TERMINATE",
        "TERMINATE"
    ),
}

def states_to_nanofuck(states,start_state):
    state_list = list(states)
    state_list.remove(start_state)
    state_list.insert(0,start_state)

    states_by_index = []
    for i,state in enumerate(state_list):
        commands, next1, next0 = states[state]
        states_by_index.append((commands,state_list.index(next1),state_list.index(next0)))


    # setup first state
    fragments = ['*(*>>>>>*<<<<<)>>>>>']

    # reset states that don't match
    for index in range(len(states_by_index)):
        for bool in range(2):
            # at state_0_0
            state_dist = index*3 + bool
            # move state to curstate
            fragments.append('>'*state_dist)
            fragments.append('(*')
            fragments.append(  '<'*state_dist)
            fragments.append(  '<<*>>')
            fragments.append(  '>'*state_dist)
            fragments.append(')')
            fragments.append('<'*state_dist)

            # go to arr
            fragments.append('<<<')

            if bool == 0:
                #flip arr
                fragments.append('*')

            # compute match = arr & curstate
            fragments.append('(>)(>*<)<(<)>')

            if bool == 0:
                #flip arr
                fragments.append('*')

            # reset curstate
            fragments.append('>(*)')

            # move match to matchstate, go back to state_0_0
            matchstate_dist = index*3 + 2
            fragments.append('>(*>')
            fragments.append(  '>'*matchstate_dist)
            fragments.append(  '*')
            fragments.append(  '<'*matchstate_dist)
            fragments.append('<)>')

    #fragments.append('|')

    # do the commands of the matching state
    for index,state in enumerate(states_by_index):
        for bool in range(2):
            # at state_0_0
            matchstate_dist = index*3 + 2
            # move matchstate to curstate
            fragments.append('>'*matchstate_dist)
            fragments.append('(*')
            fragments.append(  '<'*matchstate_dist)
            fragments.append(  '<<*>>')
            fragments.append(  '>'*matchstate_dist)
            fragments.append(')')
            fragments.append('<'*matchstate_dist)

            # if curstate, reset curstate
            fragments.append('<<(*')

            # go to arr
            fragments.append('<')

            # do commands
            commands,next1,next0 = state
            for c in commands:
                if c in '<>':
                    fragments.append(c*(3*len(states_by_index)+5))
                else:
                    fragments.append(c)

            # go to state_0_0
            fragments.append('>>>')

            # set next states
            for dist in [next0*3, next1*3+1]:
                fragments.append('>'*dist)
                fragments.append('*')
                fragments.append('<'*dist)

            # go to curstate
            fragments.append('<<')

            # end if
            fragments.append(')')

            # go to state_0_0
            fragments.append('>>')


    # go back to setup and set it
    fragments.append('<<<<<*')

    code = ''.join(fragments)

    return code



print states_to_nanofuck(states, "SETUP")

2
প্রায় 2 বছর অপেক্ষা করছে এটি এখনও পরে আছে?
ক্যালকুলেটরফলাইন

শুধু এফওয়াইআই, আপনার দেওয়া লিঙ্কটি এখন মারা গেছে ''
কনর ও'ব্রায়েন

লিঙ্কটি একটি ডাউনলোড প্রয়োজন এবং আমি খুব অলস। ঠিক করুন
ক্যালকুলেটরলাইন

@ ক্যালকুলেটরফলাইন এটি ১৩ কেবি, এটি ডাউনলোড হিসাবে পরিচালনা করা অনেক সহজ।
mbomb007

7

PQRS - নিরাপদ! / সমাধান সরবরাহ

বুনিয়াদি

সমস্ত অন্তর্নিহিত নির্দেশাবলীতে চারটি মেমরি ঠিকানা অপারেশন রয়েছে:

P₀ Q₀ R₀ S₀
P₁ Q₁ R₁ S₁
...
Pᵥ₋₁ Qᵥ₋₁ Rᵥ₋₁ Sᵥ₋₁

vকোয়ার্টারে স্মৃতি আকার Where

Pᵢ, Qᵢ, Rᵢ, Sᵢ(যেমন 16, 32 বা 64 বিট) যা আমরা শব্দ হিসেবে উল্লেখ করতে হবে সাইন ইন করা অবস্থায় মেশিনের নেটিভ আকার পূর্ণসংখ্যার করছে।

প্রতিটি কোয়ার্টের জন্য i, []নির্দেশিত ইন্ডিয়ারেশন সহ গহিত অপারেশনটি হ'ল:

if (([Pᵢ] ← [Qᵢ] − [Rᵢ]) ≤ 0) go to Sᵢ else go to Pᵢ₊₁

দ্রষ্টব্য যে স্বেলেক PQRS এর একটি উপসেট ।

সুবলেক সম্পূর্ণ প্রমাণিত হয়েছে, সুতরাং পিকিউআরএসও সম্পূর্ণ হওয়া উচিত!

প্রোগ্রাম স্ট্রাকচার

পিকিউআরএস একটি প্রাথমিক শিরোনাম নিম্নলিখিত হিসাবে সংজ্ঞায়িত করে:

H₀ H₁ H₂ H₃ H₄ H₅ H₆ H₇

H₀ H₁ H₂ H₃সর্বদা প্রথম নির্দেশ P₀ Q₀ R₀ S₀। লোড সময় সংজ্ঞায়িত H₀করা H₃প্রয়োজন।

পিকিউআরএসের প্রাথমিক / ও রয়েছে প্রাথমিক, তবে চ্যালেঞ্জের পক্ষে যথেষ্ট।

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

H₆ H₇: প্রোগ্রাম সমাপ্তিতে, সূচকে শুরু করে H₆, এটি H₇ASCII অক্ষর হিসাবে স্ট্যান্ডার্ড আউটপুট শব্দগুলি সমন্বিত সমস্ত বাইট মুদ্রণ করে । H₆এবং H₇প্রোগ্রামটি শেষ হওয়ার আগে সংজ্ঞা দেওয়া দরকার need '\0'আউটপুটে নাল বাইট বাদ দেওয়া হবে।

পরিসমাপ্তি

Sᵢসীমা অতিক্রম করে i < 0বা সমাপ্তি অর্জন করা হয় i ≥ v

ঠাট

কোয়ার্টেটগুলি Pᵢ Qᵢ Rᵢ Sᵢসারিবদ্ধ বা ক্রমযুক্ত হওয়ার দরকার নেই, উপ-চৌদ্দ বিরতিতে শাখা প্রশাখার অনুমতি রয়েছে।

পিকিউআরএসের ইন্ডিয়ারেশন রয়েছে তাই সুবলিকের বিপরীতে সাবরুটাইনগুলি প্রয়োগের জন্য যথেষ্ট নমনীয়তা রয়েছে।

কোড স্ব-সংশোধন হতে পারে!

অনুবাদক

দোভাষী সি তে লেখা আছে:

#include <stdlib.h>
#include <stdio.h>

// The "architecture"
enum {P, Q, R, S, START_OF_INPUT, LENGTH_OF_INPUT, START_OF_OUTPUT, LENGTH_OF_OUTPUT};
const int NEXT = S + 1;

// Recommend optimized!
#define OPTIMIZED

#ifdef PER_SPECS
// This may not work on all OSes and architectures - just too much memory needed!
const int K = 1002000200;
#else // OPTIMIZED
// This provides enough space to run the test cases with challenge-optimized.pqrs
const int K = 5200;
#endif

int main(int argc, char *argv[])
{
    int i, *M;
    char *p;
    FILE *program;

    // Allocate enough memory
    M = calloc(K, sizeof(int));

    // Load the program
    for (i = 0, program = fopen(argv[1], "r"); i < K && !feof(program); i++)
        if (!fscanf(program, "%d", M + i))
            break;
    fclose(program);

    // Read in the input
    for (i = 0; i < M[LENGTH_OF_INPUT] && !feof(stdin); i++)
    {
        int c = fgetc(stdin);
        if (c != EOF)
            M[M[START_OF_INPUT] + i] = c;
        else
            break;
    }
    M[LENGTH_OF_INPUT] = i;

    // Execute until terminated
    for (i = 0; i >= 0 && i < K; )
        i = (M[M[P + i]] = M[M[Q + i]] - M[M[R + i]]) <= 0? M[S + i]: i + NEXT;

    // Write the output
    for (i = 0, p = (char *)(M + M[START_OF_OUTPUT]); i < M[LENGTH_OF_OUTPUT] * sizeof(int); i++)
        // Ignore '\0'
        if (p[i])
            fputc(p[i], stdout);

    // Done
    free(M);

    return 0;
}

ব্যবহার করতে, উপরের অংশগুলি pqrs.c হিসাবে সংরক্ষণ করুন এবং তারপর সংকলন করুন:

gcc -o pqrs pqrs.c

নমুনা প্রোগ্রাম

'PQRS-' এর পূর্বে 40 অক্ষর পর্যন্ত ইকোস ইনপুট।

8 8 8 -1 14 40 9 45 0 80 81 82 83 45

চালানোর জন্য উপরের মতো সংরক্ষণ করুন echo.pqrs:

$ ./prqs echo.pqrs
greetings[enter]
[ctrl-D]
PQRS-greetings

পরীক্ষার মামলা চলছে:

$ ./pqrs challenge-optimized.pqrs < test-1.txt
1

$ ./pqrs challenge-optimized.pqrs < test-2.txt
11111111111111111

$ ./pqrs challenge-optimized.pqrs < test-3.txt
[lots of ones!]

$ ./pqrs challenge-optimized.pqrs < test-3.txt | wc
0       1     773

সমস্ত পরীক্ষার কেসগুলি খুব তাড়াতাড়ি চলে eg উদাহরণস্বরূপ <500 এমএস।

চ্যালেঞ্জ

পিকিউআরএসকে স্থিতিশীল বলে গণ্য করা যায়, সুতরাং চ্যালেঞ্জটি 2015-10-31 13:00 থেকে শুরু হবে এবং ইউটিসিতে 2015-11-08 13:00, সমাপ্ত হবে।

শুভকামনা!

সমাধান

ভাষাটি "বেবি" -তে ব্যবহৃত ভাষার সাথে বেশ অনুরূপ - বিশ্বের প্রথম সঞ্চিত-প্রোগ্রাম ইলেকট্রনিক ডিজিটাল মেশিন। সেই পৃষ্ঠাতে (সিআরটি!) মেমরির 32 টিরও কম শব্দের মধ্যে একটি পূর্ণসংখ্যার সর্বোচ্চ ফ্যাক্টর সন্ধান করার জন্য একটি প্রোগ্রাম!

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

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

; ANNOTATED PQRS ASSEMBLER CODE
; MINIMAL SIZED BUFFERS TO RUN THE TEST CASES

;OFFSET   LABEL       P-OP        Q-OP        R-OP        S-OP
0                     TEMP        ZERO        ZERO        L1

; INPUT AND OUTPUT LOCATIONS AND SIZES
4                     INPUT       4000        
6         L0:         OUTPUT      1000        

; GET CURRENT INPUT
8         L1:         TEMP        INPUT       ASCII_ZERO  L2
12                    SUM         SUM         INC         IGNORE
16                    L1+1        L1+1        INC         IGNORE
20                    TEMP        ZERO        ZERO        L1

; CHECK IF END OF NUMBERS
24        L2:         NUMBERS     SUM         ZERO        L3

; ADVANCE TO NEXT NUMBER
28                    L2          L2          INC         IGNORE

; ADVANCE COUNT
32                    COUNT       COUNT       INC         IGNORE
36                    L1+1        L1+1        INC         IGNORE

; CLEAR SUM AND GO BACK
40                    SUM         ZERO        ZERO        L1

; SORT NUMBERS                
44        L3:         P           NUMBERS     ZERO        LA
48        L4:         Q           NUMBERS+1   ZERO        L9

; COMPARE                
52                    TEMP        Q           P           L8

; SWAP IF OUT OF ORDER
56                    L5+1        L3+1        ZERO        IGNORE
60                    L6          L3+1        ZERO        IGNORE
64                    L6+1        L4+1        ZERO        IGNORE
68                    L7          L4+1        ZERO        IGNORE
72        L5:         TEMP        P           ZERO        IGNORE
76        L6:         P           Q           ZERO        IGNORE
80        L7:         Q           TEMP        ZERO        IGNORE

; INCREMENT INNER INDEX
84        L8:         L4+1        L4+1        INC         IGNORE
88                    TEMP        ZERO        ZERO        L3

; INCREMENT OUTER INDEX AND RESET INNER INDEX
92        L9:         L3+1        L3+1        INC         IGNORE
96                    L4+1        L3+1        INC         IGNORE
100                   TEMP        ZERO        ZERO        L3

; OUTPUT THIRD LARGEST NUMBER
104                   L0+1        NUMBERS+2   ZERO        IGNORE
108       LA:         TEMP        NUMBERS+2   ZERO        EXIT
112       LB:         OUTPUT      ASCII_ONE   ZERO        IGNORE
116                   LB          LB          INC         IGNORE
120                   NUMBERS+2   NUMBERS+2   DEC         EXIT
124                   TEMP        ZERO        ZERO        LA

; SAFETY LOOP – JUST IN CASE IGNORE DOESN'T WORK AS PLANNED!
128       IGNORE:     TEMP        ZERO        ZERO        IGNORE

; CONSTANTS
132       ZERO:        0
133       INC:        -1
134       DEC:         1
135       ASCII_ZERO: 48
136       ASCII_ONE:  49

; VARIABLES
137       TEMP:       [1]
138       SUM:        [1]
139       COUNT:      [1]
140       P:          [1]
141       Q:          [1]

; WORKING SPACE
142       NUMBERS:    [10]

; I/O SPACE
152       INPUT:      [4000]
4152      OUTPUT:     [1000]
5152

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

নোট করুন INC(বর্ধন) নেতিবাচক এবং DEC(হ্রাস) ইতিবাচক! এটা কোথায় ব্যবহার করছে L#বা L#+1যেমন P-বা Q-OPবৃদ্ধিশীল, decrementing, সোয়াপিং, ইত্যাদি প্রতীকী ভাষান্তর হাত প্রণীত হয়েছে: S, কী হচ্ছে এটা পয়েন্টার আপডেট হয় PQRS অফসেট সঙ্গে লেবেল দ্বারা substituting। নীচে PQRS অনুকূলিত সমাধান:

137 132 132 8
152 4000
4152 1000
137 152 135 24
138 138 133 128
9 9 133 128
137 132 132 8
142 138 132 44
24 24 133 128
139 139 133 128
9 9 133 128
138 132 132 8
140 142 132 108
141 143 132 92
137 141 140 84
73 45 132 128
76 45 132 128
77 49 132 128
80 49 132 128
137 140 132 128
140 141 132 128
141 137 132 128
49 49 133 128
137 132 132 44
45 45 133 128
49 45 133 128
137 132 132 44
7 144 132 128
137 144 132 -1
4152 136 132 128
112 112 133 128
144 144 134 -1
137 132 132 108
137 132 132 128
0
-1
1
48
49

উপরের কোডটি challenge-optimized.pqrsপরীক্ষার কেসগুলি চালানোর জন্য সংরক্ষণ করা যায়।

সম্পূর্ণতার জন্য, প্রতি চশমা উত্স এখানে:

; ANNOTATED PQRS ASSEMBLER CODE
; FULL SIZED BUFFERS TO RUN ACCORDING TO SPECS

;OFFSET   LABEL       P-OP        Q-OP        R-OP        S-OP
0                     TEMP        ZERO        ZERO        L1

; INPUT AND OUTPUT LOCATIONS AND SIZES
4                     INPUT       10^9        
6         L0:         OUTPUT      10^6        

; GET CURRENT INPUT
8         L1:         TEMP        INPUT       ASCII_ZERO  L2
12                    SUM         SUM         INC         IGNORE
16                    L1+1        L1+1        INC         IGNORE
20                    TEMP        ZERO        ZERO        L1

; CHECK IF END OF NUMBERS
24        L2:         NUMBERS     SUM         ZERO        L3

; ADVANCE TO NEXT NUMBER
28                    L2          L2          INC         IGNORE

; ADVANCE COUNT
32                    COUNT       COUNT       INC         IGNORE
36                    L1+1        L1+1        INC         IGNORE

; CLEAR SUM AND GO BACK
40                    SUM         ZERO        ZERO        L1

; SORT NUMBERS                
44        L3:         P           NUMBERS     ZERO        LA
48        L4:         Q           NUMBERS+1   ZERO        L9

; COMPARE                
52                    TEMP        Q           P           L8

; SWAP IF OUT OF ORDER
56                    L5+1        L3+1        ZERO        IGNORE
60                    L6          L3+1        ZERO        IGNORE
64                    L6+1        L4+1        ZERO        IGNORE
68                    L7          L4+1        ZERO        IGNORE
72        L5:         TEMP        P           ZERO        IGNORE
76        L6:         P           Q           ZERO        IGNORE
80        L7:         Q           TEMP        ZERO        IGNORE

; INCREMENT INNER INDEX
84        L8:         L4+1        L4+1        INC         IGNORE
88                    TEMP        ZERO        ZERO        L3

; INCREMENT OUTER INDEX AND RESET INNER INDEX
92        L9:         L3+1        L3+1        INC         IGNORE
96                    L4+1        L3+1        INC         IGNORE
100                   TEMP        ZERO        ZERO        L3

; OUTPUT THIRD LARGEST NUMBER
104                   L0+1        NUMBERS+2   ZERO        IGNORE
108       LA:         TEMP        NUMBERS+2   ZERO        EXIT
112       LB:         OUTPUT      ASCII_ONE   ZERO        IGNORE
116                   LB          LB          INC         IGNORE
120                   NUMBERS+2   NUMBERS+2   DEC         EXIT
124                   TEMP        ZERO        ZERO        LA

; SAFETY LOOP – JUST IN CASE IGNORE DOESN'T WORK AS PLANNED!
128       IGNORE:     TEMP        ZERO        ZERO        IGNORE

; CONSTANTS
132       ZERO:        0
133       INC:        -1
134       DEC:         1
135       ASCII_ZERO: 48
136       ASCII_ONE:  49

; VARIABLES
137       TEMP:       [1]
138       SUM:        [1]
139       COUNT:      [1]
140       P:          [1]
141       Q:          [1]

; WORKING SPACE
142       NUMBERS:    [10^6]

; I/O SPACE
1000142   INPUT:      [10^9]
1001000142 OUTPUT:    [10^6]
1002000142

এবং সমাধান:

137 132 132 8
1000142 1000000000
1001000142 1000000
137 1000142 135 24
138 138 133 128
9 9 133 128
137 132 132 8
142 138 132 44
24 24 133 128
139 139 133 128
9 9 133 128
138 132 132 8
140 142 132 108
141 143 132 92
137 141 140 84
73 45 132 128
76 45 132 128
77 49 132 128
80 49 132 128
137 140 132 128
140 141 132 128
141 137 132 128
49 49 133 128
137 132 132 44
45 45 133 128
49 45 133 128
137 132 132 44
7 144 132 128
137 144 132 -1
1001000142 136 132 128
112 112 133 128
144 144 134 -1
137 132 132 108
137 132 132 128
0
-1
1
48
49

উপরে চালাতে, আপনি খুঁজে মন্তব্য করার প্রয়োজন হবে #define OPTIMIZEDযোগ #define PER_SPECSমধ্যে pqrs.cএবং কম্পাইল।

এটি একটি দুর্দান্ত চ্যালেঞ্জ ছিল - সত্যিই মানসিক অনুশীলন উপভোগ করেছেন! আমাকে আমার পুরানো 6502 একত্রিতকারী দিনগুলিতে ফিরিয়ে নিয়েছে ...

যদি আমি পিকিউআরএসকে একটি "বাস্তব" প্রোগ্রামিং ভাষা হিসাবে বাস্তবায়ন করি তবে আমি সম্ভবত প্রত্যক্ষ ও দ্বিগুণ অপ্রত্যক্ষ অ্যাক্সেসের পাশাপাশি অতিরিক্ত ব্র্যাঞ্চিংয়ের জন্য অপ্রত্যক্ষ অ্যাক্সেসের বিকল্পের পাশাপাশি অবস্থান সম্পর্কিত এবং অবস্থান নিরঙ্কুশনের জন্য অতিরিক্ত পদ্ধতি যুক্ত করব!


3
পোস্ট করার আগে আপনার সমাধান প্রস্তুত করা উচিত।
feersum

1
হ্যাঁ, সমাধান প্রস্তুত। আমি বুঝতে পারি যে এতে কিছুটা সন্দেহ আছে কারণ ভাষাটি সত্যই কাজ করা বেশ কঠিন who যারা যারা লুক্কায়িত প্রাকদর্শন চান তাদের জন্য আমি এটি আপনার কাছে পাঠাতে পারি, আপনি যদি চ্যালেঞ্জ শেষ হওয়ার আগে প্রকাশ না করার প্রতিশ্রুতি দেন!

6

দস্তা, ফাটল! @ জগারব দ্বারা

গিটহাব এও উপলব্ধ ।

আপনার ডার্ট 1.12 এবং পাব দরকার। pub getকেবলমাত্র নির্ভরতা, একটি পার্সিং লাইব্রেরি ডাউনলোড করতে চালান ।

এখানে এটি আশা করার জন্য 30 মিনিটেরও বেশি দীর্ঘস্থায়ী হয়! হে

ভাষা

জিংক অপারেটরদের নতুন সংজ্ঞায়িত করার চারদিকে ভিত্তি করে। আপনি সহজেই সমস্ত অপারেটরকে ভাষার নতুন সংজ্ঞা দিতে পারেন!

একটি সাধারণ জিংক প্রোগ্রামের কাঠামোটি দেখে মনে হয়:

let
<operator overrides>
in <expression>

দুটি মাত্র প্রকারের प्रकार: পূর্ণসংখ্যা এবং সেট। সেট সেট আক্ষরিক মতো কোনও জিনিস নেই এবং খালি সেটগুলি অনুমোদিত নয়।

প্রকাশ

নিম্নলিখিত দস্তা বৈধ এক্সপ্রেশন:

লিটারেল

জিঙ্ক সমস্ত সাধারণ পূর্ণসংখ্যার আক্ষরিক সমর্থন করে, যেমন 1এবং -2

ভেরিয়েবল

জিঙ্কের ভেরিয়েবল রয়েছে (বেশিরভাগ ভাষার মতো)। তাদের উল্লেখ করতে, কেবল নামটি ব্যবহার করুন। আবার বেশিরভাগ ভাষার মতো!

তবে, একটি বিশেষ পরিবর্তনশীল বলা হয় Sযা পাইথের মতো আচরণ করে Q। আপনি যখন এটি প্রথম ব্যবহার করবেন তখন এটি স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইনে পড়বে এবং এটি সংখ্যার সেট হিসাবে ব্যাখ্যা করবে। উদাহরণস্বরূপ, ইনপুট লাইনটি 1234231সেটে পরিণত হবে {1, 2, 3, 4, 3, 2, 1}

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

বাইনারি অপারেশন

নিম্নলিখিত বাইনারি অপারেশনগুলি সমর্থিত:

  • সংযোজন মাধ্যমে +: 1+1
  • বিয়োগ মাধ্যমে -: 1-1
  • মাধ্যমে গুণ *: 2*2
  • বিভাগ মাধ্যমে /: 4/2
  • সঙ্গে সমতা =: 3=3

তদতিরিক্ত, নিম্নলিখিত unary অপারেশন এছাড়াও সমর্থিত:

  • দৈর্ঘ্য সঙ্গে #: #x

অগ্রাধিকার সর্বদা ডান-সংঘবদ্ধ। এটিকে ওভাররাইড করতে আপনি বন্ধনী ব্যবহার করতে পারেন।

সেটগুলিতে কেবল সমতা এবং দৈর্ঘ্যের কাজ। আপনি যখন কোনও পূর্ণসংখ্যার দৈর্ঘ্য পাওয়ার চেষ্টা করবেন, আপনি তার স্ট্রিং উপস্থাপনায় অঙ্কের সংখ্যা পাবেন।

বোধগম্যতা সেট করুন

সেটগুলিতে হেরফের করার জন্য, দস্তা বোঝা নির্ধারণ করেছে। তারা এ জাতীয় চেহারা:

{<variable>:<set><clause>}

একটি অনুচ্ছেদ হয় হয় যখন একটি ধারা বা একটি সাজানোর ধারা।

একটি যখন ধারা মত দেখাচ্ছে ^<expression>। ক্যারেটটি অনুসরণ করে প্রকাশ করা অবশ্যই একটি পূর্ণসংখ্যার ফলাফল হতে পারে। যখন ক্লজটি ব্যবহার করা হবে সেটে সেটগুলির কেবলমাত্র উপাদানগুলি গ্রহণ করবে যার জন্য expressionএটি শূন্য নয়। অভিব্যক্তির মধ্যে, চলকটি _সেটটিতে বর্তমান সূচীতে সেট করা হবে। এটি প্রায় এই পাইথনের সমতুল্য:

[<variable> for _, <variable> in enumerate(<set>) when <expression> != 0]

একটি সাজানোর ধারা , যা দেখে মনে $<expression>হয় সেটটির মান অনুসারে অবতরণ করে <expression>। এটি এই পাইথনের সমান:

sorted(<set>, key=lambda <variable>: <expression>)[::-1]

এখানে কিছু বোধগম্য উদাহরণ রয়েছে:

  • sসমান 5 এর সমান উপাদানগুলি নিন :

    {x:s^x=5}
    
  • sমানটির সাহায্যে সেটটি বাছাই করুন যদি এর উপাদানগুলি বর্গক্ষেত্র হয়:

    {x:s$x*x}
    

অগ্রাহ্য করা

অপারেটর ওভাররাইড আপনাকে অপারেটরদের নতুন সংজ্ঞা দিতে দেয়। তারা এ জাতীয় চেহারা:

<operator>=<operator>

বা:

<variable><operator><variable>=<expression>

প্রথম ক্ষেত্রে, আপনি অপারেটরটিকে অন্য অপারেটরের সমান করতে সংজ্ঞায়িত করতে পারেন। উদাহরণস্বরূপ, আমি এর +মাধ্যমে প্রকৃত বিয়োগের সংজ্ঞা দিতে পারি :

+=-

আপনি যখন এটি করেন, আপনি কোনও অপারেটরটিকে ম্যাজিক অপারেটর হিসাবে নতুন সংজ্ঞা দিতে পারেন । দুটি যাদু অপারেটর রয়েছে:

  • joinএকটি সেট এবং একটি পূর্ণসংখ্যা নেয় এবং সেট সামগ্রীতে যোগদান করে। উদাহরণস্বরূপ, যোগদান {1, 2, 3}সঙ্গে 4পূর্ণসংখ্যা পরিণাম ডেকে আনবে 14243

  • cutএছাড়াও একটি সেট এবং একটি পূর্ণসংখ্যার লাগে এবং পূর্ণসংখ্যার প্রতিটি ইভেন্টে সেটটি ভাগ করে নিবে। ব্যবহার cutকরুন {1, 3, 9, 4, 3, 2}এবং 3তৈরি করবেন {{1}, {9, 4}, {2}}... তবে যে কোনও একক উপাদান সেট সমতল হয়, সুতরাং ফলাফলটি আসলে আসবে {1, {9, 4}, 2}

+অপারেটরটির অর্থ বোঝানোর জন্য এখানে একটি উদাহরণ রয়েছে join:

+=join

পরবর্তী ক্ষেত্রে, আপনি প্রদত্ত এক্সপ্রেশনটিতে অপারেটরটিকে নতুনভাবে সংজ্ঞায়িত করতে পারেন। উদাহরণ হিসাবে, এটি মানগুলি যোগ করতে এবং তারপরে 1 যুক্ত করতে প্লাস অপারেশনকে সংজ্ঞায়িত করে:

x+y=1+:x+:y

তবে কী +:? :সর্বদা অন্তর্নির্মিত সংস্করণ ব্যবহার করতে আপনি কোনও অপারেটরে কোলন সংযোজন করতে পারেন । এই উদাহরণটিতে builtin ব্যবহার +মাধ্যমে +:সংখ্যার একসঙ্গে যোগ করার জন্য, তাহলে এটি একটি 1 যোগ করে (মনে রাখবেন, সব ডান-মিশুক যায়)।

দৈর্ঘ্যের অপারেটরটিকে ওভাররাইড করা একরকম দেখতে দেখতে:

#x=<expression>

নোট করুন যে প্রায় সমস্ত বিল্টিন অপারেশন (সমতা ব্যতীত) সেটটির দৈর্ঘ্য নির্ধারণ করতে এই দৈর্ঘ্য অপারেটরটি ব্যবহার করবে। আপনি যদি এটি সংজ্ঞায়িত হন:

#x=1

জিংকের প্রতিটি অংশ যা সেটগুলিতে =কাজ করে সেগুলি কেবলমাত্র সেটটি দেওয়া প্রথম সেটটিতে কাজ করবে।

একাধিক ওভাররাইড

আপনি একাধিক অপারেটরকে কমা দিয়ে আলাদা করে ওভাররাইড করতে পারেন:

let
+=-,
*=/
in 1+2*3

মুদ্রণ

আপনি সরাসরি জিঙ্কে কিছু মুদ্রণ করতে পারবেন না। নিম্নলিখিত প্রকাশের ফলাফল inমুদ্রণ করা হবে। একটি সংস্থার মানগুলি পৃথককারীকে সংমিশ্রিত করা হবে। উদাহরণস্বরূপ, এটি নিন:

let
...
in expr

যদি exprসেট থাকে {1, 3, {2, 4}}, 1324প্রোগ্রামটি শেষ হয়ে গেলে স্ক্রিনে মুদ্রিত হবে।

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

এখানে একটি সহজ জিঙ্ক প্রোগ্রাম রয়েছে যা জুড়েছে বলে মনে হচ্ছে 2+2তবে ফলাফলটি 5 হতে পারে:

let
x+y=1+:x+:y
in 1+2

দোভাষী

এটি ভিতরে যায় bin/zinc.dart:

import 'package:parsers/parsers.dart';
import 'dart:io';

// An error.
class Error implements Exception {
  String cause;
  Error(this.cause);
  String toString() => 'error in Zinc script: $cause';
}


// AST.
class Node {
  Obj interpret(ZincInterpreter interp) => null;
}

// Identifier.
class Id extends Node {
  final String id;
  Id(this.id);
  String toString() => 'Id($id)';
  Obj interpret(ZincInterpreter interp) => interp.getv(id);
}

// Integer literal.
class IntLiteral extends Node {
  final int value;
  IntLiteral(this.value);
  String toString() => 'IntLiteral($value)';
  Obj interpret(ZincInterpreter interp) => new IntObj(value);
}

// Any kind of operator.
class Anyop extends Node {
  void set(ZincInterpreter interp, OpFuncType func) {}
}

// Operator.
class Op extends Anyop {
  final String op;
  final bool orig;
  Op(this.op, [this.orig = false]);
  String toString() => 'Op($op, $orig)';
  OpFuncType get(ZincInterpreter interp) =>
    this.orig ? interp.op0[op] : interp.op1[op];
  void set(ZincInterpreter interp, OpFuncType func) { interp.op1[op] = func; }
}

// Unary operator (len).
class Lenop extends Anyop {
  final bool orig;
  Lenop([this.orig = false]);
  String toString() => 'Lenop($orig)';
  OpFuncType get(ZincInterpreter interp) =>
    this.orig ? interp.op0['#'] : interp.op1['#'];
  void set(ZincInterpreter interp, OpFuncType func) { interp.op1['#'] = func; }
}

// Magic operator.
class Magicop extends Anyop {
  final String op;
  Magicop(this.op);
  String toString() => 'Magicop($op)';
  Obj interpret_with(ZincInterpreter interp, Obj x, Obj y) {
    if (op == 'cut') {
      if (y is! IntObj) { throw new Error('cannot cut int with non-int'); }
      if (x is IntObj) {
        return new SetObj(x.value.toString().split(y.value.toString()).map(
          int.parse));
      } else {
        assert(x is SetObj);
        List<List<Obj>> res = [[]];
        for (Obj obj in x.vals(interp)) {
          if (obj == y) { res.add([]); }
          else { res.last.add(obj); }
        }
        return new SetObj(new List.from(res.map((l) =>
          l.length == 1 ? l[0] : new SetObj(l))));
      }
    } else if (op == 'join') {
      if (x is! SetObj) { throw new Error('can only join set'); }
      if (y is! IntObj) { throw new Error('can only join set with int'); }
      String res = '';
      for (Obj obj in x.vals(interp)) {
        if (obj is! IntObj) { throw new Error('joining set must contain ints'); }
        res += obj.value.toString();
      }
      return new IntObj(int.parse(res));
    }
  }
}

// Unary operator (len) expression.
class Len extends Node {
  final Lenop op;
  final Node value;
  Len(this.op, this.value);
  String toString() => 'Len($op, $value)';
  Obj interpret(ZincInterpreter interp) =>
    op.get(interp)(interp, value.interpret(interp), null);
}

// Binary operator expression.
class Binop extends Node {
  final Node lhs, rhs;
  final Op op;
  Binop(this.lhs, this.op, this.rhs);
  String toString() => 'Binop($lhs, $op, $rhs)';
  Obj interpret(ZincInterpreter interp) =>
    op.get(interp)(interp, lhs.interpret(interp), rhs.interpret(interp));
}

// Clause.
enum ClauseKind { Where, Sort }
class Clause extends Node {
  final ClauseKind kind;
  final Node expr;
  Clause(this.kind, this.expr);
  String toString() => 'Clause($kind, $expr)';
  Obj interpret_with(ZincInterpreter interp, SetObj set, Id id) {
    List<Obj> res = [];
    List<Obj> values = set.vals(interp);
    switch (kind) {
    case ClauseKind.Where:
      for (int i=0; i<values.length; i++) {
        Obj obj = values[i];
        interp.push_scope();
        interp.setv(id.id, obj);
        interp.setv('_', new IntObj(i));
        Obj x = expr.interpret(interp);
        interp.pop_scope();
        if (x is IntObj) {
          if (x.value != 0) { res.add(obj); }
        } else { throw new Error('where clause condition must be an integer'); }
      }
      break;
    case ClauseKind.Sort:
      res = values;
      res.sort((x, y) {
        interp.push_scope();
        interp.setv(id.id, x);
        Obj x_by = expr.interpret(interp);
        interp.setv(id.id, y);
        Obj y_by = expr.interpret(interp);
        interp.pop_scope();
        if (x_by is IntObj && y_by is IntObj) {
          return x_by.value.compareTo(y_by.value);
        } else { throw new Error('sort clause result must be an integer'); }
      });
      break;
    }
    return new SetObj(new List.from(res.reversed));
  }
}

// Set comprehension.
class SetComp extends Node {
  final Id id;
  final Node set;
  final Clause clause;
  SetComp(this.id, this.set, this.clause);
  String toString() => 'SetComp($id, $set, $clause)';
  Obj interpret(ZincInterpreter interp) {
    Obj setobj = set.interpret(interp);
    if (setobj is SetObj) {
      return clause.interpret_with(interp, setobj, id);
    } else { throw new Error('set comprehension rhs must be set type'); }
  }
}

// Operator rewrite.
class OpRewrite extends Node {
  final Anyop op;
  final Node value;
  final Id lid, rid; // Can be null!
  OpRewrite(this.op, this.value, [this.lid, this.rid]);
  String toString() => 'OpRewrite($lid, $op, $rid, $value)';
  Obj interpret(ZincInterpreter interp) {
    if (lid != null) {
      // Not bare.
      op.set(interp, (interp,x,y) {
        interp.push_scope();
        interp.setv(lid.id, x);
        if (rid == null) { assert(y == null); }
        else { interp.setv(rid.id, y); }
        Obj res = value.interpret(interp);
        interp.pop_scope();
        return res;
      });
    } else {
      // Bare.
      if (value is Magicop) {
        op.set(interp, (interp,x,y) => value.interpret_with(interp, x, y));
      } else {
        op.set(interp, (interp,x,y) => (value as Anyop).get(interp)(x, y));
      }
    }
    return null;
  }
}

class Program extends Node {
  final List<OpRewrite> rws;
  final Node expr;
  Program(this.rws, this.expr);
  String toString() => 'Program($rws, $expr)';
  Obj interpret(ZincInterpreter interp) {
    rws.forEach((n) => n.interpret(interp));
    return expr.interpret(interp);
  }
}


// Runtime objects.
typedef Obj OpFuncType(ZincInterpreter interp, Obj x, Obj y);

class Obj {}

class IntObj extends Obj {
  final int value;
  IntObj(this.value);
  String toString() => 'IntObj($value)';
  bool operator==(Obj rhs) => rhs is IntObj && value == rhs.value;
  String dump() => value.toString();
}

class SetObj extends Obj {
  final List<Obj> values;
  SetObj(this.values) {
    if (values.length == 0) { throw new Error('set cannot be empty'); }
  }
  String toString() => 'SetObj($values)';
  bool operator==(Obj rhs) => rhs is SetObj && values == rhs.values;
  String dump() => values.map((x) => x.dump()).reduce((x,y) => x+y);
  List<Obj> vals(ZincInterpreter interp) {
    Obj lenobj = interp.op1['#'](interp, this, null);
    int len;
    if (lenobj is! IntObj) { throw new Error('# operator must return an int'); }
    len = lenobj.value;
    if (len < 0) { throw new Error('result of # operator must be positive'); }
    return new List<Obj>.from(values.getRange(0, len));
  }
}


// Parser.
class ZincParser extends LanguageParsers {
  ZincParser(): super(reservedNames: ['let', 'in', 'join', 'cut']);
  get start => prog().between(spaces, eof);
  get comma => char(',') < spaces;
  get lp => symbol('(');
  get rp => symbol(')');
  get lb => symbol('{');
  get rb => symbol('}');
  get colon => symbol(':');
  get plus => symbol('+');
  get minus => symbol('-');
  get star => symbol('*');
  get slash => symbol('/');
  get eq => symbol('=');
  get len => symbol('#');
  get in_ => char(':');
  get where => char('^');
  get sort => char('\$');

  prog() => reserved['let'] + oprw().sepBy(comma) + reserved['in'] + expr() ^
            (_1,o,_2,x) => new Program(o,x);
  oprw() => oprw1() | oprw2() | oprw3();
  oprw1() => (basicop() | lenop()) + eq + (magicop() | op()) ^
             (o,_,r) => new OpRewrite(o,r);
  oprw2() => (id() + op() + id()).list + eq + expr() ^
             (l,_,x) => new OpRewrite(l[1], x, l[0], l[2]);
  oprw3() => lenop() + id() + eq + expr() ^ (o,a,_,x) => new OpRewrite(o, x, a);
  magicop() => (reserved['join'] | reserved['cut']) ^ (s) => new Magicop(s);
  basicop() => (plus | minus | star | slash | eq) ^ (op) => new Op(op);
  op() => (basicop() + colon ^ (op,_) => new Op(op.op, true)) | basicop();
  lenop() => (len + colon ^ (_1,_2) => new Lenop(true)) |
             len ^ (_) => new Lenop();
  expr() => setcomp() | unop() | binop() | prim();
  setcomp() => lb + id() + in_ + rec(expr) + clause() + rb ^
               (_1,i,_2,x,c,_3) => new SetComp(i,x,c);
  clausekind() => (where ^ (_) => ClauseKind.Where) |
                  (sort  ^ (_) => ClauseKind.Sort);
  clause() => clausekind() + rec(expr) ^ (k,x) => new Clause(k,x);
  unop() => lenop() + rec(expr) ^ (o,x) => new Len(o,x);
  binop() => prim() + op() + rec(expr) ^ (l,o,r) => new Binop(l,o,r);
  prim() => id() | intlit() | parens(rec(expr));
  id() => identifier ^ (i) => new Id(i);
  intlit() => intLiteral ^ (i) => new IntLiteral(i);
}


// Interpreter.
class ZincInterpreter {
  Map<String, OpFuncType> op0, op1;
  List<Map<String, Obj>> scopes;
  ZincInterpreter() {
    var beInt = (v) {
      if (v is IntObj) { return v.value; }
      else { throw new Error('argument to binary operator must be integer'); }
    };
    op0 = {
      '+': (_,x,y) => new IntObj(beInt(x)+beInt(y)),
      '-': (_,x,y) => new IntObj(beInt(x)-beInt(y)),
      '*': (_,x,y) => new IntObj(beInt(x)*beInt(y)),
      '/': (_,x,y) => new IntObj(beInt(x)/beInt(y)),
      '=': (_,x,y) => new IntObj(x == y ? 1 : 0),
      '#': (i,x,_2) =>
        new IntObj(x is IntObj ? x.value.toString().length : x.values.length)
    };
    op1 = new Map<String, OpFuncType>.from(op0);
    scopes = [{}];
  }

  void push_scope() { scopes.add({}); }
  void pop_scope() { scopes.removeLast(); }
  void setv(String name, Obj value) { scopes[scopes.length-1][name] = value; }
  Obj getv(String name) {
    for (var scope in scopes.reversed) {
      if (scope[name] != null) { return scope[name]; }
    }
    if (name == 'S') {
      var input = stdin.readLineSync() ?? '';
      var list = new List.from(input.codeUnits.map((c) =>
        new IntObj(int.parse(new String.fromCharCodes([c])))));
      setv('S', new SetObj(list));
      return getv('S');
    } else throw new Error('undefined variable $name');
  }
}


void main(List<String> args) {
  if (args.length != 1) {
    print('usage: ${Platform.script.toFilePath()} <file to run>');
    return;
  }
  var file = new File(args[0]);
  if (!file.existsSync()) {
    print('cannot open ${args[0]}');
    return;
  }
  Program root = new ZincParser().start.parse(file.readAsStringSync());
  ZincInterpreter interp = new ZincInterpreter();
  var res = root.interpret(interp);
  print(res.dump());
}

এবং এটি ভিতরে যায় pubspec.yaml:

name: zinc
dependencies:
  parsers: any

উদ্দিষ্ট সমাধান

let
#x=((x=S)*(-2))+#:x,
/=cut
in {y:{x:S/0$#:x}^_=2}

1
আমি কি সঠিকভাবে বুঝতে পারি যে সেটগুলি অর্ডার করা হয়েছে এবং সদৃশগুলি থাকতে পারে, তাই সেগুলি মূলত তালিকা? এছাড়াও, আমি যদি joinএকটি মিশ্র সেট পছন্দ {1,{3,2}}করি তবে ত্রুটি হবে? আমি এখনই ডার্ট ইনস্টল করতে পারি না, তাই আমি নিজেকে পরীক্ষা করতে পারি না।
Zgarb

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

আমি কীভাবে দোভাষী চালাতে পারি? আমি যদি কেবল চেষ্টা dart bin/zinc.dart test.zncকরি তবে আমি একটি সিনট্যাক্স ত্রুটি পেয়েছি: 'file:///D:/Development/languages/zinc/bin/zinc.dart': error: line 323 pos 41: unexpected token '?'...var input = stdin.readLineSync() ?? '';
মার্টিন এন্ডার


1
@ জাগারব মনে আছে, কবে, আমি বলেছিলাম যে সাম্যতা বাদে সমস্ত বিল্টিন অপারেশনগুলি দৈর্ঘ্য অপারেটরটি ব্যবহার করে? -2+#:Sদেওয়া হলে ফিরে আসার জন্য আমি ওভাররড করেছি S, যা দুটি পিছনের জিরো কেটে ফেলেছে। আমি আশা করছিলাম যে এটি সমাধান হয়ে যাবে। এবং ^সেটটি রিভার্স করার কথা নয় ... এটি একটি বাগ ছিল ...
kirbyfan64sos

5

কম্পাস স্যুপ ( কার্ডবোর্ড_বক্স দ্বারা ফাটল )

দোভাষী: সি ++

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

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

কিভাবে এটা কাজ করে

একটি প্রোগ্রাম পাঠ্যের একটি 2-মাত্রিক ব্লক block প্রোগ্রামের স্পেসটি প্রথম অক্ষর (0,0) এর সাথে রাখা পুরো উত্স কোড দিয়ে শুরু হয়। প্রোগ্রামের বাকি অংশটি অসীম এবং নাল অক্ষর (এএসসিআইআই 0) দিয়ে শুরু করা হয়।

দুটি পয়েন্টার রয়েছে যা প্রোগ্রামের জায়গার চারদিকে ঘুরতে পারে:

  • এক্সিকিউশন পয়েন্টারটির একটি অবস্থান এবং একটি দিক রয়েছে (উত্তর, দক্ষিণ, পূর্ব বা পশ্চিম)। প্রতিটি টিক, এক্সিকিউশন পয়েন্টারের অধীনে নির্দেশ কার্যকর করা হয়, তারপরে এক্সিকিউশন পয়েন্টারটি তার বর্তমান দিকে চলে যায়। এক্সিকিউশন পয়েন্টারটি পূর্বে (পজিটিভ এক্স) সরে যেতে শুরু করে, !চরিত্রের অবস্থানের উপর বা (0,0) যদি এটি উপস্থিত না থাকে।
  • ডেটা পয়েন্টারটির কেবলমাত্র একটি অবস্থান রয়েছে। এটা তোলে নির্দেশাবলী সহ সরানোর সময় x, X, y, এবং Y। এটি @অক্ষরটির অবস্থান থেকে শুরু হয় বা (0,0) যদি এটি উপস্থিত না থাকে।

ইনপুট

স্টিডিনের সামগ্রীগুলি প্রোগ্রামের স্পেসে >অক্ষরটির অবস্থান থেকে শুরু করে , বা যদি এটি উপস্থিত না থাকে (0,0) এ মুদ্রিত হয় ।

আউটপুট

প্রোগ্রামটির সমাপ্তি ঘটে যখন এক্সিকিউশন পয়েন্টারটি অপ্রতিরোধ্যভাবে সীমার বাইরে চলে যায়। আউটপুট হ'ল সেই সময়ে প্রোগ্রাম স্পেসের পুরো বিষয়বস্তু। এটি স্টাডাউট এবং 'ফলাফল.txt' এ প্রেরণ করা হয়।

নির্দেশনা

  • n - এক্সিকিউশন পয়েন্টার উত্তর পুনর্নির্দেশ করে (নেতিবাচক y)
  • e - এক্সিকিউশন পয়েন্টার ইস্ট পুনর্নির্দেশ করে (ইতিবাচক এক্স)
  • s - এক্সিকিউশন পয়েন্টার দক্ষিণে পুনর্নির্দেশ করে (ইতিবাচক y)
  • w - এক্সিকিউশন পয়েন্টার ওয়েস্টকে পুনর্নির্দেশ করে (নেতিবাচক এক্স)
  • y - তথ্য পয়েন্টার উত্তরে (নেতিবাচক y)
  • X - ডেটা পয়েন্টার ইস্টকে সরিয়ে দেয় (ইতিবাচক এক্স)
  • Y - তথ্য পয়েন্টার দক্ষিণে সরান (ইতিবাচক y)
  • x - ডেটা পয়েন্টার ওয়েস্টকে সরায় (নেতিবাচক এক্স)
  • p- ডেটা পয়েন্টারটিতে এক্সিকিউশন পয়েন্টারটির সম্মুখীন হওয়া পরবর্তী চরিত্রটি লিখেছেন। সেই চরিত্রটি নির্দেশ হিসাবে কার্যকর করা হয় না।
  • j- ডেটা পয়েন্টারের অধীনে অক্ষরটির বিপরীতে এক্সিকিউশন পয়েন্টারটির দ্বারা পরবর্তী অক্ষরটি পরীক্ষা করা হয়। সেই চরিত্রটি নির্দেশ হিসাবে কার্যকর করা হয় না। যদি সেগুলি একই হয় তবে এক্সিকিউশন পয়েন্টারটি পরবর্তী অক্ষরের উপরের দিকে ঝাঁপিয়ে পড়ে।
  • c - ডেটা পয়েন্টারে নাল অক্ষর লিখেছেন।
  • * - ব্রেকপয়েন্ট - কেবল দোভাষীকে বিরতি দেয়।

অন্যান্য সমস্ত অক্ষর এক্সিকিউশন পয়েন্টার দ্বারা উপেক্ষা করা হয়।

অনুবাদক

ইন্টারপ্রেটার উত্স ফাইলটিকে স্টিডিনে একটি যুক্তি এবং ইনপুট হিসাবে গ্রহণ করে। এটিতে স্টেপেবল ডিবাগার রয়েছে, যা আপনি কোডে ( *) কোডে ব্রেকপয়েন্ট নির্দেশের সাহায্যে আবেদন করতে পারেন । নষ্ট হয়ে গেলে এক্সিকিউশন পয়েন্টারটি ASCII 178 (গা dark় শেড ব্লক) হিসাবে দেখানো হয় এবং ডেটা পয়েন্টারটিকে ASCII 177 (লাইটার শেড ব্লক) হিসাবে দেখানো হয়।

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>

// Compass Soup programming language interpreter
// created by Brian MacIntosh (BMacZero)
// for https://codegolf.stackexchange.com/questions/61804/create-a-programming-language-that-only-appears-to-be-unusable
//
// 31 October 2015

struct Point
{
    int x, y;
    Point(int ix, int iy) { x = ix; y = iy; };
    bool operator==(const Point &other) const
    {
        return other.x == x && other.y == y;
    }
    bool operator!=(const Point &other) const
    {
        return other.x != x || other.y != y;
    }
};

struct Bounds
{
    int xMin, xMax, yMin, yMax;
    Bounds(int xmin, int ymin, int xmax, int ymax)
    {
        xMin = xmin; yMin = ymin; xMax = xmax; yMax = ymax;
    }
    bool contains(Point pt)
    {
        return pt.x >= xMin && pt.x <= xMax && pt.y >= yMin && pt.y <= yMax;
    }
    int getWidth() { return xMax - xMin + 1; }
    int getHeight() { return yMax - yMin + 1; }
    bool operator==(const Bounds &other) const
    {
        return other.xMin == xMin && other.xMax == xMax && other.yMin == yMin && other.yMax == yMax;
    }
    bool operator!=(const Bounds &other) const
    {
        return other.xMin != xMin || other.xMax != xMax || other.yMin != yMin || other.yMax != yMax;
    }
};

int max(int a, int b) { return a > b ? a : b; }
int min(int a, int b) { return a < b ? a : b; }

Bounds hull(Point a, Bounds b)
{
    return Bounds(min(a.x, b.xMin), min(a.y, b.yMin), max(a.x, b.xMax), max(a.y, b.yMax));
}

Bounds hull(Bounds a, Bounds b)
{
    return Bounds(min(a.xMin, b.xMin), min(a.yMin, b.yMin), max(a.xMax, b.xMax), max(a.yMax, b.yMax));
}

Bounds programBounds(0,0,0,0);
char** programSpace;

Point execPtr(0,0);
Point execPtrDir(1,0);
Point dataPtr(0,0);
Point stdInPos(0,0);

bool breakpointHit = false;
char breakOn = 0;

/// reads the character from the specified position
char read(Point pt)
{
    if (programBounds.contains(pt))
        return programSpace[pt.x - programBounds.xMin][pt.y - programBounds.yMin];
    else
        return 0;
}

/// read the character at the data pointer
char readData()
{
    return read(dataPtr);
}

/// read the character at the execution pointer
char readProgram()
{
    return read(execPtr);
}

/// gets the bounds of the actual content of the program space
Bounds getTightBounds(bool debug)
{
    Bounds tight(0,0,0,0);
    for (int x = programBounds.xMin; x <= programBounds.xMax; x++)
    {
        for (int y = programBounds.yMin; y <= programBounds.yMax; y++)
        {
            if (read(Point(x, y)) != 0)
            {
                tight = hull(Point(x, y), tight);
            }
        }
    }
    if (debug)
    {
        tight = hull(dataPtr, tight);
        tight = hull(execPtr, tight);
    }
    return tight;
}

/// ensure that the program space encompasses the specified rectangle
void fitProgramSpace(Bounds bounds)
{
    Bounds newBounds = hull(bounds, programBounds);

    if (newBounds == programBounds) return;

    // allocate new space
    char** newSpace = new char*[newBounds.getWidth()];

    // copy content
    for (int x = 0; x < newBounds.getWidth(); x++)
    {
        newSpace[x] = new char[newBounds.getHeight()];
        for (int y = 0; y < newBounds.getHeight(); y++)
        {
            Point newWorldPos(x + newBounds.xMin, y + newBounds.yMin);
            newSpace[x][y] = read(newWorldPos);
        }
    }

    // destroy old space
    for (int x = 0; x < programBounds.getWidth(); x++)
    {
        delete[] programSpace[x];
    }
    delete[] programSpace;

    programSpace = newSpace;
    programBounds = newBounds;
}

/// outputs the current program space to a file
void outputToStream(std::ostream &stream, bool debug)
{
    Bounds tight = getTightBounds(debug);
    for (int y = tight.yMin; y <= tight.yMax; y++)
    {
        for (int x = tight.xMin; x <= tight.xMax; x++)
        {
            char at = read(Point(x, y));
            if (debug && x == execPtr.x && y == execPtr.y)
                stream << (char)178;
            else if (debug && x == dataPtr.x && y == dataPtr.y)
                stream << (char)177;
            else if (at == 0)
                stream << ' ';
            else
                stream << at;
        }
        stream << std::endl;
    }
}

/// writes a character at the specified position
void write(Point pt, char ch)
{
    fitProgramSpace(hull(pt, programBounds));
    programSpace[pt.x - programBounds.xMin][pt.y - programBounds.yMin] = ch;
}

/// writes a character at the data pointer
void write(char ch)
{
    write(dataPtr, ch);
}

/// writes a line of text horizontally, starting at the specified position
void writeLine(Point loc, std::string str, bool isSource)
{
    fitProgramSpace(Bounds(loc.x, loc.y, loc.x + str.size(), loc.y));
    for (unsigned int x = 0; x < str.size(); x++)
    {
        programSpace[x + loc.x][loc.y] = str[x];

        // record locations of things
        if (isSource)
        {
            switch (str[x])
            {
            case '>':
                stdInPos = Point(loc.x + x, loc.y);
                break;
            case '!':
                execPtr = Point(loc.x + x, loc.y);
                break;
            case '@':
                dataPtr = Point(loc.x + x, loc.y);
                break;
            }
        }
    }
}

void advanceExecPtr()
{
    execPtr.x += execPtrDir.x;
    execPtr.y += execPtrDir.y;
}

void breakpoint()
{
    breakpointHit = true;
    outputToStream(std::cout, true);
    std::cout << "[Return]: step | [Space+Return]: continue | [<char>+Return]: continue to <char>" << std::endl;
    while (true)
    {
        std::string input;
        std::getline(std::cin, input);
        if (input.size() == 0)
        {
            break;
        }
        else if (input.size() == 1)
        {
            if (input[0] == ' ')
            {
                breakpointHit = false;
                break;
            }
            else
            {
                breakOn = input[0];
                breakpointHit = false;
                break;
            }
        }
    }
}

int main(int argc, char** argv)
{
    if (argc != 2)
    {
        printf("Usage: CompassSoup <source-file>");
        return 1;
    }

    // open source file
    std::ifstream sourceIn(argv[1]);

    if (!sourceIn.is_open())
    {
        printf("Error reading source file.");
        return 1;
    }

    programSpace = new char*[1];
    programSpace[0] = new char[1];
    programSpace[0][0] = 0;

    // read starting configuration
    std::string line;
    int currentLine = 0;
    while (std::getline(sourceIn, line))
    {
        writeLine(Point(0, currentLine), line, true);
        currentLine++;
    }

    sourceIn.close();

    // take stdin
    std::string input;
    std::cout << ">";
    std::cin >> input;
    std::cin.ignore();
    writeLine(stdInPos, input, false);

    // execute
    while (programBounds.contains(execPtr))
    {
        if (execPtrDir.x == 0 && execPtrDir.y == 0)
        {
            printf("Implementation error: execPtr is stuck.");
            break;
        }

        advanceExecPtr();

        char command = readProgram();

        // breakpoint control code
        if (breakpointHit || (breakOn != 0 && command == breakOn))
        {
            breakOn = 0;
            breakpoint();
        }

        switch (command)
        {
        case 'n':
            execPtrDir = Point(0,-1);
            break;
        case 'e':
            execPtrDir = Point(1,0);
            break;
        case 's':
            execPtrDir = Point(0,1);
            break;
        case 'w':
            execPtrDir = Point(-1,0);
            break;
        case 'x':
            dataPtr.x--;
            break;
        case 'X':
            dataPtr.x++;
            break;
        case 'y':
            dataPtr.y--;
            break;
        case 'Y':
            dataPtr.y++;
            break;
        case 'p':
            advanceExecPtr();
            write(readProgram());
            break;
        case 'j':
            advanceExecPtr();
            if (readData() == readProgram())
            {
                advanceExecPtr();
            }
            break;
        case 'c':
            write(0);
            break;
        case '*':
            breakpoint();
            break;
        }
    }

    std::ofstream outputFile("result.txt");
    outputToStream(outputFile, false);
    outputToStream(std::cout, false);
    outputFile.close();
}

উদাহরণ

ওহে বিশ্ব

Hello, World!

বিড়াল

>

সমতা: একটি শূন্য ('0') দ্বারা সমাপ্ত অক্ষরের একটি স্ট্রিং গ্রহণ করে। yesআউটপুটটির প্রথম লাইনে আউটপুটগুলি যদি ইনপুটটিতে 1 এর সংখ্যা বিজোড় হয়, অন্যথায় আউটপুটগুলি |

|>
!--eXj1s-c-eXj0s-c-exj|s-pyXpeXps
   c   |   c   |   |   |
  cn0j-w---n1j-w   n---w

পরামর্শ

আপনার একটি ভাল পাঠ্য সম্পাদক ব্যবহার করা উচিত এবং 'সন্নিবেশ' কীটির কার্যকারিতাটি ন্যায়বিচারপূর্ণভাবে ব্যবহার করা উচিত এবং একবারে একাধিক সারিগুলিতে পাঠ্য যোগ করতে বা মুছতে 'আল্ট-ড্র্যাগ' ব্যবহার করা উচিত।

সমাধান

এখানে আমার সমাধান। এটি কার্ডবোর্ড_বক্সের মতো সুন্দর নয় কারণ আমাকে উত্স কোডটি নিজেই মুছতে হয়েছিল। আমি আরও আশা করছিলাম যে আমি সমস্ত কোড মুছে ফেলার উপায় খুঁজে পেতে পারি এবং কেবল উত্তরটি রেখে যেতে পারি, তবে আমি পারিনি।

আমার দৃষ্টিভঙ্গি ছিল যে 1s এর বিভিন্ন ক্রমগুলি বিভিন্ন লাইনে বিভক্ত করা হবে , তারপরে সেগুলিকে 1অন্য "আঘাত" না হওয়া পর্যন্ত তাদের সমস্ত "ফলস" আপ করে বাছাই করুন 1এবং শেষ পর্যন্ত ইনপুটটির পরে তৃতীয় লাইন বাদে সবকিছু মুছে ফেলুন।

  • #A#পড়ার 1গুলি এর নীচে ডানদিকে বড় ব্লক এবং একটি 0পড়া না হওয়া অবধি বিভাজনের শেষ লাইনে অনুলিপি করে ।
  • #B#এক সেকেন্ডের জন্য চেক করে 0উত্তর দিকে যায় #D#। অন্যথায়, #C#শেষটির পরে একটি নতুন বিভক্ত লাইন শুরু করে |এবং এতে ফিরে যায় #A#
  • উপরের এবং তার উপরের ব্লকটি #F#মাধ্যাকর্ষণ কোড। এটা তোলে শেষ পদচারনা 1প্রথম সারির এবং এটি চলে আসে না হওয়া পর্যন্ত হিট 1বা -। এটি যদি এটি না করতে পারে তবে এটি সারিটি +আগে রেখে দিয়ে চিহ্নিত হিসাবে চিহ্নিত করে ।
  • #G#সমস্ত অপ্রয়োজনীয় বিভাজনগুলি #H#মুছে ফেলছে , এবং স্ট্যান্ডিন এবং প্রথম কোডটি বন্ধনীগুলির মধ্যে মুছে দিচ্ছে।

কোড:

 s-----------------------w
 s-c-w  s-c-w  s---w    e+-
 eXj)nc-eXj)nc-exj(ncyj(nn
(n-----------------------------------------w                      ))
(  #H#                             s---w   |                      ))
(                                  exj+ncyxn                      ))
(                                  |                              ))
(                      s---w   s-c-+w                             ))
(                      exj+ncy-eXj1nn                             ))
(                      |                                          ))
(         s---w    s-c-+w    s+pxw                                ))
(         eyj-n-YY-eXj1nn    |  sn1jX--w           e----s         ))
(         |                  Y  x     e+---s e---s ns1jyw         ))
(      ej+n------s           j  |     nn+jYw-n+jxw-Yw   |         ))
(      Y   ec----s      e---s|  |                       1         ))
(      c   ns1jX-wYcYYY-n-jyww  |                       p         ))
(      ns+jxw      #G#       e--s                       Y         ))
(       e---n                   |               s------w|         ))
(                               |               |   ej-nn         ))
(             s--w              e----s   exc----eyj1n---n         ))
(#A#          p e+---s   s---w       |#F#|                        ))
(e----se---s  1 ||   |   exj|n----p+YeXj1ns                       ))
(ns-jXwn-jyw--w-nn1jXw   c #D#       n----w                       ))
( |        |         |   |                                        ))
( |        n---------+---+-------------|pw            s---w s---w ))
( |                  |   |     exp)XYs   |            eyj-nYeXj0ns)
( |         s---ws---+w  n-----+-----+---+------------+----------w))
( |         |   ||   ||  e--yp)n     e---+--s         |           )
( |     e-c-exj|neYj|nn  |     #C#       |  |         p           ))
( |     |                |     s---w s---+w s---w s---+w          ))
( |     |          #B#  e+s    |   | |   || |   | |   ||          ))
(!ep-Yj0n-c----------Xj0nne----exj|n-eYj|nn exj|n-eYj|nn          ))
(-@
 |>


ডার্ন, এত কাছে! আমি আজ রাতে বাড়ি এলে আমার সমাধানটি ভাগ করে নেব।
বিএমাক

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

দেখে মনে হচ্ছে cপ্রথম দিকে অতিরিক্ত ছিল যা সেখানে থাকা উচিত হয়নি। আমি এটা ঠিক করেছি. এছাড়াও সমস্যার সমাধান আমার সমাধান যোগ।
বিএমএসি

4

দুদকে! , পিপারি দ্বারা ক্র্যাক

এই ভাষার একটি লুপিং কাঠামো, বেসিক সংখ্যার গণিত, অক্ষর I / O, এবং একটি সংযোজক (এইভাবে নাম) রয়েছে। মাত্র একটি সঞ্চালক। এইভাবে, নাম।

বিবৃতি

কমান্ডগুলি লাইন দ্বারা পার্স করা হয়। কমান্ডের তিন প্রকার রয়েছে:

  1. Count <var> while <cond>

সি-স্টাইলের সমতুল্য ননজারো <var>হিসাবে 0 থেকে উপরে গণনা করা । লুপ কাউন্টার যে কোনও একক ছোট হাতের অক্ষর হতে পারে। শর্তটি কোনও অভিব্যক্তি হতে পারে, অগত্যা লুপ পরিবর্তনশীল জড়িত না। শর্তের মান 0 হয়ে গেলে লুপটি থামে।<cond>for(<var>=0; <cond>; <var>++)

লুপগুলিকে কে ও আর-স্টাইলের কোঁকড়ানো ধনুর্বন্ধনী প্রয়োজন (বিশেষত স্ট্রস্ট্রপ রূপে ):

Count i while i-5 {
 ...
}
  1. Write <charcode>

প্রদত্ত ASCII / ইউনিকোড মানকে স্টডআউটে একটি একক অক্ষর আউটপুট দেয়। চারকোড যে কোনও এক্সপ্রেশন হতে পারে।

  1. অভিব্যক্তি

নিজেই দাঁড়িয়ে থাকা যে কোনও অভিব্যক্তি মূল্যায়ন করা হয় এবং সঞ্চয়ে সংস্থাকে (যা অ্যাক্সেসযোগ্য _) হিসাবে ফিরে দেওয়া হয় । সুতরাং, যেমন, 3একটি বিবৃতি যা সঞ্চালককে 3 তে সেট করে;_ + 1সংযোজক বৃদ্ধি; এবং _ * Nএকটি অক্ষর পড়ে এবং তার চারকোড দ্বারা সংযোজককে গুণ করে।

বিঃদ্রঃ: সঞ্চয়ের একমাত্র ভেরিয়েবল যা সরাসরি নির্ধারিত হতে পারে; লুপ ভেরিয়েবল এবং Nগণনায় ব্যবহৃত হতে পারে তবে পরিবর্তিত হয় না।

সংগ্রহকারী প্রাথমিকভাবে 0 হয়।

প্রকাশ

একটি অভিব্যক্তি সংযোজকের জন্য পূর্ণসংখ্যার আক্ষরিক, লুপ ভেরিয়েবল ( a-z) _এবং বিশেষ মান অন্তর্ভুক্ত করতে পারে N, যা একটি অক্ষর পড়ে এবং প্রতিবার ব্যবহৃত হওয়ার সাথে সাথে তার চারকোডে মূল্যায়ন করে। দ্রষ্টব্য: এর অর্থ প্রতিটি অক্ষর পড়ার জন্য আপনি কেবল একটি শট পান; পরের বার আপনি ব্যবহারN, আপনি পরেরটি পড়তে হবে।

অপারেটররা হলেন:

  • +, সংযোজন
  • -, বিয়োগ; একাত্মতা অবহেলা
  • *, গুণ
  • /, পূর্ণসংখ্যা বিভাগ
  • %, মডুলো
  • ^, exponentiation

অভিভাবকরা অপারেশনের অগ্রাধিকার প্রয়োগ করতে ব্যবহার করতে পারেন। এক্সপ্রেশনটিতে অন্য কোনও অক্ষর একটি বাক্য গঠন ত্রুটি।

সাদা জায়গা এবং মন্তব্য

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

# একটি একক লাইন মন্তব্য শুরু।

ইনপুট আউটপুট

দুদকে! ইনপুট হিসাবে অক্ষরের একক লাইন প্রত্যাশা করে। প্রতিটি ইনপুট চরিত্র ক্রমানুসারে পুনরুদ্ধার করা যায় এবং এর চারকোড ব্যবহার করে প্রক্রিয়া করা যায় N। লাইনের শেষ অক্ষরটি পড়ার চেষ্টা করার ফলে একটি ত্রুটি ঘটে। একটি চরিত্র Writeবিবৃতিতে তার চারকোড পাস করে আউটপুট হতে পারে ।

অনুবাদক

দোভাষী (পাইথন 3 এ লিখিত) অ্যাক অনুবাদ করে ! পাইথন কোড এবং execএটি।

import re, sys

def main():
    if len(sys.argv) != 2:
        print("Please supply a filename on the command line.", file=sys.stderr)
        return
    codeFile = sys.argv[1]
    with open(codeFile) as f:
        code = f.readlines()
    code = translate(code)
    exec(code, {"inputStream": (ord(char) for char in input())})

def translate(accCode):
    indent = 0
    loopVars = []
    pyCode = ["_ = 0"]
    for lineNum, line in enumerate(accCode):
        if "#" in line:
            # Strip comments
            line = line[:line.index("#")]
        line = line.strip()
        if not line:
            continue
        lineNum += 1
        if line == "}":
            if indent:
                loopVar = loopVars.pop()
                if loopVar is not None:
                    pyCode.append(" "*indent + loopVar + " += 1")
                indent -= 1
            else:
                raise SyntaxError("Line %d: unmatched }" % lineNum)
        else:
            m = re.fullmatch(r"Count ([a-z]) while (.+) \{", line)
            if m:
                expression = validateExpression(m.group(2))
                if expression:
                    loopVar = m.group(1)
                    pyCode.append(" "*indent + loopVar + " = 0")
                    pyCode.append(" "*indent + "while " + expression + ":")
                    indent += 1
                    loopVars.append(loopVar)
                else:
                    raise SyntaxError("Line %d: invalid expression " % lineNum
                                      + m.group(2))
            else:
                m = re.fullmatch(r"Write (.+)", line)
                if m:
                    expression = validateExpression(m.group(1))
                    if expression:
                        pyCode.append(" "*indent
                                      + "print(chr(%s), end='')" % expression)
                    else:
                        raise SyntaxError("Line %d: invalid expression "
                                          % lineNum
                                          + m.group(1))
                else:
                    expression = validateExpression(line)
                    if expression:
                        pyCode.append(" "*indent + "_ = " + expression)
                    else:
                        raise SyntaxError("Line %d: invalid statement "
                                          % lineNum
                                          + line)
    return "\n".join(pyCode)

def validateExpression(expr):
    "Translates expr to Python expression or returns None if invalid."
    expr = expr.strip()
    if re.search(r"[^ 0-9a-z_N()*/%^+-]", expr):
        # Expression contains invalid characters
        return None
    elif re.search(r"[a-zN_]\w+", expr):
        # Expression contains multiple letters or underscores in a row
        return None
    else:
        # Not going to check validity of all identifiers or nesting of parens--
        # let the Python code throw an error if problems arise there
        # Replace short operators with their Python versions
        expr = expr.replace("^", "**")
        expr = expr.replace("/", "//")
        # Replace N with a call to get the next input character
        expr = expr.replace("N", "inputStream.send(None)")
        return expr

if __name__ == "__main__":
    main()


3

GoToTape (নিরাপদ)

(পূর্বে সিম্পল প্লেক্স হিসাবে পরিচিত)

এই ভাষা সহজ। মূল প্রবাহ নিয়ন্ত্রণ হ'ল, নিয়ন্ত্রণের সবচেয়ে প্রাকৃতিক এবং দরকারী ফর্ম।

ভাষার স্পেসিফিকেশন

ডেটা একটি টেপ এবং একটি সঞ্চয়ের মধ্যে সংরক্ষণ করা হয়। এটি স্বাক্ষরযুক্ত ইন্টিগ্রেটেডগুলির সাথে পুরোপুরি কাজ করে। প্রতিটি চরিত্র হ'ল কমান্ড। নিম্নলিখিত সমস্ত কমান্ড নিম্নলিখিত:

  • চিঠিপত্র: a- zএতে যান বিবৃতি, যাচ্ছে হয় A- Zযথাক্রমে।
  • :: ইনপুট থেকে ASCII মানের জন্য সংযোজকটি সেট করুন।
  • ~: সঞ্চয়ের ক্ষেত্রে ASCII মানের জন্য চার্ট আউটপুট।
  • &: সংগ্রহকারী থেকে এটি 1 বা তার বেশি হলে বিয়োগ করুন, অন্যথায় একটি যুক্ত করুন।
  • |: সঞ্চয়ের সাথে একটি যুক্ত করুন।
  • <: 0 তে ডেটা পয়েন্টার সেট করুন।
  • +: ডেটা পয়েন্টারে ডেটা সেল বৃদ্ধি; পয়েন্টারটি +1 সরান।
  • -: ইতিবাচক হলে ডেটা পয়েন্টারে ডেটা সেল থেকে একটিকে বিয়োগ করুন; পয়েন্টারটি +1 সরান।
  • [...]: কোড কোড এন বার চালান যেখানে এন পয়েন্টার টেপে নম্বর থাকে (নেস্ট করা যায় না)।
  • /: সঞ্চালক 0 হলে পরবর্তী নির্দেশনা এড়িয়ে যান।

ইন্টারপ্রেটার (C ++) গুলির

#include <iostream>
#include <memory.h>
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int serch(char* str,char ch){
    for(int i = 0;str[i];i++){
        if(str[i]==ch)
            return i;
    }
    return -1;
}

void runCode(char* code){
    int i = 0;
    char c;
    unsigned int* tape;
    tape = new unsigned int[1000003];
    memset(tape,0,1000003*sizeof(int));
    unsigned int p=0;
    unsigned int a=0;
    unsigned int n;
    unsigned int s;

    while(c=code[i]){
        if('A'<=c && c<='Z');
        if('a'<=c && c<='z')i=serch(code, c+'A'-'a');
        if(':'==c)a=cin.get();
        if('+'==c)tape[p++]++;
        if('-'==c)tape[p++] += tape[p]?-1:0;
        if('|'==c)a++;
        if('&'==c)a=a?a-1:1;
        if('<'==c)p=0;
        if('['==c){if(tape[p]){n=tape[p];s=i;}else i+=serch(code+i,']');};
        if(']'==c)i=--n?i:s;
        if('~'==c)cout<<(char)a;
        if('/'==c)i+=a?0:1;
        if('$'==c)p=a;
        i++;
    }
    delete[](tape);
}

int main(int argc, char* argv[]) {
    if(argc == 2){

        ifstream sorceFile (argv[1]);
        string code(static_cast<stringstream const&>(stringstream() << sorceFile.rdbuf()).str());
        runCode((char*)code.c_str());
    }else
        cout << "Code file must be included as a command-line argument \n";
    return 0;
}

আনন্দ কর!

সমাধান

A:+&&&&&&&&&&/gbG&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/a<aB<[|]C[&]-[|]/c<[|]D[&]-[|]/d<[|]+E[&]|||||||||||||||||||||||||||||||||||||||||||||||||~X&/x-[|]/e


2
আপনার সি ++ কোডিং আমাকে হত্যা করছে! একটি কারণ আপনি ব্যবহার হয় callocপরিবর্তে new char, একটি সি-শৈলী লিখেছিলেন যখন লুপ, ব্যবহৃত সি-শৈলী মেমরি ব্যবস্থাপনা, আমাদের পুনরায় কম্পাইল সি ++ ফাইল প্রতিটি সময় আমরা কোড পরিবর্তন করতে, এবং একটি পরিবর্তে 20 Ifs ব্যবহৃত switch? আমি অভিযোগ করছি না, তবে আমার চোখ এখনই রক্তক্ষরণ করছে ...: ও
kirbyfan64sos

3
আমি দোভাষীকে মাংসের জন্য ছত্রাক স্থির করেছি।
মেগা টম

@ kirbyfan64sos কোডটি খারাপ। আমি এটিকে দ্রুত একসাথে রেখেছি, এবং এটি আমার মতো করা সম্ভব হয়নি। কোডটিকে ইনপুট হিসাবে নিতে প্রধান কার্যটি পরিবর্তন করা যেতে পারে। আসলে আমি মনে করি আমি এখন এটি করব ...
মেগাটম

1
প্রশ্নটি বলে যে দোভাষীদের প্রোগ্রামের জন্য কমান্ড লাইনে একটি ফাইলের নাম নেওয়া উচিত
ডেনিস

স্ট্রিংয়ে ফাইল পড়ার কয়েকটি ছোট উপায় এখানে । তারপরে str.c_str()একটি পেতে কল করুন char*
feersum

0

এটি একটি খারাপ ধারণা ছিল যেহেতু প্রায় সমস্ত ছদ্মবেশী ভাষা অপঠনযোগ্য দেখায় (জেলির দিকে দেখুন)।
তবে এখানে যায়:

পাইলংলফ 2 বিটা 6

স্ট্যাকের দিকে ধাক্কা

স্ট্যাকের দিকে ধাক্কা দেওয়া অন্য ভাষাতে ভিন্নভাবে কাজ করে।
কোডটি 78ধাক্কা দেয় 7এবং 8স্ট্যাকের মধ্যে, তবে পাইলংলফে এটি পুশ করে 78
পাইলংলফ 2 এ এটি টোগলযোগ্য Ü

কমান্ড

) Print the stack.
Ü Toggle the method Pylongolf2 uses for pushing to stack.
a The useless command, removes and adds the selected item in the same place.
c Ask for input.
n Convert string to a number.
" Toggle string mode for pushing text to the stack.
s Convert a number to a string. ╨ Encode the selected item (it must be a string).
_ Duplicate the selected item next to itself.
b Swap places between the selected item and the one before.
d Set the selected item to the last one.
m Move the selected item to the end of the stack.
@ Select an item. (Number required after this command as an argument).
w Wait a specified amount of time (the time is taken from the stack).
= Compare the selected item to the one before. (WARNING. THIS DELETES THE 2 ITEMS AND PLACES A true OR A false) (V2 beta)
~ Print the stack nicely. (V2 beta)
² Square a number. (V3 beta)
| Split a string to an array by the character after |. (V4 beta)
♀ Pop the array. (the contents are left in the stack) (V4 beta)
> Begin a while statement. (V5 beta)
< Loop back to the beginning of the while statement. (V5 beta)
! Break out of the while statements. (V5 beta)
? An if statement, does nothing if the selected item is a `true` boolean. (V6 beta)
¿ If an if statement is `false`, the interpreter skips everything to this character. (V6 beta)

স্ট্রিং কনটেনটেশন এবং একটি স্ট্রিং থেকে একটি রেজেক্স প্যাটার্ন সরানো

+ চিহ্নটি স্ট্রিংকে যুক্ত করে।
আপনি স্ট্রিং থেকে রেজেক্স প্যাটার্ন অনুসরণ করে অক্ষরগুলি সরাতে - চিহ্নটি ব্যবহার করতে সক্ষম হন:

c╨2"[^a-zA-Z]"-~

এই কোডটি ইনপুট নেয় এবং সমস্ত নিদর্শন মিলে সমস্ত বর্ণমালা অক্ষর মুছে ফেলে [^a-zA-Z]
নির্বাচিত আইটেমটি অবশ্যই রেজেক্স হতে হবে এবং সম্পাদনার জন্য স্ট্রিংয়ের একটি অবশ্যই হওয়া উচিত।

যদি বিবৃতি

যদি বিবৃতিগুলি করতে হয়, =নির্বাচিত আইটেমটি এবং তার পরে একটিটির তুলনা করতে একটি রাখুন।
এটি এর জায়গায় একটি trueবা একটি falseরাখে।
কমান্ড ?এই বুলিয়ান পরীক্ষা করে।
যদি তা হয় trueতবে এটি কিছুই করে না এবং দোভাষী চলে যায়।
যদি তা হয় falseতবে দোভাষী তার কাছের ¿চরিত্রটিতে চলে যান ।

গিথুব পৃষ্ঠা থেকে নেওয়া।

পাইলংলফ 2 (জাভা) এর দোভাষী:

package org.midnightas.pylongolf2;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Pylongolf {

    public static final void main(String[] args) throws Exception {
        String content = new String(Files.readAllBytes(Paths.get(new File(args[0]).toURI()))) + " ";
        boolean fullreadMode = true;
        List<Object> stack = new ArrayList<Object>();
        List<Integer> whileStatements = new ArrayList<Integer>();
        HashMap<String, Object> vars = new HashMap<String, Object>();
        int ifStatements = 0;
        Scanner scanner = new Scanner(new UnclosableDecorator(System.in));
        int selectedIndex = 0;
        for (int cl = 0; cl < content.length(); cl++) {
            char c = content.charAt(cl);
            if (isNumber(c)) {
                if (!fullreadMode) {
                    stack.add(Double.parseDouble(c + ""));
                } else {
                    String number = "";
                    for (int cl0 = cl; cl0 < content.length(); cl0++) {
                        if (isNumber(content.charAt(cl0))) {
                            number += content.charAt(cl0);
                        } else {
                            cl = cl0 - 1;
                            stack.add(Double.parseDouble(number));
                            break;
                        }
                    }
                }
            } else if (c == ')') {
                System.out.println(Arrays.toString(stack.toArray()));
            } else if (c == 'Ü') {
                fullreadMode = !fullreadMode;
            } else if (c == '+') {
                if (stack.get(selectedIndex) instanceof Object[]) {
                    Object[] obj = (Object[]) stack.remove(selectedIndex);
                    Double dbl = new Double(0d);
                    for (Object o : obj) {
                        dbl += (Double) o;
                    }
                    stack.add(selectedIndex, dbl);
                } else {
                    Object obj0 = stack.remove(selectedIndex);
                    Object obj1 = stack.remove(selectedIndex);
                    if (obj0 instanceof Number && obj1 instanceof Number)
                        stack.add(((Number) obj0).doubleValue() + ((Number) obj1).doubleValue());
                    else if (obj0 instanceof String) {
                        stack.add(obj0.toString() + obj1.toString());
                    }
                }
            } else if (c == '-') {
                Object obj0 = stack.remove(selectedIndex);
                Object obj1 = stack.remove(selectedIndex);
                if (obj0 instanceof Number && obj1 instanceof Number)
                    stack.add(((Number) obj0).doubleValue() - ((Number) obj1).doubleValue());
                else if (obj0 instanceof String && obj1 instanceof String) {
                    stack.add(obj0.toString().replaceAll(obj1.toString(), ""));
                }
            } else if (c == '*') {
                Object obj0 = stack.remove(selectedIndex);
                Object obj1 = stack.remove(selectedIndex);
                if (obj0 instanceof Number && obj1 instanceof Number)
                    stack.add(((Number) obj0).doubleValue() * ((Number) obj1).doubleValue());
            } else if (c == '/') {
                Object obj0 = stack.remove(selectedIndex);
                Object obj1 = stack.remove(selectedIndex);
                if (obj0 instanceof Number && obj1 instanceof Number)
                    stack.add(((Number) obj0).doubleValue() / ((Number) obj1).doubleValue());
            } else if (c == 'a') {
                stack.add(selectedIndex, stack.remove(selectedIndex));
            } else if (c == 'c') {
                stack.add(scanner.nextLine());
            } else if (c == 'n') {
                if (stack.get(selectedIndex) instanceof String) {
                    stack.add(selectedIndex, Double.parseDouble(stack.remove(selectedIndex).toString()));
                } else if (stack.get(selectedIndex) instanceof Object[]) {
                    Object[] oldArray = (Object[]) stack.remove(selectedIndex);
                    Object[] newArray = new Object[oldArray.length];
                    for (int i = 0; i < oldArray.length; i++) {
                        newArray[i] = Double.parseDouble(oldArray[i].toString());
                    }
                    stack.add(selectedIndex, newArray);
                }
            } else if (c == '"') {
                String string = "\"";
                for (int cl0 = cl + 1; cl0 < content.length(); cl0++) {
                    string = string + content.charAt(cl0);
                    if (content.charAt(cl0) == '"') {
                        stack.add(string.substring(1, string.length() - 1));
                        cl = cl0;
                        break;
                    }
                }
            } else if (c == 's') {
                Object obj = stack.remove(selectedIndex);
                if (obj instanceof Double) {
                    Double dbl = (Double) obj;
                    if (dbl.doubleValue() == Math.floor(dbl)) {
                        stack.add(selectedIndex, "" + dbl.intValue() + "");
                    } else {
                        stack.add(selectedIndex, "" + dbl + "");
                    }
                }
            } else if (c == '╨') {
                cl++;
                char editmode = content.charAt(cl);
                if (editmode == '0') {
                    stack.add(selectedIndex, rot13(stack.remove(selectedIndex).toString()));
                } else if (editmode == '1') {
                    stack.add(selectedIndex,
                            new StringBuilder(stack.remove(selectedIndex).toString()).reverse().toString());
                } else if (editmode == '2') {
                    stack.add(selectedIndex, stack.remove(selectedIndex).toString().toLowerCase());
                } else if (editmode == '3') {
                    stack.add(selectedIndex, stack.remove(selectedIndex).toString().toUpperCase());
                }
            } else if (c == '_') {
                stack.add(selectedIndex, stack.get(selectedIndex));
            } else if (c == 'b') {
                stack.add(selectedIndex + 1, stack.remove(selectedIndex));
            } else if (c == 'd') {
                selectedIndex = stack.size() == 0 ? 0 : stack.size() - 1;
            } else if (c == 'm') {
                stack.add(stack.remove(selectedIndex));
            } else if (c == '@') {
                String number = "";
                for (int cl0 = cl + 1; cl0 < content.length(); cl0++) {
                    if (isNumber(content.charAt(cl0)))
                        number += content.charAt(cl0);
                    else {
                        cl = cl0 - 1;
                        selectedIndex = Integer.parseInt(number);
                        break;
                    }
                }
            } else if (c == 'w') {
                String number = "";
                for (int cl0 = cl + 1; cl0 < content.length(); cl0++) {
                    if (isNumber(content.charAt(cl0)))
                        number += content.charAt(cl0);
                    else {
                        cl = cl0 - 1;
                        Thread.sleep(Long.parseLong(number));
                        break;
                    }
                }
            } else if (c == '=') {
                Object obj0 = stack.remove(selectedIndex);
                Object obj1 = stack.remove(selectedIndex);
                stack.add(new Boolean(obj0.equals(obj1)));
            } else if (c == '~') {
                for (Object o : stack)
                    System.out.print(o);
                System.out.println();
            } else if (c == '²') {
                if (stack.get(selectedIndex) instanceof Double) {
                    Double dbl = (Double) stack.remove(selectedIndex);
                    stack.add(selectedIndex, dbl * dbl);
                } else if (stack.get(selectedIndex) instanceof Object[]) {
                    Object[] obj = (Object[]) stack.remove(selectedIndex);
                    Object[] newArray = new Object[obj.length];
                    for (int i = 0; i < obj.length; i++) {
                        newArray[i] = Math.pow((Double) obj[i], 2);
                    }
                    stack.add((Object[]) newArray);
                }
            } else if (c == '|') {
                String string = (String) stack.remove(selectedIndex);
                cl++;
                char splitChar = content.charAt(cl);
                stack.add((Object[]) string.split(splitChar + ""));
            } else if (c == '♀') {
                for (Object obj : (Object[]) stack.remove(selectedIndex)) {
                    stack.add(selectedIndex, obj);
                }
            } else if (c == '>') {
                whileStatements.add(new Integer(cl));
            } else if (c == '<') {
                cl = whileStatements.get(whileStatements.size() - 1);
            } else if (c == '!') {
                whileStatements.remove(whileStatements.size() - 1);
            } else if (c == '?') {
                if (stack.get(selectedIndex) instanceof Boolean) {
                    Boolean bool = (Boolean) stack.remove(selectedIndex);
                    if (bool == false) {
                        ifStatements++;
                        for (int cl0 = cl; cl0 < content.length(); cl0++) {
                            if (content.charAt(cl0) == '¿') {
                                ifStatements--;
                                cl = cl0;
                            }
                        }
                    }
                }
            } else if (c == 't') {
                break;
            } else if (c == '(') {
                stack.remove(selectedIndex);
            } else if (c == ':') {
                cl++;
                char charToVar = content.charAt(cl);
                vars.put(charToVar + "", stack.remove(selectedIndex));
            } else if (c >= 'A' && c <= 'Z') {
                stack.add(vars.get(c + ""));
            } else if (c == 'r') {
                stack.add(selectedIndex,
                        (double) new Random().nextInt(((Double) stack.remove(selectedIndex)).intValue() + 1));
            }
        }
        scanner.close();
    }

    public static String rot13(String input) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c >= 'a' && c <= 'm')
                c += 13;
            else if (c >= 'A' && c <= 'M')
                c += 13;
            else if (c >= 'n' && c <= 'z')
                c -= 13;
            else if (c >= 'N' && c <= 'Z')
                c -= 13;
            sb.append(c);
        }
        return sb.toString();
    }

    public static boolean isNumber(char c) {
        return c >= '0' && c <= '9';
    }

}

এটি ব্যবহার করা কি কঠিন বলে মনে হচ্ছে? : /
ক্যালকুলেটরফলাইন

0

রংধনু (দ্রষ্টব্য: দোভাষী খুব শীঘ্রই আসছেন)

আমি জানি এই চ্যালেঞ্জটির মেয়াদ শেষ হয়ে গেছে।

রেইনবো হ'ল ... অনেক কিছুর মিশ্রণ।

রেইনবো একটি 2 ডি স্ট্যাক-ভিত্তিক ভাষা যেখানে দুটি স্ট্যাক (ব্রেন-ফ্লাকের মতো) এবং 8 টি দিক ( N NE E SE S SW W NW) রয়েছে with এখানে 8 টি কমান্ড রয়েছে:

  • 1, +, *, "ঠিক কি তারা 1+ না না।
  • ! সক্রিয় স্ট্যাক টগল করে।
  • > আইপি ঘড়ির কাঁটার দিকে ঘোরান।
  • , একটি অক্ষর ইনপুট এবং এটি ধাক্কা।
  • . পপ এবং আউটপুট একটি অক্ষর।

তবে উত্স কোডের অক্ষরগুলি তাত্ক্ষণিকভাবে কার্যকর করা হয় না। পরিবর্তে, [The Character in the source code]^[Top Of Stack]কোলাটজ কনজেকচার জিনিসটিতে ফিড দেওয়া হয় এবং এটি 1 এ পৌঁছতে যে ধাপে লাগে তার সংখ্যা ASCII টেবিল দ্বারা একটি চরিত্রে রূপান্তরিত হয়। এই চরিত্রটি তখনই কার্যকর করা হয়।

  • যদি এটি পৌঁছতে 127 টিরও বেশি পদক্ষেপ নেয় তবে মোট পদক্ষেপের সংখ্যা 127 দ্বারা বিভক্ত হয়ে গেছে, অনুস্মারকটি নিয়ে যান এবং তারপরে এই অনুস্মারকটি ভাগফলে যুক্ত করুন।

প্রোগ্রামের শুরুতে, উত্স কোডটি (শেষ অক্ষর ব্যতীত) স্ট্যাকের দিকে ঠেলা যায়।

আইপি যখন সোর্স কোডের প্রান্তে পৌঁছায়, এটি সমাপ্ত হয়।

রহস্যোদ্ঘাটন

n এবং m দুটি নিবন্ধক। যখন কোনও >নির্দেশ কার্যকর করা হয় তখন এম বৃদ্ধি করা হয়। অ্যাপোকালাইপস কেবল তখনই ট্রিগার করা হবে যদি এম এন ছাড়িয়ে যায়। যখন অ্যাপোক্যালাইপ্স হয়, এটি:

  • ঘড়ির কাঁটার দিকের পরিবর্তে অ্যান্টিক্লোকের দিকে ঘুরুন।
  • মি 0 হয়।
  • n স্ট্যাকের শীর্ষে পরিণত হয়। এবং তারপরে, স্ট্যাকটি পপড হয়।

মিঃ প্রাথমিকভাবে শূন্য এবং এন প্রাথমিকভাবে উত্স কোডের শেষ অক্ষর।

জোড়া লাগানো

যে কোনও মৃত্যুদন্ড কার্যকর করার পরে, উত্স কোডটি এনক্রিপ্ট করা হয়। প্রথম চরিত্রের এএসসিআইআই এক দ্বারা বৃদ্ধি করা হয়, দ্বিতীয়টি এক দ্বারা হ্রাস করা হয়, তৃতীয়টি দুটি দ্বারা বৃদ্ধি হয়, চতুর্থটি দুটি দ্বারা হ্রাস হয়, ইত্যাদি etc.


1
এটি একটি বৈধ উত্তর হতে আপনার অবশ্যই একজন দোভাষী প্রয়োজন ...
কনর ও'ব্রায়ান

@ কনরও ব্রায়েন যেহেতু এই চ্যালেঞ্জটি ইতিমধ্যে শেষ হয়ে গেছে, এটি কেবল মজাদার জন্য। যদিও আমি দোভাষা সরবরাহ করব।
হাইলিরাডিওঅ্যাকটিভ

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