অপারেটর নজির: আমি কতটা ভুল হতে পারি?


65

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

9 * 8 + 1 - 4

অপারেটরের অগ্রাধিকারের উপর নির্ভর করে এই অভিব্যক্তিটি ছয়টি বিভিন্ন উপায়ে ব্যাখ্যা করা যায়:

(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)

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

এই ক্ষেত্রে, ত্রুটির বৃহত্তম মার্জিন 45-77 হবে, যা 32 এর পার্থক্য This এর অর্থ হ'ল আমার অনুমান কেবলমাত্র সর্বোচ্চ 32 দ্বারা বন্ধ হয়ে যাবে।

চ্যালেঞ্জ

সংখ্যা এবং এর মধ্যে রয়েছে একটি অভিব্যক্তি দেওয়া +, -, *, /(পূর্ণসংখ্যা বিভাগ) এবং %, আউটপুট প্রকাশের জন্য বৃহত্তম ও ক্ষুদ্রতম সম্ভব মান পরম পার্থক্য, অপারেটরদের প্রাধান্য উপর ভিত্তি করে।

বিশেষ উল্লেখ

  • ইনপুট এক্সপ্রেশনটিতে প্রথম বন্ধনী থাকবে না এবং প্রতিটি অপারেটর বাম-সাহসী হয়।
  • ইনপুট এক্সপ্রেশনটিতে কেবল নন-নেগেটিভ পূর্ণসংখ্যা থাকবে। তবে subexpressions নেতিবাচক (উদাঃ 1 - 4) মূল্যায়ন করতে পারে ।
  • আপনি যে কোনও যুক্তিসঙ্গত বিন্যাসে অভিব্যক্তিটি নিতে পারেন। উদাহরণ স্বরূপ:
    • "9 * 8 + 1 - 4"
    • "9*8+1-4"
    • [9, "*", 8, "+", 1, "-", 4]
    • [9, 8, 1, 4], ["*", "+", "-"]
  • ইনপুটটিতে কমপক্ষে 1 জন এবং কমপক্ষে 10 জন অপারেটর থাকবে।
  • যে কোনও এক্সপ্রেশন যা 0 দ্বারা একটি বিভাজন বা মডুলো ধারণ করে তা উপেক্ষা করা উচিত।
  • আপনি ধরে নিতে পারেন যে মডুলোগুলিকে নেতিবাচক অপারেশন দেওয়া হবে না।

পরীক্ষার মামলা

9 * 8 + 1 - 4             32
1 + 3 * 4                  3
1 + 1                      0
8 - 6 + 1 * 0              8
60 / 8 % 8 * 6 % 4 * 5    63

1
@ আন্ডারস ক্যাসরগ দেখে মনে হচ্ছে আপনি %নিজের দ্বিতীয় উদাহরণে দুটি পৃথক নজির হিসাবে আচরণ করছেন ।
ফল ফল

1
'ছয়' তিনটি একই, অন্য দুটি হিসাবে একই। এটি ছয় নয়, তিনটি প্রকৃত কেস ছেড়ে দেয়।
ব্যবহারকারী 207421

3
%অপারেটর নেতিবাচক সংখ্যায় কিভাবে কাজ করে? সি বা পাইথনের মতো পথ বা অন্য কিছু?
tsh

8
শুধু বলছি, আপনার বর্ণনায় আপনার "এবং আমি অলস" অংশ যুক্ত করতে হবে না। আপনি কেবল বিকাশকারী বলাই যথেষ্ট। :)
গ্রিফন

1
@tsh যেকোন আচরণ যা ইচ্ছা কর. আপনি আমার নাক থেকে অসুরদের উড়ে নিতে পারেন ।
ফল

উত্তর:


27

পাইথন 2 , 171 156 বাইট

lambda a:max(e(a))-min(e(a))
u=')%s('
def e(a,t=u):
 try:b=[eval(a)]
 except:b=[]
 return sum([e('(%s)'%a.replace(o,t%o),u%t)for o in"+-*/%"if' '+o in a],b)

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

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

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

+)+(
*))*((
-)))-(((

আমরা পেতে

9 * 8 + 1 - 4(((9 ))*(( 8 )+( 1 )))-((( 4)))= 77


বর্গাকার বন্ধনীগুলির একটি স্তর অপসারণ orকরতে sumআপনি বাইরের দিকে সরিয়ে 2 বাইট সংরক্ষণ করতে পারেন: sum([...],[])or[eval(a)]পরিবর্তেsum([...]or[[eval(a)]],[])
স্ট্রিগোয়েড

@ স্ট্রাইকোয়েডস আমি ভাবছিলাম যে এটি সমতুল্য নয়, কারণ sumযুক্তিটি খালি না হয়ে খালি থাকতে পারে - তবে এটি আসলেই ঠিক আছে কারণ evalসেই ক্ষেত্রে অবশ্যই ব্যর্থ হতে হবে। ধন্যবাদ।
অ্যান্ডারস ক্যাসরগ

8

জেলি , 126 বাইট

"অপারেটর নজরে? প্যারেন্টেসিস? পাহ, কার দরকার?" - অপারেটর অগ্রাধিকার চ্যালেঞ্জ জন্য জেলি ব্যবহার করার চ্যালেঞ্জ।

⁾[]i$€Ḥæ%3+\¬œp¹Ḋ€
ǵḟØDO%9µÐṀṪɓœṣ⁹,ṚÑj@¥/
ǵVṾµ1ĿFḟØDḟ”-Lµ?ÐL
5Ḷx@€“]“[”ż⁸j/€,@y³Fɓ³i@€Ṁ’x@“[“]”jÇ
“+_×:%”Œ!Ç€µṾL_L’ỊµÐfV€ṢIS

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

ইনপুটটিকে স্ট্রিং হিসাবে নেওয়া হয়, যেমন "1 + 2_3 × 4: 5% 6"। দ্রষ্টব্য গুণক "*" এর পরিবর্তে "×" ব্যবহার করে, বিভাগ "/" এর পরিবর্তে ":" ব্যবহার করে এবং বিয়োগ "-" এর পরিবর্তে "_" ব্যবহার করে।

এটি কীভাবে কাজ করে প্রোগ্রামটি তিন ভাগে বিভক্ত: বিভিন্ন অপারেটরের অগ্রাধিকারের সমস্ত এক্সপ্রেশন তৈরি করা, তাদের মূল্যায়ন করা এবং সর্বোচ্চ এবং সর্বনিম্নের মধ্যে পার্থক্য ফিরিয়ে দেওয়া।

সমস্ত এক্সপ্রেশন কোড সহ উত্পন্ন হয়:

5Ḷx@€“]“[”ż⁸j/€,@y³Fɓ³i@€Ṁ’x@“[“]”jÇ (4) helper link: returns all outputs given a permutation. Input e.g. "_+:×%"
5Ḷx@€“]“[”           - repeat outer brackets to get ["",""],["]","["],["]]","[["],["]]]","[[["],["]]]]","[[[["]
          ż⁸j/€      - insert the operations in to get "_","]+[","]]:[[","]]]×[[[","]]]]%[[[["
               ,@    - turn this into a mapping equivalent to "_"↦"_","+"↦"]+[",":"↦"]]:[[","×"↦"]]]×[[[","%"↦"]]]]%[[[["
                 y³F - use this mapping to get the right number of outward brackets on each operation. e.g. "1]+[3]]]×[[[4"
ɓ³i@€Ṁ’x@“[“]”j      - add the right number of brackets to the end to get e.g."[[[1]+[3]]]×[[[4]]]"
               Ç     - this calls the link which evaluates the expression
“+_×:%”Œ!Ç€                          (5a) main link. Input e.g. "1+3×4"
“+_×:%”                                 - the string "+_×:%"
       Œ!                               - all permutations
         ǀ                             - apply link (4) to each permutation

লিঙ্কগুলি এর সাথে মূল্যায়ন করা হয় (আমি সম্ভবত অন্য কোনও কাঠামোর সাথে উন্নতি করতে পারি):

⁾[]i$€Ḥæ%3+\¬œp¹Ḋ€      (1) Helper link: Outputs a list of expressions within brackets, e.g. "[[[1]+[3]]]×[[[4]]]"↦"[[1]+[3]]","[[4]]"
⁾[]i$€Ḥæ%3                 - map "[" to 2, "]" to -2, and any other character to 0.
          +\¬              - cumulative sum negated: 1s at characters not in brackets (includes opening brackets), 0s otherwise (includes closing brackets)
             œp¹           - partition the input, not including borders, based on the sum to get "[[[1]+[3]]","[[[4]]"
                Ḋ€         - remove opening brackets
ǵḟØDO%9µÐṀṪɓœṣ⁹,ṚÑj@¥/ (2) Return the input to this link with one of the expressions from (1) evaluated
ǵVṾµ1ĿFḟØDḟ”-Lµ?ÐL     (3) link called from part 1: Evaluates expressions
 µ  µ          µ?          - if:
     1ĿFḟØDḟ”-L            - the input contains no operators within brackets:         
  VṾ                         - evaluate this one expression with normal Jelly calculation and return to string
                           - otherwise:
Ç                            - evaluate one subexpression using link (2)
                  ÐL       - repeat this until a single output is determined

সর্বাধিক এবং সর্বনিম্নের মধ্যে পার্থক্যটি লিঙ্কের কোডের সাথে গণনা করা হয় (5):

µṾL_L’ỊµÐfV€ṢIS (5b) determine difference between minimum and maximum
µ      µÐf        - filter out outputs involving division or modulo by 0. Determined with:
 ṾL_L’Ị           - actual numbers have their unevaled form Ṿ no more than one byte longer than the non-unevaled form.
          V€      - evaluate each of these valid numbers to get integers from strings
            Ṣ     - sort
             IS   - return the sum of all difference between consecutive elements.

4
সম্ভবত সবচেয়ে দীর্ঘ জেলি উত্তর (এম্বেডড ডেটা ছাড়াই) আমি কখনও দেখেছি। সাবাশ!
কিউ গান

@ কেয়ুগান আপনি যদি আরও জেলি উত্তর চান তবে এই উত্তরটি দেখুন । আমি সংক্ষেপে আর কোনও দীর্ঘ জেলি উত্তর সম্পর্কে ভাবতে পারি না।
fireflame241

6

পাইথন 2 , 235 234 233 226 বাইট

-1 বাইট (এবং একটি স্থির) অ্যান্ডারস কাসারগকে ধন্যবাদ !

-7 বাইট ধাপ হেন ধন্যবাদ !

from itertools import*
def f(e,a=()):
 for o in permutations("+-*/%"):
	l=e[:]
	for c in o:
	 for i in range(len(l),0,-1):
		if l[i-1]==c:l[i-2:i+1]=["("+l[i-2]+l[i-1]+l[i]+")"]
	try:a+=eval(*l),
	except:0
 print max(a)-min(a)

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


1
ফাংশন জমাগুলি অবশ্যই পুনরায় ব্যবহারযোগ্য হবে । আপনি aতালিকার পরিবর্তে টুপল হতে দিয়ে সমস্যাটি সমাধান করতে পারেন এবং এমনটি করে ( a=(), a+=eval(*l),) করে 1 বাইট সংরক্ষণও করতে পারেন ।
অ্যান্ডারস ক্যাসরগ

হু, তিল ভকভগক!
notjagan

1
যেহেতু আপনি পাইথন 2 এ রয়েছেন, আপনি স্থান নির্ধারণের জন্য ফাঁকা স্থান এবং ট্যাবগুলি পরিবর্তন করে কিছু বাইট সংরক্ষণ করতে পারেন (এই ক্ষেত্রে, 2 স্পেস -> ট্যাব, তিনটি স্থান -> ট্যাব + স্থান, চারটি স্থান -> দুটি ট্যাব) এটি অনলাইনে চেষ্টা করুন!
স্টিফেন

4

হাস্কেল 582 বাইট

এটি প্রায় ততটা যায় নি যেমন আমি আশা করি ...

import Data.List
f x=case x of '+'->(+);'-'->(-);'*'->(*);'/'->div;_->rem
e _ s[]=s
e 1 s(')':x:a)|0<-(read$e 0""a),(x=='%'||x=='/')=""|""<-(e 0""s)=""|""<-(e 0""a)=""|0<3=show$(f x)(read$e 0""s)$read$e 0""a
e 1 s")"=e 0""s
e n s(')':a)=e(n-1)(s++")")a
e 0 s('(':a)=e 1 s a
e n s('(':a)=e(n+1)(s++"(")a
e n s(x:a)=e n(s++[x])a
n?s=take n$cycle s
a!b=e 0""(9?"("++(concat$zipWith(++)a(b++[[]]))++9?")")
c#b|l<-[read x|x<-map(c!)(a b),x/=""]=maximum l-minimum l
a c=transpose$map(\x->map((\(Just q)->q).lookup x)$map(\a->zipWith(\x y->(y,x?")"++y:x?"("))[1..5]a)$permutations"+-*%/")c

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

একটি দীর্ঘ প্রোগ্রাম গল্ফ করার চেষ্টা আমাকে খারাপ কোড লিখতে বাধ্য করে :(

আমি হাসকেলে অ্যান্ডারসের অ্যালগরিদম ব্যবহার করার চেষ্টা করেছি, তবে এটি আমার নিয়ন্ত্রণের বাইরে চলে গেছে

ই ফাংশন ইওল এর একটি নির্দিষ্ট কেসের মতো। (#) পূর্ণসংখ্যা এবং অপারেটরগুলির একটি স্ট্রিং প্রতিনিধিত্ব করে স্ট্রিংগুলির একটি তালিকা নেয় এবং সর্বাধিক এবং সর্বনিম্ন সম্ভাব্য মানগুলির মধ্যে পার্থক্য প্রদান করে। যেমন

(#) ["9","8","1","4"] "*+-" => 32

1
আপনি যদি নতুন নামকরণ #করেন ##, আপনি এর মতো নতুন নামকরণ eকরতে (#)পারেন:(n#s)(x:a)=...
ফল

আপনি যদি নিম্নলিখিত তিনটি সাধারণভাবে ব্যবহৃত ফাংশনটি উপন্যাস করেন তবে আপনি আরও 6 বাইট সংরক্ষণ করতে পারবেন। r=read;j=zipWith;o=mapএবং তারপরে সেই ফাংশনগুলি অক্ষরের উপকরণ দিয়ে প্রতিস্থাপন করুন।
ম্যাপেল_শ্যাফ্ট

এছাড়াও আমি
582

3

পাইথ, 45 বাইট

KS.nm.x.vj\ u.nm+*H/kHckHGd]s.iFQY.p_{eQ-eKhK

আমি নিশ্চিত যে আরও অনেক অপ্টিমাইজেশন করা যেতে পারে তবে আমি এখনও পর্যন্ত এটি পছন্দ করি।

ভালো ইনপুট লাগে: [9, 8, 1, 4], ["*", "+", "-"]

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


2
আপনি একটি ব্যাখ্যা যোগ করতে পারেন?
জিম

2

গণিত, 186 164 159 বাইট

eMax@#-Min@#&[Fold[#//.{m___,x_,#2[[0]],y_,n___}:>{m,x~Last@#2~y,n}&,e,#]&/@Permutations@{"+"@Plus,"-"[#-#2&],"*"@Times,"/"@Quotient,"%"@Mod}/. 0/0|1/0->{}]

\[Function] 3 বাইট লাগে।

কিছু বিকল্প (একইভাবে বাইকাউন্টে রাখে)

#2-#&@MinMax[...] প্রতিস্থাপন করতে Max@#-Min@#&[...]

Head@#2 প্রতিস্থাপন করতে #2[[0]]

এ অনলাইনে এটিকে পরখ করে http://sandbox.open.wolframcloud.com : প্রবেশ ( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]সঙ্গে ....পরীক্ষা ক্ষেত্রে জন্য উপরের কোড দ্বারা প্রতিস্থাপিত 60 / 8 % 8 * 6 % 4 * 5Shift + enterমূল্যায়ন করতে টিপুন ।


2

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

দ্রষ্টব্য : মেঝে ফাংশনটি ব্যবহার করে পূর্ণসংখ্যার বিভাগটি রাউন্ড করে, যার অর্থ negativeণাত্মক সংখ্যাগুলি শূন্য থেকে দূরে।

এই সমাধানটি এই উত্তরের ভিত্তিতে তৈরি ।

b=>(Math.max(...(f=(a,h="(",i=")",r=[...a[d="replace"](/[^-+*/%]|(.)(?=.*\1)/g,"")])=>(r[0]?(r.map((c,j)=>s=s.concat(f(h+a[d](RegExp("\\"+(n=r.concat()).splice(j,1),"g"),i+c+h)+i,h+"(",i+")",n)),s=[]),s):(a=eval(`(${a})`[d](/\(/g,"Math.floor(")))==a&&1/a?a:r))(b))-Math.min(...f(b)))

কোড স্নিপেট উদাহরণ:

g=

b=>(Math.max(...(f=(a,h="(",i=")",r=[...a[d="replace"](/[^-+*/%]|(.)(?=.*\1)/g,"")])=>(r[0]?(r.map((c,j)=>s=s.concat(f(h+a[d](RegExp("\\"+(n=r.concat()).splice(j,1),"g"),i+c+h)+i,h+"(",i+")",n)),s=[]),s):(a=eval(`(${a})`[d](/\(/g,"Math.floor(")))==a&&1/a?a:r))(b))-Math.min(...f(b)))

for(k=0;k<5;k++)
  v=["9*8+1-4","1+3*4","1+1","8-6+1*0","60/8%8*6%4*5"][k],
  console.log(`g(${v}) = ${g(v)}`)


একে / বি কেস / এ / বি কে 0 দ্বারা প্রতিস্থাপন করে এটিকে সামঞ্জস্য করা কতটা কঠিন?
ট্রিল্কলি

@trlkly a/b|0বিভাজন / মডুলো 0 ত্রুটি পরীক্ষা বন্ধ করে, কিন্তু Math.floor(a/b)কাজ করেছে
হারমান এল

2

হাস্কেল , 254 বাইট

import Data.List.Split
import Data.List
f s=(-)<$>maximum<*>minimum$permutations(zip"+-*/%"[p(+),p(-),p(*),c$div,c$mod])>>=(s!)
p=((pure.).)
c o a b=[o a b|b/=0]
s![]=[read s]
s!((x,o):y)=case splitOn[x]s>>=(!y)of[]->[];l->l?o
[a]?_=[a]
(a:b)?o=b?o>>=o a

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

ইনপুট একটি সম্পূর্ণ স্ট্রিং, যেমন 4 + 5 * ২। এটি ক্রিয়াকলাপের সমস্ত ক্রিয়াকলাপ উত্পন্ন করে এবং প্রতিটি অনুক্রমের জন্য স্ট্রিংটি পুনরাবৃত্তভাবে বিভাজন করে। এটি তালিকা মোনাড দিয়ে বিভাগ দ্বারা 0 দ্বারা ফিল্টার করে।


(%)মডুলাস অপারেটর। এটি বাম আর্গুমেন্ট এবং ডান আর্গুমেন্টের মধ্যে বিভাজন অপারেশনের অবশিষ্ট।
ম্যাপেল_শফট

1

পাইথন 2 , 262 256 254 বাইট

from itertools import*
def r(s,o):
 try:
  while o in s:i=s.index(o)-1;s[i:i+3]=[`eval(''.join(s[i:i+3]))`]
  return s
 except:0
def f(s):
 u=[int(v[0])for v in [reduce(r,O,s.split(' '))for O in permutations('*/%+-')]if v!=None];return abs(max(u)-min(u))

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


ট্যাব ব্যবহার করে কিছু বাইট সংরক্ষণ করুন: এটি অনলাইনে চেষ্টা করুন!
স্টিফেন

1
পরিবর্তন করে এক বাইট সংরক্ষণ in [করার in[(স্থান প্রয়োজন হয় না)
Zachary

1

পিএইচপি , 316 বাইট

<?for(;$t++<54322;)count_chars($t,3)!=12345?:$p[]=$t;foreach($p as$x){for(list($z,$q)=$_GET,$b=1,$i=0;$y=strtr($x,12345,"/%*+-")[$i++];)while(-1<$k=array_flip($q)[$y]){$n=$k+1;if($b&=$z[$n]||ord($y)%10<6)eval("\$z[$k]=$z[$k]$y$z[$n]^0;");($s=array_splice)($z,$n,1);$s($q,$k,1);}$b?$r[]=$z[0]:0;}echo max($r)-min($r);

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

Expanded
for(;$t++<54322;)
  count_chars($t,3)!=12345?:$p[]=$t;
foreach($p as$x){
  for(list($z,$q)=$_GET,$b=1,$i=0;$y=strtr($x,12345,"/%*+-")[$i++];)
    while(-1<$k=array_flip($q)[$y]){
      $n=$k+1;
      if($b&=$z[$n]||ord($y)%10<6)
        eval("\$z[$k]=$z[$k]$y$z[$n]^0;");
      ($s=array_splice)($z,$n,1);
      $s($q,$k,1);
    }
  $b?$r[]=$z[0]:0;
}
echo max($r)-min($r);

Lase ক্ষেত্রে 63. কারণে একই অপারেটর এক অভিব্যক্তি বিভিন্ন স্থানে একটি ভিন্ন প্রাধান্য দান করার জন্য আপনার ভুল
H.PWiz

0

পাইথন 3 , 284 বাইট

সম্পাদনা: শেষ উদাহরণটি মূল্যায়নের সাথে কিছু ভুল হয়েছে বলে মনে হচ্ছে। আমি আগামীকাল এটি দেখতে হবে।

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

from itertools import*
def f(n,o):
 z=[]
 for p in permutations("+-*/%"):
  try:
   p,x,a=[*p],n[:],o[:]
   while(p):
    for i,d in enumerate(a):
     if d==p[0]:x[i+1]=str(eval(x[i]+d+x[i+1]));x.pop(i);a.pop(i)
    p.pop(0)
   z+=x
  except:0
 z=[*map(float,z)];return max(z)-min(z)

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


1
while(p)while pএক বাইট সংরক্ষিত হয়ে যেতে পারে ।
জাকারি

0

ক্লোজার (+ সংযুক্তি), 342 377 + 41 = 418 বাইট

ত্রুটির কারণে +35 বাইট।

(fn[x y](let[l filter s first z #(l(fn[y]y)%)r(sort(z(for[e(q/permutations[+ - * quot mod])](try(loop[t e m y a x](if(=[]t)(s a)(let[j(s t)i(reverse(keep-indexed #(if(= j %2)%)m))](recur(rest t)(l #(not= j %)m)(loop[d 0 h a](if(=(count i)d)h(let[c(nth i d)f(inc c)](recur(inc d)(vec(z(assoc h c(j(nth h c)(nth h f))f nil)))))))))))(catch Exception _ nil)))))](-(last r)(s r))))

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

এই ফাংশনটি কাজ করার জন্য useআপনার clojure.math.combinatoricsলাইব্রেরিতে (41 বাইট) থাকতে হবে:

(use '[clojure.math.combinatorics :as q])

তারতম্য:

এই ফাংশনটি একটি বেনামি ফাংশন, যার অর্থ এটি ব্যবহারের জন্য আপনাকে এটি করতে হবে:

((fn[x y]...) numbers operators)

এছাড়াও, আমি শব্দ ব্যবহার করছি quotপরিবর্তে /(যেহেতু Clojure ডিফল্টরূপে ভগ্নাংশ বিভাজন করে), এবং modপরিবর্তে %

অসম্পূর্ণ প্রোগ্রাম:

(defn precedence [numbers operators]
  (let [results
        (sort
          (for [permute (c/permutations [+ - * / mod])]
            (loop [p-temp permute
                  o-temp operators
                  n-temp numbers]
              (if (empty? o-temp) (first n-temp)
                (let [first-p (first p-temp)
                      indices (reverse (keep-indexed #(when (= first-p %2) %) o-temp))]
                  (recur
                    (rest p-temp)
                    (filter #(not= first-p %) o-temp)
                    (loop [ind 0
                          n-through n-temp]
                      (if (= ind (count indices)) n-through
                        (let [current-ind (nth indices ind)]
                          (recur
                            (inc ind)
                            (vec
                              (filter #(not (nil? %))
                                (assoc n-through
                                  current-ind (first-p (nth n-through current-ind) (nth n-through (inc current-ind)))
                                  (inc current-ind) nil)))))))))))))]
    (- (last results) (first results))))

আমি মনে করি আপনি কেবল "ক্লোজার + সংহতিবিদ" বলতে পারেন এবং useবিবৃতিটি স্কোর করতে হবে না ।
ফলস এ ফলসিং

@ চ্যালেঞ্জার 5 আমি বিশ্বাস করি আপনি এটি বর্ণনায় আরও ভাল লিখতে চাইবেন, কারণ ডিফল্টরূপে The characters used to import the library will likely be counted কোডগল্ফ.মেটা.স্ট্যাকেক্সেঞ্জার
সেকশন

@ কেয়ুগান আপনি ঠিক বলেছেন - আমি মেটা sensকমত্যকে ভুল বুঝেছি। আমি মনে করি কোডগুলিতে অন্তর্ভুক্তrequire করা দরকার এবং এর দৈর্ঘ্য বাইট গণনায় যুক্ত করা উচিত।
ফল

@ চ্যালেঞ্জার 5 সুতরাং আমার বাইটোকন্টে 41 বাইট যুক্ত করা দরকার, তাই না? ঠিক আছে.
কিউয়ার্প-ডের্প

@ কিওয়ার্প-ডের্প হ্যাঁ, তবে আমদানিটি আপনার কোডের একটি অংশ এবং আপনি এটি গল্ফ করতে পারেন।
ফল

0

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

সংখ্যা এবং অপারেটরের অ্যারে হিসাবে ইনপুট

k=>(m=n=-k,r=(o,k,j=0)=>{for(o||(m=m>k?m:k,n=n<k?n:k);q=o[j++];(q>'%'&q<'/'||z)&&r(o.slice(0,j-1)+o.slice(j),h))for(h=[...k],z=1;i=h.indexOf(q)+1;h.splice(i-2,3,eval(a=h[i-2]+q+h[i])|0))z*=h[i]})('+-*/%',k)|m-n

কম গল্ফড

k=>(
  m = n = NaN,
  r =(o, k, j=0) => {
    // try all operators in o
    for(;q = o[j]; j++)
    {  
      // q : current operator, 
      // look for q inside the expression to evaluate
      for(h = [...k], z = 1; i = h.indexOf(q) + 1;)
      {
        a = h[i - 2]
        b = h[i]
        z *= b // trace if any second operand is zero
        // subst subexpression with its value
        h.splice(i - 2, 3, eval(a + q + b) | 0)
      }
      // now all subexp involving current operator are evaluated
      // the result is ok if current operator is not % or /
      //  OR if no second operand was zero
      (q > '%' & q < '/' || z) && 
        // try again recursively
        // using the remaining operators and the remaining expression
        r(o.slice(0, j) + o.slice(j+1), h) 
    }
    // if no more operators to try, check max and min
    // k is an array with 1 element, can be used like a single number
    o || (
      m = m > k ? m : k, 
      n = n < k ? n : k
    )
  },
  r('+-*/%', k),
  m-n
)

পরীক্ষা

var F=
k=>(m=n=-k,r=(o,k,j=0)=>{for(o||(m=m>k?m:k,n=n<k?n:k);q=o[j++];(q>'%'&q<'/'||z)&&r(o.slice(0,j-1)+o.slice(j),h))for(h=[...k],z=1;i=h.indexOf(q)+1;h.splice(i-2,3,eval(a=h[i-2]+q+h[i])|0))z*=h[i]})('+-*/%',k)|m-n

function update() {
  var input = I.value.match(/\d+|\S/g)
  var result = F(input)
  O.textContent = I.value + ' -> ' + result + ' (max:'+m+' min:'+n+')'
}

update()
<input id=I value="60 / 8 % 8 * 6 % 4 * 5" oninput='update()'>
<pre id=O></pre>

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