N'inci Farklılıklar


26

Matematikte, belirli bir ilişkinin türünün (doğrusal, ikinci dereceden, vb.) Farkları hesaplamak olduğunu anlamanın bir yolu. Bunu yapmak için, karşılık gelen x değerleri arasındaki boşluğun aynı olduğu y değerlerinin bir listesini alırsınız ve her birini yukarıdaki sayıdan daha kısa bir sayı listesi oluşturarak yukarıdaki sayıdan çıkarın. Sonuçta ortaya çıkan liste tamamen aynı sayılardan oluşuyorsa, ilişkinin değeri 1'dir (doğrusaldır). Aynı değillerse, işlemi yeni listede tekrarlayın. Şimdi özdeşlerse, ilişkinin 2 farklılığı vardır (ikinci dereceden). Aynı değillerse, bu işleme onlar olana kadar devam edin. Örneğin, artan x değerleri için y değerleri [1,6,15,28,45,66] listeniz varsa:

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

Senin görevin:

Girdi olarak bir tamsayı dizisi verildiğinde, yukarıda açıklandığı gibi dizilim tarafından tanımlanan ilişkinin farkını döndüren bir program veya işlev yazın.

Giriş:

Herhangi bir uzunlukta> 1 olabilen bir tamsayı dizisi.

Çıktı:

Girdi tarafından açıklanan ilişkinin farkını temsil eden bir tam sayı.

Test Durumları:

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

puanlama:

Bu , her dilde bayt cinsinden en düşük puan, o dil için kazanıyor. Genel olarak en düşük puan yeşil onay işaretini alır.


Girdi, verilen spesifikasyona uymuyorsa, "geçersiz" olabilir mi, hata yapabilir miyiz? Çıktı olarak -1 sağlayın?
Magic Octopus Urn

Davranış geçersiz giriş için tanımsız (Kodunuzun ne yaptığı umurumda değil)
Gryphon - Monica

Gerekmiyor [1,2,1]2 vermek? [1,2,1] -> [1,-1] -> [-2]
HyperNeutrino 11:17

@HyperNeutrino, evet, üzgünüm. Orada bir beyin osuruk vardı
Gryphon - Reinstate Monica

Bu test durumunu ekle [1,3,9,26,66,150,313,610]-> 6isterseniz
J42161217

Yanıtlar:


10

Kabuğu , 6 bayt

İçin çalıştığı sürümünü kullanmama izin verdiğin için teşekkürler Leo[1,1,1,1,1,1]

←VE¡Ẋ-

Çevrimiçi deneyin!

açıklama

   ¡     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

2
Ne zaman birisi Husk'un yeni Jelly olduğunu söylese, oldukça haklıydı. > _ <
Zacharý

Kahretsin, yayınlamak edecektim bu . Yine de iyi iş çıkardın, +1!
Leo

@Leo, test davası görmedim [1,1,1,1], seninkini kullanabilir miyim?
H.PWiz

@ H.PWiz tabi, devam et!
Leo

7

JavaScript (ES6), 47 bayt

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

Test durumları


7

MATL , 8 bayt

`dta}x@q

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Bu, sonuç tüm sıfır veya boş olana kadar ardışık farklılıkları yinelemeyle karşılar. Çıktı, gerekli eksi 1 eksi sayısıdır.

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

7

R , 50 44 bayt

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

Çevrimiçi deneyin!

Bir diffalır l, onu ayarlar lve sonucun sıfır olmayan değerler içerip içermediğini kontrol eder. Eğer varsa, artım F(olarak başlatılmış FALSEdolaylı) ve döner F*1dönüştürme FALSEiçin 0her durumunda lzaten aynıdır.



5

Mathematica, 49 bayt

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

thanx @alephalpa -6 bayt ve @hftf -1 bayt

ve burada @hftf'den başka bir yaklaşım var

Mathematica, 49 bayt

Length@NestWhileList[Differences,#,!SameQ@@#&]-1&

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

1
UnsameQ[1,2,1]yanlış; !SameQ[1,2,1]doğru. : Ben manuel döngü ya karakterleri kaydeder sanmıyorum Length@NestWhileList[Differences,#,!SameQ@@#&]-1&zaten değiştirdikten sonra sizinkiyle aynı uzunlukta UnsameQolan !SameQ.
hftf 12:17

4

Jöle , 7 bayt

-Iß$E?‘

Çevrimiçi deneyin!

açıklama

-Iß$E?‘  Input: array A
     ?   If
    E    All elements are equal
         Then
-          Constant -1
         Else
   $       Monadic chain
 I           Increments
  ß          Recurse
      ‘  Increment

Özyinelemeli olmayan alternatif:IÐĿE€ċ0
Outgolfer Erik

4

Japt , 10 7 bayt

è@=ä-)d

Çevrimiçi deneyin!

Sonucun girdi dizisinin uzunluğu dahilinde olmasının garanti edildiğine güvenir.

açıklama

è@=ä-)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

Sonunda, bu diziyi eşler
[1, 3, 9, 26, 66, 150, 313, 610]için [true, true, true, true, true, true, false, false],
içerdiği 6 trues.

Önceki 10 bayt sürümü

@=ä-)e¥0}a

Çevrimiçi deneyin!


4

Perl 6 , 37 bayt

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

Çevrimiçi deneyin!

Açıklama: Fonksiyon girişi bir liste olarak alır. Daha sonra şöyle bir özyinelemeli bir dizi oluşturur: ilk eleman orijinal listedir ( $_), sonraki elemanlar {@(@$_ Z- .[1..*])}önceki eleman üzerinde çağrılarak döndürülür ve bu koşul *.nonedoğru oluncaya kadar tekrarlanır , bu sadece liste ya da boş veya yalnızca sıfır içeriyor (veya teknik olarak diğer falsey değerleri). Daha sonra listeyi alırız ve 2'yi çıkarırız ki bu onu ilk önce sayısal bağlama zorlar (ve sayısal bağlamdaki listeler, elemanlarının sayısına eşittir) ve sonunda, sonuçta elemanların sayısından daha az 2 döndürür. liste.

Garip blok {@(@$_ Z- .[1..*])}sadece verilen listeyi alır ( .[]- Zen dilim denir - boş parantezle indeksleme tüm listeyi verir), eksi operatörünü ( Z-) ilk eleman olmadan aynı liste ile ( .[1..*]) ekler ( ) ve bir listeye zorlar ( @(...)- buna ihtiyacımız var çünkü zip yalnızca bir kez tekrarlanabilen tek yönlü bir liste olan bir Seq döndürür. Bu da sevmediğimiz bir şeydir.) İşte bu.


Değişen @(.[] Z- .[1..*])için [.[] Z-.[1..*]]iki bayt kaydetmek gerekir.
nwellnhof

4

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

51 bayt için teşekkürler PunPun1000.
58 bayt için teşekkürler Nevay.

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

Çevrimiçi Deneyin!

Çevrimiçi Deneyin (198 byte version)

Yani, bu benim PPCG'de ilk gönderim (ve ilk defa bir golf kodlaması zorluğu yapıyor). Herhangi bir yapıcı eleştiri memnuniyetle karşılanır ve takdir edilir. Herhangi bir şeyi doğru ifade etmekten çekinmiyorsanız, gönderim kurallarını izlemeye çalıştım.

Güzelleştirilmiş versiyonu:

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

3
Siteye Hoşgeldiniz!
DJMcMayhem

Bunun yerine bu modülleri ithal sadece kullanabilirsinizjava.util.stream.IntStream k = java.util.Arrays.stream(a);
PunPun1000

Aslında, ücretsiz olarak yapabileceğiniz birkaç değişiklik var. 1) publicbayt sayımına dahil edilmesine gerek yoktur. 2) İkinci bir parametre kabul etmemeniz gerekir, ancak bunu silmek aslında baytları kaydedebilir. 3) Eğer orada bazı gereksiz parantez kaldırabilirsiniz
PunPun1000

4) Değil bir koruyucu ancak, burada 198'deki bu önerilerle bir örnektir mümkünse bir Tio içermelidir bayt Tio
PunPun1000



3

Kotlin , 77 bayt

ilk yazı, 2 defa kotlin'deki son cevabı düzenlemeye çalıştı;

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

@jrtapsell den sınava girdi

TryItOnline


PPCG'ye Hoşgeldiniz! Güzel ilk cevap, bir de kurt.
H.PWiz

3

APL (Dyalog Klasik) , 22 17 bayt

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

Çevrimiçi deneyin!

-5 bayt için @ngn için teşekkürler!

Nasıl?

  • { ... }, işlev
  • 1=≢∪⍵:0, eğer her eleman argümanda eşit ise, return 0
  • 1+∇2-/⍵Aksi takdirde, nfarklılıkların 1 + 'sini döndürür (yani, n-1ona bir tane ekler n)

özyinelemeyi feda ederseniz daha kısadır:{1=≢∪⍵:0⋄1+∇2-/⍵}
ngn

2

Jöle , 7 bayt

IÐĿEÐḟL

Çevrimiçi deneyin!

açıklama

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)

Jonathan Allan sayesinde -1 bayt


1
@Gryphon Yapıldı! :)
HyperNeutrino 11:17

IÐĿEÐḟLYedi için (Miles'in aynı zamanda özyinelemeyi kullanarak yedi bulduğu görüldü)
Jonathan Allan

@JonathanAllan Harika teşekkürler!
HyperNeutrino 12:17

2

05AB1E , 7 bayt

[DË#¥]N

Çevrimiçi deneyin!

açıklama

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

2

JavaScript (ES6), 58 bayt

f=a=>+(b=a.slice(1).map((e,i)=>e-a[i])).some(e=>e)&&1+f(b)

+0, yeterli değil Jquery: s. Gerçekten de, +1, iyi iş, JS'de asla golf oynayamayacağımı biliyorum.
Zacharý

2

Python 2 , 65 bayt

Jonathan Allan sayesinde -7 bayt.

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

Çevrimiçi deneyin!


Başlatmak , azaltmak ve kullanmak ciçin bir bayt kaydedin . 1print-c
Jonathan Allan

Özyinelemeli bir işleve dönüştürerek altı tasarruf edin: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

Sadece ben miyim yoksa özyinelemeli bir lambda geçiş yeterli bayt kurtarmıyor mu? : P Teşekkürler!
tamamen insan

Sanırım bunun test davalarını max(...,0)geçmesi gerekiyor [1, 1, 1, 1, ...].
Yonatan N

2

Dyalog APL, 19 bayt

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

Açıklama:

≢                      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

1
Bu çalışıyor mu? ≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
Zacharý

2

k , 21 bayt

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

Bu, k ile çalışır, ancak OK'de değildir, çünkü OK, döngü sırasında koşulu kontrol etmeden önce çalışır (önce koşulu kontrol etmenin tersine, sonra kodu çalıştırır). Bu nedenle, OK'de 1 1 1 1 1örnek düzgün çalışmayacaktır.

İnternetten deneyin

K yorumlayıcısında k örneğini 1 1 1 1 1 1 ile çalıştırma.

Açıklama:

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

~&/1_=':->1<#?
ngn

2

Haskell , 66 61 60 bayt

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

Çevrimiçi deneyin!

Christian Sievers sayesinde 5 bayt kurtarıldı

Proud-haskeller sayesinde 1 bayt kurtarıldı

iterate(z(-)) farklılık listelerini hesaplar.

or.z(/=) Bu listelerde eşit olmayan elemanlar olup olmadığını test eder.

length.takeWhile fark listelerini eşit olmayan elemanlarla sayar.


Bence eşit olmayan elementleri test edebilirsinizor.z(/=)
Christian Sievers

@ ChristianSievers teşekkürler! Bu açıktı, ama görmedim ...
jferard

Ayrıca kullanabilirsiniz z=(=<<tail).zipWith, bir bayt kısa
gururlu haskeller 13:17

@proudhaskeller ve daha zarif, her zaman olduğu gibi nokta tanımsız. Teşekkürler!
jferard,


2

Japt , 7 bayt

Farklı bir uygulama ile Justin ile aynı yaklaşım (ancak bağımsız türetilmiş) .

£=äaÃèx

Dene


açıklama

Dizinin örtük girişi U.

£   Ã

Her elemanın üzerinde eşleyin.

äa

Her sıralı äelement çiftini ( ) alın Uve mutlak farkla ( a) azaltın .

=

Bu diziyi yeniden atayın U.

èx

Sayma ( è), ilave edilerek azaltıldığında truti (yani sıfır olmayan) döndüren alt dizilerin sayısını.


1

TI-Basic, 19 bayt

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

Varsayılan olarak, değişkenler sıfırdan başlar. Ayrıca, IS>(yararlı bir şey için kullanacağımı hiç düşünmedim .


1

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

Kevin Cruijssen sayesinde -1 bayt

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

Doğru çalışması için çağrı yaparken 0 verilmelidir. Ayrıca bayt sayısına dahil:

using System.Linq;

Çevrimiçi deneyin!

Açıklama:

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

Yinelemeli sürüm 84 + 18 bayt:

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

Çevrimiçi deneyin!


1
Yedekli alanı adresinden kaldırabilirsiniz (y,z)=>y-z. Ama güzel cevap, benden +1.
Kevin Cruijssen 12:17

@KevinCruijssen teşekkür ederim! Ayrıca, ayy.
Grzegorz Puławski

1

Clojure, 62 bayt

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

Güzel bir =şekilde herhangi bir sayıda argüman alabilir ve tek bir argüman "kendisiyle" aynıdır. (apply = [1 2 3])olarak idam edilir (= 1 2 3).


Güzel, tam olarak ne yapmaya çalıştığımı, ancak kompakt bir çift fark için mücadele ediyordum. Bu mükemmel, bunu gelecek için hatırlamak zorunda kalacağım.
MattPutnam 13:17

1

Pyth , 15 bayt

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

Tüm test durumlarını doğrulayın.

Nasıl?

Açıklama # 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.

-1 baytWtl{Q=hZ=.+Q)Z
Dave

Daha da iyisi @Dave: WP{Q=hZ=.+Q)Z. Teşekkürler!
Bay Xcoder

0

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

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

Çevrimiçi deneyin!

Bir boşlukla ayrılmış sayılar listesi olarak giriş yapın.



0

Pyth, 10 bayt

tf!t{.+FQt

1'den indekslersek, öncüyü kaldırarak bir bayt kaydedebiliriz t.

Çevrimiçi Deneyin

açıklama

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.

0

Kotlin , 83 bayt

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

Beautified

{
    // 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
}

Ölçek

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


Birisi dil ipuçlarını düzeltmek için düzenleme yapabilirse, lütfen çalışmalarını sağlayamıyorum
jrtapsell

Onun lang-kotlin değil sadece, kotlinvurgulayıcı ipuçları içinde.
Ruslan

0

Swift 4 , 90 bayt

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

Alternatif, kapanmaya dayalı uygulama:

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

test durumları:

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!")
}
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.