ตัวดำเนินการมาก่อน: ฉันจะผิดได้อย่างไร?


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 ซึ่งหมายความว่าการเดาของฉันจะถูกปิดโดยสูงสุด 32

ความท้าทาย

ได้รับการแสดงออกซึ่งประกอบด้วยตัวเลขและ+, -, *, /(แบ่งจำนวนเต็ม) และ%เอาท์พุทที่แตกต่างกันแน่นอนของค่าที่เป็นไปได้ที่ใหญ่ที่สุดและมีขนาดเล็กที่สุดในการแสดงออกที่อยู่บนพื้นฐานของความสำคัญของผู้ประกอบการ

ข้อมูลจำเพาะ

  • การแสดงออกของการป้อนข้อมูลจะไม่ประกอบด้วยวงเล็บและผู้ประกอบการทุกคนมีความสัมพันธ์ด้านซ้าย
  • การแสดงออกของการป้อนข้อมูลจะมีจำนวนเต็มไม่ใช่เชิงลบเท่านั้น อย่างไรก็ตามนิพจน์ย่อยอาจประเมินผลเป็นลบ (เช่น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
@AndersKaseorg ดูเหมือนว่าคุณกำลังปฏิบัติ%เหมือนมีสองสิ่งที่แตกต่างในตัวอย่างที่สองของคุณ
แยกผลไม้

1
สามในหกนั้นเหมือนกันเช่นเดียวกับอีกสอง ที่เหลือสามกรณีจริงไม่ใช่หก
user207421

3
วิธีการที่%ผู้ประกอบการทำงานบนตัวเลขที่ติดลบ? วิธีเช่น C หรือ Python หรืออย่างอื่น?
tsh

8
เพียงแค่พูดว่าคุณไม่ต้องเพิ่มส่วน "และฉันขี้เกียจ" ลงในคำอธิบายของคุณ แค่บอกว่าคุณเป็นนักพัฒนาก็เพียงพอแล้ว :)
Gryphon

1
@tsh พฤติกรรมใด ๆ ทำสิ่งที่คุณต้องการ. คุณสามารถทำให้ปีศาจบินออกจากจมูกของฉัน
แยกผลไม้

คำตอบ:


27

Python 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)

ลองออนไลน์!

มันทำงานอย่างไร

เราล้อมรอบแต่ละผู้ประกอบการที่มีจำนวนแตกต่างกันของออกไปด้านนอกหันหน้าไปทางคู่ของวงเล็บเพื่อจำลอง precedences แตกต่างกัน (ในรูปแบบที่เป็นไปได้ทั้งหมด) evalและห่อพอคู่หันหน้าเข้าด้านในวงเล็บรอบสตริงทั้งหมดจะได้รับการแสดงออกของเราสามารถ ตัวอย่างเช่นด้วย

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

เราได้รับ

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


คุณสามารถบันทึก 2 ไบต์ได้โดยย้ายorด้านนอกsumเพื่อลบชั้นของวงเล็บเหลี่ยม: sum([...],[])or[eval(a)]แทนที่จะเป็นsum([...]or[[eval(a)]],[])
Strigoides

@ Strigoides ฉันคิดว่ามันไม่เท่ากันเพราะsumอาจจะว่างเปล่าโดยที่ไม่มีการโต้แย้ง - แต่จริง ๆ แล้วมันก็ดีเพราะevalต้องล้มเหลวในกรณีนั้น ขอบคุณ
Anders Kaseorg

8

เยลลี่ , 126 ไบต์

"ตัวดำเนินการก่อนหน้า? วงเล็บ? Pah ใครต้องการสิ่งนั้น" - ความท้าทายในการใช้เจลลี่สำหรับความท้าทายที่เหนือกว่าของผู้ปฏิบัติงาน

⁾[]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
อาจเป็นคำตอบที่ยาวที่สุดของเยลลี่ (โดยไม่มีข้อมูลที่ฝังอยู่) ที่ฉันเคยเห็น ทำได้ดี!
Keyu Gan

@KeyuGan หากคุณต้องการคำตอบของ Jelly อีกต่อไปให้ดูที่คำตอบนี้ ฉันไม่สามารถคิดถึงคำตอบที่ยาวนานของ Jelly ได้หากไม่มีการบีบอัด
fireflame241

6

Python 2 , 235 234 233 226 ไบต์

-1 ไบต์ (และแก้ไข) ขอบคุณAnders Kaseorg !

-7 ไบต์ขอบคุณStep Step !

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เป็น tuple แทนที่จะเป็นรายการและแม้แต่บันทึก 1 ไบต์ด้วยการทำเช่นนั้น ( a=(), a+=eval(*l),)
Anders Kaseorg

อืม TIL ขอบคุณสำหรับทิป!
notjagan

1
เนื่องจากคุณอยู่ใน Python 2 คุณสามารถบันทึกไบต์ได้ด้วยการสลับช่องว่างและแท็บสำหรับการย่อหน้า (ในกรณีนี้คือ 2 ช่อง -> แท็บสามช่อง -> แท็บ + ช่องว่างสี่ช่อง -> สองแท็บ) ลองออนไลน์!
สตีเฟ่น

4

Haskell 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

ลองออนไลน์!

การพยายามเล่นกอล์ฟเป็นเวลานานทำให้ฉันเขียนโค้ดไม่ดี :(

ฉันพยายามใช้อัลกอริทึมของ Anders ใน Haskell แต่ไม่สามารถควบคุมได้

ฟังก์ชั่น e เป็นเหมือนกรณีเฉพาะของการประเมิน (#) รับรายการสตริงที่แทนจำนวนเต็มและสตริงของโอเปอเรเตอร์และส่งคืนความแตกต่างระหว่างค่าสูงสุดและต่ำสุดที่เป็นไปได้ เช่น

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

1
ถ้าคุณเปลี่ยนชื่อ#เพื่อให้##คุณสามารถเปลี่ยนชื่อeไป(#)เช่นดังนั้น:(n#s)(x:a)=...
Esolanging ผลไม้

หากคุณใช้ฟังก์ชันที่ใช้กันโดยทั่วไปสามฟังก์ชันต่อไปนี้คุณสามารถบันทึกอีก 6 ไบต์ r=read;j=zipWith;o=mapจากนั้นแทนที่ฟังก์ชันเหล่านั้นด้วยนามแฝงตัวอักษร
maple_shaft

ฉันกำลังนับ 594 ไบต์ไม่ใช่ 582
maple_shaft

3

Pyth, 45 ไบต์

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

ฉันแน่ใจว่าการเพิ่มประสิทธิภาพมากขึ้นสามารถทำได้ แต่ฉันชอบมันจนถึงตอนนี้

ใช้อินพุตแบบนี้: [9, 8, 1, 4], ["*", "+", "-"].

ลองออนไลน์!


2
คุณสามารถเพิ่มคำอธิบายได้ไหม?
Jim

2

Mathematica, 186 164 159 bytes

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 * 5กดShift + enterเพื่อประเมิน


2

Javascript, 280 ไบต์

หมายเหตุ : การหารจำนวนเต็มปัดเศษโดยใช้ฟังก์ชัน floor ซึ่งหมายความว่าตัวเลขติดลบจะปัดเศษออกจากศูนย์

วิธีการแก้ปัญหานี้ขึ้นอยู่กับคำตอบนี้

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)}`)


มันจะยากแค่ไหนที่จะทำให้มันเข้ากันได้โดยแทนที่ a / b case ด้วย a / b | 0
trlkly

@trlkly a/b|0หยุดการตรวจสอบข้อผิดพลาดหาร / โมดูโล 0 แต่Math.floor(a/b)ทำงาน
Herman L

2

Haskellขนาด 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 * 2 ซึ่งสร้างการเรียงสับเปลี่ยนทั้งหมดของการดำเนินการและสำหรับการเปลี่ยนแปลงแต่ละครั้งจะแยกสตริงซ้ำ มันกรองการหารด้วย 0 ด้วยรายการ monad


(%)เป็นตัวดำเนินการโมดูลัส เป็นส่วนที่เหลือของการดำเนินการหารระหว่างอาร์กิวเมนต์ซ้ายและอาร์กิวเมนต์ขวา
maple_shaft

1

Python 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))

ลองออนไลน์!


บันทึกไบต์ด้วยการใช้แท็บ: ลองออนไลน์!
Stephen

1
บันทึกหนึ่งไบต์ด้วยการเปลี่ยนin [เป็นin[(ไม่จำเป็นต้องใช้ช่องว่าง)
Zacharý

1

PHP , 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

Python 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บันทึกได้หนึ่งไบต์
Zacharý

0

Clojure (+ combinatorics), 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%

โปรแกรม Ungolfed:

(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))))

ผมคิดว่าคุณก็สามารถพูดว่า "ปิด + Combinatorics" และไม่ต้องทำคะแนนuseคำสั่ง
แยกผลไม้

@ Challenger5 ฉันเชื่อว่าคุณควรเขียนลงในคำอธิบายเพราะตามค่าเริ่มต้นThe characters used to import the library will likely be counted codegolf.meta.stackexchange.com/questions/10225/…
Keyu Gan

@KeyuGan คุณถูกต้อง - ฉันเข้าใจผิดว่าฉันทามติ Meta ฉันคิดว่าความrequireต้องการที่จะรวมอยู่ในรหัสและควรเพิ่มความยาวลงในจำนวนไบต์
แยกผลไม้

@ Challenger5 ดังนั้นฉันต้องเพิ่ม 41 ไบต์ใน bytecount ของฉันใช่ไหม? ตกลง.
Qwerp-Derp

@ Qwerp-Derp ใช่ แต่การนำเข้าเป็นส่วนหนึ่งของรหัสของคุณและคุณสามารถตีกอล์ฟได้
ผลไม้แยกแยะ

0

JavaScript (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

น้อย golfed

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.