Aritmetik İlerlemeler


11

Senin görevin aritmetik bir dizi ise giriş ve çıkış n-terim için formül analiz, aksi takdirde "NAAP" yazdırmaktır.


Giriş

Girdi (STDIN'den), her bir sayının bir sınırlayıcıyla (boşluk veya virgül veya noktalı virgül [hangisi olursa olsun) -1000 ile 1000 dahil olmak üzere 4 ila 10 sayı arasında birkaç sayıdan oluşur. tercihiniz]). Aşağıda bazı örnek girişler verilmiştir.

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

Çıktı

Program öncelikle girişin aritmetik bir ilerleme olup olmadığını kontrol etmelidir .

Özetle Aritmetik İlerlemeler (AP): Her AP'nin ortak bir farkı olacaktır. Bu, $ n $ ve $ {n-1} $ th terimleri arasındaki farktır (temel olarak $ a (n + 1) - a (n) $; burada asekans işlevi). Bu fark, AP'deki $ n $ değerindeki herhangi bir değer için aynı kalır. Ortak bir fark yoksa, o zaman aritmetik bir dizi değildir . N. Terimin değerini hesaplamak için, $ a (n) = a (1) + (n-1) d $ formülünü kullanın; burada $ a (1) $ ilk terim ve $ d $ ortaktır farkı.

O Eğer değil bir aritmetik ilerlemesi, daha sonra programı ( "Değil bir aritmetik ilerlemesi" için kısa) hata mesajı "NAAP" yazdırmalısınız.

O takdirde ise bir aritmetik ilerlemesi, daha sonra programın STDOUT dizisinin basitleştirilmiş n'inci terimini yazdırmalısınız.

Misal:

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

Açıklama: Bu bir AP çünkü ortak bir fark var ($ 3 - 1 = 2 $). Sonra $ a (n) = a (1) + (n-1) d $ formülünü kullanırsınız.

an=a1+(n1)d

an=1+(n1)2

an=1+2n2

an=2n1

Bu nedenle çıktı 2n-1(boşluk olmadığına dikkat edin)


Standart boşluklara varsayılan olarak izin verilmez.

İsterseniz bir işlev oluşturabilirsiniz (parametreniz olarak sayı dizisiyle). Değilse, girdiyi dize veya dizi olarak alan ve buna göre çıktı veren tam bir program oluşturmanız gerekir .

Test senaryoları:

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

Bu yani bayt kısa kod kazanır! (kötü math-jax için özür dilerim)

Herhangi bir öneri bekliyoruz!


4
Muhtemelen postanızı bir saatten fazla kum havuzunda tutmalısınız ...
Mego

3
Bir saat çok kısa bir zaman. Herkes korumalı alanı sürekli kontrol etmez. 24 saat iyi bir minimumdur.
Mego

8
Maalesef, MathJax Meta'da çalışmasına rağmen, ana PPCG sitesinde çalışmıyor ...
ETHproductions

1
Sekansları azalan test vakaları eklemelisiniz.
lirtosiast

2
Are 0,0,0,0ve 3,1,-1,-3,-5aritmetik ilerlemeler? Eğer öyleyse, iyi bir test örneği olacağını düşünüyorum, çünkü denediğim bir yöntemi kırdılar.
xnor

Yanıtlar:


5

Pyth, 30 bayt

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

Test odası

Bunun aritmetik bir alay olup olmadığını kontrol etmek için, her eleman ile bir önceki arasında vektörize edilmiş bir çıkarma kullanılır -VtQQ. Üçlü, sonuçta ( ?tJ{) birden fazla değer olup olmadığını kontrol eder ve NAAPvarsa yazdırır . Daha sonra, +veya -doğru %+dolanı almak için mod-biçimlendirme kullanılır.


3

Haskell, 103 bayt

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

Kullanım örneği:

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

Haskell'de her zaman olduğu gibi, fantezi çıktı biçimlendirmesi (örneğin, sayıları dizelerle karıştırmak) çok fazla bayt tüketir (yaklaşık 40). Program mantığı oldukça kompakttır:

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 bayt

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'in sayıdan dizeye dönüşüm eksikliğini gidermek için Text(, ilerleme aritmetik ise grafik ekranındaki ( ) çıktıyı kullanır, bu da argümanları otomatik olarak birleştirir.

Bu, negatif sayıların ikili eksi işareti yerine TI-BASIC'in yüksek eksi karakteri (biraz benzeyen ) kullanılarak girildiğini varsayar . Ancak, çıktı ikili eksi işaretini kullanır.


2

Japt , 60 52 51 bayt

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

Çevrimiçi deneyin!

Girdi istediğiniz ayırıcı ile verilebilir, yorumlayıcı bu şekilde tasarlanmıştır;)

Açıklanmamış ve açıklama

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 bayt

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 bayt

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

Bu, yığındaki bir diziyi girdi olarak alan anonim bir işlevdir ve yığında bir dize çıktı olarak bırakır. Test için ek I / O kodu ile çevrimiçi deneyin .

Açıklama:

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

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

açıklama

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
)

Ölçek

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

EDIT: Farkı reddetme

EDIT: anonim alt, mantıksal işleçler ve dize enterpolasyonu kullanın. Thanks Brad Gilbert Instagram Hesabındaki Resim ve Videoları b2gills

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

Test programı (stdin'den okur):

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

Açıklama:

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

Genellikle lambda ifade formlarından birini kullanabilirsiniz, böylece sub f. Ayrıca @_yerine kullandığınız takdirde @abirkaç bayt tasarruf. {my@b=@_.rotor.... Ayrıca bir koşulu etrafında parens koymak olmamalı ifo değiştirdiyseniz açıklamada, bu Perl 5. olmadığı ifiçin @b.end&&"NAAP"||$_=...size birkaç bayt kaydetmek istiyorum. Bunun yerine 4 bayt kaydederek , son ififadeyi de kullanabilirsiniz "@b[0]n{'+'x($_>=0)}$_".
Brad Gilbert b2gills

subBaşlangıçta ihtiyacınız yoktur , bu olmadan anonim bir blok haline gelir. Ayrıca bildiğiniz gibi, .map({[-] $_})muhtemelen ».map(*-*).flatdaha uzun süre kullanacağımı kullanmayı düşünmezdim , şimdi hile ile kısaltıp kısaltamayacağımı görmek için kendi girişlerimi yapmak zorundayım.
Brad Gilbert b2gills

1

Yakut, 95 78 76 bayt

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

78 bayt

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

95 bayt

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

Kullanımı:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.