Perbedaan N

26

Dalam matematika, salah satu cara untuk mencari tahu apa jenis hubungan yang diberikan (linear, kuadratik, dll) adalah menghitung perbedaan. Untuk melakukannya, Anda mengambil daftar nilai y yang selisih antara nilai x koresponden sama, dan kurangi masing-masing dari angka di atasnya, buat daftar angka yang lebih pendek dari daftar sebelumnya. Jika daftar yang dihasilkan sepenuhnya terdiri dari angka yang sama, maka hubungannya memiliki perbedaan 1 (itu linier). Jika tidak identik, maka Anda ulangi proses pada daftar baru. Jika mereka sekarang identik, hubungannya memiliki perbedaan 2 (kuadrat). Jika tidak identik, Anda cukup melanjutkan proses ini sampai benar. Misalnya, jika Anda memiliki daftar nilai y [1,6,15,28,45,66] untuk peningkatan nilai x secara bertahap:

First Differences:

1
6   1-6  =-5
15  6-15 =-9
28  15-28=-13
45  28-45=-17
66  45-66=-21

Second differences:

-5 
-9  -5+9  =4
-13 -9+13 =4
-17 -13+17=4
-21 -17+21=4

As these results are identical, this relation has a difference of 2

Tugas Anda:

Tulis program atau fungsi yang, ketika diberi array bilangan bulat sebagai input, mengembalikan perbedaan hubungan yang dijelaskan oleh array, seperti dijelaskan di atas.

Memasukkan:

Array bilangan bulat, yang panjangnya bisa> 1.

Keluaran:

Integer mewakili perbedaan hubungan yang dijelaskan oleh input.

Kasus uji:

Input                            => Output
[1,2,3,4,5,6,7,8,9,10]           => 1
[1,4,9,16,25,36]                 => 2
[1,2,1]                          => 2 (when there is only one value left, all values are automatically identical, so the largest difference an array can have is equal to the length of the array-1)
"Hello World"                    => undefined behavior (invalid input)
[1,1,1,1,1,1,1,1,1]              => 0 (all elements are already identical)
[1, 3, 9, 26, 66, 150, 313, 610] => 6

Mencetak:

Ini adalah , skor terendah dalam byte di setiap bahasa menang untuk bahasa itu. Skor terendah secara keseluruhan mendapat tanda centang hijau.

Gryphon - Pasang kembali Monica
sumber
Dapatkah input menjadi "tidak valid" seperti pada, jika inputnya adalah TIDAK sesuai dengan spesifikasi yang disediakan, haruskah kita melakukan kesalahan? Berikan -1 sebagai output?
Magic Gurita Guci
Perilaku tidak ditentukan untuk input yang tidak valid (Saya tidak peduli apa kode Anda)
Gryphon - Reinstate Monica
Bukankah seharusnya [1,2,1]memberi 2? [1,2,1] -> [1,-1] -> [-2]
HyperNeutrino
@HyperNeutrino, ya, maaf. Saya punya otak-kentut di sana
Gryphon - Reinstate Monica
Tambahkan test case ini [1,3,9,26,66,150,313,610]-> 6jika Anda suka
J42161217

Jawaban:

10

Sekam , 6 byte

Terima kasih Leo karena telah mengizinkan saya menggunakan versinya yang berfungsi[1,1,1,1,1,1]

←VE¡Ẋ-

Cobalah online!

Penjelasan

   ¡     Repeatedly apply function, collecting results in a list
    Ẋ-     Differences
 VE      Get the index of the first place in the list where all the elements are equal
←        Decrement
H.Piz
sumber
2
Setiap kali seseorang mengatakan Sekam adalah Jelly baru, mereka benar-benar sangat tepat. > _ <
Zacharý
Sial, aku akan memposting ini . Kerja bagus, +1!
Leo
@ Leo, test case yang tidak saya lihat [1,1,1,1], bisakah saya menggunakan milik Anda?
H.PWiz
@ H.Piz, tentu saja!
Leo
7

JavaScript (ES6), 47 byte

f=a=>-a.every(x=>i=!x)||1+f(a.map(n=>n-a[++i]))

Uji kasus

Arnauld
sumber
7

MATL , 8 byte

`dta}x@q

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Ini memaksa perbedaan berturut-turut secara iteratif hingga hasilnya nol atau kosong. Outputnya adalah jumlah iterasi yang diperlukan minus 1.

`      % Do... while
  d    %   Consecutive diffferences. Takes input (implicitly) the first time
  t    %   Duplicate
  a    %   True if any element is nonzero. This is the loop condition
}      % Finally (execute before exiting the loop)
  x    %   Delete. This removes the array of all zeros
  @    %   Push iteration index
  q    %   Subtract 1. Implicitly display
       % End (implicit). Proceed with next iteration if top of the stack is true
Luis Mendo
sumber
7

R , 50 44 byte

function(l){while(any(l<-diff(l)))F=F+1
F*1}

Cobalah online!

Dibawa diffdari l, set ke l, dan periksa apakah hasilnya mengandung nilai bukan nol. Jika tidak, kenaikan F(diinisialisasi sebagai FALSEimplisit), dan kembali F*1untuk mengkonversi FALSEke 0dalam hal semua lidentik sudah.

Giuseppe
sumber
Program dan +Ftrik penuh untuk 5 byte . Jawaban rapi btw!
JayCe
5

Mathematica, 49 byte

(s=#;t=0;While[!SameQ@@s,s=Differences@s;t++];t)&  

thanx @alephalpa untuk -6 byte dan @hftf -1 byte

dan berikut adalah pendekatan lain dari @hftf

Mathematica, 49 byte

Length@NestWhileList[Differences,#,!SameQ@@#&]-1&
J42161217
sumber
(s=#;t=0;While[UnsameQ@@s,s=Differences@s;t++];t)&
alephalpha
1
UnsameQ[1,2,1]itu salah; !SameQ[1,2,1]adalah benar. Saya tidak berpikir loop manual menyimpan karakter baik: Length@NestWhileList[Differences,#,!SameQ@@#&]-1&sudah sama panjang dengan milik Anda setelah diganti UnsameQdengan !SameQ.
hftf
4

Jelly , 7 byte

-Iß$E?‘

Cobalah online!

Penjelasan

-Iß$E?‘  Input: array A
     ?   If
    E    All elements are equal
         Then
-          Constant -1
         Else
   $       Monadic chain
 I           Increments
  ß          Recurse
      ‘  Increment
mil
sumber
Alternatif non-rekursif:IÐĿE€ċ0
Erik the Outgolfer
4

Japt , 10 7 byte

è@=ä-)d

Cobalah online!

Bergantung pada kenyataan bahwa hasilnya dijamin berada dalam panjang array input.

Penjelasan

è@=ä-)d     Implcit input of array U
 @          For each value in U...
  =ä-)      Update U to be equal to its subsections, each reduced by subtraction
      d     Check if any values in that are truthy
è           Count how many items in that mapping are true

Pada akhirnya, ini akan memetakan array
[1, 3, 9, 26, 66, 150, 313, 610]ke [true, true, true, true, true, true, false, false],
yang berisi 6 trues.

Versi 10 byte sebelumnya

@=ä-)e¥0}a

Cobalah online!

Justin Mariner
sumber
4

Perl 6 , 37 byte

{($_,{@(.[] Z- .[1..*])}...*.none)-2}

Cobalah online!

Penjelasan: Fungsi ini mengambil input sebagai satu daftar. Itu kemudian membangun urutan rekursif seperti ini: elemen pertama adalah daftar asli ( $_), elemen berikutnya dikembalikan dengan {@(@$_ Z- .[1..*])}dipanggil pada elemen sebelumnya, dan itu diulangi hingga kondisinya *.nonebenar, yang terjadi hanya ketika daftar tersebut baik kosong atau hanya berisi nol (atau, secara teknis, nilai falsey lainnya). Kami kemudian mengambil daftar dan mengurangi 2 dari itu, yang memaksanya pertama kali ke konteks numerik (dan daftar dalam konteks numerik sama dengan jumlah elemen mereka) dan, pada akhirnya, mengembalikan 2 kurang dari jumlah elemen dalam daftar.

Blok aneh {@(@$_ Z- .[1..*])}hanya mengambil daftar yang diberikan ( .[]- yang disebut Zen slice - pengindeksan dengan tanda kurung kosong menghasilkan seluruh daftar), zip menggunakan operator minus ( Z-) dengan daftar yang sama tanpa elemen pertama ( .[1..*]) dan memaksanya ke daftar ( @(...)- kita memerlukannya karena zip hanya mengembalikan Seq, yang pada dasarnya adalah daftar satu arah yang dapat diulangi sekali saja, yang merupakan sesuatu yang tidak kita sukai.) Dan itu saja.

Ramillies
sumber
Mengubah @(.[] Z- .[1..*])ke [.[] Z-.[1..*]]harus menyimpan dua byte.
nwellnhof
4

Java 8, 191 + 58 = 249 198 140 byte.

Terima kasih PunPun1000 untuk 51 byte.
Terima kasih Nevay untuk 58 byte.

int f(int[]a){int x=a.length-1,b[]=new int[x];for(;x-->0;)b[x]=a[x+1]-a[x];return java.util.Arrays.stream(a).distinct().count()<2?0:1+f(b);}

Cobalah secara Online!

Cobalah Online (versi 198 byte)

Jadi, ini adalah pertama kalinya saya memposting di sini di PPCG (dan pertama kali melakukan tantangan kode golf). Setiap kritik yang membangun disambut dan dihargai. Saya mencoba mengikuti panduan untuk memposting, jika ada yang tidak beres, silakan tunjukkan.

Versi dipercantik:

int f(int[] a) {
    int x = a.length - 1, b[] = new int[x];
    for (; x-- > 0;) {
        b[x] = a[x + 1] - a[x];
    }
    return java.util.Arrays.stream(a).distinct().count() < 2 ? 0 : 1 + f(b);
}
J. Sallé
sumber
3
Selamat datang di situs ini!
DJMcMayhem
Alih-alih mengimpor modul-modul itu Anda hanya dapat menggunakanjava.util.stream.IntStream k = java.util.Arrays.stream(a);
PunPun1000
Bahkan, ada beberapa perubahan yang dapat Anda lakukan secara gratis. 1) publictidak perlu dimasukkan dalam hitungan byte. 2) Anda seharusnya tidak menerima parameter kedua, tetapi menghapusnya sebenarnya dapat menghemat byte. 3) Anda dapat menghapus beberapa tanda kurung yang tidak dibutuhkan di sana
PunPun1000
4) Bukan penghemat tetapi Anda harus menyertakan TIO jika memungkinkan, berikut adalah contoh dengan saran tersebut pada 198 byte TIO
PunPun1000
1
140 bytes
Nevay
3

Haskell, 46 byte

g l|all(==l!!0)l=0|0<1=1+g(zipWith(-)l$tail l)

ini hanya berulang - zipWith(-)l$last ladalah daftar perbedaan l. dan gadalah fungsi yang menjawab pertanyaan.

haskeller bangga
sumber
solusi rekursif adalah yang baik.
jferard
@ jferard itu sangat benar
haskeller bangga
3

Kotlin , 77 byte

posting pertama, mencoba mengedit jawaban terakhir di kotlin 2 kali; D

{var z=it;while(z.any{it!=z[0]})z=z.zip(z.drop(1),{a,b->a-b});it.size-z.size}

mengambil bagian pengujian dari @jrtapsell

TryItOnline

cab404
sumber
Selamat datang di PPCG! Jawaban pertama yang bagus, outgolf juga.
H.PWiz
3

APL (Dyalog Classic) , 22 17 byte

{1=≢∪⍵:01+∇2-/⍵}

Cobalah online!

Terima kasih kepada @ngn untuk -5 byte!

Bagaimana?

  • { ... }, fungsinya
  • 1=≢∪⍵:0, jika setiap elemen sama dalam argumen, kembali 0
  • 1+∇2-/⍵, jika tidak, kembalikan 1+ ndari perbedaan (yaitu n-1, dengan demikian menambahkan satu ke dalamnya memberi n)
Zacharý
sumber
lebih pendek jika Anda mengorbankan kekambuhan ekor:{1=≢∪⍵:0⋄1+∇2-/⍵}
ngn
2

Jelly , 7 byte

IÐĿEÐḟL

Cobalah online!

Penjelasan

IÐĿEÐḟL  Main link
 ÐĿ      While results are unique (which is never so it stops at [])
I        Take the increments, collecting intermediate values # this computes all n-th differences
    Ðḟ   Filter out
   E     Lists that have all values equal (the first n-th difference list that is all equal will be removed and all difference lists after will be all 0s)
      L  Take the length (this is the number of iterations required before the differences become equal)

-1 byte terima kasih kepada Jonathan Allan

HyperNeutrino
sumber
1
@Gryphon Selesai! :)
HyperNeutrino
IÐĿEÐḟLselama tujuh (saya melihat Miles juga menemukan tujuh menggunakan rekursi).
Jonathan Allan
@ Jonathan Allan Keren terima kasih!
HyperNeutrino
2

05AB1E , 7 byte

[DË#¥]N

Cobalah online!

Penjelasan

[         # start loop
 D        # duplicate current list
  Ë       # are all elements equal?
   #      # if so, break
    ¥     # calculate delta's
     ]    # end loop
      N   # push iteration counter
Emigna
sumber
2

JavaScript (ES6), 58 byte

f=a=>+(b=a.slice(1).map((e,i)=>e-a[i])).some(e=>e)&&1+f(b)
Neil
sumber
+0, tidak cukup Jquery: p. Sungguh, +1, pekerjaan yang bagus, saya tahu saya tidak akan pernah bisa bermain golf di JS.
Zacharý
2

Python 2 , 65 byte

-7 byte terima kasih kepada Jonathan Allan.

f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c

Cobalah online!

benar-benar manusiawi
sumber
Simpan byte yang diinisialisasi cke 1, decrementing dan kemudian gunakan print-c.
Jonathan Allan
Simpan enam lebih dengan membuatnya menjadi fungsi rekursif:f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c
Jonathan Allan
Apakah hanya saya atau beralih ke lambda rekursif tidak menyimpan cukup byte? : P Terima kasih!
totallyhuman
Saya pikir ini perlu max(...,0)untuk lulus [1, 1, 1, 1, ...]ujian.
Yonatan N
2

Dyalog APL, 19 byte

≢-1+(≢2-/⍣{1=≢∪⍵}⊢)

Penjelasan:

≢                      length of input
 -1+(             )    minus 1+
     ≢                 length of
      2-/              differences between elements
         ⍣             while
          {1=≢∪⍵}      there is more than 1 unique element
                 ⊢     starting with the input
marinus
sumber
1
Apakah ini berhasil? ≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
Zacharý
2

k , 21 byte

#1_(~&/1_=':)(1_-':)\

Ini berfungsi dalam k, tetapi tidak dalam oK, karena loop oK's sementara berjalan sebelum memeriksa kondisi (sebagai lawan dari pertama memeriksa kondisi, dan kemudian menjalankan kode). Karenanya, dalam OK, 1 1 1 1 1contohnya tidak akan berfungsi dengan baik.

Coba OK online!

Menjalankan contoh k dengan 1 1 1 1 1 1 di interpreter k.

Penjelasan:

   (        )       \ /while(
    ~&/               /      not(min(
       1_=':          /              check equality of all pairs))) {
             (1_-':)  /    generate difference list
                      /    append to output }
#1_                   /(length of output) - 1
zgrep
sumber
~&/1_=':->1<#?
ngn
2

Haskell , 66 61 60 byte

z=(=<<tail).zipWith
f=length.takeWhile(or.z(/=)).iterate(z(-))

Cobalah online!

Disimpan 5 byte berkat Christian Sievers

Disimpan 1 byte berkat bangga-haskeller

iterate(z(-)) menghitung daftar perbedaan.

or.z(/=) menguji apakah ada elemen yang tidak sama dalam daftar tersebut.

length.takeWhile menghitung daftar perbedaan dengan elemen yang tidak sama.

jferard
sumber
Saya pikir Anda dapat menguji elemen yang tidak sama denganor.z(/=)
Christian Sievers
@ChristianSievers terima kasih! Itu sudah jelas, tetapi saya tidak melihatnya ...
jferard
Anda juga dapat menggunakan z=(=<<tail).zipWith, satu byte lebih pendek
bangga haskeller
@proudhaskeller dan lebih elegan, seperti biasa dengan definisi bebas poin. Terima kasih!
jferard
2

Java (OpenJDK 8) , 98 94 byte

a->{int o=0,i,z=1;for(;z!=0;o++)for(i=a.length-1,z=0;i>o;a[i]-=a[--i])z|=a[o]^a[i];return~-o;}

Cobalah online!

Nevay
sumber
2

Japt , 7 byte

Pendekatan yang sama (tetapi diturunkan secara independen) sebagai Justin dengan implementasi yang berbeda.

£=äaÃèx

Menguji


Penjelasan

Input array secara implisit U.

£   Ã

Peta di setiap elemen.

äa

Ambil setiap pasangan berurutan ( ä) elemen Udan kurangi dengan perbedaan absolut ( a).

=

Tetapkan kembali array itu ke U.

èx

Hitung ( è) jumlah sub-array yang mengembalikan kebenaran (yaitu, non-nol) ketika dikurangi dengan penambahan.

Shaggy
sumber
1

TI-Basic, 19 byte

While max(abs(ΔList(Ans
ΔList(Ans
IS>(A,9
End
A

Secara default, variabel mulai dari nol. Juga, tidak pernah berpikir saya akan menggunakan IS>(sesuatu yang bermanfaat

Timtech
sumber
1

C # (.NET Core) , 70 69 + 18 byte

-1 byte terima kasih kepada Kevin Cruijssen

g=a=>i=>a.Distinct().Count()>1?g(a.Zip(a.Skip(1),(y,z)=>y-z))(i+1):i;

Harus diberi 0 saat menelepon untuk beroperasi dengan benar. Juga termasuk dalam jumlah byte:

using System.Linq;

Cobalah online!

Penjelasan:

g = a => i =>                      // Function taking two arguments (collection of ints and an int)
    a.Distinct()                   // Filter to unique elements
    .Count() > 1 ?                 // If there's more than one element
        g(                         //     Then recursively call the function with
            a.Zip(                 //     Take the collection and perform an action on corresponding elements with another one
                a.Skip(1),         //         Take our collection starting at second element
                (y, z) => y - z    //         Perform the subtraction
            )
        )(i + 1)                   //     With added counter
        : i;                       // Otherwise return counter

Versi berulang 84 + 18 byte:

a=>{int i=0;for(;a.Distinct().Count()>1;i++)a=a.Zip(a.Skip(1),(y,z)=>y-z);return i;}

Cobalah online!

Grzegorz Puławski
sumber
1
Anda dapat menghapus ruang berlebihan di (y,z)=>y-z. Tapi jawaban yang bagus, +1 dari saya.
Kevin Cruijssen
@KevinCruijssen terima kasih! Juga, oops.
Grzegorz Puławski
1

Clojure, 62 byte

#(loop[c % i 0](if(apply = c)i(recur(map -(rest c)c)(inc i))))

Baik =dapat mengambil sejumlah argumen, dan satu argumen identik dengan "itu sendiri". (apply = [1 2 3])dieksekusi sebagai (= 1 2 3).

NikoNyrh
sumber
Bagus, persis apa yang saya coba lakukan tetapi saya berjuang untuk diffs berpasangan yang kompak. Itu brilian, saya harus mengingatnya untuk masa depan.
MattPutnam
1

Pyth , 15 byte

W.E.+Q=.+Q=hZ)Z

Verifikasi semua kasus uji.

Bagaimana?

Penjelasan # 1

W.E.+Q=hZ=.+Q)Z   ~ Full program.

W                 ~ While...
 .E.+Q            ~ ... The deltas of Q contain a truthy element.
      =hZ         ~ Increment a variable Z, which has the initial value of 0.
         =        ~ Transform the variable to the result of a function applied to itself...
          .+Q     ~ ... Operate on the current list and deltas.
             )Z   ~ Close the loop and output Z.
Tuan Xcoder
sumber
-1 byteWtl{Q=hZ=.+Q)Z
Dave
@ Dave Bahkan lebih baik: WP{Q=hZ=.+Q)Z. Terima kasih!
Tn. Xcoder
0

Perl 5 , 83 + 1 (-a) = 84 byte

sub c{$r=0;$r||=$_-$F[0]for@F;$r}for(;c;$i=0){$_-=$F[++$i]for@F;$#F--}say y/ //-$#F

Cobalah online!

Input sebagai daftar angka yang dipisahkan oleh satu spasi.

Xcali
sumber
0

Pyth, 10 byte

tf!t{.+FQt

Jika kita dapat mengindeks dari 1, kita dapat menyimpan byte dengan menghapus yang pertama t.

Cobalah secara Online

Penjelasan

tf!t{.+FQt
 f        T  Find the first (1-indexed) value T...
     .+FQt   ... such that taking the difference T - 1 times...
  !t{        ... gives a set with more than one value in it.
t            0-index.

sumber
0

Kotlin , 83 byte

{var z=it
var c=0
while(z.any{it!=z[0]}){c++
z=(0..z.size-2).map{z[it+1]-z[it]}}
c}

Yg diperindahkan

{
    // Make input mutable
    var z=it
    // Count for returning
    var c=0
    // While the array is not identical
    while (z.any { it != z[0] }) {
        // Increment count
        c++
        // Update list to differences
        z = (0..z.size-2).map { z[it+1] - z[it] }
    }
    // Return count
    c
}

Uji

var n:(List<Int>)->Int =
{var z=it
var c=0
while(z.any{it!=z[0]}){c++
z=(0..z.size-2).map{z[it+1]-z[it]}}
c}

data class TestData(var input: List<Int>, var output: Int)

fun main(args: Array<String>) {
    val items = listOf(
        TestData(listOf(1,2,3,4,5,6,7,8,9,10), 1),
        TestData(listOf(1,4,9,16,25,36), 2),
        TestData(listOf(1,2,1), 2),
        TestData(listOf(1,1,1,1,1,1,1,1,1), 0),
        TestData(listOf(1, 3, 9, 26, 66, 150, 313, 610), 6)
    )

    val fails = items.map { it to n(it.input) }.filter { it.first.output != it.second }

    if (fails.isEmpty()) {
        println("Test passed")
    } else {
        fails.forEach {println("FAILED: $it")}
    }
}

TryItOnline

jrtapsell
sumber
Jika seseorang dapat mengedit untuk memperbaiki petunjuk bahasa saya, sepertinya saya tidak bisa membuatnya berfungsi
jrtapsell
Ini lang-kotlin, tidak hanya kotlin, dalam petunjuk stabilo.
Ruslan
0

Cepat 4 , 90 byte

func f(_ a:[Int])->Int{return a.contains{$0 != a[0]} ?f(zip(a, a.dropFirst()).map(-))+1:0}

Alternatif, implementasi berbasis penutupan:

var f: ((_ input: [Int]) -> Int)!
f = {a in a.contains{$0 != a[0]} ?f(zip(a, a.dropFirst()).map(-))+1:0}

kasus uji:

let testcases: [(input: [Int], expected: Int)] = [
    (input: [1,2,3,4,5,6,7,8,9,10],           expected: 1),
    (input: [1,4,9,16,25,36],                 expected: 2),
    (input: [1,2,1],                          expected: 2),
    (input: [1,1,1,1,1,1,1,1,1],              expected: 0),
    (input: [1, 3, 9, 26, 66, 150, 313, 610], expected: 6),
]

for (caseNumber, testcase) in testcases.enumerated() {
    let actual = f(testcase.input)
    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \(testcase.input) failed. Got \(actual), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}
Alexander - Pasang kembali Monica
sumber