Apakah saya array yang tidak signifikan?

40

Sebuah Array signifikan adalah array bilangan bulat positif, di mana perbedaan mutlak antara unsur-unsur berturut-turut adalah semua lebih kecil dari atau sama dengan 1 .

Misalnya, array berikut tidak signifikan:

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

Karena perbedaan (absolut) yang sesuai adalah:

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

Yang semuanya lebih kecil dari atau sama dengan 1 .


Tugas Anda adalah menentukan apakah array bilangan bulat yang diberikan tidak signifikan.

  • Anda dapat mengasumsikan bahwa array selalu mengandung setidaknya dua elemen.
  • Aturan input dan output standar berlaku. Anda dapat mengambil input (dan output) dalam format apa pun yang masuk akal.
  • Celah default tidak diperbolehkan.
  • Nilai-nilai kebenaran / kepalsuan harus berbeda dan konsisten.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang.

Uji kasus

Input -> Output

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4] -> true
[1, 2, 3, 4, 5, 6, 7, 8, 9, 8] -> benar
[3, 3, 3, 3, 3, 3, 3] -> true
[3, 4, 4, 4, 3, 3, 3, 4, 4, 4] -> true
[1, 2, 3, 4] -> true 
[5, 4, 3, 2] -> true 
[1, 3, 5, 7, 9, 7, 5, 3, 1] -> false
[1, 1, 1, 2, 3, 4, 5, 6, 19] -> false
[3, 4, 5, 6, 7, 8, 7, 5] -> false
[1, 2, 4, 10, 18, 10, 100] -> false
[10, 20, 30, 30, 30] -> false

Saya menggunakan nilai truedan false.

Martin Ender
sumber
Apakah nilai kebenaran / kepalsuan sebenarnya harus benar / salah dalam bahasa pilihan kita, atau bisakah kita menggunakan dua nilai yang berbeda dan konsisten?
Martin Ender
1
@ MartinEnder Ada dua nilai yang berbeda dan konsisten. PS Maaf atas tanggapan terlambat
2
Teks mengatakan Anda akan diberi array bilangan bulat, tetapi hanya array bilangan bulat positif yang tidak signifikan. Haruskah kita bersiap untuk array bilangan negatif?
Mark S.

Jawaban:

24

Jelly , 3 byte

IỊẠ

Cobalah online!

Bagaimana?

Hanya tantangan sempurna untuk Jelly.

IỊẠ Program lengkap.

Saya Bertambah; Dapatkan perbedaan antara elemen berurutan.
 Ị Tidak signifikan; return abs (angka) ≤ 1.
  Ạ Semua; mengembalikan 1 jika semua elemen benar, 0 sebaliknya.
Tuan Xcoder
sumber
2
Ptidak akan berhasil, karena jika semua perbedaan 1itu akan dihasilkan 1, tetapi jika salah satu dari mereka 0itu akan menghasilkan 0? Dan jika satu perbedaan adalah 5satu tetapi apakah 0itu masih akan terjadi 0?
Tas
1
Bagaimana dengan persyaratan "bilangan bulat positif"?
3D1T0R
19

JavaScript (ES7), 33 29 byte

Disimpan 4 byte berkat @JohanKarlsson

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

Bagaimana?

Ketika dipaksa Number, array setidaknya dua elemen dievaluasi NaN. Dengan menggunakan kembali input a sebagai variabel yang menyimpan nilai sebelumnya, iterasi pertama dari beberapa () selalu menghasilkan ([v0, v1, ...] - a [0]) ** 2 = NaN , tidak peduli nilai [0] . Jadi, tes pertama selalu salah dan perbandingan yang sebenarnya dimulai pada iterasi ke-2, seperti yang seharusnya.

Uji kasus

Arnauld
sumber
29 byte:a=>!a.some(v=>(a-(a=v))**2>1)
Johan Karlsson
@JohanKarlsson Ah ya, input dijamin mengandung setidaknya 2 elemen, jadi itu aman. Terima kasih banyak!
Arnauld
7

Mathematica, 24 byte

Max@Abs@Differences@#<2&
Martin Ender
sumber
#==Clip@#&@*Differenceslebih pendek satu byte.
Misha Lavrov
7

Python 2 , 35 byte

x=input()
while-2<x.pop(0)-x[0]<2:1

Ada dengan kode status 1 untuk array tidak signifikan, dengan kode status 0 sebaliknya.

Cobalah online!

Dennis
sumber
6

Sekam , 4 byte

ΛεẊ-

Cobalah online!

Penjelasan:

ΛεẊ- 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
Erik the Outgolfer
sumber
6

Oktaf , 21 byte

@(x)all(diff(x).^2<2)

Fungsi anonim yang memasukkan vektor numerik dan ouput 1jika tidak signifikan atau 0sebaliknya.

Cobalah online!

Luis Mendo
sumber
6

Haskell , 34 33 byte

all((<2).abs).(zipWith(-)=<<tail)

Cobalah online! -1 byte terima kasih kepada @ user1472751


Solusi point-free adalah satu lagi dua hanya satu byte ( terima kasih kepada -1 byte dari @ Dennis ) lebih pendek dari pendekatan rekursif:

f(a:b:r)=2>(a-b)^2&&f(b:r)
f _=1>0

Cobalah online!

Laikoni
sumber
5

Pyth , 6 byte

._MI.+

Verifikasi semua kasus uji.


Pyth , 8 byte

.A<R2aVt

Cobalah online!

Penjelasan

._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.
Tuan Xcoder
sumber
Saya tidak tahu mengapa saya pikir I#bukan M.
Steven H.
5

Proton , 41 byte

a=>all(-2<a[i]-a[i+1]<2for i:0..len(a)-1)

Cobalah online!

-16 byte terima kasih kepada Tn. Xcoder
-2 byte
-6 byte terima kasih kepada Tn. Xcoder

HyperNeutrino
sumber
@ Mr.Xcoder Saya pikir ruang dalam <2 formungkin dapat diabaikan.
Jonathan Frech
@JonathanFrech Tidak ada ruang di sana?
Tn. Xcoder
@ Mr.Xcoder oh ya saya tidak tahu apa yang saya pikirkan dengan semua rantai fungsi gila itu. Terima kasih! : D
HyperNeutrino
5

Japt , 6 byte

äa e<2

Cobalah online!

Penjelasan

ä        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
Justin Mariner
sumber
5

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

-1 byte terima kasih kepada Jeppe Stig Nielsen

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

Hitungan byte juga mencakup:

using System.Linq;

Cobalah online!

Penjelasan:

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!)
Grzegorz Puławski
sumber
3
Sedikit perbaikan a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4):, itu menghindari negasi !.
Jeppe Stig Nielsen
@JeppeStigNielsen luar biasa, terima kasih!
Grzegorz Puławski
5

Perl 6 , 25 byte

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

Cobalah online!

Ini harus cukup mudah dibaca. Satu-satunya hal yang kurang jelas di sini adalah bahwa operator zip Zakan berhenti zipping ketika daftar yang lebih pendek habis (kami menghapus elemen pertama dari daftar di sebelah kanan) dan bahwa subskrip kosong .[], yang disebut Zen slice, memberikan seluruh daftar. .skipmengembalikan daftar tanpa elemen pertama.

Ramillies
sumber
Apakah kedua ruang itu benar-benar diperlukan?
Jonathan Frech
@ JonathanFrech: Yang benar mungkin tidak. Saya juga baru menyadari bahwa .rotateitu tidak diperlukan di sini.
Ramillies
Heck, bahkan yang kiri bisa dihilangkan. Saya benar-benar tidak mengerti di mana spasi putih diperlukan dan di mana tidak ...
Ramillies
Anda bisa menulis -2<alih-alih -1≤dan <2bukannya ≤1menyimpan empat byte lagi.
Sean
Eh, saya kira Anda benar-benar harus membalik perbandingan 2>...>-2untuk menghindari menafsirkan dengan <cara yang salah.
Sean
5

R , 30 26 byte

cat(all(diff(scan())^2<2))

Cobalah online!

pengguna2390246
sumber
3
Saya pikir function(a)all(diff(a)^2<2)menghemat 3 byte.
BLT
Anda dapat mengambil input dari konsol:all(diff(scan())^2<2)
flodel
@BLT poin bagus!
user2390246
1
@flodel Ada beberapa diskusi terkini tentang perlunya mencetak output secara eksplisit saat menggunakan scan, tetapi masih menyimpan satu byte!
user2390246
4

05AB1E , 5 byte

¥Ä2‹P

Cobalah online!

Penjelasan

¥        # calculate deltas
 Ä       # absolute values
  2‹     # smaller than 2
    P    # product
Emigna
sumber
@Okx: Saya rasa tidak. [5,2]Misalnya tidak akan berfungsi .
Emigna
4

Ohm v2 , 4 byte

Δ2<Å

Cobalah online!

Bagaimana?

Δ2<Å   ~ Full program.

Δ      ~ Absolute deltas.
 2<    ~ Is smaller than 2?
   Å   ~ Check if all elements are truthy.
Tuan Xcoder
sumber
3

PowerShell , 62 byte

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

Cobalah online!

PowerShell tidak memiliki .mapatau .someperintah atau mirip, jadi di sini kita secara individual memeriksa setiap delta.

Kami mengambil input $adan menyetel $lsama dengan elemen pertama. Kemudian kita mengulang $adan mengambil setiap elemen di mana |?{...}perbedaannya $_-$ladalah -injangkauan 1,0,-1. Kami kemudian mengatur $lsama dengan elemen saat ini. Jadi sekarang kita memiliki koleksi elemen di mana delta antara tetangga mereka sebelumnya adalah 1. Kita ambil .countitu dan periksa apakah itu benar -eqke .countarray secara keseluruhan. Jika ya, maka setiap delta adalah 1 atau kurang, jadi itu adalah array yang tidak signifikan. Hasil Boolean itu ditinggalkan di jalur pipa, dan hasilnya tersirat.

AdmBorkBork
sumber
Anda dapat menyimpan 1 byte dengan menyingkirkan param dan melakukan$l=($a=$args)[0]
briantist
@ Briantist Itu tidak berhasil. Sebagai contoh. Ini karena pengaturan $lmenjadi seluruh input array dalam saran Anda.
AdmBorkBork
Saya pikir itu hanya perlu mengubah cara Anda memberikan argumen di TIO (setiap elemen perlu ditentukan secara terpisah). Cara Anda memilikinya sekarang, elemen pertama $argsadalah seluruh array. Contoh
briantis
Itu terasa curang ...
AdmBorkBork
Saya pikir itu sebenarnya cara yang tepat untuk digunakan $args. Jika Anda memanggil skrip atau fungsi dengan serangkaian argumen yang dipisahkan sebagai spasi, itu akan muncul sebagai elemen yang terpisah $args, dan untuk TIO itulah cara meniru itu. Saya pribadi telah menggunakannya berkali-kali sebelumnya, tetapi untuk masing-masing :)
briantist
2

MATL ,6 5 byte

d|2<A

-1 byte terima kasih kepada Giuseppe

Cobalah online! atau Verifikasi semua kasus uji

Cinaski
sumber
Saya pikir per meta konsensus yang dapat Anda gunakan d|2<sebagai gantinya, sebagai array dengan nilai nol adalah falsey di MATL.
Giuseppe
1
Atau d|2<Auntuk sesuatu yang lebih dekat dengan jawaban awal Anda.
Giuseppe
1
@ Giuseppe Tidak, mereka tidak dapat: Nilai-nilai kebenaran / kepalsuan harus berbeda dan konsisten .
Tn. Xcoder
@ Mr.Xcoder "array semua 1 untuk kebenaran" dan "array yang mengandung setidaknya satu nol untuk falsey" tidak berbeda dan konsisten?
Giuseppe
2
@Giuseppe "array semua 1 untuk kebenaran" dan "array yang mengandung setidaknya satu nol untuk falsey" tidak berbeda dan konsisten? - Tidak, itu tidak dapat diterima, karena mereka tidak konsisten.
2

anyfix , 9 byte

I€A€2<»/&

Cobalah online!

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

Ini sebagian besar merupakan port dari solusi 05AB1E kecuali mengerikan karena anyfix tidak memiliki autovectorization dan hal-hal keren lainnya

HyperNeutrino
sumber
2

C, 61 56 byte

Terima kasih kepada @cottinet untuk menghemat lima byte!

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

Cobalah online!

C (gcc), 47 byte

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

Cobalah online!

Steadybox
sumber
Dan jika diizinkan / jika Anda menyukainya, Anda dapat menyimpan 9 byte lebih banyak dengan menyimpan hasilnya ralih-alih mengembalikannya. :-)
scottinet
@ skottinet saya menganggap itu, tapi itu tidak valid C meskipun kebetulan bekerja dengan gcc. Namun diizinkan, jadi saya rasa saya hanya akan memasukkannya sebagai versi alternatif.
Steadybox
2
@ skottinet Menetapkan variabel di akhir fungsi menempatkan nilai itu di alamat pengembalian fungsi, membuatnya merasa seperti mengembalikan nilai. Namun, perilaku ini bukan bagian dari spesifikasi C, sehingga tidak dijamin untuk bekerja. Itu juga bisa pecah dengan flag-flag compiler optimisasi tertentu.
Jonathan Frech
2
@ skottinet Ah, saya minta maaf. Saya pikir itu tidak akan diizinkan karena Anda tidak bisa hanya menetapkan variabel dalam solusi Anda sesuai aturan yang disepakati. Sebagai contoh, menggunakan variabel yang didefinisikan secara global alih-alih argumen fungsi tidak akan diizinkan. Tugas Anda adalah menulis program / fungsi yang berfungsi penuh.
Jonathan Frech
1
Bahasa @JonathanFrech ditentukan oleh implementasinya di sini, jadi jika Anda memiliki kompiler yang menghasilkan hasil yang konsisten maka jawabannya valid, bahkan jika secara resmi UB.
Quentin
2

Clojure, 35 byte

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

Seberapa rapi itu?

NikoNyrh
sumber
2

TI-Basic, 6 7 byte

prod(2>abs(ΔList(Ans

atau, 5 byte jika kesalahan dihitung sebagai nilai balik yang valid (pengembalian ERR:ARGUMENTjika tidak signifikan, yang lain ERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans
Oki
sumber
1
Ini mungkin harus memiliki abs(ΔList(Ans, atau turun lebih dari 1 (seperti dalam {5,3,1} atau dalam test case {3,4,5,6,7,8,7,5}) tidak mendapatkan terdeteksi.
Misha Lavrov
@MishaLavrov terima kasih, kamu benar!
Oki
1

JavaScript (ES6), 37 36 byte

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

Sunting: Disimpan 1 byte dengan mencuri trik @ Arnauld.

Neil
sumber
Anda bisa menggunakan kari:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint
1

Pyth, 7 byte

._I#I.+

Test Suite

Mengembalikan nilai true / false.

Penjelasan:

     .+ 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.
Steven H.
sumber
1

Mathematica, 34 byte

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

Penjelasan

                                 & (* 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 *)
ngenisis
sumber
1

Java (OpenJDK 8) , 60 byte

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

Cobalah online!

  • 5 byte terima kasih kepada @Nay!
Olivier Grégoire
sumber
1
Anda dapat menggunakan rdalam loop untuk menghitung (p-n)hanya sekali, >>1bisa /2, atau dihapus jika Anda menggunakan |alih-alih +: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 byte).
Nevay
Cheers @Nevay, terima kasih! Golf sempurna, seperti biasa ;-)
Olivier Grégoire
dapatkah Anda menjelaskan kepada saya bagaimana cara kerjanya? Terima kasih!
blurstream
1

Swift 4, 52 bytes

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

Test suite:

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!")
}
Alexander
sumber
1

APL, 13 byte

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

Jawaban APL pertama \ o /

Catatan: Saya adalah bot yang dimiliki oleh Hyper Neutrino. Saya ada terutama untuk pengujian obrolan.

Penjelasan

{×/(|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)
NeutrinoBot
sumber
1
11 byte sebagai tacit -∧/2>(|2-/⊢)
Uriel