ম্যাচস্টিক সমীকরণ


16

এই চ্যালেঞ্জটিতে আপনার কাজটি হ'ল এর মতো প্রদত্ত "ম্যাচস্টিক সমীকরণ" বিশ্লেষণ করা ...

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

... এবং এটি ম্যাচগুলি পুনরায় সাজিয়ে একটি বৈধ সমীকরণে রূপান্তরিত করা যায় কিনা তা খুঁজে বের করার জন্য। যদি তা হয় তবে আপনাকে সর্বনিম্ন সংখ্যাটি চালনা করতে হবে এবং ফলাফলটি সমীকরণ করতে হবে।

ইনপুট

ইনপুটটি এমন একটি স্ট্রিং যা এসটিডিএন থেকে পড়া যায়, একটি ফাংশন আর্গুমেন্ট হিসাবে নেওয়া বা এমনকি কোনও ফাইলেও সংরক্ষণ করা যায়। এটি একটি সমীকরণ যা একটি ম্যাচস্টিক বিন্যাসকে উপস্থাপন করে এবং নিম্নলিখিত EBNF ব্যবহার করে বর্ণনা করা যেতে পারে:

input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;

একটি বৈধ ইনপুট জন্য একটি উদাহরণ হতে পারে 3+6-201=0+0+8

কার্য

নিম্নলিখিত চিত্রটি বিবেচনা করুন যেখানে প্রতিটি ম্যাচস্টিকের একটি নম্বর নির্ধারিত থাকে:

ম্যাচস্টিক অবস্থান

আমরা এখন প্রতিটি ইনপুট প্রতীকটি নিম্নরূপে সম্পর্কিত ম্যাচস্টিক পজিশনে ম্যাপ করি:

0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9

প্রতিটি ইনপুট সূত্র ম্যাচস্টিক বিন্যাসে রূপান্তরিত হতে পারে। উদাহরণস্বরূপ, "45 + 6 = 92" সমীকরণটি হয়ে যায়

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

যেখানে অব্যবহৃত ম্যাচস্টিকগুলি গ্রে আউট করা আছে। আপনার কাজটি হল সমীকরণটিকে বৈধ করার জন্য ন্যূনতম ম্যাচস্টিকের পুনরায় ব্যবস্থা করতে হবে।

আউটপুট

আমরা তিনটি সম্ভাব্য মামলার মধ্যে পার্থক্য করি:

  • যদি ইনপুটটি বৈধ না হয় (যেমন এটি উপরের ইবিএনএফকে সন্তুষ্ট করে না), আপনি যা চান আউটপুট।
  • অন্যথায়, যদি ম্যাচস্টিকগুলি পুনর্বিন্যাসের মাধ্যমে সমীকরণটিকে বৈধ এক হিসাবে রূপান্তর করার উপায় থাকে তবে আপনাকে ন্যূনতম সংখ্যার পুনর্বিন্যাসের এবং সংশ্লিষ্ট সমীকরণ উভয়ই আউটপুট দিতে হবে । ইনপুট হিসাবে, আউটপুট সমীকরণ অবশ্যই প্রদত্ত EBNF সন্তুষ্ট করতে হবে। উপরের উদাহরণে, সঠিক আউটপুট হবে এবং । ফলস্বরূপ সমীকরণের জন্য যদি একাধিক সম্ভাবনা থাকে তবে এগুলির যে কোনও একটিকে আউটপুট দিন।146+6=52
  • অন্যথায় (সুতরাং যদি ইনপুটটি বৈধ হয় তবে সমীকরণটি সত্য করার কোনও উপায় না থাকে), আপনাকে আউটপুট দিতে হবে -1

বিস্তারিত

  • আপনাকে ম্যাচগুলি সরাতে বা যোগ করার অনুমতি নেই। এর অর্থ, যদি ইনপুটটি nম্যাচস্টিকগুলি দিয়ে নির্মিত হয় তবে আউটপুটটিতে অবশ্যই হুবহু nম্যাচস্টিক থাকতে হবে।
  • "খালি" ম্যাচস্টিক-ব্লকগুলি কেবল সমীকরণের শেষে এবং মাঝামাঝি সময়েই অনুমোদিত হয়। সুতরাং, উদাহরণস্বরূপ, বাঁক 7-1=6মধ্যে 7 =6-1কেবল সরিয়ে -1বাম দিক থেকে এবং মাত্র 3 দেশলাই কাঠি rearrangements সঙ্গে ডান দিকে এটি যোগ মঞ্জুরিপ্রাপ্ত নয়।
  • যেহেতু আমি এই চ্যালেঞ্জের একটি আকর্ষণীয় অংশ হিসাবে নম্বর থেকে ম্যাচস্টিক পজিশনে ম্যাপিংটি সত্যিই দেখছি না, 20 বাইটের একাধিকের জন্য , আপনি হয়ত

    • কোনও ফাইল অ্যাক্সেস করুন যাতে ম্যাপিং (number/operation ↦ matchstick positions)কোনও যুক্তিসঙ্গত উপায়ে সংরক্ষণ করা হয়, বা
    • যদি আপনার প্রোগ্রামিং ল্যাঙ্গুয়েজ কোনও Mapডেটাটাইপ সমর্থন করে তবে ধরে নিন যে (number/operation ↦ matchstick positions)-ম্যাপিংয়ের সাথে পূর্বনির্ধারিত কোনও মানচিত্রে আপনার অ্যাক্সেস রয়েছে। এই মানচিত্রটি উদাহরণস্বরূপ দেখতে পারে:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}

উদাহরণ

ইনপুট: 1+1=3আউটপুট: 1 এবং1+1=2

ইনপুট: 15+6=21আউটপুট: 0 এবং15+6=21

ইনপুট: 1=7আউটপুট: -1

ইনপুট: 950-250=750আউটপুট: 2 এবং990-240=750

ইনপুট: 1-2=9আউটপুট: 1 এবং1+2=3

ইনপুট: 20 + 3=04আউটপুট: যে কোনও কিছু

বিজয়ী

এটি , তাই সংক্ষিপ্ত সঠিক উত্তর (বাইটে) জেতে। প্রথম সঠিক উত্তর পোস্ট হওয়ার এক সপ্তাহ পরে বিজয়ী নির্বাচন করা হবে।


1
দয়া করে 0: 1, 2, 3, 4, 5, 6ধারাবাহিকতার জন্য যুক্ত করুন
চার্লস

ওহ ধন্যবাদ, একরকম সম্পর্কে সম্পূর্ণরূপে ভুলে গেছি!
vauge

@ ওয়াজ আরে '2 = 1-1' -> '2-1 = 1' 3 বা 14 টি পদক্ষেপের ফিরতে হবে যেহেতু 2 প্রযুক্তিগতভাবে বাম দিকে সরানো হয়েছে?
সেরিক

@ সিয়েরিক এটি 3 ফিরে আসবে, কেবল কারণ আপনি =(2 ম্যাচস্টিক) এবং -(1 ম্যাচস্টিক) অবস্থান স্যুইচ করতে পারেন এবং তারা যেখানে আছেন সেখানে সমস্ত সংখ্যা রেখে যেতে পারেন। তবে, যদি 2 টি বাম দিকে সরানো হয় তবে আপনাকে প্রয়োজনীয় পদক্ষেপগুলিও গণনা করতে হবে।
ভিজ

অপারেশন সংখ্যার কি কোনও সীমাবদ্ধতা রয়েছে? ইনপুট কি মত হতে পারে 1+1+2=3-6+10? এবং আউটপুট সম্পর্কে একই প্রশ্ন।
কিওয়ারটি

উত্তর:


6

জাভাস্ক্রিপ্ট, 1069 বাইট

আমি এটি বেশ কয়েকটি পরীক্ষামূলক সমীকরণের সাথে পরীক্ষা করেছি এবং মনে হয় এটি এখন সময়ের সব সময় কার্যকর হয় ...

function w(t){function B(c,f){d=(c.length>f.length?f:c).split("");e=(c.length>f.length?c:f).split("");longer=Math.max(d.length,e.length);if(0!==d.length&&0!==e.length){c=[];for(x in d)for(y in c[x]=[],e)c[x][y]=1<y-x?-1:function(c,n){r=0;for(j in n)-1<c.indexOf(n[j])&&r++;return c.length+n.length-2*r}(a[d[x]],a[e[y]]);return v=function(f,n){for(var h=f.length-2;0<=h;h--)c[n.length-1][h]+=c[n.length-1][h+1];for(h=f.length-2;0<=h;h--)for(var q=0;q<n.length-1;q++)1>=h-q&&(c[q][h]+=-1==c[q][h+1]?c[q+1][h+1]:Math.min(c[q+1][h+1],c[q][h+1]));return c[0][0]/2}(e,d)}return-1}a=[[1,2,3,4,5,6],[4,5],[2,3,5,6,8],[3,4,5,6,8],[1,4,5,8],[1,3,4,6,8],[1,2,3,4,6,8],[4,5,6],[1,2,3,4,5,6,8],[1,3,4,5,6,8]];a["+"]=[8,0];a["-"]=[8];a["="]=[7,9];a[" "]=[];l=0;p=[];u=[];r=/^([1-9]\d*|0)([+-]([1-9]\d*|0))*=([1-9]\d*|0)([+-]([1-9]\d*|0))*$/;b=/(=.*=|[+=-]{2,}|^[+=-])/;if(!t.match(r))return-1;g=function(c,f,t){if(0===t&&f.match(r)&&eval(f.replace("=","==")))c.push(f);else for(var n in a)t>=a[n].length&&" "!=n&&!(f+n).match(b)&&g(c,f+n,t-a[n].length)};g(p,"",function(c){m=0;for(var f in c)m+=a[c[f]].length;return m}(t.split("")));for(var z in p)k=B(t,p[z]),u[k]||(u[k]=[]),u[k].push(p[z]);for(var A in u)return[A,u[A]];return-1}

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

যদি ইনপুটটি "1-2 = 9" হয় তবে আউটপুটটি [1, ["1 + 2 = 3", "7-2 = 5"]]

এবং এখানে সঙ্কুচিত কোডটি রয়েছে:

function ms(s) {
a=[[1,2,3,4,5,6],[4,5],[2,3,5,6,8],[3,4,5,6,8],[1,4,5,8],[1,3,4,6,8],[1,2,3,4,6,8],[4,5,6],[1,2,3,4,5,6,8],[1,3,4,5,6,8]];
a["+"] = [8, 0];
a["-"] = [8];
a["="] = [7, 9];
a[" "] = [];
l = 0;
p = [];
u = [];
r = /^([1-9]\d*|0)([+-]([1-9]\d*|0))*=([1-9]\d*|0)([+-]([1-9]\d*|0))*$/;
b = /(=.*=|[+=-]{2,}|^[+=-])/;
if (!s.match(r)) return -1;
function f(g,h)
{
    d=(g.length>h.length?h:g).split('');
    e=(g.length>h.length?g:h).split('');
    longer=Math.max(d.length, e.length);
    if(0!==d.length&&0!==e.length)
    {
        g=[];
        for(x in d)
        {
            g[x]=[];
            for(y in e)
            {
                g[x][y]=(y-x>1)?-1:function(g, h){r=0;for(j in h)if(g.indexOf(h[j])>-1)r++;return g.length+h.length-2*r;}(a[d[x]],a[e[y]]);
            }
        }
        v=function(d,e)
        {
        for(var y=d.length-2;y>=0;y--) g[e.length-1][y]+=g[e.length-1][y+1];
        for(var y=d.length-2;y>=0;y--)
            for(var x=0;x<e.length-1;x++)
                if(y-x<=1)
                    g[x][y]+=g[x][y+1]==-1?g[x+1][y+1]:Math.min(g[x+1][y+1], g[x][y+1]);
        return g[0][0]/2}(e,d)
        return v
    }
    return -1;
}
g=function(n, s, i){if (i===0 && s.match(r) && eval(s.replace('=','=='))){n.push(s);return;}for (var c in a) if(i>=a[c].length && c!=" " && !(s+c).match(b)) g(n, s+c, i-a[c].length);};
g(p, "", function(q){m=0;for(var t in q)m+=a[q[t]].length;return m}(s.split('')));
for (var i in p)
{
    k=f(s, p[i]);
    if (!u[k]) u[k] = [];
    u[k].push(p[i]);
}
for (var q in u) return [q, u[q]];
return -1;
}

সতর্কতা: 950-250 = 750 এর মতো সমীকরণগুলি করবেন না এটিতে ~ 45 ম্যাচস্টিক ব্যবহার করা হয় এবং এই কোডটি ব্রুটি ফোর্স ব্যবহার করে কারণ এটি জাভাস্ক্রিপ্টটি ঝুলিয়ে দেবে।


আমি বিশ্বাস করি আপনি var kপ্রতিটি ঘোষণার জন্য 3 বাইট সংরক্ষণ করে ফাংশনে অব্যবহৃত প্যারামিটার হিসাবে লুপগুলিতে ব্যবহার করেন এমন ভেরিয়েবলগুলি আপনি ঘোষণা করতে পারেন ।
রোরলর্ক

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

আমি মনে করি আপনার সমাধানটি সঠিক নয়, আপনি যখন দূরত্বটি গণনা করছেন আপনি সর্বদা সমান অক্ষরকে সারিবদ্ধ করেন। কিছু ক্ষেত্রে এটি সর্বোত্তম উপায় নয়। উদাহরণস্বরূপ '2 = 1-1' 3 টি মুভগুলিতে '2-1 = 1' তে রূপান্তরিত হতে পারে, যখন '=' চিহ্নগুলি সারিবদ্ধ করার পরে 14 টি চাল দেওয়া হয়। এছাড়াও আপনি দেখতে পাচ্ছেন না যে আপনি কীভাবে শীর্ষস্থানীয় শূন্যগুলি এড়িয়ে চলেছেন। উদাহরণস্বরূপ 08=8জন্য 80=8ভুল।
নটকি

@ নটকি হ্যাঁ, আমি মনে করি আমি এটি পরিবর্তন করতে পারি। আমি ভেবেছিলাম যে ভুল হতে চাই যদিও আপনাকে প্রযুক্তিগতভাবে -1
সিয়েরিক

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

1

পার্ল, 334

1 বা 2 পদক্ষেপে সমাধানটি যখন অ্যাক্সেসযোগ্য হয় ততক্ষণ দ্রুত। কোনও সমাধান নেই যখন আপনি এমনকি সবচেয়ে ছোট ক্ষেত্রে এমনকি দীর্ঘ প্রতীক্ষার জন্য প্রস্তুত 1=7

#!perl -p
@y=map{sprintf"%010b",$_}63,24,118,124,89,109,111,56,127,125,64,192,768;
$y{$z{$y[$c++]}=$_}=$y[$c]for 0..9,qw(- + =);
$"="|";$l=s/./$y{$&}/g;$x{$_}=1;for$m(0..y/1//){
last if$_=(map"$m $_",grep{s/@y/$z{$&}/g==$l&&/^\d.*\d$/&!/\D\D/&!/\b0\d/&y/=//==1&&eval s/=/==/r}keys%x)[0];
$_=-1;s/0/"$`1$'"=~s!1!$x{"$`0$'"}=1!ger/eg for keys%x}

উদাহরণ:

$ time perl ~/matchstick.pl <<<950-250=750
2 990-250=740

real    0m39.835s
user    0m39.414s
sys 0m0.380s

এটি এমন সমাধানগুলি খুঁজে পাবে না যা 11=4-> এর মতো সমতার দৈর্ঘ্য পরিবর্তন করে 2 11=11তবে আমি নিশ্চিত নই যে এটির অনুমতি দেওয়া হবে।


1
যে সমাধানগুলি সমীকরণের দৈর্ঘ্য পরিবর্তন করে ততক্ষণ অনুমতি দেওয়া হবে যতক্ষণ না তারা প্রশ্নে উল্লিখিত EBNF অনুসরণ করে। সুতরাং, সেগুলি আপনার ফাংশন দ্বারাও খুঁজে পাওয়া উচিত।
2'15

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

@ ওয়াজ আমি অভদ্র শব্দটি শুনতে চাই না, তবে কোডটি স্থির না হলে এটি এখনও গণনা করবে?
সিয়েরিক

@ সিয়েরিক যদি এই সমস্ত কেস পরিচালনা করে এমন কোনও সমাধান নেই তবে হ্যাঁ, এটি গণনা করা হবে। তবে, এই চ্যালেঞ্জের শেষে যদি কোনও পুরোপুরি কার্যকারী উত্তর থাকে তবে আমি তাদের মধ্যে সবচেয়ে কম গ্রহণ করব।
13:25

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