Ben önemsiz bir dizi miyim?


40

Bir önemsiz dizi ardışık elemanlar arasında mutlak fark göre tüm küçük veya eşit pozitif tamsayılar, bir dizi 1 .

Örneğin, aşağıdaki dizi önemsiz:

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4]

Çünkü karşılık gelen (mutlak) farklılıklar:

[1, 1, 1, 1, 1, 1, 0, 0, 1]

Tüm daha küçük olan veya eşit Hangi 1 .


Göreviniz verilen bir tam sayı dizisinin önemsiz olup olmadığını belirlemektir.

Test durumları

Giriş -> Çıkış

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4] -> doğru
[1, 2, 3, 4, 5, 6, 7, 8, 9, 8] -> doğru
[3, 3, 3, 3, 3, 3, 3] -> doğru
[3, 4, 4, 4, 3, 3, 3, 4, 4, 4] -> doğru
[1, 2, 3, 4] -> doğru 
[5, 4, 3, 2] -> doğru 
[1, 3, 5, 7, 9, 7, 5, 3, 1] -> yanlış
[1, 1, 1, 2, 3, 4, 5, 6, 19] -> yanlış
[3, 4, 5, 6, 7, 8, 7, 5] -> yanlış
[1, 2, 4, 10, 18, 10, 100] -> yanlış
[10, 20, 30, 30, 30] -> yanlış

Ben değerleri kullanılır trueve false.


Gerçeği / sahte değerleri, bizim tercih ettiğimiz dilde gerçekten de sahte / sahte olmalı mı, yoksa iki farklı ve tutarlı değer kullanabilir miyiz?
Martin Ender

1
@MartinEnder Herhangi iki farklı ve tutarlı değer. PS Geç cevap için özür dilerim

2
Metin size bir tam sayı dizisi verildiğini söylüyor, ancak yalnızca pozitif tam sayı dizileri önemsiz olabiliyor. Bir dizi negatif tamsayı için hazırlanmalı mıyız?
Mark S.

Yanıtlar:


24

Jöle , 3 bayt

IỊẠ

Çevrimiçi deneyin!

Nasıl?

Jelly için sadece mükemmel bir meydan okuma.

Ben tam program.

I Artışlar; Ardışık elemanlar arasındaki farkı al.
 Ị Önemsiz; geri dönüş abs (sayı) ≤ 1.
  Ạ Hepsi; Tüm elemanlar truthy ise 1, aksi takdirde 0 döndürür.

2
Pİşe yaramazdı, çünkü bütün farklılıklar 1çıktıysa 1, ama eğer onlardan biri 0çıktıysa 0? Ve eğer bir fark olsaydı, 5ama biri 0yine de yapardı 0?
Tas

1
"Pozitif tamsayılar" gereksinimi ne durumda?
3D1T0R

19

JavaScript (ES7), 33 29 bayt

@JohanKarlsson sayesinde 4 bayt kaydedildi

a=>!a.some(v=>(a-(a=v))**2>1)

Nasıl?

Zorlandığında Number, en az iki elementin dizileri olarak değerlendirilir NaN. Tarafından giriş yeniden kullanarak a önceki değeri tutan değişken birinci yineleme olarak bazı () her zaman sonuçlanır ([v0, v1, ...] - a [0]) ** 2 = NaN , hiç önemi [0] değeri . Bu yüzden, ilk test her zaman sahtedir ve gerçek karşılaştırmalar, tam olarak oldukları gibi 2. tekrarda başlar.

Test durumları


29 bayt:a=>!a.some(v=>(a-(a=v))**2>1)
Johan Karlsson

@JohanKarlsson Ah evet, girişin en az 2 öğe içereceği garanti edilir, bu yüzden güvenli. Çok teşekkürler!
Arnauld




6

Kabuğu , 4 bayt

ΛεẊ-

Çevrimiçi deneyin!

Açıklama:

ΛεẊ- 2-function composition
Λ    (x -> y):f -> [x]:x -> TNum: Check if f returns a truthy result for all elements of x
 ε    f: TNum:x -> TNum: Check if abs(x) <= 1 (shamelessly stolen from Jelly)
  Ẋ   x: (x -> x -> y):f -> [x]:x -> [y]: reduce each overlapping pair of x by f
   -   f: TNum:x -> TNum:y -> TNum: y - x



5

Pyth , 6 bayt

._MI.+

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


Pyth , 8 bayt

.A<R2aVt

Çevrimiçi deneyin!

açıklama

._MI.+   Full program.

    .+   Deltas.
   I     Is invariant under...
._M      Mapping with Sign. 0 if n == 0, -1 if n < 0, 1 if n > 0.

.A<R2aVt    Full program.

      Vt    Vectorize function, applied on the input zipped with the tail of the input.
     a      Absolute difference.
  <R2       For each, check if it is smaller than 2.
.A          All.

Bunun I#yerine neden düşündüğümü bilmiyorum M.
Steven H.


5

Japt , 6 bayt

äa e<2

Çevrimiçi deneyin!

açıklama

ä        Get all pairs of elements
 a       Take absolute difference of each pair
         This results in the deltas of the array
   e     Check if every element...
    <2   Is less than 2

5

C # (.NET Core) , 51 45 44 + 18 bayt

Jeppe Stig Nielsen sayesinde -1 bayt

a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)

Bayt sayısı ayrıca şunları içerir:

using System.Linq;

Çevrimiçi deneyin!

Açıklama:

a =>                      // Take an array of integers as input
    a.Zip(                // Combine each element with corresponding one from:
        a.Skip(1),        //     the input array without first element
        (x, y) => x - y   //     get their difference
    )
    .All(x => x * x < 4)  // Check if all differences are less than 2
                          // (We only care about 0 and 1, and so happens that when they're squared, it works like Abs! Magic!)

3
Küçük düzelme: a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)Olumsuzluktan kaçınır !.
Jeppe Stig Nielsen

@JeppeStigNielsen harika, teşekkür ederim!
Grzegorz Puławski

5

Perl 6 , 25 bayt

{?(2>all(.[]Z-.skip)>-2)}

Çevrimiçi deneyin!

Bu oldukça okunaklı olmalı. Buradaki daha az belirgin olan şey Z, kısa operatörün tükenmesi durumunda zip operatörünün sıkıştırmayı durdurması (listenin ilk öğesini sağdaki kaldırıyoruz) ve .[]Zen dilimi olarak adlandırılan boş alt listenin tüm listeyi vermesidir. .skipilk öğe olmadan listeyi döndürür.


Bu iki alan gerçekten gerekli mi?
Jonathan Frech

@JonathanFrech: Doğru olanı muhtemelen hayır. Ayrıca farkettim ki.rotate burada gerekmediğini .
Ramillies

Heck, soldaki bile kaldırılabilir. Boşluğun nerede gerekli olduğunu ve nerede olmadığını gerçekten anlamıyorum.
Ramillies

Dört bayt kaydetmek yerine -2<yerine -1≤ve <2yerine yazabilirsiniz ≤1.
Sean

Er, sanırım 2>...>-2yorum yapmamak için karşılaştırmaları tersine çevirmelisin< yanlış bir şekilde çevirmelisin.
Sean




3

PowerShell , 62 bayt

param($a)$l=$a[0];($a|?{$_-$l-in1..-1;$l=$_}).count-eq$a.count

Çevrimiçi deneyin!

PowerShell'in bir .mapveya .somebenzeri bir komutu yoktur, bu yüzden burada her deltayı ayrı ayrı kontrol ediyoruz.

Girdiyi alıyoruz $ave $lilk öğeye eşit olarak ayarlıyoruz . Sonra döngü $ave her eleman çıkarmak |?{...}fark $_-$lolduğunu -inaralığı 1,0,-1. Daha sonra $lmevcut öğeye eşit olarak ayarladık . Önceki komşusu arasındaki delta 1. olduğu Şimdi biz unsurların bir koleksiyona sahip Biz almak .counto ve 's olmadığını kontrol -eqUAL etmek.count bir bütün olarak dizinin. Öyleyse, her delta 1 veya daha azdır, bu nedenle önemsiz bir dizidir. Bu Boolean sonucu boru hattında bırakılır ve çıktı kesindir.


$l=($a=$args)[0]
Paragraftan kurtularak

@briantist Yine de çalışmıyor. Örneğin. Bunun nedeni $l, önerinizdeki tüm giriş dizisi olacak şekilde ayarlanması .
AdmBorkBork 21:17

Ben sadece TIO'da argüman verme şeklinizi değiştirmenizi gerektiriyor (her elemanın ayrı ayrı belirtilmesi gerekiyor). Şimdi sahip olma şekliniz, ilk öğesi $args, tüm dizinin kendisidir. Örnek
briantist

Bu hile hissettiriyor ...
AdmBorkBork 21.06

Bence kullanmak için doğru yol bu $args . Boşluk olarak ayrılmış bir dizi argümanla bir komut dosyası veya işlev $argsçağırdıysanız, içinde ayrı öğeler olarak gelir ve TIO için bu nasıl öykünülür. Şahsen daha önce birçok kez kullanmıştım, ama her biri kendilerine göre :)
briantist



2

MATL ,6 5 bayt

d|2<A

Giuseppe sayesinde -1 bayt

Çevrimiçi deneyin! veya Tüm test durumlarını doğrula


Bence meta konsensüs başına kullanabileceğiniz d|2<sıfır değerine sahip bir dizi olarak yerine Matl içinde Falsey olduğunu.
Giuseppe

1
Veya d|2<Aorijinal cevabınıza daha yakın bir şey için.
Giuseppe

1
@Giuseppe Hayır, yapamazlar: Gerçek / sahtekarlık değerleri, farklı ve tutarlı olmalıdır .
Bay Xcoder

@ Mr.Xcoder "truthy için 1'lerin bir dizisi" ve "falsey için en az bir sıfır içeren bir dizi" belirgin ve tutarlı değil mi?
Giuseppe

2
@Giuseppe " truthy için 1'lerin bir dizisi" ve "falsey için en az bir sıfır içeren bir dizi" belirgin ve tutarlı değil mi? - Hayır, bu kabul edilebilir değil çünkü tutarsızlar.

2

anyfix , 9 bayt

I€A€2<»/&

Çevrimiçi deneyin!

I€A€2<»/&  Main Link
I          Deltas
 €         For each element
  A        Take its absolute value
   €  »    For each element
    2<     Is it less than two?
       /   Reduce over
        &  Logical AND

Bu, çoğu yerde 05AB1E çözümünün bir limanıdır, çünkü korkunçtur, herhangi bir otovektörleşme ve başka harika şeyler yoktur.


2

C, 61 56 bayt

Beş bayt tasarrufu için @scottinet için teşekkürler!

r;f(a,n)int*a;{for(r=1;--n;r=(*a-*++a)/2?0:r);return r;}

Çevrimiçi deneyin!

C (gcc), 47 bayt

r;f(a,n)int*a;{for(r=1;--n;r=(*a-*++a)/2?0:r);}

Çevrimiçi deneyin!


Ve eğer izin verilirse / eğer istersen , sonucu geri koymak yerine saklayarak 9 bayt daha kazanabilirsin r. :-)
scottinet

@scottinet Bunu düşündüm, fakat gcc ile çalışsa bile geçerli değil C. Yine de izin var, bu yüzden alternatif bir sürüm olarak ekleyeceğim galiba.
Steadybox

2
@scottinet Bir fonksiyonun sonundaki değişkeni atamak, bu değeri fonksiyonun geri dönüş adresine koyar, geri dönen değeri hissettirir. Bununla birlikte, bu davranış C spesifikasyonlarının bir parçası değildir, bu nedenle çalışması garanti edilmez. Ayrıca, belirli optimizasyon derleyici bayraklarıyla da kırılabilir.
Jonathan Frech

2
@scottinet Ah, özür dilerim. Sanırım çözümünüzde kabul ettiğiniz her kural için değişkenler atayamayacağınız için buna izin verilmez. Örnek olarak, fonksiyon argümanları yerine global olarak tanımlanmış değişkenleri kullanmaya da izin verilmez. Göreviniz tamamen işlevsel bir program / fonksiyon yazmaktır.
Jonathan Frech

1
@JonathanFrech dilleri burada uygulanmaları ile tanımlanır, bu nedenle tutarlı sonuçlar üreten bir derleyiciniz varsa, o zaman cevap resmen UB olsa bile geçerlidir.
Quentin

2

Clojure, 35 bayt

#(every? #{-1 0 1}(map -(rest %)%))

Bu ne kadar düzenli?


2

TI-Basic, 6 7 bayt

prod(2>abs(ΔList(Ans

veya, eğer hatalar geçerli geri dönüş değeri olarak sayılırsa 5 bayt ( ERR:ARGUMENTönemsiz olması durumunda döndürür ERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans

1
Bu muhtemelen abs(ΔList(Ans1'den fazla düşmüş veya düşmelidir ({5,3,1} veya {3,4,5,6,7,8,7,5} test durumundaki gibi) algılandı.
Misha Lavrov

@MishaLavrov teşekkürler, haklısın!
Oki

1

JavaScript (ES6), 37 adet 36 bayt

(a,u)=>!a.some(e=>(e-=(u=e))>1|e<-1)

Düzenleme: @ Arnauld's hilesini çalarak kaydetti 1 byte.


Currying'i kullanabilirsiniz:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint

1

Pyth, 7 bayt

._I#I.+

Test odası

Doğru / yanlış döndürür.

Açıklama:

     .+ Deltas, returns differences between consecutive values.
._      Signum, returns the sign of a number (1, 0, or -1).  Note that this should
             be equal to the input for insignificant arrays.
  I     Tests if it is equal to the input...
   #    For each in the input, and filter out those that aren't...
    I   And make sure none have been filtered out.

1

Mathematica, 34 bayt

Differences@#~MatchQ~{(1|0|-1)..}&

açıklama

                                 & (* Function *)
Differences                        (* which takes the consecutive differences*)
           @#                      (* of the input list *)
             ~MatchQ~              (* and returns whether it matches *)
                     {(1|0|-1)..}  (* a list consisting of one or more 1s, 0s, or -1s *)

1

Java (OpenJDK 8) , 60 bayt

a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}

Çevrimiçi deneyin!

  • @Nevay sayesinde 5 bayt!

1
Sen kullanabilirsiniz rhesaplamak için döngü içinde (p-n), sadece bir kez >>1olabilir /2kullanırsanız veya kaldırıldı |yerine +: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 bayt).
Nevay

Alkış @Nevay, teşekkür ederim! Her zamanki gibi mükemmel golf
oynama

nasıl çalıştığını bana açıklar mısın? teşekkür ederim!
blurstream

1

Swift 4, 52 bayt

{!zip($0.dropFirst(),$0).map(-).contains{1<abs($0)}}

Test odası:

let isInsignificant: (_ array: [Int]) -> Bool = {!zip($0.dropFirst(),$0).map(-).contains{1<abs($0)}}

let testcases: [(input: [Int], expected: Bool)] = [
    (input: [1, 2, 3, 4, 3, 4, 5, 5, 5, 4], expected: true),
    (input: [1, 2, 3, 4, 5, 6, 7, 8, 9, 8], expected: true),
    (input: [3, 3, 3, 3, 3, 3, 3],          expected: true),
    (input: [3, 4, 4, 4, 3, 3, 3, 4, 4, 4], expected: true),
    (input: [1, 2, 3, 4],                   expected: true ),
    (input: [5, 4, 3, 2],                   expected: true ),
    (input: [1, 3, 5, 7, 9, 7, 5, 3, 1],    expected: false),
    (input: [1, 1, 1, 2, 3, 4, 5, 6, 19],   expected: false),
    (input: [3, 4, 5, 6, 7, 8, 7, 5],       expected: false),
    (input: [1, 2, 4, 10, 18, 10, 100],     expected: false),
    (input: [10, 20, 30, 30, 30],           expected: false),
]


for (caseNumber, testcase) in testcases.enumerated() {
    let actual = isInsignificant(testcase.input)
    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \(testcase.input) failed. Got \(actual), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}

1

APL, 13 bayt

{×/(|2-/⍵)<2}

İlk APL cevabı \ o /

Not: Ben Hyper Neutrino'ya ait bir botum. Ben esas olarak sohbet testi için varım.

açıklama

{×/(|2-/⍵)<2}
{           }  Function; right argument is ⍵
   (     )     Bracketed Expression
       /       Reduce
     2         Every pair (two elements) of
        ⍵      ⍵
      -        Using subtraction
    |          Magnitude (Absolute Value)
          <2   For each element, is it less than two?
  /            Reduce over
 ×             Multiplication (Product) (All)

1
Tacit olarak 11 bayt -∧/2>(|2-/⊢)
Uriel
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.