Tôi có phải là một mảng không đáng kể?


40

Một mảng không đáng kể là một mảng các số nguyên dương, nơi mà sự khác biệt tuyệt đối giữa các yếu tố liên tiếp đều nhỏ hơn hoặc bằng 1 .

Ví dụ, mảng sau không đáng kể:

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

Bởi vì sự khác biệt (tuyệt đối) tương ứng là:

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

Tất cả đều nhỏ hơn hoặc bằng 1 .


Nhiệm vụ của bạn là xác định xem một mảng số nguyên đã cho có đáng kể hay không.

Các trường hợp thử nghiệm

Đầu vào -> Đầu ra

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4] -> đúng
[1, 2, 3, 4, 5, 6, 7, 8, 9, 8] -> đúng
[3, 3, 3, 3, 3, 3, 3] -> đúng
[3, 4, 4, 4, 3, 3, 3, 4, 4, 4] -> đúng
[1, 2, 3, 4] -> đúng 
[5, 4, 3, 2] -> đúng 
[1, 3, 5, 7, 9, 7, 5, 3, 1] -> sai
[1, 1, 1, 2, 3, 4, 5, 6, 19] -> sai
[3, 4, 5, 6, 7, 8, 7, 5] -> sai
[1, 2, 4, 10, 18, 10, 100] -> sai
[10, 20, 30, 30, 30] -> sai

Tôi đã sử dụng các giá trị truefalse.


Các giá trị trung thực / giả có thực sự phải là trung thực / giả trong ngôn ngữ chúng ta lựa chọn, hoặc chúng ta có thể sử dụng bất kỳ hai giá trị riêng biệt và nhất quán nào không?
Martin Ender

1
@MartinEnder Bất kỳ hai giá trị riêng biệt và nhất quán. PS Xin lỗi vì phản hồi muộn

2
Văn bản nói rằng bạn sẽ được cung cấp một loạt các số nguyên, nhưng chỉ các mảng số nguyên dương mới có thể không đáng kể. Chúng ta có nên chuẩn bị cho một loạt các số nguyên âm?
Đánh dấu S.

Câu trả lời:


24

Thạch , 3 byte

IỊẠ

Hãy thử trực tuyến!

Làm sao?

Chỉ là thử thách hoàn hảo cho Jelly.

Chương trình đầy đủ.

Tôi tăng; Lấy sự khác biệt giữa các yếu tố liên tiếp.
 Ị không đáng kể; trở lại abs (số) 1.
  Ạ Tất cả; trả về 1 nếu tất cả các phần tử là trung thực, 0 nếu không.

2
Pnó sẽ không hoạt động, bởi vì nếu tất cả sự khác biệt là 1đầu ra của nó 1, nhưng nếu một trong số chúng là 0nó sẽ xuất ra 0? Và nếu một sự khác biệt là 5một nhưng 0nó vẫn sẽ làm gì 0?
TAS

1
Điều gì về yêu cầu "số nguyên dương"?
3D1T0R

19

JavaScript (ES7), 33 29 byte

Đã lưu 4 byte nhờ @JohanKarlsson

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

Làm sao?

Khi bị ép buộc Number, các mảng của ít nhất hai yếu tố được ước tính NaN. Bằng cách sử dụng lại đầu vào a làm biến giữ giá trị trước đó, lần lặp đầu tiên của một số () luôn dẫn đến ([v0, v1, ...] - a [0]) ** 2 = NaN , bất kể giá trị của một [0] . Vì vậy, bài kiểm tra đầu tiên luôn sai lệch và các so sánh thực tế bắt đầu ở lần lặp thứ 2, giống như ý của chúng.

Các trường hợp thử nghiệm


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

@JohanKarlsson À đúng rồi, đầu vào được đảm bảo chứa ít nhất 2 yếu tố, nên an toàn. Cảm ơn rất nhiều!
Arnauld




6

Husk , 4 byte

ΛεẊ-

Hãy thử trực tuyến!

Giải trình:

ΛεẊ- 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

Bình thường , 6 byte

._MI.+

Xác nhận tất cả các trường hợp thử nghiệm.


Bình thường , 8 byte

.A<R2aVt

Hãy thử trực tuyến!

Giải trình

._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.

Tôi không biết tại sao tôi nghĩ I#thay vì M.
Steven H.

5

Proton , 41 byte

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

Hãy thử trực tuyến!

-16 byte nhờ Mr. Xcoder
-2 byte
-6 byte nhờ Mr. Xcoder



@ Mr.Xcoder Tôi nghĩ rằng không gian trong <2 forcó thể bị bỏ qua.
Jonathan Frech

@JonathanFrech Không có không gian ở đó?
Ông Xcoder

@ Mr.Xcoder oh yeah Tôi không biết tôi đang nghĩ gì với tất cả các chuỗi chức năng điên rồ đó. Cảm ơn! : D
HyperNeutrino


5

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

-1 byte nhờ Jeppe Stig Nielsen

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

Số lượng byte cũng bao gồm:

using System.Linq;

Hãy thử trực tuyến!

Giải trình:

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
Ít cải thiện : a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4), nó tránh được sự phủ định !.
Jeppe Stig Nielsen

@JeppeStigNielsen tuyệt vời, cảm ơn bạn!
Grzegorz Puławski

5

Perl 6 , 25 byte

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

Hãy thử trực tuyến!

Điều này nên được đọc khá. Điều duy nhất ít rõ ràng hơn ở đây là toán tử zip Zsẽ ngừng nén khi danh sách ngắn hơn đã hết (chúng tôi xóa phần tử đầu tiên của danh sách ở bên phải) và chỉ mục trống .[], được gọi là Zen lát, cung cấp toàn bộ danh sách. .skiptrả về danh sách mà không có phần tử đầu tiên.


Là hai không gian thực sự cần thiết?
Jonathan Frech

@JonathanFrech: Có lẽ không. Ngoài ra tôi chỉ nhận ra rằng .rotatekhông cần thiết ở đây.
Ramillies

Heck, thậm chí một bên trái có thể được gỡ bỏ. Tôi thực sự không hiểu nơi nào cần có khoảng trắng và nơi không ...
Ramillies

Bạn có thể viết -2<thay vì -1≤<2thay vì ≤1để lưu thêm bốn byte.
Sean

Er, tôi đoán bạn thực sự phải đảo ngược các so sánh 2>...>-2để tránh diễn giải <một cách sai lầm.
Sean

5

R , 30 26 byte

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

Hãy thử trực tuyến!


3
Tôi nghĩ function(a)all(diff(a)^2<2)tiết kiệm 3 byte.
BLT

bạn có thể lấy đầu vào từ bảng điều khiển:all(diff(scan())^2<2)
flodel

@BLT điểm tốt!
dùng2390246

1
@flodel Có một số cuộc thảo luận gần đây liên quan đến nhu cầu in rõ ràng đầu ra khi sử dụng scan, nhưng nó vẫn tiết kiệm được một byte!
dùng2390246



3

PowerShell , 62 byte

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

Hãy thử trực tuyến!

PowerShell không có .maphoặc .somehoặc tương tự lệnh, vì vậy ở đây chúng tôi đang từng kiểm tra từng đồng bằng.

Chúng tôi lấy đầu vào $avà đặt $lbằng với phần tử đầu tiên. Sau đó, chúng tôi lặp qua $avà lấy ra từng yếu tố trong đó |?{...}sự khác biệt $_-$l-inphạm vi 1,0,-1. Sau đó chúng ta đặt $lbằng với phần tử hiện tại. Vì vậy, bây giờ chúng ta có một tập hợp các phần tử trong đó đồng bằng giữa hàng xóm trước của chúng là 1. Chúng ta lấy phần .countđó và kiểm tra xem nó có -eqphải .countlà toàn bộ mảng không. Nếu có, thì mỗi delta là 1 hoặc ít hơn, vì vậy đó là một mảng không đáng kể. Kết quả Boolean đó được để lại trên đường ống và đầu ra là ẩn.


Bạn có thể tiết kiệm 1 byte bằng cách loại bỏ thông số và thực hiện$l=($a=$args)[0]
briantist

@briantist Điều đó không làm việc, mặc dù. Ví dụ. Điều này là do cài đặt $llà toàn bộ mảng đầu vào trong đề xuất của bạn.
admBorkBork

Tôi nghĩ rằng nó chỉ yêu cầu thay đổi cách bạn đưa ra các đối số trong TIO (mỗi yếu tố cần được chỉ định riêng). Cách bạn có nó bây giờ, phần tử đầu tiên của $argschính nó là toàn bộ mảng. Ví dụ
briantist

Điều đó cảm thấy gian lận ...
admBorkBork

Tôi nghĩ rằng đó thực sự là cách chính xác để sử dụng $args. Nếu bạn đã gọi một tập lệnh hoặc hàm với một loạt các đối số được phân tách thành khoảng trắng, thì nó sẽ xuất hiện dưới dạng các phần tử riêng biệt $argsvà đối với TIO đó là cách mô phỏng điều đó. Cá nhân tôi đã sử dụng nó theo cách đó nhiều lần trước đây, nhưng với mỗi người của họ :)
sáng lập



2

Tôi nghĩ rằng mỗi sự đồng thuận meta bạn có thể sử dụng d|2<thay vào đó, vì một mảng có giá trị bằng 0 là falsey trong MATL.
Giuseppe

1
Hoặc d|2<Acho một cái gì đó gần hơn với câu trả lời ban đầu của bạn.
Giuseppe

1
@Giuseppe Không họ không thể: Các giá trị trung thực / giả dối phải khác biệt và nhất quán .
Ông Xcoder

@ Mr.Xcoder "một mảng của tất cả 1 giây cho sự thật" và "một mảng chứa ít nhất một số 0 cho chim ưng" có khác biệt và nhất quán không?
Giuseppe

2
@Giuseppe "một mảng của tất cả 1 giây cho sự thật" và "một mảng chứa ít nhất một số 0 cho chim ưng" không khác biệt và nhất quán? - Không, điều đó không được chấp nhận, vì chúng không nhất quán.

2

bất kỳ , 9 byte

I€A€2<»/&

Hãy thử trực tuyến!

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

Đây chủ yếu là một cổng của giải pháp 05AB1E ngoại trừ khủng khiếp vì anyfix không có chế độ tự động hóa và những thứ hay ho khác


2

C, 61 56 byte

Cảm ơn @scottinet vì đã lưu năm byte!

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

Hãy thử trực tuyến!

C (gcc), 47 byte

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

Hãy thử trực tuyến!


Và nếu nó được cho phép / nếu bạn cảm thấy thích nó, bạn có thể lưu thêm 9 byte bằng cách lưu trữ kết quả rthay vì trả lại. :-)
scottinet

@scottinet Tôi đã xem xét điều đó, nhưng nó không hợp lệ C mặc dù nó tình cờ hoạt động với gcc. Tuy nhiên, điều đó được cho phép, vì vậy tôi đoán tôi sẽ chỉ đưa nó vào như một phiên bản thay thế.
Steadybox

2
@scottinet Việc gán một biến ở cuối hàm sẽ đặt giá trị đó vào địa chỉ trả về của hàm, tạo cảm giác như nó đang trả về giá trị. Tuy nhiên, hành vi này không phải là một phần của thông số kỹ thuật C, do đó không đảm bảo hoạt động. Nó cũng có thể phá vỡ với các cờ biên dịch tối ưu hóa nhất định.
Jonathan Frech

2
@scottinet À, mình xin lỗi. Tôi nghĩ rằng điều đó sẽ không được phép vì bạn không thể chỉ định các biến trong giải pháp của mình theo quy tắc đã được thống nhất. Ví dụ, sử dụng các biến được xác định toàn cục thay vì các đối số hàm cũng sẽ không được phép. Nhiệm vụ của bạn là viết một chương trình / chức năng đầy đủ chức năng.
Jonathan Frech

1
Các ngôn ngữ @JonathanFrech được xác định bởi việc triển khai chúng ở đây, vì vậy nếu bạn có một trình biên dịch tạo ra kết quả nhất quán thì câu trả lời là hợp lệ, ngay cả khi chính thức là UB.
Quentin

2

Clojure, 35 byte

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

Làm thế nào gọn gàng?


2

TI-Basic, 6 7 byte

prod(2>abs(ΔList(Ans

hoặc, 5 byte nếu lỗi được tính là giá trị trả về hợp lệ (trả về ERR:ARGUMENTnếu không đáng kể, khác ERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans

1
Điều này có lẽ nên có abs(ΔList(Ans, hoặc người nào khác giảm hơn 1 (chẳng hạn như trong {5,3,1} hoặc trong trường hợp thử nghiệm {3,4,5,6,7,8,7,5}) không nhận được phát hiện.
Misha Lavrov

@MishaLavrov cảm ơn, bạn nói đúng!
Oki

1

JavaScript (ES6), 37 36 byte

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

Chỉnh sửa: Đã lưu 1 byte bằng cách ăn cắp thủ thuật của @ Arnauld.


Bạn có thể sử dụng cà ri:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint

1

Bình thường, 7 byte

._I#I.+

Phòng thử nghiệm

Trả về đúng / sai.

Giải trình:

     .+ 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

Toán học, 34 byte

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

Giải trình

                                 & (* 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;}

Hãy thử trực tuyến!

  • 5 byte nhờ @Nevay!

1
Bạn có thể sử dụng rtrong vòng lặp để (p-n)chỉ tính toán một lần, >>1có thể /2hoặc xóa nếu bạn sử dụng |thay vì +: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 byte).
Nevay

Chúc mừng @Nevay, cảm ơn bạn! Chơi golf hoàn hảo, như thường lệ ;-)
Olivier Grégoire

bạn có thể giải thích cho tôi làm thế nào nó hoạt động? cảm ơn bạn!
dòng chảy

1

Swift 4, 52 byte

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

Bộ kiểm tra:

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}

Câu trả lời APL đầu tiên \ o /

Lưu ý: Tôi là một bot thuộc sở hữu của Hyper Neutrino. Tôi tồn tại chủ yếu để thử nghiệm trò chuyện.

Giải trình

{×/(|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 dưới dạng ngầm -∧/2>(|2-/⊢)
Uriel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.