গাণিতিক চিহ্নগুলি বোঝাও


13

আপনি যদি কার্ল সাগান দ্বারা পরিচিতি বইটি পড়ে থাকেন তবে এই চ্যালেঞ্জটি আপনার পরিচিত হতে পারে।


একটি সংখ্যা, অজানা অপারেটর, অন্য নম্বর এবং একটি ফলাফল সমন্বিত গাণিতিক সমীকরণগুলির সেটগুলির একটি ইনপুট দেওয়া হয়েছে, যা অপারেটরগুলি যোগ, বিয়োগ, গুণ বা বিভাগকে উপস্থাপন করে uce

প্রতিটি ইনপুট সমীকরণ সর্বদা সমন্বিত থাকে

  • একটি অ-নেতিবাচক পূর্ণসংখ্যা
  • চিঠির এক A, B, C, অথবাD
  • অন্য অ-নেতিবাচক পূর্ণসংখ্যা
  • চরিত্র =
  • একটি চূড়ান্ত অ-নেতিবাচক পূর্ণসংখ্যার

একসাথে সংক্ষিপ্ত। উদাহরণস্বরূপ, একটি সম্ভাব্য ইনপুট হ'ল 1A2=3, যা থেকে আপনি সংযোজনকে Aউপস্থাপন করতে পারেন । পূর্ণসংখ্যার প্রতিটি সন্তুষ্ট হবে 0 ≤ x ≤ 1,000

তবে এটি সর্বদা সহজ নয় that এর মধ্যে দ্ব্যর্থহীনতা থাকা সম্ভব:

  • 5A0=5: যোগ / বিয়োগ
  • 1A1=1: গুণ / বিভাগ
  • 0A5=0: গুণ / বিভাগ
  • 2A2=4: সংযোজন / গুণ
  • 4A2=2: বিয়োগ / বিভাজন
  • 0A0=0: যোগ / বিয়োগ / গুণ

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

উদাহরণস্বরূপ, আসুন আসুন ইনপুটটি নীচের সমীকরণগুলি:

  • 0A0=0: এটি সংযোজন, বিয়োগ বা গুণনের (0 দ্বারা বিভাজন করতে পারে না) নীচে নেমে আসে।
  • 10B0=10: বি হয় হয় যোগ বা বিয়োগফল হতে হবে।
  • 5C5=10: সি স্পষ্টত সংযোজন, যা বি বিয়োগ করে, যা একটি গুণ করে।

অতএব, এই ইনপুট সমীকরণগুলির জন্য আউটপুটটির Aসাথে *, B সাথে -এবং Cসাথে মেলা উচিত +

ইনপুটটি একটি একক সাদা স্থান- / কমা-বিস্মৃত স্ট্রিং বা স্ট্রিংগুলির একটি অ্যারে হিসাবে দেওয়া যেতে পারে, প্রতিটি প্রত্যেকে একটি সমীকরণ উপস্থাপন করে। আউটপুট হয় একক স্ট্রিং ( "A*B-C+"), একটি অ্যারে ( ["A*", "B-", "C+"]), বা অভিধান / ডিক্ট-এর মতো 2D অ্যারে ( {"A": "*", ...}বা [["A", "*"], ...]) হতে পারে।

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

যেহেতু এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

পরীক্ষার কেস:

In                       Out
-------------------------------
0A0=0 10B0=10 5C5=10     A*B-C+
100D100=10000            D*
4A2=2 4B2=2 0A0=0        A-B/
15A0=15 4B2=2 2C2=0      A+B/C-
1A1=1 0A0=0              A*
0A0=0 2A2=4 5B0=5 2B2=4  A*B+
2A2=4 0C0=0 5B0=5 5A0=5  A+B-C*
0A1000=0 4A2=2           A/

1
আমরা কি (কাটা) পূর্ণসংখ্যা বিভাগ করছি?
মার্টিন এন্ডার

@ মার্টিনবাটনার আপনি ধরে নিতে পারেন যে কোনও সংখ্যার দ্বারা কখনও ভাগ হবে না যার ফলে পূর্ণসংখ্যার ফলাফল হয় না doesn't (প্রশ্নে সম্পাদিত।)
ডোরকনব

আমরা কি অভিধান হিসাবে আউটপুট দিতে পারি?
lirtosiast

@ থমাসকওয়া শিওর, একটি অভিধানও গ্রহণযোগ্য আউটপুট।
Doorknob

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

উত্তর:


9

এমএটিএল , 53 বাইট

j61tthYX'+-*/'X{Y@!"t'ABCD'!XKX{@YXU?K@Y}hwxKGm1L3$).

বর্তমান সংস্করণ (10.1.0) ব্যবহার করে

সম্পাদনা করুন (12 জুন, 2016): ভাষা পরিবর্তন মানিয়ে, প্রতিস্থাপন Y}দ্বারা gএবং 1L3$)দ্বারা Y)। নীচের লিঙ্কটিতে সেই পরিবর্তনগুলি অন্তর্ভুক্ত করা হয়েছে

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

ব্যাখ্যা

এই ক্রমটি চারটি অপারেটরের সমস্ত সম্ভাব্য ক্রমকে একটি লুপে পরীক্ষা করে দেয় যতক্ষণ না একটি ক্রমায়ন সকল সমীকরণকে সত্য করে তোলে।

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

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

j            % input data string
61           % '=' (ASCII)
tth          % duplicate twice and concat: '==' (ASCII)
YX           % regexprep to change '=' into '==' in input string
'+-*/'       % push string
X{           % transform into cell array {'+','-','*','/'}
Y@!          % all permutations, each in a column
"            % "for" loop. Iterate columns (that is, permutations)
  t          %   duplicate data string containing '=='
  'ABCD'!XK  %   create column array ['A';'B';'C';'D'] and copy to clipboard K
  X{         %   transform into column cell array {'A';'B';'C';'D'} 
  @          %   push column cell array with current permutation of operator symbols
  YX         %   regexprep. Replaces 'A',...,'D' with current permutation of operators
  U          %   convert to numbers, i.e. evaluate string
  ?          %   if all numbers are 1 (truthy result): found it! But before breaking...
    K        %     push column array ['A';'B';'C';'D']
    @Y}      %     push column array with current permutation of operator symbols
    h        %     concatenate horizontally into 4x2 char array
    wx       %     delete original input so it won't be displayed
    K        %     push ['A';'B';'C';'D']
    G        %     push input string
    m        %     logical index that tells which of 'A',...,'D' were in input string
    1L3$)    %     apply that index to select rows of the 4x2 char array
    .        %     we can now break "for" loop
             %   implicitly end "if"
             % implicitly end "for"
             % implicitly display stack contents

6

পাইথন, 278 টি অক্ষর

কোড গল্ফে আমার প্রথম উত্তর ...

এটি কেবল একটি জন্তু শক্তি অ্যালগরিদম বাস্তবায়নের একটি ফাংশন, আপনি একে সমীকরণের স্ট্রিংকে যুক্তি হিসাবে বলছেন।

from itertools import *
def f(s):
    l=list("ABCD")
    for p in permutations("+-*/"):
        t=s
        for v,w in zip(l+["="," "],list(p)+["=="," and "]):
            t=t.replace(v, w)
        try:
            o=""
            if eval(t):
                for c,r in zip(l,p):
                    if c in s:
                        o+=c+r
                return o
        except:
            pass

আমি নিশ্চিত যদি এটি কাজ করে না, কিন্তু আপনি প্রতিস্থাপন করতে পারেন ["A","B","C","D"]সঙ্গে list("ABCD")?
আদনান

@ আদনান যা বলেছিলেন তা বাস্তবে কার্যকর হয়। =সংজ্ঞা অনুসারে আপনি আশেপাশের স্থানগুলিও সরাতে পারেন l
অ্যালেক্স এ।

@ আদনান এবং অ্যালেক্স এ। ধন্যবাদ, আমি কোডটি সম্পাদনা করেছি।
বব

এখানে একই পদ্ধতির জন্য 257 বাইট রয়েছে , সাথে সাথে একটি অনলাইন পরীক্ষার পরিবেশ।
অ্যালেক্স এ।

কিছু পরিবর্তন করেছেন - repl.it/BfuU । ভিন্ন আউটপুট ফর্ম্যাটটি বেছে নিয়ে আপনি আরও অনেকগুলি বাইট কাটতে পারেন। এই দ্রবণটি কেবল অজগর 3 বিটিডাব্লু ( 4A2=2 4B3=1) তে কাজ করে ।
নাব্ব

4

জাভাস্ক্রিপ্ট (ES6), 213 208 বাইট

f=(l,s="+-*/",p="",r)=>s?[...s].map(o=>r=f(l,s[g="replace"](o,""),p+o)||r)&&r:l.split` `.every(x=>(q=x.split`=`)[1]==eval(q[0][g](/[A-D]/g,m=>p[(a="ABCD").search(m)])))&&a[g](/./g,(c,i)=>l.match(c)?c+p[i]:"")

ব্যাখ্যা

ইনপুট এবং আউটপুট স্ট্রিং হয়।

fঅপারেটরগুলির সমস্ত ক্রম উত্পাদন উত্পন্ন করার জন্য একটি পুনরাবৃত্ত ফাংশন হিসাবে দ্বিগুণ এবং একটি ফাংশন সংজ্ঞায়িত করে ইনপুট সমীকরণগুলি ব্যবহার করে সম্পূর্ণ ক্রিয়াকলাপ পরীক্ষা করে eval

f=(
  l,                          // l = input expression string
  s="+-*/",                   // s = remaining operators
  p="",                       // p = current permutation of operators
  r                           // r is here so it is defined locally
)=>
  s?                          // if there are remaining operators
    [...s].map(o=>            // add each operator o
      r=f(
        l,
        s[g="replace"](o,""), // remove it from the list of remaining operators
        p+o                   // add it to the permutation
      )
        ||r                   // r = the output of any permutation (if it has output)
    )
    &&r                       // return r
  :                           // else if there are no remaining operators
    l.split` `.every(x=>      // for each expression
      (q=x.split`=`)          // q = [ equation, result ]
      [1]==eval(              // if the results is equal to the eval result

        // Replace each letter with the current permutation
        q[0][g](/[A-D]/g,m=>p[(a="ABCD").search(m)])
      )
    )

    // If all results matched, add permutation symbols to present characters and return
    &&a[g](/./g,(c,i)=>l.match(c)?c+p[i]:"")

পরীক্ষা

ব্রাউজারের সামঞ্জস্যের জন্য পরীক্ষা ডিফল্ট আর্গুমেন্ট ব্যবহার করে না।

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