Czy jestem nieistotną tablicą?


40

Znaczenia tablicą jest tablica dodatnimi liczbami całkowitymi, gdzie bezwzględnych różnic między kolejnymi elementami są wszystkie mniejsze niż lub równe 1 .

Na przykład poniższa tablica jest nieistotna:

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

Ponieważ odpowiadające (bezwzględne) różnice to:

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

Które są mniejsze lub równe 1 .


Twoim zadaniem jest ustalenie, czy dana tablica liczb całkowitych jest nieistotna.

Przypadki testowe

Wejście -> Wyjście

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4] -> prawda
[1, 2, 3, 4, 5, 6, 7, 8, 9, 8] -> prawda
[3, 3, 3, 3, 3, 3, 3] -> prawda
[3, 4, 4, 4, 3, 3, 3, 4, 4, 4] -> prawda
[1, 2, 3, 4] -> prawda 
[5, 4, 3, 2] -> prawda 
[1, 3, 5, 7, 9, 7, 5, 3, 1] -> fałsz
[1, 1, 1, 2, 3, 4, 5, 6, 19] -> fałsz
[3, 4, 5, 6, 7, 8, 7, 5] -> fałsz
[1, 2, 4, 10, 18, 10, 100] -> fałsz
[10, 20, 30, 30, 30] -> fałsz

Użyłem wartości truei false.


Czy wartości prawda / fałsz rzeczywiście muszą być zgodne z prawdą / fałszem w wybranym przez nas języku, czy też możemy zastosować dowolne dwie odrębne i spójne wartości?
Martin Ender

1
@MartinEnder Dowolne dwie odrębne i spójne wartości. PS Przepraszam za spóźnioną odpowiedź

2
Tekst mówi, że otrzymasz tablicę liczb całkowitych, ale tylko tablice liczb całkowitych dodatnich mogą być nieznaczne. Czy powinniśmy być przygotowani na tablicę ujemnych liczb całkowitych?
Mark S.

Odpowiedzi:


24

Galaretka , 3 bajty

IỊẠ

Wypróbuj online!

W jaki sposób?

Idealne wyzwanie dla galaretki.

IỊẠ Pełny program.

I Przyrosty; Uzyskaj różnicę między kolejnymi elementami.
 Ị Nieistotne; zwracany abs (liczba) ≤ 1.
  Ạ wszyscy; zwraca 1, jeśli wszystkie elementy są zgodne z prawdą, 0 w przeciwnym razie.

2
Pnie zadziałałoby, bo gdyby wszystkie różnice byłyby 1wyprowadzone 1, ale gdyby jedna z nich była 0wyprowadzona 0? A jeśli jedna różnica byłaby, 5ale jedna 0byłaby nadal skuteczna 0?
Tas

1
Co z wymogiem „dodatnich liczb całkowitych”?
3D1T0R

19

JavaScript (ES7), 33 29 bajtów

Zaoszczędź 4 bajty dzięki @JohanKarlsson

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

W jaki sposób?

Po wymuszeniu na Numbertablice co najmniej dwóch elementów są oceniane na NaN. Ponowne użycie wejścia a jako zmiennej przechowującej poprzednią wartość powoduje , że pierwsza iteracja niektórych () zawsze powoduje ([v0, v1, ...] - a [0]) ** 2 = NaN , bez względu na wartość [0] . Tak więc pierwszy test jest zawsze fałszywy, a rzeczywiste porównania rozpoczynają się od drugiej iteracji, tak jak powinny.

Przypadki testowe


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

@JohanKarlsson Ach, tak, wejście zawiera co najmniej 2 elementy, więc jest to bezpieczne. Wielkie dzięki!
Arnauld




6

Łuska , 4 bajty

ΛεẊ-

Wypróbuj online!

Wyjaśnienie:

ΛεẊ- 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 bajtów

._MI.+

Sprawdź wszystkie przypadki testowe.


Pyth , 8 bajtów

.A<R2aVt

Wypróbuj online!

Wyjaśnienie

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

Nie mam pojęcia, dlaczego myślałem I#zamiast M.
Steven H.


5

Japt , 6 bajtów

äa e<2

Wypróbuj online!

Wyjaśnienie

ä        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 bajtów

-1 bajt dzięki Jeppe Stig Nielsen

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

Liczba bajtów obejmuje również:

using System.Linq;

Wypróbuj online!

Wyjaśnienie:

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
Mała poprawa: a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)pozwala uniknąć negacji !.
Jeppe Stig Nielsen,

@JeppeStigNielsen niesamowite, dziękuję!
Grzegorz Puławski,

5

Perl 6 , 25 bajtów

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

Wypróbuj online!

To powinno być dość czytelne. Jedyną mniej oczywistą rzeczą jest to, że operator zip Zprzestanie zipować, gdy wyczerpana zostanie krótsza lista (usuwamy pierwszy element listy po prawej stronie) i że pusty indeks dolny .[], tak zwany plasterek Zen, daje całą listę. .skipzwraca listę bez pierwszego elementu.


Czy te dwie przestrzenie są naprawdę konieczne?
Jonathan Frech,

@JathanathanFrech: Właściwy prawdopodobnie nie. Właśnie zdałem sobie sprawę, że .rotatetutaj nie jest to potrzebne.
Ramillies,

Cholera, nawet lewy można usunąć. Naprawdę nie rozumiem, gdzie jest wymagane białe miejsce, a gdzie nie ...
Ramillies,

Możesz pisać -2<zamiast -1≤i <2zamiast ≤1zapisywać kolejne cztery bajty.
Sean

Wydaje mi się, że trzeba odwrócić porównania, 2>...>-2aby uniknąć <błędnej interpretacji .
Sean




3

PowerShell , 62 bajty

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

Wypróbuj online!

PowerShell nie posiada .maplub .somelub podobne polecenie, więc tutaj mamy indywidualnie sprawdzanie każdego deltę.

Bierzemy dane wejściowe $ai ustawiamy $lrówne pierwszemu elementowi. Następnie przechodzimy przez pętlę $ai wyjmujemy każdy element, w którym |?{...}różnica $_-$ljest -inzakresem 1,0,-1. Następnie ustawiamy $lrówny bieżącemu elementowi. Mamy teraz kolekcję elementów, w których delta między ich poprzednim sąsiadem wynosi 1. Bierzemy .countto i sprawdzamy, czy jest ona -eqrówna .countcałej tablicy. Jeśli tak, to każda delta ma wartość 1 lub mniej, więc jest to niewielka tablica. Ten wynik logiczny jest pozostawiany w potoku, a dane wyjściowe są niejawne.


Możesz zaoszczędzić 1 bajt, pozbywając się param i robiąc$l=($a=$args)[0]
briantist

@briantist To jednak nie działa. Na przykład. Wynika to z faktu, że $lw Twojej sugestii jest ustawiona cała tablica wejściowa.
AdmBorkBork,

Myślę, że to wymaga jedynie zmiany sposobu podawania argumentów w TIO (każdy element musi być określony osobno). Tak jak teraz, pierwszym elementem $argsjest sama cała tablica. Przykład
briantist

To wydaje się oszukiwane ...
AdmBorkBork

Myślę, że to właściwie właściwy sposób użycia $args. Jeśli wywołałeś skrypt lub funkcję z szeregiem argumentów oddzielonych spacjami, pojawiłby się on jako osobne elementy w $args, a dla TIO właśnie to naśladuje. Osobiście korzystałem z niego w ten sposób wiele razy wcześniej, ale każdemu z nich :)
briantist



2

MATL ,6 5 bajtów

d|2<A

-1 bajt dzięki Giuseppe

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe


Myślę, że według meta konsensusu możesz użyć d|2<zamiast tego, ponieważ tablica z zerową wartością jest falsey w MATL.
Giuseppe,

1
Lub d|2<Acoś bliższego oryginalnej odpowiedzi.
Giuseppe,

1
@Giuseppe Nie, nie mogą: Wartości prawdy / fałszu muszą być wyraźne i spójne .
Pan Xcoder,

@ Mr.Xcoder „tablica wszystkich 1 na prawdę” i „tablica zawierająca co najmniej jedno zero dla falsey” nie jest wyraźna i spójna?
Giuseppe,

2
@Giuseppe „tablica wszystkich 1 dla prawdy” i „tablica zawierająca co najmniej jedno zero dla falsey” nie jest wyraźna i spójna? - Nie, to nie do przyjęcia, ponieważ są niespójne.

2

anyfix , 9 bajtów

I€A€2<»/&

Wypróbuj 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

Jest to głównie port rozwiązania 05AB1E, z wyjątkiem strasznego, ponieważ anyfix nie ma autowektoryzacji i innych fajnych rzeczy


2

C, 61 56 bajtów

Dzięki @scottinet za uratowanie pięciu bajtów!

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

Wypróbuj online!

C (gcc), 47 bajtów

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

Wypróbuj online!


A jeśli jest to dozwolone / jeśli masz na to ochotę, możesz zaoszczędzić jeszcze 9 bajtów , przechowując wynik rzamiast go zwracając. :-)
scottinet,

@ scottinet Rozważyłem to, ale nie jest to poprawne C, nawet jeśli zdarza się, że działa z gcc. Jest to jednak dozwolone, więc chyba dołączę go jako alternatywną wersję.
Steadybox

2
@ scottinet Przypisanie zmiennej na końcu funkcji umieszcza tę wartość na adresie zwrotnym funkcji, sprawiając wrażenie, że zwraca wartość. Jednak takie zachowanie nie jest częścią specyfikacji C, a tym samym nie gwarantuje działania. Może również zerwać z pewnymi optymalizującymi flagami kompilatora.
Jonathan Frech,

2
@scottinet Ah, przepraszam. Myślę, że nie byłoby to dozwolone, ponieważ nie można po prostu przypisać zmiennych do rozwiązania zgodnie z ustaloną zasadą. Na przykład, użycie globalnie zdefiniowanych zmiennych zamiast argumentów funkcji również nie byłoby dozwolone. Twoim zadaniem jest napisanie w pełni funkcjonalnego programu / funkcji.
Jonathan Frech,

1
Języki @JathanathanFrech są tutaj zdefiniowane przez ich implementację, więc jeśli masz kompilator, który daje spójne wyniki, odpowiedź jest poprawna, nawet jeśli formalnie UB.
Quentin,

2

Clojure, 35 bajtów

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

Jak to jest miłe?


2

TI-Basic, 6 7 bajtów

prod(2>abs(ΔList(Ans

lub 5 bajtów, jeśli błędy liczą się jako poprawna wartość zwracana (zwraca, ERR:ARGUMENTjeśli nieistotna, w przeciwnym razie ERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans

1
Prawdopodobnie powinno to mieć abs(ΔList(Ans, inaczej spadnie o więcej niż 1 (na przykład w {5,3,1} lub w przypadku testowym {3,4,5,6,7,8,7,5}) wykryty.
Misha Lavrov

@MishaLavrov dzięki, masz rację!
Oki

1

JavaScript (ES6), 37 36 bajtów

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

Edycja: Zapisano 1 bajt kradnąc sztuczkę @ Arnauld.


Można użyć curry:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint

1

Pyth, 7 bajtów

._I#I.+

Pakiet testowy

Zwraca true / false.

Wyjaśnienie:

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

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

Wyjaśnienie

                                 & (* 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 bajtów

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

Wypróbuj online!

  • 5 bajtów dzięki @Nevay!

1
Możesz użyć rw pętli, aby obliczyć (p-n)tylko raz, >>1można /2lub usunąć, jeśli użyjesz |zamiast +: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 bajtów).
Nevay

Pozdrawiam @Nayay, dziękuję! Idealne gra w golfa, jak zwykle ;-)
Olivier Grégoire,

czy możesz mi wyjaśnić, jak to działa? Dziękuję Ci!
blurstream

1

Swift 4, 52 bajty

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

Zestaw testowy:

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 bajtów

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

Pierwsza odpowiedź APL \ o /

Uwaga: Jestem botem należącym do Hyper Neutrino. Jestem głównie do testowania czatów.

Wyjaśnienie

{×/(|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 bajtów jako ukryte -∧/2>(|2-/⊢)
Uriel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.