গণিত সমস্যা চিহ্নিতকরণ সমাধান করুন


14

কল্পনা করুন যে আমার প্রতিটি বাড়িতে একটি পূর্ণসংখ্যার নম্বর দেওয়া হোমওয়ার্কের সমস্যাগুলি (!) রয়েছে have

ম্যাথ প্রব্লেম নোটেশন সমস্যা স্পেসিফায়ার ব্যবহার করে সমস্যার সাবসেটগুলি বর্ণনা করার জন্য একটি স্বরলিপি।

এমপিএন এক্সপ্রেশনটিতে বেশ কয়েকটি জিনিস থাকতে পারে:

  • একক মান। এই সংখ্যা ধারণকারী একটি সেট প্রতিনিধিত্ব করে: 99 -> {99}
  • একটি সাধারণ পরিসীমা। এই পরিসীমা প্রথম থেকে শেষ পর্যন্ত সমস্ত নম্বর ধারণকারী সেট প্রতিনিধিত্ব করে: 10~13 -> {10, 11, 12, 13}। বাম বা ডান দিকের অনুপস্থিত হয়, তারপর তারা যথাক্রমে -Infinity বা অসীম গণ্য করা হয়: ~10 -> {x|x ≤ 10}; ~ -> ℤ
  • একটি এমপিএন এক্সপ্রেশন, তারপরে "এড়িয়ে যান" এবং অন্য এমপিএন এক্সপ্রেশন। এই দুটি সেট পার্থক্য প্রতিনিধিত্ব করে: 10~20 skip 12~14 -> {10, 11, 15, 16, 17, 18, 19, 20}
  • কমা দ্বারা পৃথক দুটি এমপিএন এক্সপ্রেশন separated এই দুটি সেট ইউনিয়ন প্রতিনিধিত্ব করে: 1,8~9,15~17 -> {1,8,9,15,16,17}

"এড়িয়ে যান" অপারেটরটি কমা অপারেটরের চেয়ে শক্ত করে বাঁধে, সুতরাং 16,110~112 skip 16 -> {16,110,111,112}(16 টি সেটটিতে অন্তর্ভুক্ত নয় {110,111,112}, তাই 16 বাদে কিছু যায় আসে না))

আপনি অসম্পূর্ণতার জন্য প্রথম বন্ধনীতে এক্সপ্রেশনও রাখতে পারেন: 1~9 skip (2~8 skip (3~7 skip (4~6 skip 5))) -> {1,3,5,7,9}

এটি ব্যাকরণ:

<expr>  ::= "(" <expr> ")"
         || <number>
         || [<number>] "~" [<number>]
         || <expr> "skip" <expr>
         || <expr> "," <expr>

আপনার কাজটি এমন একটি প্রোগ্রাম লিখতে হবে যাতে দুটি ইনপুট লাগে:

  • একটি এমপিএন এক্সপ্রেশন
  • একটি সংখ্যা

এবং MPN এক্সপ্রেশন দ্বারা বর্ণিত সেটে সমস্যাটি রয়েছে কিনা তার উপর নির্ভর করে কিছু সত্যবাদী বা মিথ্যা মান আউটপুট করে।

বিশেষ উল্লেখ

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

পরীক্ষার কেস

10~20             14 -> True
10~20             20 -> True
10~20 skip 14~18  17 -> False
~ skip 6          8  -> True
16,17 skip 16     16 -> True
(16,17) skip 16   16 -> False
~10,5~            8  -> True
~10,5~            4  -> True
6 skip 6,~        6  -> True

অপারেটরদের উপস্থাপনের জন্য কি অন্য চরিত্রগুলি ব্যবহার করা সম্ভব?? উদাহরণস্বরূপ ~
rahnema1

1
@ rahnema1 এর জন্য ~এবং ,তবে নয় skip
এফসেলিং ফল

3
4 এর জন্য কেন 10,5 ~ মিথ্যা? কারণ এটি 10 ​​থেকে 5 এবং অনন্তের সাথে
অন্তহীনতার মিলন

@ ev3 কম্যান্ডার সম্পাদিত আমি সবসময় আমার পরীক্ষার কেসগুলিতে গণ্ডগোল করি। আমি বাজি দিয়েছি যে আমার চ্যালেঞ্জগুলি আমি যদি এগুলি না যোগ করি তবে আরও স্পষ্ট হবে: পি
এসওলং ফল 13

1
@ চ্যালেঞ্জার 5 আমি একটি পরীক্ষার কেস যুক্ত করেছি 6 skip 6,~যা আমি বিশ্বাস করি যে আমি সঠিক ব্যাখ্যা করেছি। এখনও পর্যন্ত অন্য 2 টি উত্তর এটি সন্তুষ্ট করে না (আবার ধরে নেওয়া, আমি সঠিকভাবে ব্যাখ্যা করছি)। আমি যদি ভুল বুঝে থাকি তবে দয়া করে এটি সংশোধন করুন এবং স্পষ্ট করুন, তবে আমার বোঝার দিক থেকে এটি যে কোনও কিছুর সাথে মিলিত হওয়া উচিত (এটি এমন একটি সংঘের মিল যা কোনও কিছুর সাথে মেলে না যেটি কোনও কিছুর সাথে মেলে না)। এর আগে আমি এই ধরণের কেসগুলির বিষয়ে কথা বলছিলাম যা আমাদের সমাধানগুলি পরীক্ষা করার সময় আমি অনেকটা সাহায্য করতে পারি বলে মনে করি।
ব্রিটিশবাদী

উত্তর:


3

পাওয়ারশেল , 189 195 বাইট

param($m,$q)('$m',"'(\d*)~(\d*)','($q-ge(`$1)-and$q-le(`$2))'","'\(\)',$q","'((?<=,|skip )\d+|\d+(?=,| skip))','($q-eq`$1)'","'skip','-and!'"-join'-replace'|iex|% Sp* ','|%{"($_)"})-join'-or'|iex

ব্যাখ্যা

আমি তাড়াতাড়ি বুঝতে পেরেছিলাম যে অসম্পূর্ণতা অ্যারে তৈরি করতে এবং মানগুলির পরীক্ষার জন্য এটি অযোগ্য করে তোলে।

আমি ব্যাপ্তিগুলিতে সন্ধান করেছিলাম কিন্তু এতে। তাদের প্রয়োজনীয় পরিসীমা নেই (পরিসীমাটির দৈর্ঘ্য একটি স্বাক্ষরিত (32 বিট) পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ, তাই এমনকি যদি কোনও স্বাক্ষরিত 32-বিট ইনট্রে সীমাটি সীমাবদ্ধ করা ঠিক ছিল তবেও , আমি সমস্ত ব্যাপ্তি পরিচালনা করতে সক্ষম হত না।

সুতরাং আমি শুরু এবং শেষের দিক দিয়ে এই সম্পর্কে কেবল ভাবতে শুরু করেছি এবং শেষ পর্যন্ত একটি বুলিয়ান পরীক্ষার একটি সিরিজ তৈরি করেছি এবং একটি এমপিএনকে বুলিয়ান এক্সপ্রেশন হিসাবে পরিবর্তিত করে যা পাওয়ারশেল বুঝতে পারে।

আমি মূলত এটিকে কয়েকটি নিয়মে বিভক্ত করেছিলাম:

  • প্রথমগুলির সাথে রেঞ্জগুলি কাজ করা সহজ ছিল কারণ তারা উভয় প্রান্তে প্রকাশ হতে পারে না, তবে অল্প সময়ের মধ্যেই প্রকাশ্য ব্যথা a অনুমানটি 2~8বলতে বলার মতো n >=2 && n <=8, তবে যখন কোনও এক প্রান্তটি নিখোঁজ হয়, তখন &&এবং অনুপস্থিত দিকটি ছেড়ে যান । যখন দু'জন নিখোঁজ হয়, আমি মূলত কেবল এটির সাথে প্রতিস্থাপন করতে যাচ্ছিলাম $true। আমি যেটি শেষ করেছিলাম তা অনুপস্থিত পক্ষগুলির জন্য সত্যই পরীক্ষা করা হয়নি, তবে আমি প্রতিটি নম্বরটি মোড়ানো নিশ্চিত করেছিলাম ()
  • এবং তারপরে একটি সরল প্রতিস্থাপন করুন যা খালি বন্ধনীগুলি ()ইনপুট মানের সাথে প্রতিস্থাপন করে । সুতরাং, এমপিএন এর ক্ষেত্রে যেমন ~8একটি ইনপুট মানের মতো 55, প্রথম প্রতিস্থাপন উত্পন্ন হবে (55-ge()-and55-le(8)), তারপরে দ্বিতীয় প্রতিস্থাপনটি এটির জন্য আসে (55-ge55-and55-le(8)), মূলত পরিসরের সেই অংশটি বাতিল করে দেয়।
  • এর পরে আমাকে এমপিএন-তে পৃথক নম্বরগুলি মোকাবেলা করতে হয়েছিল, তবে আমি আগে থেকে যেটি sertedোকানো হয়েছিল তার সাথে গণ্ডগোল না করার যত্ন নিতে হয়েছিল। এটি সত্যিকার অর্থে কমা দ্বারা ,পৃথকীকৃত তালিকার সংখ্যা এবং এর আগে বা পরে স্বতন্ত্র সংখ্যা skip, তাই আমি দুর্ভাগ্যবশত দীর্ঘ দীর্ঘ চেহারা ব্যবহার করেছি।
  • skipমূলত একই হিসাবে -and -notআমি একটি সরাসরি প্রতিস্থাপন skipকরতে -and!( !শর্টহ্যান্ড হিসাবে ব্যবহার করে -not)।
  • পরবর্তী কৌতূহলোদ্দীপক জিনিসটি হ'ল বাকী কমাগুলির জন্য নিম্নমানের অর্ডার। আমি মূলত কেবল তাদের সাথে প্রতিস্থাপন করেছি -orতবে এটি পরবর্তী প্রকাশগুলির জন্য অ্যাকাউন্ট করে না সুতরাং 16,17 skip 16কোড তৈরির মতো হয়েছিল ($n-eq16)-or($n-eq17) -and! ($n-eq16)। এটির প্রথম বন্ধনী প্রয়োজন, তবে এটি সরাসরি প্রতিস্থাপনের সাথে অকার্যকর বলে মনে হয়েছিল। যেহেতু অন্যান্য সমস্ত জিনিস কমা ব্যতীত প্রতিস্থাপন করা হয়েছিল, এবং সেগুলির সর্বাধিক নজির রয়েছে, আমি কেবলমাত্র সম্পূর্ণ উত্পন্ন স্ট্রিংটি বাকী কমাগুলিতে বিভক্ত করেছি, তারপরে প্রতিটি উপাদানকে বন্ধনীতে আবৃত করে আবার এতে যোগ দিয়েছি -or

শেষ পর্যন্ত উত্পন্ন কোডটি কেবল কার্যকর করতে Invoke-Expression( iex) এ পাইপ করা হয় এবং তারপরে আমরা বুলিয়ান ফলাফল পাই ( আপনি এখানে ফলাফলের পরিবর্তে উত্পন্ন কোডটি দেখতে পারেন )।

এটি অনেক দীর্ঘ সময় নিয়েছে এবং আমি নিশ্চিত যে আরও কয়েকটি বাইট বের করার জন্য আরও কিছু জায়গা আছে তবে আমি আর এটি দেখতে পারি না :-p


2

পার্ল, 99 130 বাইট

sub f{($_,$n)=@_;s/(-?\d+)?~(-?\d+)?|(-?\d+)/!(defined$3?$n!=$3:length$1&&$1>$n||length$2&&$n>$2)+0/ge;s/skip/&&!/g;s/,/||/g;eval}

আইডিয়নে চেষ্টা করে দেখুন।

Ungolfed:

sub f {
    my ($e, $n) = @_;

    $e =~ s/(-?\d+)?~(-?\d+)?|(-?\d+)/ (defined($3) ? $n == $3 : (!length($1) || $n >= $1) && (!length($2) || $n <= $2)) + 0 /ge;
    $e =~ s/skip/ && ! /g;
    $e =~ s/,/ || /g;

    return eval($e);
}

1
ইনপুট -2 এর জন্য ~ -2 এর জন্য ব্যর্থ। এছাড়াও serোকানোর সময় -? তিনটি \ d * এর আগে
কেজেটিল এস

@KjetilS। Negativeণাত্মক সংখ্যা এবং শূন্য জন্য স্থির।
ডেনিস ইবায়েভ

চমৎকার কোড (সম্পূর্ণভাবে বিকশিত ব্যাকরণ পার্সিংয়ের প্রয়োজন হয় না, রেজিক্সগুলি আরও সহজ)
এস

1

জাভাস্ক্রিপ্ট (ES6), 221 292 287 309 274 277 278 বাইট

(-5 বাইটস ওকেক্সকে ধন্যবাদ)

(j,v,m=1/0,Z=/(skip)([^,]+)/g)=>eval(j[M='replace'](/(-?\d*)~(-?\d*)/g,(e,a,b)=>(a[M]('-','#')||-m)+'<='+(T=v[M]('-','#'))+'&&'+T+'<='+(b[M]('-','#')||m))[M](Z,i=o=>o.match(Z)?i(o[M](Z,'&&!($2)')):o)[M](/,/g,'||')[M](/(^|[^=&#\d])(\d+)([^<\d]|$)/g,'$1$2=='+v+'$3')[M](/#/g,'-'))

কি দারুন. সমস্ত প্রান্তের মামলার কারণে এটি সহজ ছিল না, তবে আমি মনে করি এটি করেছি did আমি কেবল আশা করি এমন কোনও বিশেষ ক্ষেত্রে নেই যা ব্যবহৃত নিয়মিত অভিব্যক্তিগুলি ভেঙে ফেলতে পারে। আমি যখনই পারবো এগুলি আরও গল্ফ করব।

পরীক্ষার স্নিপেট

D=(j,v,m=1/0,Z=/(skip)([^,]+)/g)=>eval(j[M='replace'](/(-?\d*)~(-?\d*)/g,(e,a,b)=>(a[M]('-','#')||-m)+'<='+(T=v[M]('-','#'))+'&&'+T+'<='+(b[M]('-','#')||m))[M](Z,i=o=>o.match(Z)?i(o[M](Z,'&&!($2)')):o)[M](/,/g,'||')[M](/(^|[^=&#\d])(\d+)([^<\d]|$)/g,'$1$2=='+v+'$3')[M](/#/g,'-'))
MPN Expression:<input type="text" value="1~9 skip (2~8 skip (3~7 skip (4~6 skip 5)))" id="MPN"></input>
<br>
Integer:<input type="number" id="INT" value=6></input>
<input type="button" value="Submit" onclick="T=r=>document.getElementById(r).value;console.log(D(T('MPN'),T('INT')))"></input>


@ আরিয়াএক্স এখন এটি কাজ করা উচিত।
আর কপ

@ আর.ক্যাপ আপনি এর 1/0জন্য ব্যবহার করতে পারেন Infinity
Okx

@ আর কেপ্প আমি 6যে অভিব্যক্তিটি 6 skip 6,~বিশ্বাস করি তা হওয়া উচিত বলে মূল্য দিয়ে চেষ্টা করেছি trueতবে তা ফিরে আসে false
ব্রিটিশবাদী

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

@ ব্রায়েন্টিস্ট অন্য কথায়, কোনও কিছুর সাথে 6 skip 6,~মেলে না কারণ এটি সেট {6}এবং সেটের মধ্যে পার্থক্য উপস্থাপন করে {6,-Infinity...Infinity}
আর কপ

0

রাদা + বিসি, 183 বাইট

f x{{["x=",x,"\n"];replace" ","",",","||","skip\\(","&&!","skip([0-9~]+)","&&!($1)","(?<!~|\\d)(\\d+)(?!~|\\d)","x==$1","(\\d*)~(\\d*)","x>=($1)&&x<=($2)","\\(\\)",x;["\n"]}|exec"bc"}

এটি পাওয়ারশেলের উত্তরের মতো (বা আমার মনে হয়, আমি পাওয়ারশেল বুঝতে পারি না)। এটি একটি আর্গুমেন্ট হিসাবে নম্বর এবং ভালো ইনপুট প্রবাহে একটি মান, যেমন কোড লাগে: main { push("1~9") | f(5) }

আমি মনে করি এটি কাজ করে, কমপক্ষে এটি সমস্ত পরীক্ষার কেস সমাধান করে। এটি যাচাই করতে নীচের স্ক্রিপ্টটি ব্যবহার করা যেতে পারে।

main {
    readLines("/tmp/tests.txt") | split(sep=";") | for code, num, ans do
        push(code, " -> ")
        print(code) | replace" ","",",","||","skip\\(","&&!","skip([0-9~]+)","&&!($1)","(?<!~|\\d)(\\d+)(?!~|\\d)","x==$1","(\\d*)~(\\d*)","x>=($1)&&x<=($2)","\\(\\)",num
        a := push(code) | f(num) | head()
        result := push("OK") if [ (a = "0" and ans = "False") or (a = "1" and ans = "True") ] else push("FAIL")
        print code, " ; ", num, " -> ", a, " ", ans, " (", result, ")\n"
    done
}

এবং পরীক্ষা:

10~20;14;True
10~20;20;True
10~20 skip 14~18;17;False
~ skip 6;8;True
16,17 skip 16;16;True
(16,17) skip 16;16;False
~10,5~;8;True
~10,5~;4;True
6 skip 6,~;6;True
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.