Bin ich eine unbedeutende Gruppe?

40

Ein unbedeutendes Array ist ein Array positiver Ganzzahlen, bei dem die absoluten Unterschiede zwischen aufeinanderfolgenden Elementen alle kleiner oder gleich 1 sind .

Das folgende Array ist beispielsweise unbedeutend:

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

Weil die entsprechenden (absoluten) Unterschiede sind:

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

Welches sind alle kleiner als oder gleich 1 .


Ihre Aufgabe besteht darin, festzustellen, ob ein bestimmtes Array von Ganzzahlen unbedeutend ist.

  • Sie können davon ausgehen, dass das Array immer mindestens zwei Elemente enthält.
  • Es gelten die Standard-Ein- und Ausgaberegeln . Sie können Eingaben (und Ausgaben) in jedem vernünftigen Format vornehmen.
  • Standardlücken sind verboten.
  • Die Wahrheits- / Falschheitswerte müssen eindeutig und konsistent sein.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes.

Testfälle

Eingabe -> Ausgabe

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

Ich habe die Werte trueund verwendet false.

Martin Ender
quelle
Müssen die wahrheitsgemäßen / falschen Werte in unserer Sprache der Wahl tatsächlich wahrheitsgemäss / falsch sein, oder können wir zwei unterschiedliche und konsistente Werte verwenden?
Martin Ender
1
@MartinEnder Beliebige zwei unterschiedliche und konsistente Werte. PS Entschuldigung für die späte Antwort
2
Der Text besagt, dass Sie eine Reihe von ganzen Zahlen erhalten, aber dass nur Reihen von positiven ganzen Zahlen unbedeutend sein können. Sollten wir auf eine Reihe negativer Ganzzahlen vorbereitet sein?
Mark S.

Antworten:

24

Gelee , 3 Bytes

IỊẠ

Probieren Sie es online!

Wie?

Genau die richtige Herausforderung für Jelly.

IỊẠ Volles Programm.

I Inkremente; Holen Sie sich den Unterschied zwischen aufeinanderfolgenden Elementen.
 Ị unbedeutend; return abs (Zahl) ≤ 1.
  Ạ Alle; Gibt 1 zurück, wenn alle Elemente wahr sind, andernfalls 0.
Mr. Xcoder
quelle
2
Pwürde nicht funktionieren, würde es, denn wenn alle Unterschiede 1ausgegeben würden 1, aber wenn einer von ihnen 0ausgegeben würde 0? Und wenn ein Unterschied 5nur einer 0wäre, würde er immer noch reichen 0?
Tas
1
Was ist mit der Anforderung "positive ganze Zahlen"?
3D1T0R
19

JavaScript (ES7), 33 29 Bytes

4 Bytes gespart dank @JohanKarlsson

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

Wie?

Wenn erzwungen Number, werden Arrays von mindestens zwei Elementen ausgewertet NaN. Durch die Wiederverwendung des Eingangs a als Variable, die den vorherigen Wert enthält, ergibt die erste Iteration von some () immer ([v0, v1, ...] - a [0]) ** 2 = NaN , unabhängig von der Wert von a [0] . Der erste Test ist also immer falsch und die tatsächlichen Vergleiche beginnen bei der zweiten Iteration, genau wie sie beabsichtigt sind.

Testfälle

Arnauld
quelle
29 Bytes:a=>!a.some(v=>(a-(a=v))**2>1)
Johan Karlsson
@JohanKarlsson Ah ja, die Eingabe enthält garantiert mindestens 2 Elemente, das ist also sicher. Danke vielmals!
Arnauld
7

Mathematica, 24 Bytes

Max@Abs@Differences@#<2&
Martin Ender
quelle
#==Clip@#&@*Differencesist ein Byte kürzer.
Mischa Lawrow
6

Schale , 4 Bytes

ΛεẊ-

Probieren Sie es online!

Erläuterung:

ΛεẊ- 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 der Outgolfer
quelle
6

Oktave , 21 Bytes

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

Anonyme Funktion, die einen numerischen Vektor und Ausgaben eingibt, 1wenn diese unbedeutend sind oder 0nicht.

Probieren Sie es online!

Luis Mendo
quelle
5

Pyth , 6 Bytes

._MI.+

Überprüfen Sie alle Testfälle.


Pyth , 8 Bytes

.A<R2aVt

Probieren Sie es online!

Erläuterung

._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.
Mr. Xcoder
quelle
Ich habe keine Ahnung, warum ich I#stattdessen gedacht habe M.
Steven H.
5

Proton , 41 Bytes

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

Probieren Sie es online!

-16 Bytes dank Mr. Xcoder
-2 Bytes
-6 Bytes dank Mr. Xcoder

HyperNeutrino
quelle
@ Mr.Xcoder Ich denke der Platz in <2 forkönnte weggelassen werden.
Jonathan Frech
@ JonathanFrech Es ist kein Platz da?
Mr. Xcoder
@ Mr.Xcoder oh yeah ich weiß nicht was ich mit all den verrückten Funktionsverkettungen gedacht habe. Vielen Dank! : D
HyperNeutrino
5

Japt , 6 Bytes

äa e<2

Probieren Sie es online!

Erläuterung

ä        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
quelle
5

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

-1 Byte danke an Jeppe Stig Nielsen

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

Die Byteanzahl umfasst auch:

using System.Linq;

Probieren Sie es online!

Erläuterung:

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
quelle
3
Kleine Verbesserung: a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)Es vermeidet die Verneinung !.
Jeppe Stig Nielsen
@JeppeStigNielsen super, danke!
Grzegorz Puławski
5

Perl 6 , 25 Bytes

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

Probieren Sie es online!

Dies sollte ziemlich lesbar sein. Das einzig weniger offensichtliche ist, dass der zip-Operator Zdas Zippen beendet, wenn die kürzere Liste erschöpft ist (wir entfernen das erste Element der Liste rechts) und dass das leere Index .[], das sogenannte Zen-Slice, die gesamte Liste enthält. .skipgibt die Liste ohne das erste Element zurück.

Ramillies
quelle
Sind diese beiden Räume wirklich notwendig?
Jonathan Frech
@ JonathanFrech: Der Richtige wohl nein. Außerdem habe ich gerade gemerkt, dass das .rotatehier nicht gebraucht wird.
Ramillies
Verdammt, sogar der linke könnte entfernt werden. Ich verstehe wirklich nicht, wo das Leerzeichen erforderlich ist und wo es nicht ...
Ramillies
Man könnte schreiben -2<statt -1≤und <2statt ≤1vier weitere Bytes zu speichern.
Sean
Ich denke, Sie müssen die Vergleiche tatsächlich umkehren 2>...>-2, um <eine fehlerhafte Interpretation zu vermeiden .
Sean
5

R , 30 26 Bytes

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

Probieren Sie es online!

user2390246
quelle
3
Ich denke, function(a)all(diff(a)^2<2)spart 3 Bytes.
BLT
Sie könnten die Eingabe von der Konsole nehmen:all(diff(scan())^2<2)
Flodel
@BLT guter Punkt!
user2390246
1
@flodel In letzter Zeit gab es einige Diskussionen darüber, ob die Ausgabe bei Verwendung explizit gedruckt werden muss scan, aber es wird trotzdem ein Byte gespeichert !
user2390246
4

05AB1E , 5 Bytes

¥Ä2‹P

Probieren Sie es online!

Erläuterung

¥        # calculate deltas
 Ä       # absolute values
  2‹     # smaller than 2
    P    # product
Emigna
quelle
@Okx: Ich fürchte nicht. Es wird [5,2]zum Beispiel nicht funktionieren .
Emigna
4

Ohm v2 , 4 Bytes

Δ2<Å

Probieren Sie es online!

Wie?

Δ2<Å   ~ Full program.

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

PowerShell , 62 Byte

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

Probieren Sie es online!

Powershell hat bisher keine .mapoder .someoder ähnlichen Befehl, so dass hier wir individuell jedes Delta überprüfen.

Wir nehmen Eingaben $aund setzen sie $lgleich dem ersten Element. Dann durchlaufen wir $ajedes Element und nehmen es heraus, wobei |?{...}der Unterschied $_-$lin -inder Reichweite liegt 1,0,-1. Wir setzen dann $lgleich dem aktuellen Element. Nun haben wir also eine Sammlung von Elementen, bei denen das Delta zwischen ihrem vorherigen Nachbarn 1 ist. Wir nehmen das .countvon und prüfen, ob es -eqdem .countdes Arrays als Ganzes entspricht. Wenn dies der Fall ist, ist jedes Delta 1 oder kleiner, sodass es sich um ein unbedeutendes Array handelt. Dieses boolesche Ergebnis verbleibt in der Pipeline, und die Ausgabe ist implizit.

AdmBorkBork
quelle
Sie können 1 Byte sparen, indem Sie den Parameter loswerden und tun$l=($a=$args)[0]
Briantist
@briantist Das geht aber nicht. Zum Beispiel. Dies liegt daran $l, dass in Ihrem Vorschlag das gesamte Eingabearray festgelegt wird.
AdmBorkBork
Ich denke, es erfordert nur eine Änderung der Art und Weise, wie Sie Argumente in TIO angeben (jedes Element muss separat angegeben werden). So wie Sie es jetzt haben, ist das erste Element von $argsselbst das gesamte Array. Beispiel
Briantist
Das fühlt sich betrogen an ...
AdmBorkBork
Ich denke, das ist eigentlich der richtige Weg $args. Wenn Sie ein Skript oder eine Funktion mit einer Reihe von Argumenten aufrufen, die als Leerzeichen voneinander getrennt sind, werden sie als separate Elemente in $argsTIO eingegeben. Ich persönlich habe es schon oft so benutzt, aber für jeden das
Richtige
2

MATL ,6 5 Bytes

d|2<A

-1 Byte danke an Giuseppe

Probieren Sie es online! oder Überprüfen Sie alle Testfälle

Cinaski
quelle
Ich denke , je Meta Konsens können Sie verwenden d|2<stattdessen als ein Array mit einem Nullwert ist Falsey in MATL.
Giuseppe
1
Oder d|2<Afür etwas, das Ihrer ursprünglichen Antwort näher kommt.
Giuseppe
1
@ Giuseppe Nein, das können sie nicht: Die Wahrheits- / Falschheitswerte müssen eindeutig und konsistent sein .
Mr. Xcoder
@ Mr.Xcoder "Ein Array mit allen Einsen für Wahrheit" und "Ein Array mit mindestens einer Null für Falsch" ist nicht eindeutig und konsistent?
Giuseppe
2
@ Giuseppe "ein Array mit allen Einsen für Wahrhaftigkeit" und "ein Array mit mindestens einer Null für Falsey" ist nicht eindeutig und konsistent? - Nein, das ist nicht akzeptabel, weil sie inkonsistent sind.
2

Anyfix , 9 Bytes

I€A€2<»/&

Probieren Sie es 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

Dies ist größtenteils ein Port der 05AB1E-Lösung, außer fürchterlich, da anyfix keine automatische Vektorisierung und andere coole Dinge enthält

HyperNeutrino
quelle
2

C 61 56 Bytes

Vielen Dank an @scottinet für das Speichern von fünf Bytes!

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

Probieren Sie es online!

C (gcc), 47 Bytes

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

Probieren Sie es online!

Steadybox
quelle
Und wenn es erlaubt ist / wenn Sie Lust dazu haben, können Sie 9 weitere Bytes einsparen, indem Sie das Ergebnis in speichern, ranstatt es zurückzugeben. :-)
Scottinet
@ Scottinet Ich dachte darüber nach, aber es ist kein gültiges C, obwohl es mit gcc funktioniert. Es ist jedoch erlaubt, also werde ich es wohl nur als alternative Version einbinden.
Steadybox
2
@scottinet Wenn Sie eine Variable am Ende einer Funktion zuweisen, wird dieser Wert in die Rückgabeadresse der Funktion eingefügt, sodass das Gefühl entsteht, dass der Wert zurückgegeben wird. Dieses Verhalten ist jedoch nicht Teil der C-Spezifikation und kann daher nicht garantiert werden. Es kann auch mit bestimmten optimierenden Compiler-Flags brechen.
Jonathan Frech
2
@ Scottinet Ah, es tut mir leid. Ich denke, das wäre nicht zulässig, da Sie in Ihrer Lösung nicht einfach Variablen gemäß der vereinbarten Regel zuweisen können. Beispielsweise wäre die Verwendung global definierter Variablen anstelle von Funktionsargumenten ebenfalls nicht zulässig. Ihre Aufgabe ist es, ein voll funktionsfähiges Programm / Funktion zu schreiben.
Jonathan Frech
1
@ JonathanFrech-Sprachen werden hier durch ihre Implementierung definiert. Wenn Sie also einen Compiler haben, der konsistente Ergebnisse liefert, ist die Antwort gültig, auch wenn sie formal UB ist.
Quentin
2

Clojure, 35 Bytes

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

Wie ordentlich ist das?

NikoNyrh
quelle
2

TI-Basic, 6 7 Bytes

prod(2>abs(ΔList(Ans

oder 5 Bytes, wenn Fehler als gültiger Rückgabewert gelten (gibt zurück, ERR:ARGUMENTwenn sie nicht signifikant sind, sonst ERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans
Oki
quelle
1
Dies sollte wahrscheinlich haben abs(ΔList(Ans, oder fällt um mehr als 1 (wie in {5,3,1} oder im Testfall {3,4,5,6,7,8,7,5}) nicht erkannt.
Mischa Lawrow
@ Mischa Lawrow danke, du hast recht!
Oki
1

JavaScript (ES6), 37-36 Byte

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

Bearbeiten: 1 Byte durch Stehlen von @ Arnauld's Trick gespeichert.

Neil
quelle
Sie könnten Curry gebrauchen:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint
1

Pyth, 7 Bytes

._I#I.+

Test Suite

Gibt true / false zurück.

Erläuterung:

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

Mathematica, 34 Bytes

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

Erläuterung

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

Probieren Sie es online!

  • 5 Bytes dank @Nevay!
Olivier Grégoire
quelle
1
Sie können rin der Schleife verwenden, um (p-n)nur einmal zu berechnen , >>1können /2oder entfernt werden, wenn Sie |anstelle von +: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 Bytes) verwenden.
Nevay
Prost @Nevay, danke! Perfektes Golfen, wie immer ;-)
Olivier Grégoire
Kannst du mir erklären, wie es funktioniert? Dankeschön!
Unschärfe
1

Schnelle 4, 52 Bytes

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

Testsuite:

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
quelle
1

APL, 13 Bytes

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

Erste APL-Antwort \ o /

Hinweis: Ich bin ein Bot von Hyper Neutrino. Ich existiere hauptsächlich für Chat-Tests.

Erläuterung

{×/(|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
quelle
1
11 Bytes als stillschweigend -∧/2>(|2-/⊢)
Uriel