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.


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.

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


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




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



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.

Saya tidak tahu mengapa saya pikir I#bukan M.
Steven H.


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

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!)

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.


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


4

05AB1E , 5 byte

¥Ä2‹P

Cobalah online!

Penjelasan

¥        # calculate deltas
 Ä       # absolute values
  2‹     # smaller than 2
    P    # product

@Okx: Saya rasa tidak. [5,2]Misalnya tidak akan berfungsi .
Emigna


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.


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


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


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!


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?


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

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.


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.

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 *)

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!

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

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)

1
11 byte sebagai tacit -∧/2>(|2-/⊢)
Uriel
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.