Perbedaan kuadrat dari jumlah


37

Temukan perbedaan antara kuadrat dari jumlah dan jumlah kuadrat.

Ini adalah representasi matematis:

(n)2n2

Program / metode Anda harus mengambil dua input, ini adalah batas bawah dan atas rentang Anda, dan inklusif. Batas akan seluruh bilangan bulat di atas 0.

Program / metode Anda harus mengembalikan jawabannya.

Anda dapat menggunakan basis mana saja yang Anda inginkan, tetapi mohon sebutkan jawaban Anda pada basis mana yang telah Anda gunakan.

Test case (Basis 10)

5,9      970
91,123   12087152
1,10     2640

Ini adalah golf kode biasa, jadi semakin pendek jawabannya semakin baik.


11
Perlu beberapa saat bagi saya untuk menyadari bahwa input adalah titik akhir dari suatu range.
Brad Gilbert b2gills

@ BradGilbertb2gills diedit untuk kejelasan
george

Ini lebih sederhana dari yang terlihat?
kucing

@cat apa maksudmu dengan itu? Ya matematika adalah hal-hal Alevel sederhana. Tapi itu semua tergantung bagaimana Anda bermain golf
george

@george Pertanyaan dan banyak jawaban membuatnya tampak seperti banyak pekerjaan, tetapi tidak
cat

Jawaban:


23

Python 2, 43 byte

f=lambda a,b,s=0:b/a and 2*a*s+f(a+1,b,s+a)

Uji di Ideone .

Bagaimana itu bekerja

Panggil fungsi yang ditentukan dalam spesifikasi g (a, b) . Kami memilikinya

Tentukan fungsi f (x, y, s) secara rekursif sebagai berikut.

Dengan menerapkan relasi rekurensi dari f (a, b, 0) total b - a kali, kita dapat menunjukkannya.

Ini adalah fungsi f pelaksanaan. Sementara b/amengembalikan integer non-nol, kode berikut anddijalankan, sehingga mengimplementasikan definisi rekursif dari f .

Setelah b/amencapai 0 , kita memiliki b> a dan lambda mengembalikan False = 0 , sehingga mengimplementasikan basis kasus dari definisi f .


ah baiklah. Bisakah Anda menjelaskan metode Anda?
george

Ya, tapi saat ini saya mencoba untuk bermain golf sedikit lebih.
Dennis

terima kasih untuk formulanya. Saya kira saya tidak pernah melihatnya seperti itu karena kami tidak membahas jumlah seri seperti itu di sekolah. Cukup menarik!
george

2
@ george Saya sudah menyelesaikan penjelasannya.
Dennis

Ingin memberi tahu kami sedikit lebih banyak tentang bagaimana di dunia ide untuk mendefinisikan f muncul dalam pikiran Anda! Motivasi! Saya benar-benar tertarik.
Musa Al-hassy

15

MATL , 9 byte

&:&*XRssE

Cobalah online!

Penjelasan

&:   % Inclusive range between the two implicit inputs
&*   % Matrix of all pair-wise products
XR   % Upper triangular part of matrix, without the diagonal
ss   % Sum of all elements of the matrix
E    % Multiply by 2. Implicit display

Contoh

Ini adalah hasil parsial dari setiap baris untuk input 5dan 9:

  1. &:

    5 6 7 8 9
    
  2. &:&*

    25 30 35 40 45
    30 36 42 48 54
    35 42 49 56 63
    40 48 56 64 72
    45 54 63 72 81
    
  3. &:&*XR

    0 30 35 40 45
    0  0 42 48 54
    0  0  0 56 63
    0  0  0  0 72
    0  0  0  0  0
    
  4. &:&*XRss

    485
    
  5. &:&*XRssE

    970
    

7
Saya sangat suka melihat hasil parsial. Mereka sangat membantu memahami program. Terima kasih sudah memasukkan mereka!
DanTheMan

10

Jelly, 9 8 byte

rµS²_²S$

Cobalah online!

r         inclusive range from first input to second input
 µ        pass the range to a new monadic chain
  S       the sum
   ²      squared
    _     minus...
     ²S$  the squares summed

Terima kasih kepada FryAmTheEggman untuk satu byte!


3
Sekali ini, Jelly sebenarnya sangat mudah dibaca.
Adám

Bisakah saya membayar jawaban saya?
Leaky Nun

@ LeakyNun apa artinya itu?
Gagang Pintu


6
Anting-anting yang bagus: S²_²S
Thomas Weller

10

Python 2, 45 byte

lambda a,b:(a+~b)*(a-b)*(3*(a+b)**2+a-b-2)/12

Solusi formulir tertutup - bukan yang terpendek, tapi saya pikir akan tetap layak untuk diposkan.

Penjelasan

Membiarkan p(n)menjadi angka piramidal persegi ke- n , dan menjadi angka segitiga ke- n . Kemudian, untuk n pada rentang a , ..., b :t(n)

  • ∑n = t(b)-t(a-1), dan
  • ² n² = p(b) - p(a-1)
  • Jadi (∑ n) ²-∑ n = = (t(b)-t(a-1))² - (p(b) - p(a-1)).

Ungkapan ini mengurangi ke dalam kode.


Hai, bisakah Anda menjelaskan persamaan Anda jika memungkinkan. Versi python saya lebih panjang 16 byte dan saya tidak tahu bagaimana Anda mendapatkan persamaan Anda
george

1
@george Membiarkan p(n)menjadi nomor piramidal kuadratn ke-4 , dan menjadi bilangan segitiga ke - th . Maka ini adalah versi sederhana dari . t(n)n(t(b)-t(a-1))^2 - (p(b) - p(a-1))
Martin Ender

@ MartinEnder Jadi itu rumus tepat yang saya gunakan, tetapi Sp3000 telah menyederhanakannya dengan cara yang tidak bisa saya mengerti. Skrip python saya adalah: (b * - ~ ba * ~ -a) ** 2 / 4- (b * - ~ b * (2 * b + 1) -a * ~ -a * (2 * a-1) ) / 6 jika itu ada gunanya. Saya telah bermain golf sebanyak yang saya bisa dua formula
george

@george Terkadang, dengan masalah seperti ini, cara termudah adalah membuat Wolfram | Alpha melakukan bagian yang membosankan, lalu memeriksa ulang untuk memastikan itu benar. Sejujurnya, saya tidak berpikir saya bisa menarik (a-b-1)faktor keluar (b*(b+1)*(2b+1)-a*(a-1)*(2a-1))/6sendiri.
Sp3000

@ Sp3000 itu cara yang bagus untuk melakukannya. Saya akan mencobanya di masa depan
george

6

05AB1E, 8 byte

ŸDOnsnO-

Dijelaskan

ŸD       # range from a to b, duplicate
  On     # sum and square first range
    s    # swap top 2 elements
     nO  # square and sum 2nd range
       - # take difference

Cobalah online


Apakah 05AB1E versi ROT13 dari Jelly mungkin? Mengganti r dengan Ÿ, µ oleh D, S oleh O, ² oleh n, _ oleh s dan $ oleh -.
Thomas Weller

4
@ ThomasWeller: Mereka sebenarnya sangat berbeda. Offset umum antara beberapa "fungsi" kemungkinan besar adalah kebetulan. Jelly adalah bahasa diam-diam tentang fungsi chaining (afaik), sedangkan 05AB1E adalah bahasa berbasis tumpukan.
Emigna

6

Mathematica, 21 byte

Tr[x=Range@##]^2-x.x&

Fungsi yang tidak disebutkan namanya mengambil dua argumen dan mengembalikan perbedaan. Pemakaian:

Tr[x=Range@##]^2-x.x&[91, 123]
(* 12087152 *)

Ada tiga trik golf kecil (dan cukup standar) di sini:

  • ##mewakili kedua argumen sekaligus, sehingga kita dapat menggunakan notasi awalan untuk Range. Range@##adalah singkatan Range[##]yang meluas ke Range[a, b]dan memberi kami jangkauan inklusif sebagaimana diperlukan.
  • Tradalah untuk melacak tetapi menggunakannya pada vektor hanya menjumlahkan vektor itu, menghemat tiga byte lebih Total.
  • x.xadalah produk titik, menghemat lebih dari empat byte Tr[x^2].

Akan Variancemembantu?
Leaky Nun

@ LeakyNun Saya tidak mengerti caranya, karena salah satu dari dua istilah Varianceini dibagi dengan nyang lain n^2dan saya tidak melihat cara mudah untuk membatalkannya secara terpisah.
Martin Ender

1
Tr@#^2-#.#&@*Rangehanya 18 byte.
Misha Lavrov

@MishaLavrov rapi! Jangan ragu untuk menjadikannya jawaban yang terpisah. :)
Martin Ender

5

Labirin , 28 24 byte

?:?:}+=-:(:(#{:**+**#2/!

Cobalah online!

Penjelasan

Karena loop cenderung mahal di Labyrinth, saya pikir rumus eksplisit harus paling pendek, karena dapat dinyatakan sebagai kode linier.

Cmd Explanation                 Stacks [ Main | Aux ]
?   Read M.                     [ M | ]
:   Duplicate.                  [ M M | ]
?   Read N.                     [ M M N | ]
:   Duplicate.                  [ M M N N | ]
}   Move copy to aux.           [ M M N | N ]
+   Add.                        [ M (M+N) | N ]
=   Swap tops of stacks.        [ M N | (M+N) ]
-   Subtract.                   [ (M-N) | (M+N) ]
:   Duplicate.                  [ (M-N) (M-N) | (M+N) ]
(   Decrement.                  [ (M-N) (M-N-1) | (M+N) ]
:   Duplicate.                  [ (M-N) (M-N-1) (M-N-1) | (M+N) ]
(   Decrement.                  [ (M-N) (M-N-1) (M-N-2) | (M+N) ]
#   Push stack depth.           [ (M-N) (M-N-1) (M-N-2) 3 | (M+N) ]
{   Pull (M+N) over from aux.   [ (M-N) (M-N-1) (M-N-2) 3 (M+N) | ]
:   Duplicate.                  [ (M-N) (M-N-1) (M-N-2) 3 (M+N) (M+N) | ]
*   Multiply.                   [ (M-N) (M-N-1) (M-N-2) 3 ((M+N)^2) | ]
*   Multiply.                   [ (M-N) (M-N-1) (M-N-2) (3*(M+N)^2) | ]
+   Add.                        [ (M-N) (M-N-1) (3*(M+N)^2 + M - N - 2) | ]
*   Multiply.                   [ (M-N) ((M-N-1)*(3*(M+N)^2 + M - N - 2)) | ]
*   Multiply.                   [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)) | ]
#   Push stack depth.           [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)) 1 | ]
2   Multiply by 10, add 2.      [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)) 12 | ]
/   Divide.                     [ ((M-N)*(M-N-1)*(3*(M+N)^2 + M - N - 2)/12) | ]
!   Print.                      [ | ]

Penunjuk instruksi kemudian mencapai jalan buntu dan harus berbalik. Ketika sekarang bertemu /itu mencoba pembagian dengan nol (karena bagian bawah tumpukan secara implisit diisi dengan nol), yang mengakhiri program.


4

Haskell, 34 byte

a#b=sum[a..b]^2-sum(map(^2)[a..b])

Contoh penggunaan: 91 # 123-> 12087152.

Tidak ada yang bisa dijelaskan.


3

Matlab, 30 29 28 byte

Menggunakan ide Suever tentang normmemberi kita 2 byte lebih sedikit

@(x,y)sum(x:y)^2-norm(x:y)^2

Versi lama (sederhana):

@(x,y)sum(x:y)^2-sum((x:y).^2)

3

Oktaf, 27 23 byte

@(x,y)sum(z=x:y)^2-z*z'

Menciptakan fungsi anonim bernama ansyang menerima dua input:ans(lower, upper)

Demo online

Penjelasan

Membuat vektor baris dari xhingga y(inklusif) dan menyimpannya di z. Kami kemudian menjumlahkan semua elemen menggunakan sumdan persegi itu ( ^2). Untuk menghitung jumlah kuadrat, kita melakukan multplikasi matriks antara vektor baris dan transposnya. Ini akan secara efektif menguadratkan setiap elemen dan merangkum hasilnya. Kami kemudian kurangi keduanya.


3

Java, 84 77 karakter, 84 77 byte

7 byte lebih kecil karena Martin Ender dan FryAmTheEggMan, terima kasih.

public int a(int b,int c){int e=0,f=0;for(;b<=c;e+=b,f+=b*b++);return e*e-f;}

Menggunakan tiga test case di pos asli: http://ideone.com/q9MZSZ

Tidak Disatukan:

public int g(int b, int c) {
    int e = 0, f = 0;
    for (; b <= c; e += b, f += b * b++);
    return e*e-f;
}

Prosesnya cukup jelas. Saya mendeklarasikan dua variabel untuk mewakili kuadrat dari jumlah dan jumlah kuadrat dan berulang kali menambahkannya dengan tepat. Akhirnya, saya mengembalikan perbedaan yang dihitung.


Selamat datang di PPCG! Anda mungkin dapat menyimpan byte dengan meletakkannya ++di f+=b*b++(sehingga Anda dapat meninggalkan slot ketiga forkosong) dan Anda juga tidak perlu persegi esebelum mengembalikannya (yaitu lakukan saja return e*e-f).
Martin Ender

Sebenarnya alih-alih meninggalkan slot ketiga yang forkosong, pindahkan bagian f+=b*b++dalamnya, sehingga Anda dapat menghemat titik koma dan kawat gigi.
Martin Ender

Tangkapan hebat @MartinEnder, terima kasih :)
Mario Ishac

Juga berdasarkan apa yang ada dalam pikiran Martin, ini tampaknya sedikit lebih pendek.
FryAmTheEggman

1
Rupanya, komentar terakhir saya salah. Ini sebenarnya adalah bagian khusus dari tata bahasa Jawa: pernyataan akhir untuk adalah sebenarnya jenis pernyataan khusus, yang disebut daftar ekspresi pernyataan. Pernyataan khusus ini dapat memiliki lebih dari satu pernyataan yang diikuti oleh koma. Lihat 14.14.1 (Anda harus menavigasi ke sana sendiri, saya tidak dapat menemukan cara untuk membuat tautan yang lebih tepat) dari spesifikasi bahasa.
FryAmTheEggman


3

JavaScript (ES6), 50 37 byte

f=(n,m,s=0)=>n>m?0:2*n*s+f(n+1,m,n+s)

Sekarang port dari solusi Python @ Dennis ♦.


Coba gunakan n=>m=>eval(`for(s=t=0;n<=m;t+=n++)s+=n*n;t*t-s`)
Mama Fun Roll

@MamaFunRoll Di sisi lain, saya dapat mencoba porting solusi Python Dennis ♦ ...
Neil

3

Faktor, 48 byte

[ [a,b] [ [ sq ] map sum ] [ sum sq ] bi - abs ]

Fungsi anonim.

[ 
  [a,b] ! a range from a to b 
  [ 
    [ sq ] map sum ! anonymous function: map sq over the range and sum the result 
  ] 
  [ sum sq ] ! the same thing, in reverse order
  bi - abs   ! apply both anon funcs to the range, subtract them and abs the result
]

3

Haskell, 36 byte

m#n=sum[2*i*j|i<-[m..n],j<-[i+1..n]]

λ> m # n = sum [ 2*i*j | i <- [m..n], j <- [i+1..n] ]
λ> 5 # 9
970
λ> 91 # 123
12087152
λ> 1 # 10
2640

Catat itu

(k=mnk)2-k=mnk2==k1=mnk2=mk2k1nk1k2=k1=mnk2=k1+1n2k1k2

1
Anda tidak perlu orangtua di sekitar i+1.
Wheat Wizard

2
Juga jika Anda ingin berbicara golf Haskell dan Haskell Anda dapat bergabung dengan kami di ruang obrolan .
Wheat Wizard

3

Perl 6 ,  36 32  31 byte

{([+] $_=@_[0]..@_[1])²-[+] $_»²}
{([+] $_=$^a..$^b)²-[+] $_»²}
{[+]($_=$^a..$^b)²-[+] $_»²}

Menguji

Penjelasan:

{ # bare block with placeholder parameters $a and $b

  [+](# reduce with &infix:<+>
      # create a range, and store it in $_
      $_ = $^a .. $^b
  
  -
  [+] # reduce with &infix:<+>
    # square each element of $_ ( possibly in parallel )
    $_»²
}

Uji:

#! /usr/bin/env perl6
use v6.c;
use Test;

my @tests = (
  (5,9) => 970,
  (91,123) => 12087152,
  (1,10) => 2640,
);

plan +@tests;

my &diff-sq-of-sum = {[+]($_=$^a..$^b)²-[+] $_»²}

for @tests -> $_ ( :key(@input), :value($expected) ) {
  is diff-sq-of-sum(|@input), $expected, .gist
}
1..3
ok 1 - (5 9) => 970
ok 2 - (91 123) => 12087152
ok 3 - (1 10) => 2640

1
Simpan byte memindahkan tugas dan menghindari parens: {$_=$^a..$^b;.sum²-[+] $_»²}
Phil H

1
25 byte: {.sum²-[+] $_»²}o&[..]
nwellnhof

2

Brachylog , 24 byte

:efL:{:2^.}a+S,L+:2^:S-.

Mengharapkan 2 angka dalam Input sebagai daftar, mis [91:123].

Penjelasan

:efL                     Find the list L of all integers in the range given in Input
    :{:2^.}a             Apply squaring to each element of that list
            +S,          Unify S with the sum of the elements of that list
               L+:2^     Sum the elements of L, then square the result
                    :S-. Unify the Output with that number minus S

2

APL, 23 20 byte

-/+/¨2*⍨{(+/⍵)⍵}⎕..⎕

Bekerja di NARS2000.


2

MATL, 11 byte

&:ts2^w2^s-

Cobalah online!

Penjelasan:

&:           #Create a range from the input
  t          #Duplicate it
   s2^       #Sum it and square it
      w      #swap the two ranges
       2^s   #Square it and sum it
          -  #Take the difference

2

Pyth, 11 byte

s*M-F#^}FQ2

Cobalah online!

s*M-F#^}FQ2
       }FQ    Compute the range
      ^   2   Generate all pairs
   -F#        Remove those pairs who have identical elements
 *M           Product of all pairs
s             Sum.

Penggunaan filter yang bagus. Meskipun sudah ada built-in untuk tugas ini:s*M.P}FQ2
Jakube


1

CJam, 17 byte

q~),>_:+2#\2f#:+-

Uji di sini.

Penjelasan

q~       e# Read and evaluate input, dumping M and N on the stack.
),       e# Increment, create range [0 1 ... N].
>        e# Discard first M elements, yielding [M M+1 ... N].
_        e# Duplicate.
:+2#     e# Sum and square.
\2f#:+   e# Swap with other copy. Square and sum.
-        e# Subtract.

Atau, kita bisa menjumlahkan produk dari semua pasangan yang berbeda (pada dasarnya mengalikan kuadrat dari jumlah, dan menghapus kotak), tapi itu satu byte lebih lama:

q~),>2m*{)-},::*:+

1

PowerShell v2 +, 47 byte

Dua variasi

param($n,$m)$n..$m|%{$o+=$_;$p+=$_*$_};$o*$o-$p

$args-join'..'|iex|%{$o+=$_;$p+=$_*$_};$o*$o-$p

Dalam kedua kasus tersebut, kami membuat kisaran dengan ..operator, menyalurkannya ke loop |%{...}. Setiap iterasi, kami mengakumulasikan $odan $psebagai jumlah atau jumlah kuadrat. Kami kemudian menghitung kuadrat-jumlah dengan $o*$odan mengurangi $p. Keluaran ditinggalkan di saluran pipa dan pencetakan tersirat.


1

JavaScript (ES6), 67 byte

a=>b=>([s=q=0,...Array(b-a)].map((_,i)=>q+=(s+=(n=i+a),n*n)),s*s-q)

Test Suite

f=a=>b=>([s=q=0,...Array(b-a)].map((_,i)=>q+=(s+=(n=i+a),n*n)),s*s-q)
e=s=>`${s} => ${eval(s[0])}` // template tag format for tests
console.log(e`f(5)(9)`)
console.log(e`f(91)(123)`)
console.log(e`f(1)(10)`)


1

J, 29 byte

Port of Doorknob's Jelly menjawab .

[:(+/@(^&2)-~2^~+/)[}.[:i.1+]

Pemakaian

>> f = [:(+/@(^&2)-~2^~+/)[}.[:i.1+]
>> 91 f 123x
<< 12087152

Di mana >>STDIN, <<adalah STDOUT, dan xuntuk presisi yang diperluas.


1

Pyke, 11 byte

h1:Ds]MXXs-

Coba di sini!

h1:         - inclusive_range(input)
   Ds]      -     [^, sum(^)]
      MX    -    deep_map(^, <--**2)
         s  -   ^[1] = sum(^[1])
          - -  ^[0]-^[1]

1

Julia, 25 byte

f(a,b,x=a:b)=sum(x)^2-x'x

Ini adalah fungsi yang menerima dua integer dan mengembalikan array integer 1x1.

Pendekatan sederhana: Buatlah UnitRangedari titik akhir adan bdan menyebutnya x, maka jumlah x, persegi itu, dan kurangi norma, yang dihitung sebagai transpose(x) * x.

Cobalah online! (termasuk semua kasus uji)


1
a\b=-(x=a:b)'x+sum(x)^2menghemat beberapa byte.
Dennis

1

TI-BASIC, 19 byte

Prompt N,M
randIntNoRep(N,M
sum(Ans)2-sum(Ans2

randIntNoRepmendapat kisaran (dikocok). Sisanya cukup jelas.


1

Fith , 52 byte

{ 1 + range dup sum 2 pow swap { 2 pow } map sum - }

Ini adalah fungsi anonim yang mengambil dua angka di tumpukan dan meninggalkan satu nomor.

Penjelasan:

{
    1 + range dup      2 ranges from a to b inclusive
    sum 2 pow          Sum one and square it
    swap               Bring a fresh range to the top
    { 2 pow } map sum  Square every element and sum the list
    -                  Subtract
}

1
Jika Anda menyukai postfix, point-free dan stack fungsional berbasis prorgamming Anda mungkin menyukai Factor : D
kucing

1

GeoGebra, 91 byte

a(x)=(x²+x)/2
b(x)=x³/3+x²/2+x/6
c(x,y)=(a(y)-a(x))²
d(x,y)=b(y)-b(x)
c(x-1,y)-d(x-1,y)

Menentukan fungsi (mungkin e(x,y)) yang menghitung perbedaan yang diinginkan.
a(x)menghitung jumlah bilangan asli antara 0dan x.
b(x)menghitung jumlah kuadrat dari bilangan asli antara 0dan x.
c(x,y)pertama menghitung jumlah bilangan asli antara xdan y, lalu kuadratkan jumlah itu.
d(x,y)menghitung jumlah kuadrat antara b(x)dan b(y).
Baris terakhir mendefinisikan fungsi multi-variabel yang menyelesaikan perhitungan. Fungsi secara otomatis diberi nama, menyimpan beberapa byte.


Hai, bagaimana saya memanggil fungsi yang didefinisikan ini? Saya dapat mengetahui input di geogebra.org/classic#cas , tetapi tidak dapat menemukan cara menemukan atau memanggil fungsi terakhir.
sundar - Reinstate Monica

@sundar: Baris terakhir adalah ekspresi dalam x dan y. Kita bisa menambahkan e(x,y)=untuk memberinya nama, tetapi untuk menyimpan byte, kita tidak di sini. GeoGebra secara otomatis memberikan ekspresi sebuah nama (mungkin e, karena itulah huruf yang tersedia berikutnya) Saya tidak memiliki lingkungan yang tersedia saat ini, tetapi saya tidak akan menggunakan panel CAS. Panel aljabar dan bilah masukan harus melakukan pekerjaan dengan benar. (Sudah lama sejak saya menggunakan GGb online; gambar mental saya mungkin sudah ketinggalan zaman.)
Joe
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.