সামিং? এটাই আমার ফোর!


18

ভূমিকা

সংখ্যার মানগুলি সংশোধন করার ধারণার উপর ভিত্তি করে ফোর্টটি একটি খুব অদ্ভুত রহস্যময় ভাষা। বৈশিষ্ট্য সংখ্যাগুলিতে ধ্রুবক নয় তবে পরিবর্তনশীল, আপনি তাদের LETনির্দেশকে নতুন মান নির্ধারণ করতে ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, LET 2=4-1এখন থেকে নির্বাহের পরে 2এর মান ধরে নেওয়া হয় 3যার অর্থ যে যখনই মানটি 2একটি অভিব্যক্তিতে আসে এটি পরিবর্তে "প্রতিস্থাপিত" হয় 3। এক্সপ্রেশনটি (1+1)*2এখন মূল্যায়ন করবে 9

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

চ্যালেঞ্জ

ফোর্টের LETএক্সপ্রেশনগুলির সরলিকৃত উপসেটের জন্য আপনাকে একটি দোভাষী লিখতে হবে ।

আপনি এই ব্যাকরণটি অনুসরণ করে ইনপুট হিসাবে একাধিক রেখার লাইন পাবেন:

<line>::= <number>=<expression>

<expression>::= <number>|<expression>+<number>

দ্রষ্টব্য: এই ব্যাকরণটি বৈধ বৈশিষ্ট্য নয় কারণ এতে লাইন নম্বর, এলইটি, এবং প্রথম বন্ধনী নেই (যা সর্বদা বাধ্যতামূলক)

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

সংখ্যাগুলি সর্বদা আপনার ভাষার স্থানীয় পূর্ণসংখ্যার ধরণের (বা 2 ^ 32, যেটি উচ্চতর হয়) সীমা অবধি অ-নেতিবাচক পূর্ণসংখ্যার হবে।

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

এটি , সংক্ষিপ্ততম কোড (বাইটে) জয়!

অন্যান্য বিধি

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

উদাহরণ

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

5=4
4
6=5
4        # 5 -> 4
7=1+2+5
7
7=5+2+1
4        # Order of operations matters! 5+2 -> 4+2 -> 6 -> 4
18=5+6+7
12
5=3
3        # Remember: 5 -> 4
10=6+4
3        # 6 -> 4 -> 3, 3+3 = 6 -> 3

কি 0একটি বৈধ নম্বর?
orlp

@ অরলপটি 0বৈধ ("সংখ্যা সর্বদা অ-নেতিবাচক পূর্ণসংখ্যার হবে")
লিও

আমাদের কি কোনও গাণিতিক অপারেটর গ্রহণ করা উচিত?
বাচ্চুবিলে

পুনঃটুইট করুন
লিও

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

উত্তর:


4

জেলি , 28 বাইট

®y$ÐL
ṪÇ+Ç¥/Ṅ;®⁸Ǥ;©
⁸©ḷƓÇ€¤

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

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

[[5,[4]],[6,[5]],[7,[1,2,5]],[7,[5,2,1]],[18,[5,6,7]],[5,[3]],[10,[6,4]]]

ব্যাখ্যা

সহায়ক ফাংশন 1Ŀ (একটি পূর্ণসংখ্যা এর মান হিসাবে অনুবাদ করুন)

®y$ÐL
   ÐL   Repeatedly, until there are no further changes,
  $       apply the following unary function to {the input}:
 y          replace values using the mapping table
®             stored in the register.
        {Then return the eventual result.}

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

সহায়ক ফাংশন 2Ŀ (একটি এলইটি নির্দেশিকার মূল্যায়ন করুন)

ṪÇ+Ç¥/Ṅ;®⁸Ǥ;©
Ṫ               On the last element of {the input},
 Ç              Run 1Ŀ,
     /          left fold it via
    ¥             the following binary function:
  +                 add {the two arguments}
   Ç                and run 1Ŀ on {the result},
      Ṅ         write {the result} (and a newline) to standard output,
       ;®       append the value of the register,
            ;   prepend
           ¤      the following value:
         ⁸          {the input, without its last element}
          Ç         with 1Ŀ run on it
             ©  and store that value in the register {and return it}.

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

মূল প্রোগ্রাম

⁸©ḷƓÇ€¤
 ©       Initialize the mapping table
⁸        with the empty string (which is also the empty list)
  ḷ      then evaluate and discard
      ¤  the following value:
   Ɠ       a line from standard input, parsed into a data structure
    Ç€     with each element transformed via 2Ŀ
         {and leave the empty string to be printed implicitly}

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

এটি অসম্ভব আমি এখনও বুঝতে পারি না যে কেন দ্বিতীয় লাইনে ⁸Ǥ;কেবল ন্যায়বিচারের চেয়ে বলার দরকার আছে ;@Ç- দু'জনের সমতুল্য হওয়া উচিত, আমি যতটা জেলি বুঝতে পেরেছি, µ/ ð/ ø- এর ব্যবহারের অভাবের কারণে, তবে পরবর্তী কারণটি কোনও কারণে ক্র্যাশ হয়ে গেছে। তেমনিভাবে, বাইটগুলি না হারিয়ে প্রোগ্রামটিকে পুনরায় সাজানোর বিভিন্ন উপায় রয়েছে, সুতরাং এটি সম্ভব যে আমি কিছুটা ছোট করার কোনও উপায় মিস করেছি।

ঘটনাক্রমে, শেষ লাইনে পরিবর্তনটি ;আপনাকে প্রোগ্রামের অভ্যন্তরীণ কর্মের জন্য একটি আকর্ষণীয় চেহারা দেয় কারণ এটি "রেজিস্টারের ইতিহাস" আউটপুট দেয় যা প্রত্যাবর্তনের মানগুলি দ্বারা স্পষ্টতই আউটপুট দেয় 2Ḷ


5

পার্ল 5 , 92 বাইট

কোড + -plপতাকা 90 বাইট ।

sub f{($b=$h{$a=pop}//$a)!=$a?f($b):$a}s%(\d+)\+(\d+)%f($1)+f$2%e&&redo;/=/;$_=$h{f$`}=f$'

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

আমি %hসংখ্যার মধ্যে ম্যাপিংটি সঞ্চয় করতে হ্যাশ টেবিলটি ব্যবহার করি ।
ফাংশন ( sub) fতার ইনপুট মানচিত্রে (বা এটির কোনও সংখ্যায় ম্যাপ করা থাকলে এর ইনপুট) $h{$a=pop}নম্বরটি দেয় : ইনপুট মানচিত্রের দিকে যে সংখ্যাটি পুনরুদ্ধার করে। যদি এটি না হয় তবে ধন্যবাদ //$a, এর মান ($b=$h{$a=pop}//$a)হ'ল ইনপুট ( $a)। আমরা নিশ্চিত করে নিই যে এই মানগুলি অসীমভাবে লুপ না করে ইনপুট নয় ( !=$a)। তারপরে, আমরা হয় পুনরাবৃত্তভাবে কল fবা ইনপুট ফিরে।
মূল প্রোগ্রামটি দুটি পদক্ষেপ নিয়ে গঠিত:
- s%(\d+)\+(\d+)%f($1)+f$2%e&&redoডান দিকের প্রথম সংযোজনটিকে মূল্যায়ন করে, যখন এখনও একটি সংযোজন রয়েছে: এটি x+yমূল্যায়নের ফলাফল দ্বারা প্রতিস্থাপন করে f(x)+f(y)
- /=/;$_=$h{f$`}=f$'অ্যাসাইনমেন্টটি করে:/=/বাম পাশ দিয়ে $`এবং ডান পাশ দিয়ে অ্যাক্সেস করতে দেয় $', তারপরে $h{f$`}=f$'অ্যাসাইনমেন্ট দেয়। এবং আমরা এটিকেও নির্ধারণ করি $_প্রতিটি লাইনের পরে সুস্পষ্টভাবে মুদ্রিত হয়।


5

জাভাস্ক্রিপ্ট (নোড.জেএস) , 81 বাইট

v=x=>(v[x]=v[x]||x,v[x]-x?v(v[x]):x)
f=x=>l=>v[v(x)]=l.reduce((p,x)=>v(v(x)+p),0)

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

নির্ধারিত মান সহ f কল করে ইনপুট গ্রহণ করে, তারপরে ফলাফলটির সাথে একত্রিত করার জন্য মানগুলির একটি অ্যারে দিয়ে কল করে। (যেমন f(5)([4])) একাধিক লাইনের জন্য পুনরাবৃত্তি করুন।

vএকটি সংখ্যার প্রকৃত বর্তমান মান গণনা করার জন্য একটি ফাংশন হিসাবে ব্যবহার করা হয় এবং আসল মানগুলি সংরক্ষণ করার জন্য একটি বস্তু হিসাবেও ব্যবহৃত হয়। প্রথমত v[x]=v[x]||xএটি v[x]সংজ্ঞায়িত করা নিশ্চিত করে । v[x]-xএটি প্রকৃত সংখ্যা কিনা তা নির্ধারণের জন্য একটি তুলনা করে। যদি নম্বরটি নিজের কাছে মানচিত্র না দেয় তবে v(v[x])পুনরাবৃত্তি করে আবার চেষ্টা করে, অন্যথায় ফিরে আসুন x

f গণনা এবং কার্য সম্পাদন করে, একটি বাইট সংরক্ষণ করার জন্য প্রস্তুত, যেখানে দ্বিতীয় কলটি গণিত মান প্রদান করে।


3

হাস্কেল , 116 113 108 106 বাইট

(#)=until=<<((==)=<<)
e?((n,s):r)|m<-foldl1(\a b->e#(e#a+e#b))s=m:(\x->last$m:[e#x|x/=e#n])?r
e?r=[]
(id?)

এটি অনলাইন চেষ্টা করুন! প্রতিটি সমীকরণটি 4=3+1+5টিপল হিসাবে চিহ্নিত করা হয় (4,[3,1,5])। বেনামে ফাংশন এ (id?)জাতীয় টিপলগুলির একটি তালিকা নেয় এবং সমস্ত মধ্যবর্তী ফলাফলের একটি তালিকা প্রদান করে।

#প্রদত্ত ফাংশন eএবং প্রারম্ভিক মানের একটি ফিক্সপয়েন্ট খুঁজে পেতে একটি ফাংশন x

ফাংশনটি ?একটি মূল্যায়ন ফাংশন নেয় eএবং প্রতিটি সমীকরণকে পুনরাবৃত্তভাবে সমাধান করে।foldl1(\a b->e#(e#a+e#b))sএকটি সমীকরণের ডানদিকে মূল্যায়ন করে ফলাফল সংরক্ষণ করে mযেমন উদাহরণস্বরূপ 4=3+1+5এটি গণনা করা হয় eval(eval(eval 3 + eval 1) + eval 5), যেখানে প্রতিটিই evalএকটি নির্দিষ্ট পয়েন্ট অ্যাপ্লিকেশন e। তারপরে এভাল ফাংশনটি নতুন অ্যাসাইনমেন্টটি nঅ্যাকাউন্টে নেওয়ার জন্য পরিবর্তন করা হয়: (\x->last$m:[e#x|x/=e#n])যা একই \x -> if x == eval n then m else eval x

প্রাথমিক মূল্যায়ন ফাংশন idযা প্রতিটি সংখ্যাকে নিজের কাছে মানচিত্র করে।


একটি সংক্ষিপ্ত ফিক্সপয়েন্ট ফাংশন জন্য 2 বাইট সংরক্ষণ করে Ørjan জোহানসেনকে ধন্যবাদ!


সুন্দর কাজ! উপায় দ্বারা আপনাকে সমস্ত মধ্যবর্তী ফলাফলগুলি ফিরিয়ে আনতে হবে, যাতে আপনি ড্রপ করতে পারেনlast.
লিও

2
(#)e=until((==)=<<e)eবা (#)=until=<<((==)=<<)কম হয়।
janrjan জোহানসেন

@ আরজান জোহানসেন অনেক ধন্যবাদ!
লাইকনি

3

ওকে, 48 বাইট

a:[];s:{*(a@x;x)^0N}/;f:{a[s@x]:y:{s@x+y}/s'y;y}

ব্যবহার: f[5;1 2 3] / 5=1+2+3

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


আপনি এই ধরনের শুধুমাত্র সংখ্যা ব্যবহার সংখ্যাটি ব্যবহার করতে পারেন, একটি সর্বোচ্চ সীমা থাকার কিছু মনে না করেন 0মাধ্যমে 998নিম্নলিখিত যথেষ্ট, তবে ( 41 বাইট কয়েক সর্বাধিক উপর নির্ভর করে ±):

a:!999;s:(a@)/;f:{a[s@x]:y:{s@x+y}/s'y;y}

ব্যাখ্যা:

; তিনটি সংজ্ঞা পৃথক করে।

aসংখ্যার একটি অভিধান / মানচিত্র। প্রথম ক্ষেত্রে, এটি একটি প্রকৃত, খালি অভিধান এর []দ্বিতীয় ক্ষেত্রে এটি সংখ্যার একটি তালিকা 0থেকে 998

sএকটি ফাংশন যা কোনও নম্বর দেওয়ার পরে "ফলাফল" নম্বরটি সন্ধান করে। /ফাংশন মানে এটি পর্যন্ত আউটপুট পরিবর্তন স্টপ নিজস্ব আউটপুট থেকে নিজেকে প্রযোজ্য হবে শেষে হয়।

শেষ বিট f, এর অর্থ:

f:{                      } /function called f, input number x, list y
                    s'y    /apply s to every number in the list
                   /       /fold through the list
            {s@x+y}        /    sum the two numbers, apply s
   a[s@x]:                 /set the s(x) to map to the final sum
          y:           ;y  /redefine y to be the final sum, then return it

3

পাইথন 3, 146 132 130 বাইট

14 বাইট সংরক্ষিত
হয়েছে @ দাদাকে ধন্যবাদ 2 বাইট @ এমবিম্ব007 ধন্যবাদ saved

d={}
g=lambda x:d.get(x)and x!=d[x]and g(d[x])or x
def f(t):
 for n,(s,*r)in t:
  for b in r:s=g(g(s)+g(b))
  d[g(n)]=s;yield g(n)

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

জেনারেটরের মাধ্যমে আউটপুট সমীকরণের আকার হিসাবে [ x = y + z + wযেমন (x, (y, z, w))] ইনপুট প্রাপ্ত করে Re


আপনি কি একটি অনুরোধের উদাহরণটি প্রদর্শন করতে পারেন যাতে এটি পরীক্ষা করা যায়?
লিও

1
@Loo যোগ করেছেন টিআইও।
ইউরিয়েল

1
gসম্ভবত লেখা যেতে পারে g=lambda x:d.get(x)and d[x]!=x and g(d[x])or x। এবং আমি মনে করি আপনি 2 এর পরিবর্তে 1 স্থান ব্যবহার করতে পারেন can এটি আপনাকে [132 বাইট] পেতে হবে ( এটি অনলাইনে চেষ্টা করুন! )।
দাদা

1
@ দাদাকে ধন্যবাদ! খুব খারাপ তাদের অর্ধ-স্পেস ইনডেন্ট নেই: পি
ইউরিয়েল

1
অর্ধ-স্পেস ইনডেন্ট নয়, তবে আরও একটি ঝরঝরে কৌশল দুটি স্পেসের পরিবর্তে একটি একক ট্যাব ব্যবহার করছে। যতক্ষণ ইনডেন্টেশন আলাদা হয় ততক্ষণ পাইথন খুশি হয় (উদাহরণস্বরূপ আপনি স্পেস-ট্যাব এবং ট্যাব-স্পেস অতিরিক্ত নেস্টেড স্তরের ইনডেন্টেশন হিসাবে ব্যবহার করতে পারেন)। এটি আপনাকে দুটি বাইট সংরক্ষণ করতে পারে :)
লিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.