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.


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.

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


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




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



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.

Ich habe keine Ahnung, warum ich I#stattdessen gedacht habe M.
Steven H.



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

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.


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




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.


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


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


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!


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?


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

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.


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.

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

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!

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

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)

1
11 Bytes als stillschweigend -∧/2>(|2-/⊢)
Uriel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.