ความก้าวหน้าทางเลขคณิต


11

งานของคุณคือการวิเคราะห์อินพุตและเอาต์พุตสูตรสำหรับคำศัพท์ที่ n หากเป็นลำดับเลขคณิตมิฉะนั้นจะพิมพ์ "NAAP"


อินพุต

อินพุต (จาก STDIN) จะประกอบด้วยตัวเลขไม่กี่ตัวระหว่าง 4 ถึง 10 หมายเลขโดยที่แต่ละหมายเลขจะอยู่ในช่วงระหว่าง -1000 ถึง 1,000 รวมโดยคั่นด้วยตัวคั่น (ช่องว่างหรือเครื่องหมายจุลภาคหรือกึ่งเครื่องหมายโคลอน การตั้งค่าของคุณ]) นี่คือตัวอย่างอินพุต

12,14,16,18       //valid
-3 4 5 1 -2 -4    //valid
45;35;-35         //invalid (only three numbers are present instead of the minimum of 4 numbers)
2,32;21,321       //invalid (it uses two different delimiters: `,` and `;`)

เอาท์พุต

โปรแกรมควรตรวจสอบก่อนว่าอินพุตเป็นความก้าวหน้าทางคณิตศาสตร์หรือไม่

เลขคณิตความก้าวหน้า (AP) สั้น: AP ทุกคนจะมีความแตกต่างกัน นี่คือความแตกต่างระหว่างคำศัพท์ $ n $ และ $ {n-1} $ th (โดยทั่วไป $ a (n + 1) - a (n) $ โดยที่aฟังก์ชันสำหรับ sequnce) ความแตกต่างนี้ยังคงเหมือนเดิมสำหรับมูลค่าใด ๆ ของ $ n $ ใน AP หากไม่มีความแตกต่างทั่วไปนั่นก็ไม่ใช่ลำดับเลขคณิต ในการคำนวณมูลค่าของคำศัพท์ที่ n ให้ใช้สูตรนี้ $ a (n) = a (1) + (n-1) d $ โดยที่ $ a (1) $ เป็นคำแรกและ $ d $ เป็นเรื่องธรรมดา ข้อแตกต่าง

หากไม่ใช่การดำเนินการทางคณิตศาสตร์โปรแกรมควรพิมพ์ข้อความแสดงข้อผิดพลาด "NAAP" (ย่อมาจาก "Not An Progression")

หากเป็นความก้าวหน้าทางเลขคณิตโปรแกรมควรพิมพ์คำศัพท์ n-th ที่เรียบง่ายของลำดับไปยัง STDOUT

ตัวอย่าง:

> 1,3,5,7,9
2n-1

คำอธิบาย: นี่คือ AP เนื่องจากมีความแตกต่างทั่วไป ($ 3 - 1 = 2 $) จากนั้นคุณใช้สูตร $ a (n) = a (1) + (n-1) d $

an=a1+(n1)d

an=1+(n1)2

an=1+2n2

an=2n1

ดังนั้นเอาต์พุตคือ2n-1(สังเกตว่าไม่มีที่ว่าง)


ช่องโหว่มาตรฐานจะไม่ได้รับอนุญาตตามค่าเริ่มต้น

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

กรณีทดสอบ:

1

1,3,5,7,9
2n-1

2

1 3 12312 7 9
NAAP

3

-6;8;22;36;50
14n-20

4

5,1,-3,-7,-11,-15
-4n+9

5

-5,-7,-9,-11,-13,-15
-2n-3

6

3,3,3,3,3,3,3,3,3
0n+3

7

-4,-5,-6,-7
-1n-3

นี่คือเพื่อให้โค้ดที่สั้นที่สุดเป็นไบต์ชนะ! (ขออภัยสำหรับคณิตศาสตร์ที่ไม่ดี -Jax)

ข้อเสนอแนะใด ๆ ยินดีต้อนรับ!


4
คุณควรเก็บโพสต์ของคุณไว้ในกล่องทรายเป็นเวลานานกว่าหนึ่งชั่วโมง ...
Mego

3
หนึ่งชั่วโมงเป็นเวลาสั้น ๆ ไม่ใช่ทุกคนที่ตรวจสอบกล่องทรายอย่างต่อเนื่อง 24 ชั่วโมงเป็นขั้นต่ำที่ดี
Mego

8
ขออภัยแม้ว่า MathJax จะทำงานบน Meta แต่มันไม่ทำงานบนเว็บไซต์ PPCG หลัก ...
ETHproductions

1
คุณควรเพิ่มกรณีทดสอบที่มีลำดับลดลง
lirtosiast

2
มีความก้าวหน้าทางคณิตศาสตร์0,0,0,0และ3,1,-1,-3,-5? ถ้าเป็นเช่นนั้นฉันคิดว่าพวกเขาจะเป็นกรณีทดสอบที่ดี
xnor

คำตอบ:


5

Pyth, 30 ไบต์

?tJ{-VtQQ"NAAP"+hJ%"n%+d"-hQhJ

ชุดทดสอบ

ในการตรวจสอบไม่ว่าจะเป็นขบวนเลขคณิตนี้ใช้เป็นลบ vectorized -VtQQระหว่างแต่ละองค์ประกอบและก่อนหน้านี้ การตรวจสอบแบบไตรภาคจะตรวจสอบว่ามีหลายค่าในผลลัพธ์ ( ?tJ{) และพิมพ์NAAPถ้าใช่หรือไม่ จากนั้นจะได้รับ+หรือ-ขวา mod-formating %+dถูกนำมาใช้


3

Haskell, 103 ไบต์

z=(tail>>=).zipWith
f l@(a:b:_:_:_)|and$z(==)$z(-)l=show(b-a)++'n':['+'|b-a<=a]++show(a+a-b)
f _="NAAP"

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

f [-6,8,22,36,50]   ->   "14n-20"
f [60,70,80,90]     ->   "10n+50"
f [2,3,4,6,7,8]     ->   "NAAP"

เช่นเดียวกับใน Haskell การจัดรูปแบบเอาต์พุตแฟนซี (เช่นการผสมตัวเลขกับสตริง) จะกินจำนวนมาก (ประมาณ 40) ตรรกะของโปรแกรมค่อนข้างกะทัดรัด:

f l@(a:b:_:_:_)           -- pattern match an input list with at least 4 elements,
                          -- call the whole list l, the first two elements a and b
z=(tail>>=).zipWith       -- the helper function z takes a function f and a list l
                          -- and applies f element wise to the tail of l and l

           z(-)l          -- make a list of neighbor differences
     z(==)                -- then compare these differences for equality
 and                      -- and see if only True values occur

       show ...           -- if so format output string

f _="NAAP"                -- in all other cases ( < 4 elements or False values)
                          -- return "NAAP"

2

TI-BASIC, 70 ไบต์

Input X
ΔList(∟X->Y
If variance(Ans
Then
∟X(1)-min(Ans
Text(0,0,min(∟Y),"n",sub("+-",(Ans<0)+1,1),abs(Ans
Else
"NAAP

เพื่อแก้ไขการขาดการแปลงตัวเลขเป็นสตริงแบบ TI-BASIC วิธีนี้จะใช้เอาต์พุตบนกราฟสกรีน ( Text() หากการดำเนินการเป็นแบบเลขคณิต

นี่จะถือว่าตัวเลขลบถูกป้อนโดยใช้อักขระลบสูงของ TI-BASIC (ซึ่งดูเหมือนเล็กน้อย) ไม่ใช่เครื่องหมายลบไบนารี อย่างไรก็ตามเอาต์พุตใช้เครื่องหมายลบไบนารี


2

Japt , 60 52 51 ไบต์

V=N¤£X-NgY+1};W=Vg;Ve_¥W} ?W+'n+'+sU<W +(U-W :"NAAP

ลองออนไลน์!

สามารถป้อนข้อมูลด้วยตัวคั่นใดก็ได้ที่คุณต้องการเนื่องจากเป็นวิธีการออกแบบล่าม;)

Ungolfed และคำอธิบาย

V=N¤  £    X-NgY+1};W=Vg;Ve_  ¥ W} ?W+'n+'+sU<W +(U-W :"NAAP
V=Ns2 mXYZ{X-NgY+1};W=Vg;VeZ{Z==W} ?W+'n+'+sU<W +(U-W :"NAAP

            // Implicit: N = list of inputs, U = first input
V=Ns2       // Set variable V to N, with the first 2 items sliced off,
mXYZ{       // with each item X and index Y mapped to:
X-NgY+1}    //  X minus the item at index Y+1 in N.
            // This results in a list of the differences (but the first item is NaN).
W=Vg;       // Set W to the first item in V (the multiplication part).
VeZ{Z==W}   // Check if every item in V is equal to W.
?W+'n+      // If true, return W + "n" +
'+sU<W      //  "+".slice(U<W) (this is "+" if U >= W, and "" otherwise)
+(U-W       //  + (U minus W [the addition part]).
:"NAAP      // Otherwise, return "NAAP".
            // Implicit: output last expression


1

CJam, 38 ไบต์

{:T2ew::-):U-"NAAP"UW*"n%+d"T0=U+e%+?}

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้อาร์เรย์บนสแต็กเป็นอินพุตและปล่อยให้สตริงบนสแต็กเป็นเอาท์พุท ลองออนไลน์ด้วยรหัส I / O เพิ่มเติมสำหรับการทดสอบ

คำอธิบาย:

:T      Save a copy of input in variable T for output generation.
2ew     Generate list of pairs of sequential elements.
::-     Reduce all pairs with subtraction operator.
)       Pop last value from list of differences.
:U      Save difference value in variable U for output generation.
-       Set difference. This will leave an empty list (falsy) if all values are the same.
"NAAP"  First value for ternary operator, for case where not all values are the same.
UW*     Start generating output for success case. Need to flip sign of difference saved
        in variable U, since it was 1st value minus 2nd, and we need the opposite.
"n%+d"  Push format string for printf operator. The + sign in the format specifies that
        the sign is always generated, saving us from needing different cases for the
        value being negative or positive.
T0=     Extract first value from original input saved in variable T.
U+      Add the difference (with the "wrong" sign) to it.
e%      "printf" operator.
+       Concatenate two parts of result.
?       Ternary operator for picking one of the two output cases.

1

JavaScript (ES6), 91 ไบต์

x=>(s=x.split`,`,m=s[1]-s[0],a=s[0]-m,s.some((n,i)=>n!=m*i+m+a)?"NAAP":m+"n"+(a<0?a:"+"+a))

คำอธิบาย

x=>(
  s=x.split`,`,       // s = array of input numbers
  m=s[1]-s[0],        // m = the multiplication part of the formula
  a=s[0]-m,           // a = the addition part of the formula
  s.some((n,i)=>      // check if the rest of the numbers follow this sequence
    n!=m*i+m+a
  )?"NAAP":
  m+"n"+(a<0?a:"+"+a) // output the formula
)

ทดสอบ

<input type="text" id="input" value="5,1,-3,-7,-11,-15" /><button onclick='result.innerHTML=(

x=>(s=x.split`,`,m=s[1]-s[0],a=s[0]-m,s.some((n,i)=>n!=m*i+m+a)?"NAAP":m+"n"+(a<0?a:"+"+a))

)(input.value)'>Go</button><pre id="result"></pre>


1

Perl 6, 123 102 101 ไบต์

แก้ไข: อย่าปฏิเสธความแตกต่าง

แก้ไข: ใช้ย่อยที่ไม่ระบุชื่อตัวดำเนินการเชิงตรรกะและการแก้ไขสตริง ขอบคุณ Brad Gilbert b2gills

sub{my@b=@_.rotor(2=>-1).map({[-] $_}).squish;$_=@_[0]+@b[0];@b.end&&"NAAP"||"@b[0]n{'+'x($_>=0)}$_"}

โปรแกรมทดสอบ (อ่านจาก stdin):

my $f = <the code above>
$f(split(/<[;,]>/, slurp)).say

คำอธิบาย:

my @b =
  @_.rotor(2=>-1)  # sliding window of 2: (1,2,3,4) => ((1,2),(2,3),(3,4))
  .map({[-] $_})  # calculate difference (subtract all elements and negate)
  .squish;         # remove adjacent elements that are equal

@b.end        # @b.end is last index, @b.end = 0 means @b has only 1 element
&& "NAAP"     # true branch
|| "@b[0]n{'+'x($_>=0)}$_" # string for an+b, 
        # {'+'x($_>=0)} inserts a plus sign using the repetition operator x

sub fโดยปกติคุณจะใช้หนึ่งในรูปแบบการแสดงออกแลมบ์ดาเพื่อให้คุณสามารถลบ นอกจากนี้ถ้าคุณใช้@_แทนคุณ@aจะประหยัดหลายไบต์ {my@b=@_.rotor.... นอกจากนี้คุณไม่ควรใส่ parens รอบ ๆ เงื่อนไขของifstatement นี่ไม่ใช่ Perl 5 ถ้าคุณเปลี่ยนifไป@b.end&&"NAAP"||$_=...คุณจะประหยัดอีกสองสามไบต์ นอกจากนี้คุณยังสามารถทำได้ด้วยifคำสั่งสุดท้ายนั้นหากคุณใช้"@b[0]n{'+'x($_>=0)}$_"แทนการบันทึก 4 ไบต์
Brad Gilbert b2gills

คุณไม่ต้องการsubที่จุดเริ่มต้นโดยที่มันจะกลายเป็นบล็อกที่ไม่ระบุชื่อ อีกอย่างที่คุณรู้ฉันไม่คิดว่า.map({[-] $_})จะใช้».map(*-*).flatซึ่งอาจใช้นานกว่าตอนนี้ฉันต้องผ่านรายการของตัวเองเพื่อดูว่าฉันสามารถย่อให้สั้นลงได้ด้วยเล่ห์เหลี่ยมของคุณหรือไม่
Brad Gilbert b2gills

1

Ruby, 95 78 76 ไบต์

->s{i,j=s;puts s.reduce(:+)==s.size*(s[-1]+i)/2?"%dn%+d"%[v=j-i,i-v]:"NAAP"}

78 ไบต์

->s{puts s.reduce(:+)==s.size*(s[-1]+i=s[0])/2?"%dn%+d"%[v=s[1]-i,i-v]:"NAAP"}

95 ไบต์

->s{puts s.reduce(:+)==s.size*(s[0]+s[-1])/2?"#{v=s[1]-s[0]}n#{"+"if (i=s[0]-v)>0}#{i}":"NAAP"}

Ungolfed:

-> s {
  i,j=s
  puts s.reduce(:+)==s.size*(s[-1]+i)/2?"%dn%+d"%[v=j-i,i-v]:"NAAP"
}

การใช้งาน:

->s{i,j=s;puts s.reduce(:+)==s.size*(s[-1]+i)/2?"%dn%+d"%[v=j-i,i-v]:"NAAP"}[[-6,8,22,36,50]]

=> 14n-20

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