ฉันเป็นอาร์เรย์ที่ไม่มีนัยสำคัญหรือไม่?


40

อาร์เรย์ที่ไม่มีนัยสำคัญเป็นอาร์เรย์ของจำนวนเต็มบวกที่แตกต่างแน่นอนระหว่างองค์ประกอบติดต่อกันทุกคนที่มีขนาดเล็กกว่าหรือเท่ากับ1

ตัวอย่างเช่นอาร์เรย์ต่อไปนี้ไม่มีนัยสำคัญ:

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

เนื่องจากความแตกต่าง (สัมบูรณ์) ที่สอดคล้องกันคือ:

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

ซึ่งทั้งหมดมีขนาดเล็กกว่าหรือเท่ากับ1


งานของคุณคือการพิจารณาว่าอาร์เรย์จำนวนเต็มที่กำหนดนั้นไม่มีนัยสำคัญหรือไม่

  • คุณอาจคิดว่าอาร์เรย์มีองค์ประกอบอย่างน้อยสององค์ประกอบเสมอ
  • ใช้กฎอินพุตและเอาต์พุตมาตรฐาน คุณสามารถรับอินพุต (และเอาท์พุท) ในรูปแบบที่สมเหตุสมผล
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • ค่าความจริง / เท็จต้องชัดเจนและสอดคล้องกัน
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

อินพุต -> เอาท์พุท

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4] -> จริง
[1, 2, 3, 4, 5, 6, 7, 8, 9, 8] -> จริง
[3, 3, 3, 3, 3, 3, 3] -> จริง
[3, 4, 4, 4, 3, 3, 3, 4, 4, 4] -> จริง
[1, 2, 3, 4] -> จริง 
[5, 4, 3, 2] -> จริง 
[1, 3, 5, 7, 9, 7, 5, 3, 1] -> false
[1, 1, 1, 2, 3, 4, 5, 6, 19] -> เท็จ
[3, 4, 5, 6, 7, 8, 7, 5] -> false
[1, 2, 4, 10, 18, 10, 100] -> false
[10, 20, 30, 30, 30] -> false

ผมใช้ค่าและtruefalse


ค่าความจริง / เท็จต้องเป็นความจริง / เท็จในภาษาที่เราเลือกหรือไม่หรือเราสามารถใช้สองค่าที่ชัดเจนและสอดคล้องกันได้หรือไม่?
Martin Ender

1
@MartinEnder สองค่าที่แตกต่างและสอดคล้องกัน ป.ล. ขออภัยในความไม่สะดวก

2
ข้อความบอกว่าคุณจะได้รับอาร์เรย์จำนวนเต็ม แต่มีเพียงอาร์เรย์ของจำนวนเต็มบวกเท่านั้นที่จะไม่มีนัยสำคัญ เราควรเตรียมพร้อมสำหรับอาร์เรย์ของจำนวนเต็มลบหรือไม่
Mark S.

คำตอบ:


24

เยลลี่ 3 ไบต์

IỊẠ

ลองออนไลน์!

อย่างไร?

เพียงแค่ความท้าทายที่สมบูรณ์แบบสำหรับเยลลี่

ฉันเต็มโปรแกรม

ฉันเพิ่มขึ้น; รับความแตกต่างระหว่างองค์ประกอบต่อเนื่อง
 Ịไม่สำคัญ ABS คืน (หมายเลข) ≤ 1
  Ạทั้งหมด; ส่งกลับ 1 ถ้าองค์ประกอบทั้งหมดเป็นความจริงมิฉะนั้น 0

2
Pจะไม่ทำงานมันจะเพราะถ้าความแตกต่างทุกคน1ก็ต้องการส่งออก1แต่ถ้าหนึ่งในนั้นคือ0มันจะส่งออก0? และถ้าความแตกต่างอย่างใดอย่างหนึ่ง5แต่อย่างใดอย่างหนึ่ง0มันจะยังคงทำ0อย่างไร
Tas

1
สิ่งที่เกี่ยวกับข้อกำหนด "จำนวนเต็มบวก"
3D1T0R

19

JavaScript (ES7), 33 29 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ @JohanKarlsson

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

อย่างไร?

เมื่อบังคับให้อาร์เรย์อย่างน้อยสององค์ประกอบจะมีการประเมินเพื่อNumber NaNโดยการใช้อินพุตaเป็นตัวแปรที่ถือค่าก่อนหน้าการวนซ้ำครั้งแรกของบางอย่าง ()จะให้ผลลัพธ์ใน([v0, v1, ... ] - a [0]) ** 2 = NaNไม่ว่า ค่าของa [0] ดังนั้นการทดสอบครั้งแรกจะผิดพลาดและการเปรียบเทียบที่แท้จริงเริ่มต้นที่การทำซ้ำครั้งที่ 2 เช่นเดียวกับที่พวกเขาต้องการ

กรณีทดสอบ


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

@JohanKarlsson อ่าใช่ข้อมูลเข้ารับประกันว่ามีอย่างน้อย 2 องค์ประกอบดังนั้นจึงปลอดภัย ขอบคุณมาก!
Arnauld




6

Husk , 4 ไบต์

ΛεẊ-

ลองออนไลน์!

คำอธิบาย:

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


6

Haskell , 34 33 ไบต์

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

ลองออนไลน์! -1 ไบต์ต้องขอบคุณ@ user1472751


วิธีแก้ปัญหาแบบไม่มีจุดคือหนึ่ง สองอีกครั้งเพียงหนึ่งไบต์ ( ขอบคุณ -1 ไบต์จาก@Dennis ) สั้นกว่าวิธีแบบเรียกซ้ำ:

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

ลองออนไลน์!


5

Pyth , 6 ไบต์

._MI.+

ตรวจสอบกรณีทดสอบทั้งหมด


Pyth , 8 ไบต์

.A<R2aVt

ลองออนไลน์!

คำอธิบาย

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

ผมมีความคิดว่าทำไมผมคิดว่าไม่มีแทนI# M
Steven H.

5

โปรตอน , 41 ไบต์

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

ลองออนไลน์!

-16 ไบต์ขอบคุณ Mr. Xcoder
-2 ไบต์
-6 ไบต์ขอบคุณ Mr. Xcoder



@ Mr.Xcoder ฉันคิดว่าพื้นที่ใน<2 forอาจจะละเว้น
Jonathan Frech

@JonathanFrech ไม่มีที่ว่างหรือเปล่า
Mr. Xcoder

@ Mr.Xcoder โอ้ใช่ฉันไม่รู้ว่าฉันคิดอะไรกับเชนฟังก์ชั่นบ้าคลั่งเหล่านั้นทั้งหมด ขอบคุณ! : D
HyperNeutrino


5

C # (. NET Core) , 51 45 44 + 18 ไบต์

-1 ไบต์ขอบคุณJeppe Stig Nielsen

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

จำนวนไบต์ยังรวมถึง:

using System.Linq;

ลองออนไลน์!

คำอธิบาย:

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
การปรับปรุงเล็ก ๆ น้อย ๆ : มันหลีกเลี่ยงปฏิเสธa=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4) !
Jeppe Stig Nielsen

@JeppeStigNielsen ยอดเยี่ยมขอบคุณ!
Grzegorz Puławski

5

Perl 6 , 25 ไบต์

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

ลองออนไลน์!

ควรอ่านได้สวย สิ่งที่เห็นได้ชัดเพียงอย่างเดียวที่นี่คือตัวดำเนินการ zip Zจะหยุดซิปเมื่อรายการที่สั้นกว่าหมดลง (เราลบองค์ประกอบแรกของรายการทางด้านขวา) และตัวห้อยว่างเปล่าที่.[]เรียกว่า Zen slice ให้รายการทั้งหมด .skipส่งคืนรายการโดยไม่มีองค์ประกอบแรก


ช่องว่างทั้งสองนั้นจำเป็นจริงๆหรือ?
Jonathan Frech

@JonathanFrech: คนที่ใช่อาจไม่ใช่ นอกจากนี้ฉันเพิ่งตระหนักว่า.rotateไม่จำเป็นที่นี่
Ramillies

เฮคแม้แต่คนซ้ายก็สามารถลบออกได้ ฉันไม่เข้าใจว่าต้องใช้ช่องว่างที่ใดและที่ใด ...
Ramillies

คุณสามารถเขียน-2<แทน-1≤และ<2แทนที่จะ≤1บันทึกอีกสี่ไบต์
ฌอน

เอ้อฉันคิดว่าคุณต้องย้อนกลับการเปรียบเทียบ2>...>-2เพื่อหลีกเลี่ยงการตีความ<ผิด ๆ
ฌอน

5

R , 30 26 ไบต์

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

ลองออนไลน์!


3
ฉันคิดว่าfunction(a)all(diff(a)^2<2)ประหยัดได้ 3 ไบต์
BLT

คุณสามารถรับอินพุตจากคอนโซล:all(diff(scan())^2<2)
flodel

@BLT จุดดี!
2390246

1
@flodel มีการสนทนาเมื่อไม่นานมานี้เกี่ยวกับความจำเป็นในการพิมพ์เอาต์พุตอย่างชัดเจนเมื่อใช้scanงาน แต่ยังคงบันทึกเป็นไบต์!
2390246



3

PowerShell , 62 ไบต์

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

ลองออนไลน์!

PowerShell ไม่ได้.mapหรือ.someหรือคล้ายคำสั่งดังนั้นที่นี่เรากำลังตรวจสอบรายบุคคลแต่ละเดลต้า

เรารับอินพุต$aและตั้งค่า$lเท่ากับองค์ประกอบแรก จากนั้นเราก็ห่วงผ่าน$aและนำออกจากแต่ละองค์ประกอบที่|?{...}แตกต่างกัน$_-$lคือช่วง-in 1,0,-1จากนั้นเราตั้งค่า$lเท่ากับองค์ประกอบปัจจุบัน ดังนั้นตอนนี้เรามีชุดขององค์ประกอบที่เดลต้าระหว่างเพื่อนบ้านก่อนหน้าของพวกเขาคือ 1 เราใช้ส่วน.countนั้นและตรวจสอบว่ามันเป็น-eqไปตามลำดับ.countของอาร์เรย์โดยรวมหรือไม่ ถ้าเป็นเช่นนั้นเดลต้าทุกอันจะมีค่า 1 หรือน้อยกว่าดังนั้นจึงเป็นอาร์เรย์ที่ไม่มีนัยสำคัญ ผลลัพธ์บูลีนนั้นถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตนั้นเป็นนัย


คุณสามารถประหยัด 1 ไบต์โดยกำจัด param และทำ$l=($a=$args)[0]
briantist

@ briantist ที่ใช้งานไม่ได้แม้ว่า ตัวอย่างเช่น. นี่เป็นเพราะการตั้งค่า$lเป็นอาร์เรย์อินพุตทั้งหมดในคำแนะนำของคุณ
AdmBorkBork

ฉันคิดว่ามันต้องเปลี่ยนวิธีที่คุณให้ข้อโต้แย้งใน TIO (แต่ละองค์ประกอบจะต้องระบุแยกต่างหาก) วิธีที่คุณมีตอนนี้องค์ประกอบแรก$argsคืออาร์เรย์ทั้งหมด ตัวอย่าง
นักเทศน์

นั่นทำให้รู้สึกว่านอกใจ ...
AdmBorkBork

ฉันคิดว่านั่นเป็นวิธีที่ถูกต้องในการใช้งาน$argsจริง หากคุณเรียกสคริปต์หรือฟังก์ชั่นที่มีชุดของอาร์กิวเมนต์ที่แยกกันเป็นช่องว่างมันจะเข้ามาเป็นองค์ประกอบที่แยกจากกัน$argsและสำหรับ TIO นั้นเป็นวิธีเลียนแบบ ผมเคยใช้ส่วนตัวมันเป็นอย่างนั้นหลายครั้งก่อน แต่แต่ละตัวเอง :)
briantist



2

MATL ,6 5 ไบต์

d|2<A

-1 ไบต์ขอบคุณGiuseppe

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด


ฉันคิดว่าฉันทามติต่อเมตาดาต้าที่คุณสามารถใช้d|2<แทนเนื่องจากอาร์เรย์ที่มีค่าเป็นศูนย์นั้นเป็นเท็จใน MATL
Giuseppe

1
หรือd|2<Aเพื่ออะไรที่ใกล้เคียงกับคำตอบเดิมของคุณ
Giuseppe

1
@Giuseppe ไม่มีพวกเขาไม่สามารถ: truthy / ค่า falsy จะต้องมีความชัดเจนและสอดคล้องกัน
Mr. Xcoder

@ Mr.Xcoder "อาเรย์ของ 1s ทั้งหมดสำหรับความจริง" และ "อาเรย์ที่มีอย่างน้อยหนึ่งศูนย์สำหรับความเท็จ" ไม่ชัดเจนและสอดคล้องกันใช่หรือไม่
Giuseppe

2
@Giuseppe "อาร์เรย์ของ 1s ทั้งหมดสำหรับความจริง" และ "อาร์เรย์ที่มีอย่างน้อยหนึ่งศูนย์สำหรับความเท็จ" ไม่ชัดเจนและสอดคล้องกันใช่หรือไม่ - ไม่นั่นเป็นสิ่งที่ยอมรับไม่ได้เพราะมันไม่สอดคล้องกัน

2

anyfixขนาด 9 ไบต์

I€A€2<»/&

ลองออนไลน์!

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

นี่เป็นพอร์ตของโซลูชัน 05AB1E ส่วนใหญ่ยกเว้นสิ่งที่แย่มากเพราะ anyfix ไม่มีการตั้งค่าอัตโนมัติและสิ่งดีๆอื่น ๆ


2

C, 61 56 ไบต์

ขอบคุณ @scottinet สำหรับการบันทึกห้าไบต์!

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

ลองออนไลน์!

C (gcc), 47 ไบต์

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

ลองออนไลน์!


และหากได้รับอนุญาต / หากคุณรู้สึกว่าชอบคุณสามารถบันทึกได้อีก 9 ไบต์โดยเก็บผลลัพธ์ไว้rแทนที่จะส่งกลับ :-)
scottinet

@scottinet ฉันคิดว่า แต่มันไม่ถูกต้อง C แม้ว่ามันจะเกิดขึ้นกับ gcc แม้ว่าจะได้รับอนุญาตดังนั้นฉันเดาว่าฉันจะรวมมันเป็นเวอร์ชันอื่น
Steadybox

2
@scottinet การกำหนดตัวแปรที่ส่วนท้ายของฟังก์ชันทำให้ค่านั้นอยู่ใน return return ของ adress ทำให้รู้สึกว่ามันคืนค่า อย่างไรก็ตามพฤติกรรมนี้ไม่ได้เป็นส่วนหนึ่งของข้อกำหนด C ดังนั้นจึงไม่รับประกันว่าจะทำงานได้ นอกจากนี้ยังสามารถแตกหักได้ด้วยการตั้งค่าสถานะคอมไพเลอร์ให้เหมาะสม
Jonathan Frech

2
@scottinet อ่าฉันขอโทษ ฉันคิดว่าจะไม่ได้รับอนุญาตเนื่องจากคุณไม่สามารถกำหนดตัวแปรในโซลูชันของคุณตามกฎที่ตกลงกันไว้ ตัวอย่างเช่นการใช้ตัวแปรที่กำหนดไว้ทั่วโลกแทนที่จะเป็นอาร์กิวเมนต์ของฟังก์ชันจะไม่ได้รับอนุญาตเช่นกัน งานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นที่ใช้งานได้อย่างสมบูรณ์
Jonathan Frech

1
@JonathanFrech ภาษาถูกกำหนดโดยการนำไปใช้ที่นี่ดังนั้นหากคุณมีคอมไพเลอร์ซึ่งให้ผลลัพธ์ที่สอดคล้องกันคำตอบนั้นจะใช้ได้แม้ว่า UB อย่างเป็นทางการ
เควนติน


2

TI-Basic, 6 7 ไบต์

prod(2>abs(ΔList(Ans

หรือ 5 ไบต์หากข้อผิดพลาดนับเป็นค่าส่งคืนที่ถูกต้อง (ส่งคืนERR:ARGUMENTหากไม่มีนัยสำคัญอื่นERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans

1
สิ่งนี้น่าจะมีabs(ΔList(Ansหรืออื่น ๆ ลดลงมากกว่า 1 (เช่นใน {5,3,1} หรือในกรณีทดสอบ {3,4,5,6,7,8,7,5}) ไม่ได้รับ ตรวจพบ
Misha Lavrov

@MishaLavrov ขอบคุณคุณพูดถูก!
Oki

1

JavaScript (ES6), 37 36 ไบต์

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

แก้ไข: บันทึก 1 ไบต์โดยขโมยเคล็ดลับของ @ Arnauld


คุณสามารถใช้การแกง:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint

1

Pyth, 7 ไบต์

._I#I.+

ชุดทดสอบ

ส่งคืนจริง / เท็จ

คำอธิบาย:

     .+ 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 ไบต์

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

คำอธิบาย

                                 & (* 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 ไบต์

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

ลองออนไลน์!

  • 5 ไบต์ขอบคุณ @Nevay!

1
คุณสามารถใช้rในการวนซ้ำเพื่อคำนวณ(p-n)เพียงครั้งเดียว>>1สามารถเป็น/2หรือลบออกได้ถ้าคุณใช้|แทน+: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 ไบต์)
Nevay

ขอบคุณ @Nevay ขอบคุณ! การเล่นกอล์ฟที่สมบูรณ์แบบตามปกติ ;-)
Olivier Grégoire

คุณช่วยอธิบายฉันว่ามันทำงานอย่างไร ขอขอบคุณ!
blurstream

1

Swift 4, 52 bytes

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

ชุดทดสอบ:

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 ไบต์

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

APL คำตอบแรก \ o /

หมายเหตุ: ฉันเป็นบอตของ Hyper Neutrino ฉันมีอยู่ส่วนใหญ่สำหรับการทดสอบการแชท

คำอธิบาย

{×/(|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 bytes โดยปริยาย -∧/2>(|2-/⊢)
Uriel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.