อาวุธการสอนคณิตศาสตร์


44

ครั้งสุดท้ายที่ฉันพยายามหาอะไรที่ง่าย ๆ ที่ไม่ซ้ำซ้อนมันก็ยากเกินไป .. หวังว่าครั้งนี้มันจะเป็นสิ่งที่ผู้มาใหม่สามารถลองได้เช่นกัน

การป้อนข้อมูล:

อาร์เรย์ / รายการที่มีจำนวนเต็ม / ทศนิยม (หรือสตริงที่แทนอาร์เรย์ที่มีจำนวนเต็ม / ทศนิยม)

เอาท์พุท:

วนรอบตัวเลขและใช้ตัวถูกดำเนินการทางคณิตศาสตร์ห้าตัวต่อไปนี้ตามลำดับนี้:

  • เพิ่มเติม ( +);
  • การลบ ( );
  • การคูณ ( *หรือ×หรือ·);
  • จริง /กองเครื่องคิดเลข ( /หรือ÷);
  • การยกกำลัง ( ^หรือ**)

(หมายเหตุ: สัญลักษณ์ระหว่างวงเล็บจะถูกเพิ่มเป็นการชี้แจงหากภาษาการเขียนโปรแกรมของคุณใช้สัญลักษณ์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิงสำหรับการดำเนินการทางคณิตศาสตร์มากกว่าตัวอย่าง

ดำเนินการต่อไปเรื่อย ๆ จนกว่าคุณจะไปถึงจุดสิ้นสุดของรายการแล้วให้ผลลัพธ์ของผลรวม

กฏท้าทาย:

  • การยกกำลังด้วย 0 ( n ^ 0) ควรส่งผลเป็น 1 (รวมถึง0 ^ 0 = 1)
  • ไม่มีกรณีทดสอบสำหรับการหารด้วย 0 ( n / 0) ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับกรณีขอบ
  • หากอาร์เรย์มีเพียงตัวเลขเดียวเราจะคืนค่านั้นเป็นผลลัพธ์

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ

กรณีทดสอบ:

[1,2,3,4,5] -> 0
-> 1 + 2 = 3
  -> 3 - 3 = 0
    -> 0 * 4 = 0
      -> 0 / 5 = 0 

[5,12,23,2,4,4,2,6,7] -> 539
-> 5 + 12 = 17
  -> 17 - 23 = -6
    -> -6 * 2 = -12
      -> -12 / 4 = -3
        -> -3 ^ 4 = 81
          -> 81 + 2 = 83
            -> 83 - 6 = 77
              -> 77 * 7 -> 539

[-8,50,3,3,-123,4,17,99,13] -> -1055.356...
-> -8 + 50 = 42
  -> 42 - 3 = 39
    -> 39 * 3 = 117
      -> 117 / -123 = -0.9512...
        -> -0.9512... ^ 4 = 0.818...
          -> 0.818... + 17 = 17.818...
            -> 17.818... - 99 -> -81.181...
              -> -81.181... * 13 = -1055.356...

[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256
-> 2 + 2 = 4
  -> 4 - 2 = 2
    -> 2 * 2 = 4
      -> 4 / 2 = 2
        -> 2 ^ 2 = 4
          -> 4 + 2 = 6
            -> 6 - 2 = 4
              -> 4 * 2 = 8
                -> 8 / 2 = 4
                  -> 4 ^ 2 = 16
                    -> 16 + 2 = 18
                      -> 18 - 2 = 16
                        -> 16 * 2 = 32
                          -> 32 / 2 = 16
                            -> 16 ^ 2 = 256

[1,0,1,0,1,0] -> 1
-> 1 + 0 = 1
  -> 1 - 1 = 0
    -> 0 * 0 = 0
      -> 0 / 1 = 0
        -> 0 ^ 0 = 1

[-9,-8,-1] -> -16
  -> -9 + -8 = -17
    -> -17 - -1 = -16

[0,-3] -> -3
  -> 0 + -3 = -3

[-99] -> -99

ไม่ใช่การหารจำนวนเต็ม?
Leun Nun

@LeakyNun ไม่ฉันควรเปลี่ยนอินพุตเป็นรายการที่มีทศนิยมแทนจำนวนเต็มเนื่องจากการหาร (และกรณีทดสอบ 3)?
Kevin Cruijssen

นี่คือในกล่องทรายหรือไม่
Bálint

9
ในวิชาคณิตศาสตร์มีสองขัดแย้งกัน "กฎ" แต่n ^ 0 = 1 0 ^ n = 0ความขัดแย้งได้รับการแก้ไขโดยการตั้งค่าn != 0สำหรับกฎทั้งสอง แต่จากนั้นจะ0 ^ 0ไม่ได้กำหนด แต่มีจำนวนมากของสิ่งที่ตกอยู่ในสถานที่เป็นอย่างดีในวิชาคณิตศาสตร์ถ้าถูกกำหนดให้เป็น0 ^ 0 1ดูWikipediaสำหรับรายละเอียดบางอย่าง
Mego

1
@ Bálintกฎระบุว่าจะไม่มีการป้อนข้อมูลที่ถูกต้องด้วยการหารด้วยศูนย์ คุณไม่ต้องกังวลเกี่ยวกับตัวเรือนขอบนั้น
Mego

คำตอบ:


7

เยลลี่ขนาด 13 ไบต์

“+_×÷*”ṁṖ⁸żFV

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

“+_×÷*”ṁṖ⁸żFV  Main link. Argument: A (list of integers)

“+_×÷*”        Yield the list of operations as a string.
        Ṗ      Yield A popped, i.e., with its last element removed.
       ṁ       Mold; reshape the string as popped A.
               This repeats the characters of the string until it contains
               length(A)-1 characters.
         ⁸ż    Zipwith; pairs the integers of A with the corresponding characters.
           F   Flatten the result.
            V  Eval the resulting Jelly code.
               Jelly always evaluates left-to-right (with blatant disregard towards
               the order of operations), so this returns the desired result.

Nice นั่นคือ 8 นับไบต์ที่ต่ำกว่าPykeซึ่งปัจจุบันเป็นผู้นำ
Kevin Cruijssen

3
ไม่มีใครเทียบได้กับเดนนิส ไม่เคย
บลู

1
เพียงแค่คำถาม: มันนับเป็น 13 ไบต์กับตัวละครที่ไม่ใช่แบบ ASCII ทั้งหมดหรือไม่?
Xavier Dury

3
@XavierDury ใช่ ไบต์การเชื่อมโยงในการนำไปสู่ส่วนหัวเพื่อหน้ารหัสวุ้นของตัวเองมากซึ่ง encodes 256 ตัวอักษรวุ้นเข้าใจเป็นไบต์เดี่ยวแต่ละ
Dennis

@Dennis ขอขอบคุณสำหรับความแม่นยำ!
Xavier Dury

19

Javascript ES7 49 ไบต์

a=>a.reduce((c,d,e)=>[c**d,c+d,c-d,c*d,c/d][e%5])

บันทึกไปแล้ว 9 ไบต์ด้วย Dom Hastings บันทึกอีก 6 ขอบคุณ Leaky Nun

ใช้โอเปอเรเตอร์การยกกำลังใหม่


@LeakyNun ไม่เพียงสร้างInfinityแต่ไม่ใช่ข้อผิดพลาดหรือเปล่า?
Dom Hastings

ลองใช้ eval มันอาจจะสั้นกว่านี้
Downgoat

@Upgoat จะใช้ EVAL แรกแล้วรั่วนูนแสดงให้ฉันเห็นว่ามันจะดีกว่าที่จะทำเช่นนี้
Bálint

@ Bálintคุณชอบใช้เครื่องหมายจุลภาคจำนวนมาก?
Rɪᴋᴇʀ

1
@ EᴀsᴛᴇʀʟʏIʀᴋผู้พูดที่ไม่ใช่เจ้าของภาษา บาลินต์ทำเช่นนั้นบ่อยครั้ง ไวยากรณ์ภาษาอังกฤษนั้นโง่ในเวลาที่ดีที่สุด
wizzwizz4

11

Haskell, 76 65 64 62 ไบต์

ขอบคุณ @Damien ที่ลบอีกสองไบต์ =)

f(u:v)=foldl(\x(f,y)->f x y)u(zip(v>>[(+),(-),(*),(/),(**)])v)

นี่ใช้สิ่ง>>ที่นี่ต่อท้ายรายการ[(+),...]กับlength vเวลาของตัวเอง ส่วนที่เหลือยังคงใช้งานได้เหมือนเดิม

รุ่นเก่า:

โซลูชันเหล่านี้ใช้ประโยชน์จากรายการที่ไม่มีที่สิ้นสุดเช่นเดียวกับที่cycle[...]ทำซ้ำรายการที่กำหนดอย่างไม่สิ้นสุด จากนั้นจะได้รับการzipแก้ไขพร้อมกับรายชื่อตัวเลขและเราเพียงแค่ลดfold ( ในภาษาอื่น ๆ ) รายการที่ถูกซิปผ่านแลมบ์ดา

f(u:v)=foldl(\x(f,y)->f x y)u(zip(cycle[(+),(-),(*),(/),(**)])v)

f(u:v)=foldl(\x(y,f)->f x y)u(zip v(cycle[(+),(-),(*),(/),(**)]))

f l=foldl(\x(y,f)->f x y)(head l)(zip(drop 1l)(cycle[(+),(-),(*),(/),(**)]))

คุณสามารถแทนที่วัฏจักรโดย: v >>
Damien

@ Damien ขอบคุณมาก!
ข้อบกพร่อง

หืมfoldl(&)u$zipWith(&)v(flip<$>v>>[…])?
Bergi

@Bergi ฉันสุจริตไม่สามารถอ่านสิ่งนี้จะทำอีกต่อไป =) อย่างไรก็ตามเราจำเป็นต้องมีimportสำหรับ&, เพื่อที่จะเป็นอีกต่อไปอีกครั้ง แต่ต้องขอบคุณต่อไป!
ข้อผิดพลาด

@flawr: จริง ๆ แล้วความคิดของฉันค่อนข้างเหมือนกับสิ่งที่Lazersmoke โพสต์เป็นคำตอบฉันไม่ได้อ่าน ผมได้ไปเมื่อพยายามที่จะลดความซับซ้อนของ Lamda uncurryของคุณที่กับสิ่งที่ต้องการ ไม่ได้ผล แต่ฉันสังเกตเห็นว่าคุณควรจะสามารถบันทึกไบต์อื่นได้โดยใช้$แทนวงเล็บ
Bergi


7

Haskell, 61 ไบต์

foldl(flip id)0.zipWith flip((+):cycle[(+),(-),(*),(/),(**)])

สร้างชุดการแปลงในรายการเช่นเดียวกับใน [เพิ่ม 1, เพิ่ม 2, ลบ 3, ... ], เริ่มต้นด้วยการเพิ่ม 2 ครั้งเนื่องจากเราเริ่มต้นด้วย 0 ในการพับ ต่อไปเราทำสิ่งที่ฉันเรียกว่า List Application Fold หรือ foldl (flip id) ซึ่งใช้รายการของโฮโมมอร์ฟิซึมในซีรีส์ สิ่งนี้เริ่มต้นด้วยศูนย์เพิ่มค่าเริ่มต้นจากนั้นทำการแปลงที่คำนวณข้างต้นทั้งหมดเพื่อให้ได้ผลลัพธ์สุดท้าย

โปรดทราบว่า (flip id) เหมือนกับ (\ x y-> yx) สั้นกว่า

ตัวอย่างการใช้งาน:

f = foldl(flip id)0.zipWith flip((+):cycle[(+),(-),(*),(/),(**)])
f [1,2,3,4,5] -- Is 0.0

แทนที่จะคุณก็สามารถใช้flip id หรือ& flip($)ว้าวฉันไม่เคยรู้เลย($) = id
Bergi

1
@Bergi: &มีการกำหนดไว้Data.Functionดังนั้นคุณต้องการimportเช่นกัน บางทีล่ามออนไลน์บางรายอาจนำเข้าเป็นค่าเริ่มต้น แต่คุณต้องระบุว่าคุณต้องใช้อันใด
nimi

7

TSQL 116 115 88 88 ไบต์

ขอบคุณคำแนะนำของ Ross Presser ฉันสามารถเล่นกอล์ฟได้ถึง 88 ตัวอักษร

-- In Try-it code, this must be DECLARE @y TABLE 
CREATE TABLE T(a real, i int identity)
INSERT T values(5),(12),(23),(2),(4),(4),(2),(6),(7)

DECLARE @ REAL SELECT @=CHOOSE(i%5+1,@/a,ISNULL(POWER(@,a),a),@+a,@-a,@*a)FROM T
PRINT @

ลองออนไลน์


1
1 ไบต์ที่น้อยกว่า: ต้องการตารางอินพุตให้ชื่อ T แทน @y โซลูชัน PL / SQL มีสิ่งนี้ดังนั้นทำไมไม่ใช้ TSQL
Ross Presser

@RossPresser ใช่แน่นอน ฉันพลาดได้อย่างไร มันเป็นไปไม่ได้ในลิงค์ทดสอบไม่มีสิทธิ์ในการสร้างตารางและมันจะทำงานได้อย่างถูกต้องในครั้งแรกในฐานข้อมูล แต่สิ่งที่สำคัญเมื่อตัวละครสามารถตีกอล์ฟได้ ขอบคุณสำหรับคำแนะนำของคุณการปรับปรุงของคุณได้รับการเพิ่ม
t-clausen.dk

ออกไปอีก 12 ไบต์: ใช้ CHOOSE แทน IIF ที่ซ้อนกันโดยเหลือ IIF หนึ่งอันสำหรับเคส i = 1 เมื่อได้รับอนุญาตจากคุณฉันจะแก้ไขคำตอบ
Ross Presser

แก้ไขคำตอบแล้ว นี่คือลิงค์ทดลองใช้ - ฉันไม่ระบุตัวตนดังนั้นจึงไม่มีชื่อหลังจากนั้น: data.stackexchange.com/stackoverflow/query/edit/499612
Ross Presser

1
@RossPresser ฉันไม่รู้จักเลือก รวมข้อเสนอแนะของคุณและเล่นกอล์ฟเพิ่มเติมอีกหน่อย
t-clausen.dk

6

Pyth, 27 26 25 ไบต์

.v+>tlQ*lQ"^c*-+":jdQ\-\_

ชุดทดสอบ

Pyth ใช้สัญกรณ์นำหน้า: 1+2ถูกเขียนเป็น+1 2(ช่องว่างที่จำเป็นสำหรับการแยกตัวเลข)

ดังนั้นสำหรับ testcase แรกแสดงออกจะเป็นที่สัญกรณ์คำนำหน้าจะเขียนเป็น(((1+2)-3)*4)/5/*-+ 1 2 3 4 5

ใน Pyth ส่วนลอยเป็นcแทนดังนั้นมันจะกลายเป็น/c*-+ 1 2 3 4 5

ยิ่งไปกว่านั้นใน Pyth -100ถูกเขียนขึ้น_100แทน

ดังนั้นสำหรับกรณีการทดสอบที่สามซึ่งเป็นมันจะกลายเป็น:((((((((-8+50)-3)*3)/-123)^4)+17)-99)*13)*-+^c*-+ _8 50 3 3 _123 4 17 99 13

.v+>tlQ*lQ"^c*-+":jdQ\-\_
                  jdQ       Join input by space.
                 :   \-\_   Replace "-" with "_".
   >tlQ*lQ"^c*-+"           Generate the string "...^c*-+" of suitable length.
  +                         Join the two strings above.
.v                          Evaluate as a Pyth expression.

ประวัติศาสตร์


คุณเร็วมาก! ดูเหมือนว่าฉันประสบความสำเร็จในการสร้างความท้าทายที่ง่ายขึ้น หรือคุณแค่นั้นก็ดี ;)
Kevin Cruijssen

1
เพราะมันเป็นเรื่องที่คล้ายกันนี้
Leun Nun


6

ที่จริงแล้ว 23 ไบต์

;l"+-*/ⁿ"*@R':j':+'?o+ƒ

ลองออนไลน์!

ใช้สัญกรณ์ postfix สำหรับคณิตศาสตร์จริง ๆ และโอเปอเรเตอร์ที่รับอาร์กิวเมนต์สองตัวเท่านั้น (เช่นโอเปอเรเตอร์สำหรับการบวกการลบการคูณการหารและการยกกำลัง) ไม่ทำอะไรเลยเมื่อมีเพียงองค์ประกอบเดียวในสแต็ก ดังนั้นการเปลี่ยนอินพุตให้เป็นรหัสจริงนั้นง่ายเพียงย้อนกลับอินพุตป้อนข้อมูลจัดรูปแบบเป็นตัวเลขและผนวกการดำเนินการ จากนั้นโค้ดผลลัพธ์สามารถถูกเรียกใช้งานโดยให้เอาต์พุตที่ต้องการ

คำอธิบาย:

;l"+-*/ⁿ"*@R':j':+'?o+ƒ
;l"+-*/ⁿ"*               repeat the operations a number of times equal to the length of the input
                            (since extraneous operations will be NOPs, there's no harm in overshooting)
          @R             reverse the input
            ':j          join on ":" (make a string, inserting ":" between every pair of elements in the list)
               ':+       prepend a ":" (for the first numeric literal)
                  '?o    append a "?"
                           (this keeps the poor numeric parsing from trying to gobble up the first + as part of the numeric literal, since ? isn't interpreted as part of the literal, and is a NOP)
                     +   append the operations string
                      ƒ  cast as a function and call it

ตัวอย่างรหัสแปลสำหรับการป้อนข้อมูล1,2,3,4,5:

:5:4:3:2:1?+-*/ⁿ+-*/ⁿ+-*/ⁿ+-*/ⁿ+-*/ⁿ

3
รักวิธีที่ชื่อของภาษาผสานเข้ากับจำนวนไบต์
user6245072

3
s/Actually uses postfix notation/Actually actually uses postfix notation/
Leun Nun


5

J, 40 ไบต์

^~`(%~)`*`(-~)`+/@(|.@,7#:~#&2)(5-5|4+#)

ค้นหาจำนวนค่าที่ต้องใช้ในการใช้งานตัวดำเนินการหลายตัวจาก 5 ตัวซึ่งจะมีค่ามากกว่าแผ่นข้อมูลที่มีค่าตัวตนของตัวดำเนินการเหล่านั้น ตามลำดับ+คือ 0 -คือ 0 *คือ 1 %คือ 1 และ^1 ซึ่งสามารถเป็นค่าบิตได้00111หรือ 7 ในฐาน 10 จากนั้นดำเนินการกับรายการนั้นขณะที่หมุนไปตามตัวดำเนินการ

การใช้

   f =: ^~`(%~)`*`(-~)`+/@(|.@,7#:~#&2)(5-5|4+#)
   f 1 2 3 4 5
0
   f 5 12 23 2 4 4 2 6 7
539
   f _8 50 3 3 _123 4 17 99 13
_1055.36
   f 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
256
   f 1 0 1 0 1 0
1
   f _9 _8 _1
_16
   f 0 _3
_3
   f _99
_99

คำอธิบาย

^~`(%~)`*`(-~)`+/@(|.@,7#:~#&2)(5-5|4+#) Input: A
                                      #  Get length of A
                                    4+   Add four to it
                                  5|     Take it mod 5
                                5-       Find 5 minus its value, call it x
                           #&2           Create x copies of 2
                       7#:~              Convert 7 to base 2 and take the last x digits
                      ,                  Append those x digits to the end of A
                   |.@                   Reverse it, call it A'
^~                                       Power, reversed operators
    %~                                   Division, reversed operators
       *                                 Multiplication
         -~                              Subtraction, reversed operators
            +                            Addition
             /@                          Insert the previous operations, separated by `,
                                         into A' in order and cycle until the end
                                         Then evaluate the equation from right-to-left
                                         and return

5

Python 2, 81 67 64 ไบต์

i=10
for n in input():exec'r%s=n'%'*+-*/*'[i::5];i=-~i%5
print r

การป้อนข้อมูลเป็นอาร์เรย์ของการลอย ทดสอบบน Ideone Ideone

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

'*+-*/*'[i::5]เลือกตัวละครทุกตัวที่ห้าของสตริงที่เริ่มต้นด้วยหนึ่งที่ดัชนีฉันดังนั้นอัตราผลตอบแทนนี้**ถ้าi = 0 , +ถ้าi = 1 , -ถ้าi = 2 , *ถ้าi = 3และ/ถ้าi = 4 เนื่องจากสายมีความยาว6การแสดงออกจะให้ผลผลิตสตริงที่ว่างเปล่าถ้าฉัน> 5

เราเริ่มต้นตัวแปรฉันไป10 สำหรับแต่ละหมายเลขnในอาร์เรย์อินพุตเราสร้างสตริงr<op>=nซึ่งexecดำเนินการ

ในขั้นต้นi = 10เพื่อให้<op>เป็นสตริงที่ว่างเปล่าและมันเริ่มต้นRr+=nกับ หลังจากแต่ละขั้นตอนเราเพิ่มi modulo 5ด้วยi=-~i%5ดังนั้นขั้นตอนถัดไปจะดึงข้อมูลโอเปอเรเตอร์ที่เหมาะสม

เมื่อประมวลผลตัวเลขอินพุตทั้งหมดแล้วเราจะพิมพ์rซึ่งเก็บเอาต์พุตที่ต้องการ


5

Matlab - 95 91 85 bytes / Octave - 81 bytes

อินพุตอยู่ในรูปแบบดังกล่าว: a = ['1' '2' '3' '4' '5'];ฉันหวังว่านี่จะถูกปกคลุมด้วย "สตริงที่แทนอาร์เรย์ที่มีจำนวนเต็ม / ทศนิยม" มิฉะนั้นก็มี 2 num2str ที่ต้องการเพิ่มเติม

ผลลัพธ์ระดับกลางทุกครั้งจะถูกพิมพ์ไปที่คอนโซลเพราะนั่นจะช่วยฉันอัฒภาคบ้าง จะถูกดำเนินการเพื่อให้ความคุ้มค่าจะถูกบันทึกไว้แล้วa(1) ansแน่นอนว่าการใช้งานansโค้ดก็เป็นวิธีปฏิบัติที่ไม่ดีเช่นกัน

b='+-*/^'
a(1)
for i=2:length(a)
  ['(',ans,')',b(mod(i-2,5)+1),a(i)]
end
eval(ans)

ใน Octave '+-*/^'(mod(i+2,5)+1)ยังใช้งานได้ซึ่งช่วยประหยัดอีก 4 ไบต์ขอบคุณAdámและ Luis Mendo:

a(1)
for i=2:length(a)
  strcat('(',ans,')','+-*/^'(mod(i-2,5)+1),a(i))
end
eval(ans)

การเปลี่ยนแปลง:

  • ลบช่องว่างที่เป็นไปได้
  • เพิ่มวิธีการแก้ปัญหาคู่
  • แทนที่ strcat () ด้วย []

สวัสดียินดีต้อนรับสู่ PPCG! อินพุตเป็นแบบนั้นเพราะมันยังแยกความแตกต่างได้ง่ายว่าอินพุตคืออะไร อืมฉันไม่เคยใช้ Matlab ดังนั้นบางทีฉันอาจจะพูดเรื่องงี่เง่าที่นี่ แต่ไม่b = '+-*/^'สามารถเล่นกอล์ฟไปที่b='+-*/^'และfor i = 2:length(a)ไปfor i=2:length(a)(ลบพื้นที่) นอกจากนี้เคล็ดลับสำหรับการเล่นกอล์ฟใน MATLABอาจเป็นสิ่งที่น่าสนใจสำหรับคุณ :)
Kevin Cruijssen

คือ'+-*/^'(mod(i+2,5)+1)ถูกต้อง?
อดัม

@ Adámไม่ แต่อาจเป็นใน Octave
Luis Mendo

@ Adám: มันทำงานได้ใน Octave ฉันเพิ่มมัน
Lukas K.

4

Mathematica, 67 66 65 ไบต์

Fold[{+##,#-#2,#2#,#/#2,If[#2==0,1,#^#2]}[[i++~Mod~5+1]]&,i=0;#]&

ง่ายFoldด้วยตัวแปรที่iถือดัชนี


ไบต์สามารถบันทึกได้โดย+##แทน#+#2
LLlAMnYP

4

CJam, 18 ไบต์

q~{"+-*/#"W):W=~}*

การป้อนข้อมูลเป็นอาร์เรย์ของการลอย ลองออนไลน์!

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

q~                  Read and evaluate all input.
  {             }*  Reduce:
   "+-*/#"            Push the string of operators.
          W           Push W (initially -1).
           ):W        Increment and save in W.
              =       Retrieve the character at that index.
               ~      Evaluate.

4

R , 87 78 70 ไบต์

i=0
Reduce(function(a,j)get(substr("+-*/^",i<<-i%%5+1,i))(a,j),scan())

ลองออนไลน์!


ในบางจุดฉันจำเป็นต้องเรียนรู้วิธีใช้งานจริง ๆdo.call... ฉันอาจไม่ควรพิจารณาตัวเองเป็นโปรแกรมเมอร์ R จนกว่าฉันจะทำ!
Giuseppe

1
@Giuseppe Advanced Rโดย Hadley Wickamเป็นชายหาดที่ยอดเยี่ยมอ่าน :)
JayCe

ขอบคุณสำหรับการชี้ @Giuseppe ออกdo.call- getทำให้ผมรู้ผมกำลังมองหา
JayCe

3

Haskell - 74

f(x:xs)=foldl(\x(o,y)->o x y)x(zip(cycle[(+),(-),(*),(/),flip(^).floor])xs)

กรณีทดสอบ:

λ> f[1,2,3,4,5] -> 0.0
λ> f[5,12,23,2,4,4,2,6,7] -> 539.0
λ> f[-8,50,3,3,-123,4,17,99,13] -> -1055.356943846277
λ> f [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] -> 256.0

มันอาจจะสั้นกว่านี้ การสนับสนุนของ Haskell สำหรับรายการที่ไม่มีที่สิ้นสุดและฟังก์ชั่นการสั่งซื้อที่สูงขึ้นทำให้โซลูชันตรงนั้นน่าพึงพอใจ รุ่นหนึ่ง^ :: Double -> Double -> Doubleน่าจะดีกว่าสำหรับการเล่นกอล์ฟ แต่ฉันหามันไม่เจอ โชคดีที่ฉันไม่ต้องการแลมบ์ดาแบบเต็มดังนั้นสไตล์ที่ไม่มีจุดหมายจึงถูกลบทิ้งไปสองสามไบต์


2
คุณสามารถย่อหน้าเดียว(+)ในรายชื่อของผู้ประกอบการและเริ่มต้นfoldlด้วยการ0ไป pointfree foldl(\x(o,y)->o x y)0.zip((+):cycle[(+),(-),(*),(/),(**)])สมบูรณ์และบันทึกชื่อฟังก์ชันและพารามิเตอร์:
nimi

3

PowerShell v2 +, 124 ไบต์

param($n)$o=$n[0];if($y=$n.count-1){1..$y|%{$o=if(($x=$i++%5)-4){"$o"+'+-*/'[$x]+$n[$_]|iex}else{[math]::pow($o,$n[$_])}}}$o

ยาวเพราะ PowerShell ไม่มี^หรือ**โอเปอเรเตอร์ดังนั้นเราต้องพิจารณากรณีและแยกจากกันและใช้การเรียก. NET

รับอินพุต$nเป็นอาร์เรย์ตั้งค่าเอาต์พุตของเรา$oเป็นตัวเลขแรก จากนั้นเราจะตรวจสอบของอาร์เรย์และตราบใดที่มันเป็นมากกว่าหนึ่งที่เราใส่.count มิฉะนั้นเราข้ามifif

ข้างในifเราวนรอบอาร์เรย์1..$y|%{...}และการวนซ้ำแต่ละครั้งที่เราตั้งค่า$oเป็นค่าใหม่ผลลัพธ์ของif/elseคำสั่งอื่น ตราบใดที่เคาน์เตอร์ของเรา$i++ไม่ได้เป็นแบบโมดูโล-5 เท่ากับ 4 (คือเราไม่ได้อยู่ที่^ผู้ประกอบการ) เราก็ใช้$oและเชื่อมกับสัญลักษณ์ที่เหมาะสมและจำนวนต่อไปในอาร์เรย์การป้อนข้อมูล'+-*/'[$x] $n[$_]เราท่อที่iex(นามแฝงสำหรับInvoke-Expressionและคล้ายกับeval) $oและที่ได้รับการบันทึกไว้อีกครั้งเพื่อ หากเราอยู่ใน^โอเปอเรเตอร์เราอยู่ในelseดังนั้นเราจึงดำเนินการ[math]::Pow()โทรและผลลัพธ์นั้นจะถูกบันทึกไว้อีกครั้ง$oผลที่ได้รับกลับมาอีกครั้งบันทึกลงใน

ในกรณีใดกรณีหนึ่งเราเพียงแค่ส่งออก$oไปป์ไลน์และทางออกด้วยเอาต์พุตโดยนัย


3

สนิม123 , 117 ไบต์

คำตอบเดิม:

fn a(v:&[f32])->f32{v.iter().skip(1).enumerate().fold(v[0],|s,(i,&x)|match i%5{0=>s+x,1=>s-x,2=>s*x,3=>s/x,_=>s.powf(x)})}

โง่ชื่อวิธียาว ๆ ^^ อ่าดีกว่ามาก

fn f(v:&[f32])->f32{v[1..].iter().zip(0..).fold(v[0],|s,(&x,i)|match i%5{0=>s+x,1=>s-x,2=>s*x,3=>s/x,_=>s.powf(x)})}

ungolfed

fn f(values : &[f32]) -> f32 {
    values[1..].iter().zip(0..)
    .fold(values[0], |state,(&x,i)|
        match i%5 {
            0=>state+x,
            1=>state-x,
            2=>state*x,
            3=>state/x,
            _=>state.powf(x)
        }
    )
}

3

Perl 6 ,  70 68 65   62 ไบต์

{$/=[(|(&[+],&[-],&[*],&[/],&[**])xx*)];.reduce: {$/.shift.($^a,$^b)}}
{(@_ Z |(&[+],&[-],&[*],&[/],&[**])xx*).flat.reduce: {&^b($^a,$^c)}}
{(@_ Z |(*+*,*-*,&[*],*/*,&[**])xx*).flat.reduce: {&^b($^a,$^c)}}
{reduce {&^b($^a,$^c)},flat @_ Z |(*+*,*-*,&[*],*/*,&[**])xx*}

คำอธิบาย:

-> *@_ {
  reduce
    -> $a, &b, $c { b($a,$c) },

    flat       # flatten list produced from zip
      zip
        @_,    # input

        slip(  # causes the list of operators to flatten into the xx list

          # list of 5 infix operators
          &infix:<+>, &infix:<->, &infix:<*>, &infix:</>, &infix:<**>

        ) xx * # repeat the list of operators infinitely
}

ในทางเทคนิค* + *คือสิ่งที่แลมบ์ดา แต่มีประสิทธิภาพเหมือนกับชุด&[+]ย่อสำหรับ&infix:<+>ชุดของรูทีนย่อยที่จัดการการเติมตัวเลขแบบฝัง
ฉันไม่ได้ใช้สิ่งนั้นสำหรับการคูณหรือการยกกำลังเป็นวิธีที่จะเขียนมันอย่างน้อยก็ตราบใดที่ฉันมี (*×*หรือ* * *และ* ** *)

ทดสอบ:

ทดสอบบนideone.com
(หลังจากที่พวกเขาอัพเกรดเป็นRakudoรุ่นที่ไม่ได้มาจากปีและครึ่งหนึ่งก่อนที่จะปล่อยอย่างเป็นทางการของPerl 6 spectests )

#! /usr/bin/env perl6

use v6.c;
use Test;

my @tests = (
  [1,2,3,4,5] => 0,
  [5,12,23,2,4,4,2,6,7] => 539,
  [-8,50,3,3,-123,4,17,99,13] => -1055.35694385, # -2982186493/2825761
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] => 256,
  [1,0,1,0,1,0] => 1,
  [-9,-8,-1] => -16,
  [0,-3] => -3,
  [-99] => -99,
);

plan +@tests;

my &code = {reduce {&^b($^a,$^c)},flat @_ Z |(*+*,*-*,&[*],&[/],&[**])xx*}

for @tests -> $_ ( :key(@input), :value($expected) ) {
  is code(@input), $expected, .gist
}
1..8
ok 1 - [1 2 3 4 5] => 0
ok 2 - [5 12 23 2 4 4 2 6 7] => 539
ok 3 - [-8 50 3 3 -123 4 17 99 13] => -1055.35694385
ok 4 - [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] => 256
ok 5 - [1 0 1 0 1 0] => 1
ok 6 - [-9 -8 -1] => -16
ok 7 - [0 -3] => -3
ok 8 - [-99] => -99


3

Python 3, 88 93 ไบต์

f=lambda x:eval('('*(len(x)-1)+'){}'.join(map(str,x)).format(*['+','-','*','/','**']*len(x)))

มันเริ่มต้นจากการที่สั้นกว่ามาก แต่หลังจากนั้นโอเปอเรเตอร์สำคัญกว่าก็เอาชนะฉันและฉันต้องใส่วงเล็บจำนวนมาก ...


3

Oracle PL / SQL, 275 254 ไบต์

declare r number;begin for x in (select n,mod(rownum,5)r from t) loop if r is null then r:=x.n;elsif x.r=2then r:=r+x.n;elsif x.r=3then r:=r-x.n;elsif x.r=4then r:=r*x.n;elsif x.r=0then r:=r/x.n;else r:=r**x.n;end if;end loop;DBMS_OUTPUT.PUT_LINE(r);end;

ข้อมูลจะต้องถูกแทรกในตารางที่เรียกว่าTมีคอลัมน์NประเภทNUMBER

การใช้งาน:

drop table t;
create table t (n number);
insert into t values (-8);
insert into t values (50);
insert into t values (3);
insert into t values (3);
insert into t values (-123);
insert into t values (4);
insert into t values (17);
insert into t values (99);
insert into t values (13);

declare r number;begin for x in (select n,mod(rownum,5)r from t) loop if r is null then r:=x.n;elsif x.r=2then r:=r+x.n;elsif x.r=3then r:=r-x.n;elsif x.r=4then r:=r*x.n;elsif x.r=0then r:=r/x.n;else r:=r**x.n;end if;end loop;DBMS_OUTPUT.PUT_LINE(r);end;

เอาท์พุท:

-1055,356943846277162152071601242992595623

เวอร์ชั่น 275 ไบต์:

declare r number;cursor c is select n,mod(rownum,5) r from t;begin for x in c loop if r is null then r:=x.n;else case x.r when 2 then r:=r+x.n;when 3 then r:=r-x.n;when 4 then r:=r*x.n;when 0 then r:=r/x.n;else r:=r**x.n; end case;end if;end loop;DBMS_OUTPUT.PUT_LINE(r);end;

3

Java 8, 173 172 167 138 137 118 113 ไบต์

a->{double r=a[0],t;for(int i=1;i<a.length;r=new double[]{Math.pow(r,t),r+t,r-t,r*t,r/t}[i++%5])t=a[i];return r;}

คำอธิบาย:

ลองที่นี่

a->{                     // Method with double-array parameter and double return-type
  double r=a[0],         //  Result-double, starting at the first item of the input
         t;              //  Temp double
  for(int i=1;           //  Index-integer, starting at the second item
      i<a.length;        //  Loop over the input-array
      r=new double[]{    //    After every iteration, change `r` to:
         Math.pow(r,t),  //      If `i%5` is 0: `r^t`
         r+t,            //      Else-if `i%5` is 1: `r+t`
         r-t,            //      Else-if `i%5` is 2: `r-t`
         r*t,            //      Else-if `i%5` is 3: `r*t`
         r/t}[i++%5])    //      Else-if `i%5` is 4: `r/t`
                         //      And increase `i` by 1 afterwards with `i++`
    t=a[i];              //   Change `t` to the next item in the array
  return r;}             //  Return result-double

2
เพราะคุณรู้, java.1.5 นานกว่าคำตอบที่ยาวที่สุดในปัจจุบัน .... ซึ่งอยู่ใน SQL
Bálint

1
คุณสามารถเปลี่ยนdouble r=a[0];ไปdouble r=a[0],b;เพื่อประหยัดไบต์บาง
Leun Nun

1
@LeakyNun ตอนแรกฉันมีfloatแต่ไม่มีMath.powสำหรับลอยดังนั้นdoubleแทน ,bขอบคุณสำหรับ และเมื่อi++<a.lengthฉันได้รับArrayOutOfBoundsExceptionที่b=a[i];(เว้นแต่ว่าฉันจะทำi++<a.length-1แทนซึ่งเป็นอีกหนึ่งไบต์ยาวแทนที่จะสั้น)
Kevin Cruijssen

1
คุณสามารถเปลี่ยน== 4ไป> 3และจะ== 0 < 1ผมไม่แน่ใจ i % 5แต่ผมคิดว่าคุณสามารถบันทึกบิตโดยการสร้างตัวแปรสำหรับ
Frozn

1
ฉันคิดว่าคุณสามารถเปลี่ยนสิ่งทั้งปวงให้เป็นแบบสามมิติ ในการเปรียบเทียบทั้งหมดคุณสามารถใช้<xเคล็ดลับโดยย่อฟังก์ชันทั้งหมดให้เหลือ 137 อักขระ
Frozn

3

เทคนิคเล็กน้อยสามารถลดวิธีการของ @ Willmore ได้ 23 ถึง 174 ไบต์ (ต้องการ php 5.6 หรือใหม่กว่า) ส่วนที่ประหยัดที่สุดคือการลบวงเล็บที่ไม่จำเป็นออก (-10 ไบต์)

ฟังก์ชั่น f ($ a) {ในขณะที่ (นับ ($ a)> 1) {$ l = array_shift ($ a); $ r = array_shift ($ a); array_unshift ($ a, ($ j = $ i ++% 5 5) ? ($ J == $ 1 L- $ r:? ($ J == $ 2 ลิตร * $ r:? ($ J == $ 3 ลิตร / $ r:? $ ลิตร ** $ R))): $ l + $ r);} คืนสิ้นสุด ($ a);}

แต่การใช้งาน **โอเปอเรเตอร์แทนpow()ยังอนุญาตให้ใช้evalกับอาเรย์สำหรับการดำเนินการ และด้วยเทคนิคเพิ่มเติม ...

PHP> = 5.6, 82 ไบต์

while(--$argc)eval('$x'.['/','**','+','-','*'][$i++?$i%5:2]."=$argv[$i];");echo$x;

รับรายการจากพารามิเตอร์บรรทัดคำสั่ง ทำงานด้วยphp -nr '<code>'หรือลองออนไลน์

รุ่นเก่า, 161 157 151 145 144 140 137 117 ไบต์

function f($a){while(count($a)>1)eval('$a[0]=array_shift($a)'.['+','-','*','/','**'][$i++%5].'$a[0];');return$a[0];}

การตีกอล์ฟที่มีประสิทธิภาพมากที่สุดนั้นมาจากการเขียนผลกลางไปยังองค์ประกอบแรกโดยตรงหลังจากเปลี่ยนผลลัพธ์ก่อนหน้าจากอาเรย์

ชำรุด

function f($a)
{
    while(count($a)>1)  // while array has more than one element ...
        eval('$a[0]='                           // future first element :=
            . 'array_shift($a)'                 // = old first element (removed)
            . ['+','-','*','/','**'][$i++%5]    // (operation)
            .'$a[0];'                           // new first element (after shift)
        );
    return$a[0];        // return last remaining element
}

ชุดทดสอบ

$cases = array (
    0=>[1,2,3,4,5],
    539=>[5,12,23,2,4,4,2,6,7],
    '-1055.356...' => [-8,50,3,3,-123,4,17,99,13],
    256 => [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
    1 => [1,0,1,0,1,0],
    -16 => [-9,-8,-1],
    -3 => [0, -3],
    -99 => [-99]
);
echo '<table border=1><tr><th>values</th><th>expected</th><th>actual result</th></tr>';
foreach ($cases as $expect=>$a)
{
    $result=f($a);
    echo "<tr><td>[", implode(',',$a),"]</td><td>$expect</td><td>$result</td></tr>";
}
echo '</table>';

ทำได้ดีมาก คุณสามารถลบได้อีก 3 ไบต์โดยคืนค่าสุดท้ายเป็นอาร์เรย์ (เปลี่ยน 'return $ a [0]' เป็น 'return $ a') ซึ่งฉันไม่ได้เห็นนั้นผิดกฎ :)
640KB

@ gwaugh Imo If the array contains just a single number, we return that as the result.ค่อนข้างชัดเจน แต่ขอขอบคุณที่ให้ฉันกลับมาทบทวนสิ่งนี้
ติตัส

หนึ่งสามารถสร้างอาร์กิวเมนต์ความหมายที่ "ว่า" ในประโยคสามารถอ้างถึง "อาร์เรย์" คำตอบของคุณคือ PHP ที่สั้นที่สุด ทำได้ดีมากและขอบคุณอีกครั้งสำหรับพอยน์เตอร์ที่ฉันยอมจำนนอีกต่อไป
640KB

3

PHP ,135 130 ไบต์

ขอบคุณ @titus -5 ไบต์บวกกับการแก้ไขกรณี 0 รายการ!

function f($z){return array_reduce($z,function($c,$x)use(&$i){eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x;');return$c;});};

ลองออนไลน์!

หักกอล์ฟ:

function f( $t ) {
    return array_reduce( $t,
        function( $c, $x ) use( &$i ) {
            eval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x;');
            return $c;
        }
    );
};

คือการรูทจริงสำหรับ array_reduce () ในการทำงานนี้ แต่ต้องใช้ตัวอักษรมากเกินไปที่จะเอาชนะคะแนน PHP ต่ำสุดในปัจจุบัน

โพสต์ไว้แล้วในกรณีที่ใครมีคำแนะนำ!


1
วิธีการที่ดี; แต่ฉันคิดว่ามันจะล้มเหลวเมื่อใดก็ตามที่ความนิยม$c บันทึกไบต์ที่สองที่มีฟังก์ชั่นที่ไม่ระบุชื่อแทน0 สั้นลงหกไบต์และควรแก้ไขปัญหาศูนย์ weval('$c'.['/','**','+','-','*'][$i++?$i%5:5].'=$x');return$c;
ติตัส

ขอบคุณ @Titus! คุณพูดถูกเกี่ยวกับกรณี 0 ฉันต้องเพิ่มกลับ; หลังจาก = $ x เพราะ eval จะไม่ทำงานหากไม่มีมัน ถ้าฉันทำให้มันเป็นฟังก์ชั่นอานนท์ฉันจะต้องมีการกำหนดตัวแปรให้มันหรือรันมันในโค้ดทดสอบใช่ไหม? ไม่ต้องการเรียกจำนวนไบต์เป็นคำถาม : D
640KB

2

Brachylogขนาด 68 ไบต์

hI,?bL,1:+:-:*:/:^b:L:I{bhv?t.|[O:L:I]h$(P,LbM,OhA,Lh:Ir:A&:M:Pr&.}.

นั่นมันนาน… แต่มันไม่ใช้เพรดิเคตการประเมิน

คำอธิบาย

  • ภาคแสดงหลัก

    hI,                                  Unify I with the first element of the input
       ?bL,                              L is the input minus the first element
           1:+:-:*:/:^b                  Construct the list of predicates [+:-:*:/:^]
                       :L:I{...}.        Call predicate 1 with [[+:-:*:/:^]:L:I] as input
    
  • คำกริยา 1

    bhv?t.                               If the second element of Input is empty (i.e. L),
                                         unify Output with the last element of Input
    |                                    Or
    [O:L:I]                              Input = [O:L:I]
           h$(P,                         P is O circularly permutated to the left
                LbM,                     M is L minus the first element
                    OhA,                 A is the first element of O
                        Lh:Ir:A&         Call predicate A on [I:First element of L]
                                :M:Pr&.  Call predicate 1 recursively with P:M:
    

เอาชนะคุณโดย1̶̶b̶y̶t̶e; 2 ไบต์;)
LegionMammal978

2

IBM PC 8087 FPU 66 82 ไบต์

ใช้ตัวประมวลผลทางคณิตศาสตร์ Intel 8087 ของ IBM PC สำหรับการคำนวณเท่านั้น

ลองออฟไลน์! (ใน DOSBox หรืออะไรก็ตาม) มอบชิป 8087 สำหรับพีซีเก่าของคุณให้คุณทำนอกเหนือจากสเปรดชีต Lotus 1-2-3 ทั้งหมดที่คุณเคยทำในยุค 80

9bdf 0783 c302 499b de07 83c3 0249 e342 9bde 2783 c302 49e3 399b de0f 83c3 0249 
e330 9bde 3783 c302 49e3 2751 8b0f 9bd9 e883 f900 7413 9c7f 02f7 d99b d8c9 e2fb 
9d7d 069b d9e8 9bd8 f159 83c3 0249 e302 ebb5 c3

Ungolfed (ไม่ประกอบชิ้นส่วน):

START: 
    ; RUN TESTS  
    MOV  BX, OFFSET TST     ; 5, 12, 23, 2, 4, 4, 2, 6, 7
    MOV  CX, CTST           ; input array length
    CALL WOMI               ; calculate sequence
    CALL PRINT_FLT          ; output to console

    MOV  BX, OFFSET TST1    ; 5, 12, 23, 2, 4, -4, 2, 6, 7
    MOV  CX, CTST1
    CALL WOMI
    CALL PRINT_FLT

    MOV  BX, OFFSET TST2    ; -8, 50, 3, 3, -123, 4, 17, 99, 13
    MOV  CX, CTST2
    CALL WOMI
    CALL PRINT_FLT

    MOV  BX, OFFSET TST3    ; 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
    MOV  CX, CTST3
    CALL WOMI
    CALL PRINT_FLT

    MOV  BX, OFFSET TST4    ; 1,0,1,0,1,0
    MOV  CX, CTST4
    CALL WOMI
    CALL PRINT_FLT

    MOV  BX, OFFSET TST5    ; -9, -8, -1
    MOV  CX, CTST5
    CALL WOMI
    CALL PRINT_FLT

    MOV  BX, OFFSET TST6    ; 0, -3
    MOV  CX, CTST6
    CALL WOMI
    CALL PRINT_FLT

    MOV  AX, 4C00H          ; exit to DOS
    INT  21H

;  TEST DATA

TST   DW  5, 12, 23, 2, 4, 4, 2, 6, 7
CTST  EQU ($-TST)/(SIZE TST)    ; count of items on list

TST1  DW  5, 12, 23, 2, 4, -4, 2, 6, 7
CTST1 EQU ($-TST1)/(SIZE TST1)  ; count of items on list

TST2  DW -8, 50, 3, 3, -123, 4, 17, 99, 13
CTST2 EQU ($-TST2)/(SIZE TST2)  ; count of items on list

TST3  DW 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
CTST3 EQU ($-TST3)/(SIZE TST3)  ; count of items on list

TST4  DW 1,0,1,0,1,0
CTST4 EQU ($-TST4)/(SIZE TST4)  ; count of items on list

TST5  DW -9, -8, -1
CTST5 EQU ($-TST5)/(SIZE TST5)  ; count of items on list

TST6  DW 0, -3
CTST6 EQU ($-TST6)/(SIZE TST6)  ; count of items on list

; 8087 exponent: ST(0) = ST(0) ^ EXP
FIEXP   MACRO   EXP
        LOCAL   REPEAT, DONE
        PUSH CX
        MOV  CX, EXP        ; Exponent is count for loop
        FLD1                ; load 1 into ST
        CMP  CX, 0          ; is exponent pos, neg or 0?
        JZ   DONE           ; exit (with value 1) if exponent is 0
        PUSHF               ; save result flags for later
        JG   REPEAT         ; if exp > 1 start calculation
        NEG  CX             ; make exponent positive for loop
REPEAT:
        FMUL ST(0), ST(1)   ; multiply ST0 = ST0 * ST1
        LOOP REPEAT
        POPF                ; retrieve flags from earlier
        JGE  DONE           ; if exponent was negative, divide 1 by result
        FLD1                ; push 1 into numerator
        FDIV ST(0), ST(1)   ; ST0 = 1 / ST1
DONE:
        POP  CX
        ENDM

; Function WOMI: (Weapons of Math Instruction)
; input: BX - address of start of input array
;       CX - length of input array
; output: ST - result on top of 8087 register stack
WOMI PROC
    FILD WORD PTR [BX]      ; load first item
    ADD  BX, 2              ; move to next
    DEC  CX
CALC:
    FIADD WORD PTR [BX]     ; add
    ADD  BX, 2              ; move to next
    DEC  CX                 ; decrement counter
    JCXZ OUTPUT             ; check if done

    FISUB WORD PTR [BX]     ; subtract
    ADD  BX, 2
    DEC  CX
    JCXZ OUTPUT

    FIMUL WORD PTR [BX]     ; multiply
    ADD  BX, 2
    DEC  CX
    JCXZ OUTPUT

    FIDIV WORD PTR [BX]     ; divide
    ADD  BX, 2
    DEC  CX
    JCXZ OUTPUT

    FIEXP [BX]              ; exponent
    ADD  BX, 2
    DEC  CX
    JCXZ OUTPUT
    JMP CALC                ; start again

OUTPUT:
    RET 
WOMI ENDP

PRINT_FLT PROC
; print top of 8087 stack
; scaling: 14 digits, 4 decimal places
; input: BX = address of a TBYTE (BCD) output buffer
;       ST = value to display on top of 8087 stack  
    LEA   BX, BUFF                  ; set BX to BCD output buffer
    MOV   AH, 2
    MOV   WORD  PTR[BX], 10000      ; ten thousand (scale factor)
    FIMUL WORD  PTR[BX]             ; scale up by 10000
    FBSTP TBYTE PTR[BX]             ; store as BCD
    FWAIT                           ; sync 8088 and 8087
    TEST  BYTE  PTR[BX+9], 80H      ; check sign bit
    JE    PF_1                      ; 0, goto PF_1
    MOV   DL, '-'                   ; output '-'
    INT   21H
PF_1:
    ADD   BX, 8                     ; point to high byte
    MOV   CH, 7                     ; 14 digits before decimal point
    MOV   CL, 4                     ; 4 shifts (8 bytes / 2 = 4 = 1 nibble)
    MOV   DH, 2                     ; 2 times (8 bytes / 4)
PF_LOOP:
    MOV   DL, [BX]                  ; get BCD digits
    SHR   DL, CL                    ; move high digit to low nibble
    OR    DL, 30H                   ; convert to ASCII
    INT   21H
    MOV   DL, [BX]                  ; get byte again
    AND   DL, 0FH                   ; mask out high digit
    OR    DL, 30H                   ; convert to ASCII
    INT   21H                       ; output
    DEC   BX                        ; next byte
    DEC   CH                        ; decrement byte
    JG    PF_LOOP                   ; repeat if more bytes
    DEC   DH                        ; second time?
    JE    PF_DONE                   ; yes, done
    MOV   DL, '.'                   ; no, output decimal point
    INT   21H
    MOV   CH, 2                     ; 4 more digits after decimal point
    JMP   PF_LOOP                   ; go print digits
PF_DONE:
    MOV  DL, 0DH                    ; display newline CRLF
    MOV  AH, 2
    INT  21H
    MOV  DL, 0AH
    INT  21H
    RET 
PRINT_FLT ENDP

BUFF DT 0   ; output buffer for floating point digit string

_TEXT ENDS
END START

เอาท์พุท:

A>WOMI.COM
00000000000539.0000
-00000000000027.9136
-00000000001055.3569
00000000000256.0000
00000000000001.0000
-00000000000016.0000
-00000000000003.0000

อินพุตคือทาง PROC (x86 ที่เทียบเท่ากับฟังก์ชั่นมากที่สุด) โดยที่ BX เป็นตัวชี้ไปยังอาร์เรย์ของคำในหน่วยความจำและ CX เป็นจำนวนรายการในนั้นและส่งกลับผลลัพธ์ใน ST

* หมายเหตุ: รหัสจริงสำหรับฟังก์ชั่นคือ 6682 ไบต์ แน่นอนว่าโค้ดเพียงเพื่อเขียนจำนวนจุดลอยตัวไปที่คอนโซล (โค้ดตำรา) คือ 83 ไบต์ โปรแกรมการทดสอบและข้อมูลคือ183215 ไบต์ทำให้. COM สามารถเรียกทำงานได้ 305 ทั้งหมด 380 ไบต์


1
มันเยี่ยมมาก! ฉันได้เขียนวิธีแก้ปัญหาที่คล้ายกันสำหรับ x86-64 (linux) แต่ฉันไม่ได้ตีกอล์ฟมาก แต่อาจจะเปลี่ยนตรรกะมากมายรอบ ๆ สำหรับการคำนวณเลขชี้กำลังของคุณแม้ว่าการทดสอบที่ได้รับจะไม่ได้รับเลขชี้กำลังเป็นค่าลบ แต่ฉันรู้สึกว่ามันเป็นส่วนที่จำเป็นของตรรกะของโปรแกรมโดยเฉพาะอย่างยิ่งเนื่องจากมันง่ายเหมือนการกด 1 ถึง st0 แล้วทำ div ระหว่าง st0 และ st1 (อย่างน้อยใน x86 นี่เป็นสองคำแนะนำ)
เดฟ

ขอบคุณ @davey - เป็นจุดที่ดีมาก! ฉันได้อัปเดตรหัสเพื่อจัดการเลขชี้กำลังเป็นค่าลบและเพิ่มอีกหนึ่งกรณีทดสอบ
640KB

2

APL (Dyalog Unicode) , 29 27 ไบต์SBCS

ฟังก์ชั่นคำนำหน้าเงียบผิดปกติ โปรดทราบว่า*เป็นการยกกำลังใน APL

≢{⍎3↓⍕⌽⍵,¨⍨⍺⍴'+-×÷*''⍨'}⊢

ลองออนไลน์!

เนื่องจาก APL เรียกใช้จากขวาไปซ้ายเราสามารถย้อนลำดับของอาร์กิวเมนต์ของการดำเนินการที่แทรกไว้และย้อนกลับนิพจน์ทั้งหมด Postfix ย้อนกลับอาร์กิวเมนต์ หลังจากทำการสลับตัวเลขและการดำเนินการที่สมบูรณ์แบบเราเพียงแค่ต้องย้อนกลับปรับและประเมินผล:

≢{}⊢ เรียกฟังก์ชั่นต่อไปนี้โดยนับจำนวนและจำนวนจริงตามและ:

'⍨' ตัวละครนี้

'+-×÷*',¨ เพิ่มอักขระแต่ละตัวลงในนั้น ["+⍨","-⍨","×⍨","÷⍨","*⍨"]

⍺⍴ ใช้อาร์กิวเมนต์ซ้าย (จำนวนนับ) เพื่อ cyclically r eshape ว่า

 ถอยหลัง

 จัดรูปแบบเป็นสตริงแบบแบน

3↓ วางนำหน้า 3 ตัวอักษร (เว้นวรรคและสัญลักษณ์และ )

 รันเป็นรหัส APL


2

Japt , 16 ไบต์

r@[XY]r"p+-*/"gZ

ลองออนไลน์!

คำอธิบาย:

r@                  #Reduce the input list:
       "p+-*/"      # The list of functions to apply (offset by one due to the behavior of Z)
              gZ    # Choose the one at the current index, wrapping
  [  ]r             # Apply that function to:
   X                #  The result of the previous step
    Y               #  and the current number
                    #Implicitly return the result of the final step

อา, feck, กำลังทำเรื่องนี้ด้วยตัวเอง, พยายามหาสาเหตุว่าทำไมมันถึงให้ผลลัพธ์ที่ไม่ถูกต้อง - ฉันพลาดการยกกำลัง fecking! : \
ปุย

1

c #, 238 , 202 ไบต์

double d(double[]a){Array.Reverse(a);var s=new Stack<double>(a);int i=0,j;while(s.Count>1){double l=s.Pop(),r=s.Pop();j=i++%5;s.Push(j==0?l+r:j==1?l-r:j==2?l*r:j==3?l/r:Math.Pow(l,r));}return s.Peek();}

ฉันไม่เห็นวิธีแก้ปัญหา c # ดังนั้นฉันจะให้ นี่คือ codegolf ตัวแรกของฉัน ฉันเริ่มเขียนใน c # "สองเดือนที่ผ่านมา" (แม้ว่าฉันรู้ Java ในระดับหนึ่ง)

มันใช้สแต็ค

ลองออนไลน์!

กรณี Ungolfed และการทดสอบ

using System;
using System.Collections.Generic;

class M 
{
    double d(double[]a) {
        Array.Reverse(a);
        var s = new Stack<double>(a);
        int i=0,j;
        while (s.Count>1)
        {
            double l=s.Pop(),r=s.Pop();
            j=i++%5;
            s.Push(j==0?l+r:j==1?l-r:j==2?l*r:j==3?l/r:Math.Pow(l, r));
        }
        return s.Peek();
    }

    public static void Main()
    {
        int[][] a = new int[][]{
            new int[]{1,2,3,4,5},
            new int[]{5,12,23,2,4,4,2,6,7},
            new int[]{-8,50,3,3,-123,4,17,99,13},
            new int[]{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
            new int[]{1,0,1,0,1,0},
            new int[]{-9,-8,-1},
            new int[]{0,-3},
            new int[]{-99}
        };

        for (int i = 0; i < a.Length; i++)
        {
            Console.WriteLine(new M().d(Array.ConvertAll(a[i], e => Convert.ToDouble(e))));
        }
        Console.ReadKey();
    }
}

เอาท์พุท:

0
539
-1055,35694384628
256
1
-16
-3
-99

สวัสดีและยินดีต้อนรับสู่ PPCG! นี้อาจจะเป็นหัวข้อที่ดีที่จะดูที่: เคล็ดลับสำหรับรหัสการเล่นกอล์ฟใน C # บางสิ่งที่สามารถใส่ลงในรหัสของคุณ: ช่องว่าง ( a, Double.Parse-> a,Double.Parse; while (s.Count-> while(s.Count; Pow(l, r)-> Pow(l,r)) นอกจากนี้คุณยังสามารถลบint หน้าและวางไว้เบื้องหลังj= int i=0,j;คำตอบแรกที่ดีแม้ว่าและยินดีต้อนรับอีกครั้ง :)
Kevin Cruijssen

@KevinCruijssen สวัสดี! ไท! ลบช่องว่างและย้าย j ตามที่คุณแนะนำ :)
display_name

1

PHP, 206 , 198 , 197 ไบต์

function f($a){while(count($a)>1){$l=array_shift($a);$r=array_shift($a);array_unshift($a,($j=$i++%5)==0?($l+$r):($j==1?($l-$r):($j==2?($l*$r):($j==3?($l/$r):(pow($l,$r))))));}return array_pop($a);}

ลองออนไลน์!

Ungolfed

<?php

function f($a)
{
    while(count($a)>1)
    {
        $l = array_shift($a); $r = array_shift($a);
        array_unshift($a,($j=$i++%5)==0?($l+$r):($j==1?($l-$r):($j==2?($l*$r):($j==3?($l/$r):(pow($l,$r))))));
    }
    return array_pop($a);
}

echo f([1,2,3,4,5])."\n";
echo f([5,12,23,2,4,4,2,6,7])."\n";
echo f([-8,50,3,3,-123,4,17,99,13])."\n";
echo f([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2])."\n";
echo f([1,0,1,0,1,0])."\n";
echo f([-9,-8,-1])."\n";
echo f([0,-3])."\n";
echo f([-99])."\n";

ใน PHP ตรรกะคล้ายกับ c # ของฉัน answer ( 202 bytes ) :) ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.