Menyamakan array

26

Tantangan

Anda diberi array dari integer. Dengan gerakan, Anda dapat menambah atau mengurangi elemen array sebanyak 1 . Tugas Anda adalah untuk menyamakan array, yaitu membuat semua elemen array sama dengan melakukan beberapa gerakan . Tapi itu tidak cukup! Anda juga ingin membuat gerakan sesedikit mungkin .Sebuah

Memasukkan

  • Sebuah non-kosong array yang bilangan bulatSebuah
  • Opsional, panjang dari .Sebuah

Keluaran

  • The jumlah minimum bergerak dibutuhkan untuk menyamakan array .Sebuah

Aturan

  • Aturan standar untuk pengiriman yang valid , I / O , celah berlaku.
  • Ini adalah , sehingga solusi terpendek (dalam byte) menang. Seperti biasa, jangan biarkan solusi yang sangat pendek dalam bahasa golf mencegah Anda untuk mengirim jawaban yang lebih panjang dalam bahasa pilihan Anda.
  • Ini bukan aturan, tetapi jawaban Anda akan lebih baik diterima jika itu termasuk tautan untuk menguji solusi dan penjelasan tentang cara kerjanya.

Contohnya

Input                       --> Output

[10]                        --> 0
[-1, 0, 1]                  --> 2
[4, 7]                      --> 3
[6, 2, 3, 8]                --> 9
[5, 8, 12, 3, 2, 8, 4, 5]   --> 19
[1,10,100]                  --> 99
Delfad0r
sumber

Jawaban:

9

Bahasa Wolfram (Mathematica) , 19 byte

Tr@Abs[#-Median@#]&

Cobalah online!

Untuk array integer 1D, Trbekerja dengan cara yang sama dengan Total.

Bagaimana?

Aplikasi sederhana ketimpangan segitiga.

...

Saya awalnya bermaksud untuk menulis buktinya di sini, tetapi kemudian memutuskan untuk mencari /math/ sebagai gantinya dan menemukan Median Meminimalkan Jumlah Penyimpangan Absolut ( Norma )L.1 .

Dengan mengetahui nama operator, ini adalah solusi alternatif 19-byte:

Norm[#-Median@#,1]&
pengguna202729
sumber
Komentar acak: Medianagak terlalu sulit untuk beberapa bahasa esoteris.
user202729
1
Melihat sekeliling sedikit, satu-satunya penyerahan dalam bahasa esoteris dalam tantangan "compute the median" adalah WW-Brain-Flak WW .
user202729
8

JavaScript (Node.js) , 50 48 byte

Disimpan 2 byte berkat Arnauld

a=>a.sort((x,y)=>x-y,r=0).map(n=>r+=a.pop()-n)|r

Cobalah online!

Sortir array yang naik kemudian jumlah:

  a[last]   -a[0] // moves to equalise this pair
+ a[last-1] -a[1] // + moves to equalise this pair
+ ...etc
James
sumber
1
Yang bagus! Anda dapat menyimpan 2 byte dengan a=>a.sort((x,y)=>x-y).map(n=>r+=a.pop()-n,r=0)|r.
Arnauld
6

05AB1E , 4 byte

ÅmαO

Cobalah online!

Penjelasan

Åm     # push median of input
  α    # absolute difference with each in input
   O   # sum
Emigna
sumber
Median! Itulah kata yang saya cari! ZL€αOWadalah usaha saya ._.
Magic Gurita Guci
6

Perl 6 , 29 28 byte

-1 byte terima kasih kepada nwellnhof

{sum (.sort[*/2]X-$_)>>.abs}

Cobalah online!

Penjelasan

{                          }  # Anonymous code block
      .sort[*/2]              # Get the median of the input array
                X-$_          # Subtract all elements from the median
     (              )>>.abs   # Get the absolute of each value
 sum                          # Sum the values
Jo King
sumber
1
Anda dapat menukar X-operan untuk menghemat satu byte.
nwellnhof
5

Japt, 7 byte

£xaXÃrm

Cobalah


Penjelasan

            :Implicit input of array U
£           :Map each X
  aX        :  Absolute difference between X and each element in U
 x          :  Reduce by addition
    Ã       :End map
     rm     :Reduce by minimum
Shaggy
sumber
5

JavaScript (ES6), 60 56 55 byte

Disimpan 1 byte berkat @Shaggy

a=>a.map(r=k=>r=a.map(n=>m+=n>k?n-k:k-n,m=0)|m>r?r:m)|r

Cobalah online!

Bagaimana?

Kecuali ada beberapa trik yang saya lewatkan, menghitung median di JS ternyata lebih lama. Mungkin sekitar 65 byte karena panggilan balik yang diperlukan untuk sort()menghindari jenis leksikografis default dan yang agak panjang Math.abs():

a=>a.sort((a,b)=>b-a).map(n=>s+=Math.abs(n-a[a.length>>1]),s=0)|s

Alih-alih itu, kami mencoba semua nilai dalam array asli sebagai nilai penyamaan .

Arnauld
sumber
-2 byte dengan mendeklarasikan rdalam yang pertama map.
Shaggy
5

Haskell , 34 byte

f l=minimum[sum$abs.(m-)<$>l|m<-l]

Cobalah online!

Menemukan jarak total semua elemen ke median, menguji setiap elemen dalam daftar sebagai median potensial dan mengambil hasil terkecil.

Tidak
sumber
4

Jelly , 4 byte

ạÆṁS

Cobalah online!

Bagaimana itu bekerja

ạÆṁS – Full program. Takes an array A of integers as input from argument 1.
 Æṁ  – Median. For odd-length A, middle element of S. For even-length A, the
       arithmetic mean of the two middle elements of S. Where S = A sorted.
ạ    – Absolute difference of each element with the median.
   S – Sum.
Tuan Xcoder
sumber
4

Python 2 , 46 byte

lambda l,n:sum(l[-~n/2:l.sort()])-sum(l[:n/2])

Cobalah online!

Mengambil panjang daftar nsebagai argumen. Menghitung jumlah setengah bagian atas dikurangi jumlah bagian bawah dengan mengiris daftar yang diurutkan menjadi elemen pertama n/2dan terakhir n/2.

Ekspresi l[-~n/2:l.sort()]sama dengan komputasi l.sort(), yang mengubah daftar di tempat, lalu melakukan l[-~n/2:None], di mana pengirisan daftar mengabaikan batas atas Noneyang l.sort()dihasilkan. Ini mungkin tampak seperti daftar diurutkan terlambat untuk diiris dengan benar, tetapi Python tampaknya mengevaluasi argumen slice sebelum "mengunci" daftar yang akan diiris.


Python 2 , 47 byte

lambda l,n:sum(abs(x-sorted(l)[n/2])for x in l)

Cobalah online!

Metode membosankan menjumlahkan jarak setiap nilai dari median. Membawa panjang nsebagai argumen.


Python , 51 byte

f=lambda l:l>l[l.sort():1]and l[-1]-l[0]+f(l[1:-1])

Cobalah online!

Urutkan daftar pada tempatnya, lalu berulang kali menambahkan entri terakhir (sisa tertinggi) dikurangi entri pertama (sisa terendah), dan berulang pada daftar tanpa elemen-elemen ini sampai hanya 0 atau 1 yang tersisa. Usings pop's mendapat panjang yang sama: l.pop()-l.pop(0)+f(l).

The l.sort()terjebak di tempat di mana Noneia mengembalikan tidak berpengaruh. Irisan l[None:1]sama dengan l[:1]karena Noneirisan irisan diabaikan.


Python , 54 byte

lambda l:sum(l.pop()-l.pop(0)for _ in l[1:l.sort():2])

Cobalah online!

Pemahaman daftar lucu yang mengabaikan argumen yang berulang dan mengubah daftar di tempat dengan berulang kali muncul elemen pertama dan terakhir. Kami memastikan bahwa pemahaman daftar dilakukan beberapa len(l)//2kali dengan mengulangi setiap elemen lainnya dari lmelewatkan yang pertama, selesai dengan l[1::2]. The l.sort()memproduksi Nonedapat terjebak dalam terpakai argumen slice akhir.

Tidak
sumber
4

APL (Dyalog), 12 byte

{⌊/+/|⍵∘.-⍵}

Brute paksa dengan menguji setiap angka sebagai equalizer. Tidak yakin apakah diam-diam lebih pendek, tapi saya tidak bisa mengetahuinya.

TIO

Quintec
sumber
4

TI-Basic, 18 6 byte

sum(abs(Ans-median(Ans

-12 byte dari Misha Lavrov (saya belum pernah menggunakan TI-Basic untuk sementara waktu dan saya lupa daftar itu bisa melakukannya)

TI-Basic adalah bahasa tokenized . Semua token yang digunakan dalam jawaban ini adalah satu byte.

Mengambil input sebagai {1,2,3,4}:prgmNAME

Ide dasarnya sama dengan sebagian besar jawaban lain: kurangi dengan median, lalu ambil jumlah.

Penjelasan:

sum(abs(Ans-median(Ans
sum(                    # 1 byte, Add up:
    abs(                # 1 byte, the absolute values of
        Ans-median(Ans  # 4 bytes, the differences between each element and the list's median
pizzapants184
sumber
1
sum(abs(Ans-median(Ansjuga berfungsi. (Dan "TI-84 Plus CE" tampaknya terlalu spesifik; ini akan bekerja setidaknya pada kalkulator 83-seri, dan mungkin juga 73 dan 82.)
Misha Lavrov
3

Rosda , 33 byte

{|a|a|abs _-[sort(a)][#a//2]|sum}

Cobalah online!

Penjelasan:

{|a| /* Anonymous function with parameter a */
  a|         /* Push items in a to the stream */
             /* For each _ in the stream: */
  abs        /*   Abstract value of */\
  _-         /*   the value from stream minus */\
  [sort(a)][ /*     the value in the sorted version of a at index */
    #a//2    /*       length of a / 2 (the median) */
  ]|
  sum        /* Sum of all values in the stream */
}
fergusq
sumber
1

Attache , 18 byte

Sum##Abs@`-#Median

Cobalah online!

Penjelasan

Sum##Abs@`-#Median
            Median    take the median of the input list
     Abs@`-#          absolute difference with the original list
Sum##                 sum of all elements
Conor O'Brien
sumber
1

J , 15 byte

[:<./1#.|@-/~"{

Pada dasarnya sama dengan solusi Shaggy Japt.

Cobalah online!

Bagaimana itu bekerja?

|@-/~"{- Membuat tabel /~perbedaan absolut |@-dari setiap angka dengan yang lainnya"{

   |@-/~"{ 6 2 3 8
0 4 3 2
4 0 1 6
3 1 0 5
2 6 5 0

1#. jumlah setiap baris

   1#.|@-/~"{ 6 2 3 8
9 11 9 13

[:<./ menemukan item terkecil (dikurangi minimum)

   ([:<./1#.|@-/~"{) 6 2 3 8
9
Galen Ivanov
sumber
1

Arang , 16 11 byte

I⌊EθΣEθ↔⁻ιλ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 5 byte berkat @Arnauld. Penjelasan:

  Eθ        Map over input array
     Eθ     Map over input array
         ι  Outer value
          λ Inner value
        ⁻   Difference
       ↔    Absolute value
    Σ       Sum
 ⌊          Minimum
I           Cast to string
            Implicitly print
Neil
sumber
Ini harus bekerja selama 11 byte.
Arnauld
@Arnauld Ah, tentu saja, untuk array panjang ganjil, median selalu menjadi anggota array, dan untuk array panjang genap, jumlahnya sama untuk semua nilai antara dan termasuk dua tengah. Terima kasih!
Neil
1

Visual C #, 138 byte

int s=0;foreach(string i in a)s+=int.Parse(i);int x=s/a.Length;int o=0;foreach(string i in a)o+=Math.Abs(int.Parse(i)-x);Console.Write(o);

ungolfed:

int s = 0;                    // Takes a string array of arguments a as input
foreach (string i in a)       
     s += int.Parse(i);       // s as sum of the array elements
int x = s / a.Length;         // calculating the target value of all elements
int o = 0;                    // o as minimum number of moves
foreach (string i in a)
     o += Math.Abs(int.Parse(i) - x);    // summing up the moves to the target value
Console.Write(o);

Cobalah online!

pengguna51497
sumber
Kode ini gagal pada TIO untuk [1,10,100]. Ini mengembalikan 126 bukannya 99.
Meerkat
1

C (gcc), 100 93 byte

e(q,u,a,l,i,z)int*q;{i=1<<31-1;for(a=u;a--;i=z<i?z:i)for(l=z=0;l<u;)z+=abs(q[l++]-q[a]);q=i;}

Solusi brute-force, mencoba menyamakan dengan masing-masing elemen. Cobalah online di sini .

Berkat ceilingcat untuk bermain golf 7 byte.

Tidak Disatukan:

e(q, u, a, l, i, z) int *q; { // function taking an array of int and its length; returns an int (extra parameters are variables and don't have to be passed when calling e())
    i = 1 << 31 - 1; // construt the maximum value of a signed 4-byte integer
    for(a = u; a--; i = z < i ? z : i) // loop through the array, testing each element as the equalizer; if the number of moves is smaller than the current minimum, set it as the new minimum
        for(l = z = 0; l < u; ) // loop through the array ...
            z += abs(q[l++] - q[a]); // ... and sum the number of moves it takes to equalize each element
    q = i; // return the minimum number of moves
}
Ketidakseimbangan
sumber
1

PHP, 78 byte

Urutkan array, lalu loop melalui salinan, popping elemen dari yang asli dan menjumlahkan perbedaan absolut, yang perlu dibelah dua untuk pengembalian.

function m($n){sort($n);foreach($n as$i)$r+=abs(array_pop($n)-$i);return$r/2;}

var_dump(
    m([10]),
    m([-1, 0, 1]),
    m([4, 7]),
    m([6, 2, 3, 8]),
    m([5, 8, 12, 3, 2, 8, 4, 5]),
    m([1,10,100])
);

Keluaran:

int(0)
int(2)
int(3)
int(9)
int(19)
int(99)
Progrock
sumber
1

PHP, 69 byte

function($a,$c){for(sort($a);$c-->$d;)$s+=$a[$c]-$a[+$d++];return$s;}

fungsi anonim. Cobalah online .

Titus
sumber
@Progrock Input: *) A non-empty array a of integers *) Optionally, the length of a.
Titus
@Progrock Post-decrement melakukan trik yang sama. Tapi terima kasih atas petunjuknya.
Titus
-1

Java (JDK), 112 byte

Golf

private static int e(int[]a){int s=0;for(int i:a){s+=i;}s/=a.length;int r=0;for(int i:a){r+=abs(s-i);}return r;}

Tidak disatukan

private static int equalize(int[] array) {
    int sum = 0;
    for (int i : array) {
        sum += i;
    }
    sum /= array.length;
    int ret = 0;
    for (int i : array) {
        ret += abs(sum-i);
    }
    return ret;
}
Jaden Lee
sumber
1
Selamat datang di PPCG! Sayangnya, solusi Anda gagal untuk input [1,1,4](mengembalikan 4, tetapi jawabannya adalah 3).
Delfad0r
1
Catatan yang sepertinya menggunakan rata - rata array, bukan median
Jo King
-1

Android Kotlin, 200 byte

fun m(a:IntArray){var d=0;var s=0;var p=a.max()!!.times(a.size);var x =0;for(i in a.indices){x=a[i];d=0;s=0;while(d<a.size){if(x-a[d]<0)s=((x-a[d])*-1)+s;else s=((x-a[d]))+s;d++};if(p>s)p=s};print(p)}

Coba Online

Syed Hamza Hassan
sumber
Perhatikan bahwa input melalui variabel yang dideklarasikan sebelumnya tidak diperbolehkan. Selain itu, Anda dapat mempersingkat nama variabel Anda sedikit
Jo King
tentu, saya akan segera melakukannya.
Syed Hamza Hassan