Kemajuan Aritmatika


11

Tugas Anda adalah menganalisis input dan output rumus untuk istilah ke-n jika itu adalah urutan aritmatika, jika tidak maka harus mencetak "NAAP".


Memasukkan

Input (dari STDIN) akan terdiri dari beberapa angka, antara 4 hingga 10 angka di mana setiap angka akan berada dalam kisaran antara -1000 dan 1000 inklusif, dipisahkan oleh pembatas (spasi atau koma atau titik koma) preferensi Anda]). Berikut adalah beberapa contoh input.

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

Keluaran

Program pertama-tama harus memeriksa apakah input adalah perkembangan aritmatika atau tidak.

Singkatnya, Kemajuan Aritmatika (AP): Setiap AP akan memiliki perbedaan yang sama. Ini adalah perbedaan antara istilah $ n $ dan $ {n-1} $ th (pada dasarnya $ a (n + 1) - a (n) $ di mana afungsi untuk sequnce). Perbedaan ini tetap sama untuk nilai $ n $ dalam suatu AP. Jika tidak ada perbedaan umum, maka itu bukan urutan aritmatika. Untuk menghitung nilai suku ke-n, gunakan rumus ini $ a (n) = a (1) + (n-1) d $ di mana $ a (1) $ adalah suku pertama dan $ d $ adalah umum perbedaan.

Jika itu bukan perkembangan aritmatika, maka program harus mencetak pesan kesalahan "NAAP" (kependekan dari "Bukan An Aritmatika Progresi").

Jika adalah perkembangan aritmatika, maka program harus mencetak term urutan ke-n dari urutan ke STDOUT.

Contoh:

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

Penjelasan: Ini adalah AP karena ada perbedaan umum ($ 3 - 1 = 2 $). Kemudian Anda menggunakan rumus $ a (n) = a (1) + (n-1) d $

Sebuahn=Sebuah1+(n-1)d

Sebuahn=1+(n-1)2

Sebuahn=1+2n-2

Sebuahn=2n-1

Oleh karena itu output 2n-1(perhatikan tidak adanya spasi)


Celah standar tidak diizinkan secara default.

Anda diizinkan untuk membuat fungsi jika Anda mau (dengan array angka sebagai parameter Anda). Jika tidak, maka Anda harus membuat program lengkap yang mengambil input sebagai string atau array dan menghasilkan output yang sesuai.

Kasus uji:

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

Ini adalah sehingga kode terpendek dalam byte menang! (maaf untuk matematika buruk-jax)

Ada saran dipersilahkan!


4
Anda mungkin harus menyimpan posting Anda di kotak pasir selama lebih dari satu jam ...
Mego

3
Satu jam adalah waktu yang sangat singkat. Tidak semua orang memeriksa kotak pasir terus-menerus. 24 jam adalah minimum yang baik.
Mego

8
Maaf, tetapi meskipun MathJax bekerja di Meta, itu tidak berfungsi di situs PPCG utama ...
ETHproduksi

1
Anda harus menambahkan kasus uji dengan urutan menurun.
lirtosiast

2
Apakah 0,0,0,0dan 3,1,-1,-3,-5perkembangan aritmatika? Jika demikian, saya pikir itu akan menjadi kasus uji yang baik, karena mereka melanggar metode yang saya coba.
xnor

Jawaban:


5

Pyth, 30 byte

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

Suite uji

Untuk memeriksa apakah ini prosesi aritmatika, ini menggunakan pengurangan vektor antara setiap elemen dan sebelumnya -VtQQ,. Sebuah ternary memeriksa apakah ada beberapa nilai pada hasilnya ( ?tJ{) dan mencetak NAAPjika demikian. Kemudian, untuk mendapatkan +atau -benar, mod-formating %+ddigunakan.


3

Haskell, 103 byte

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

Contoh penggunaan:

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

Seperti biasa di Haskell, format output yang bagus (mis. Mencampur angka dengan string) memakan banyak byte (sekitar 40). Logika program cukup kompak:

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 byte

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

Untuk memperbaiki kurangnya konversi jumlah-ke-string TI-BASIC, ini menggunakan output pada layar grafik ( Text() jika progresnya adalah aritmatika, yang secara otomatis menggabungkan argumen bersama.

Ini mengasumsikan bahwa angka negatif dimasukkan menggunakan karakter minus-tinggi TI-BASIC (yang agak mirip ), bukan tanda minus biner. Namun, output menggunakan tanda minus biner.


2

Japt , 60 52 51 byte

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

Cobalah online!

Masukan dapat diberikan dengan pemisah mana pun yang Anda suka, karena itulah cara penerjemah dirancang;)

Tanpa penjelasan dan penjelasan

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

Matlab, 103 byte

x=str2num(input('','s'));y=diff(x);if range(y) disp('NAAP'),else fprintf('%gn%+g\n',y(1),x(1)-y(1)),end

1

CJam, 38 byte

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

Ini adalah fungsi anonim yang mengambil array pada stack sebagai input, dan meninggalkan string pada stack sebagai output. Cobalah online dengan kode I / O tambahan untuk pengujian.

Penjelasan:

: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 byte

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

Penjelasan

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
)

Uji

<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 byte

EDIT: Jangan meniadakan perbedaan

EDIT: gunakan sub anonim, operator logis dan interpolasi string. Terima kasih Brad Gilbert b2gills

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

Program tes (dibaca dari stdin):

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

Penjelasan:

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

Biasanya Anda akan menggunakan salah satu dari bentuk ekspresi lambda sehingga Anda dapat menghapus sub f. Juga jika Anda digunakan @_sebagai pengganti @aAnda akan menyimpan beberapa byte. {my@b=@_.rotor.... Juga Anda tidak harus meletakkan parens sekitar kondisi sebuah ifpernyataan, ini bukan Perl 5. Jika Anda mengubah bahwa ifuntuk @b.end&&"NAAP"||$_=...Anda akan menghemat beberapa byte. Anda juga dapat menghapus ifpernyataan terakhir itu jika Anda menggunakannya "@b[0]n{'+'x($_>=0)}$_"sebagai gantinya, menghemat 4 byte.
Brad Gilbert b2gills

Anda tidak perlu subdi awal, tanpa itu menjadi blok anonim. Juga supaya Anda tahu, saya tidak akan berpikir untuk menggunakan .map({[-] $_})saya mungkin akan menggunakan ».map(*-*).flatyang lebih lama, sekarang saya harus melalui entri saya sendiri untuk melihat apakah saya dapat mempersingkat dengan trik Anda.
Brad Gilbert b2gills

1

Ruby, 95 78 76 byte

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

78 byte

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

95 byte

->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"}

Tidak Disatukan:

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

Pemakaian:

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

0

Python 3, 92 byte
Berdasarkan jawaban saya dari Temukan Urutannya

def m(t):s=str;a=t[0];b=t[1];q=b-a;return((s(q)+'n'+'+'*(0<a-q)+s(a-q)),'NAAP')[t[2]/b==b/a]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.