Я незначний масив?


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] -> помилково
[1, 1, 1, 2, 3, 4, 5, 6, 19] -> помилково
[3, 4, 5, 6, 7, 8, 7, 5] -> помилково
[1, 2, 4, 10, 18, 10, 100] -> помилково
[10, 20, 30, 30, 30] -> помилково

Я використав значення trueі false.


Чи мають насправді значення truthy / falesy повинні бути правдивими / хибними у нашій обраній мові, чи ми можемо використовувати будь-які два чіткі та послідовні значення?
Мартін Ендер

1
@MartinEnder Будь-які два чіткі та послідовні значення. PS Вибачте за пізню відповідь

2
У тексті сказано, що вам буде надано масив цілих чисел, але лише масиви додатних цілих чисел можуть бути незначними. Чи слід бути готовим до масиву від’ємних цілих чисел?
Марк С.

Відповіді:


24

Желе , 3 байти

IỊẠ

Спробуйте в Інтернеті!

Як?

Просто ідеальний виклик для Jelly.

IỊẠ Повна програма.

I Зростання; Отримайте різницю між послідовними елементами.
 Ị Незначні; повернути abs (число) ≤ 1.
  Ạ Усі; повертає 1, якщо всі елементи є truthy, 0 інакше.

2
Pце не спрацювало б так, бо якби всі відмінності були 1виведеними 1, але якби одна з них була, 0вона виводить 0? І якби одна різниця була, 5але одна, 0це все-таки зробить 0?
Тас

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 байт:a=>!a.some(v=>(a-(a=v))**2>1)
Йохан Карлссон

@JohanKarlsson Ага так, вхід гарантовано містить щонайменше 2 елементи, тож це безпечно. Дуже дякую!
Арнольд







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.
Стівен Х.

5

Протон , 41 байт

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

Спробуйте в Інтернеті!

-16 байт завдяки містеру Xcoder
-2 байти
-6 байт завдяки містеру Xcoder



@ Mr.Xcoder Я думаю, що простір у <2 forможе бути пропущеним.
Джонатан Фрех

@JonathanFrech Там немає місця?
Містер 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перестане блискавки , коли коротший список буде вичерпаний (ми видаляємо перший елемент списку праворуч) і що порожній підписник .[], так званий дзеркальний фрагмент, дає весь список. .skipповертає список без першого елемента.


Чи справді потрібні ці два простори?
Джонатан Фрех

@JonathanFrech: Правий, мабуть, ні. Також я просто зрозумів, що .rotateтут не потрібно.
Раміллі

Чорт, навіть ліву можна було видалити. Я дійсно не розумію, де потрібен пробіл, а де його немає ...
Раміллі

Ви можете написати -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 байт, позбувшись $l=($a=$args)[0]
парами

@briantist Це не працює. Наприклад. Це пояснюється тим, що $lу вашій програмі налаштування має бути вхідним масивом.
AdmBorkBork

Я думаю, що це просто вимагає змінити спосіб наведення аргументів у TIO (кожен елемент потрібно вказати окремо). Як ви це маєте зараз, перший елемент - $argsце сам масив. Приклад
британіст

Це відчуває себе шахрайством ...
AdmBorkBork

Я думаю, що це насправді правильний спосіб використання $args. Якщо ви назвали скрипт або функцію з низкою аргументів, розділених як пробіли, він увійшов би як окремі елементи в $args, а для TIO - це як емуляція цього. Я особисто використовував це так багато разів раніше, але кожному своє :)
британіст



2

MATL ,6 5 байт

d|2<A

-1 байт завдяки Джузеппе

Спробуйте в Інтернеті! або Перевірте всі тестові випадки


Я думаю, що за мета-консенсус ви можете використовувати d|2<замість цього, як масив із нульовим значенням - фальси в MATL.
Джузеппе

1
Або d|2<Aдля чогось ближчого до вашої оригінальної відповіді.
Джузеппе

1
@Giuseppe Ні, вони не можуть. Значення "truthy / false" мають бути чіткими та послідовними .
Містер Xcoder

@ Mr.Xcoder "масив усіх 1s для truthy" і "масив, що містить принаймні один нуль для falsey", не є чітким і послідовним?
Джузеппе

2
@Giuseppe "масив усіх 1s для truthy" та "масив, що містить принаймні один нуль для falsey", не є чітким та послідовним? - Ні, це не прийнятно, оскільки вони суперечать.

2

будь-яке виправлення , 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, за винятком жахливого, оскільки будь-яка виправлення не має автовекторизації та інших цікавих речей


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 Призначення змінної в кінці функції ставить це значення у зворотній адресі функції, створюючи відчуття, що вона повертає значення. Однак така поведінка не входить до специфікацій C, тому не гарантується для роботи. Він також може зламатися з певними оптимізаційними прапорами компілятора.
Джонатан Фрех

2
@scottinet Ах, вибачте. Я думаю, що це не буде дозволено, оскільки ви не можете просто призначити змінні у своєму рішенні за узгодженим правилом. Наприклад, використання глобально визначених змінних замість аргументів функції також не дозволяється. Ваше завдання - написати повністю функціональну програму / функцію.
Джонатан Frech

1
Мови @JonathanFrech визначаються їх реалізацією тут, тож якщо у вас є компілятор, який видає стійкі результати, то відповідь справедлива, навіть якщо формально UB.
Квентін

2

Clojure, 35 байт

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

Наскільки це охайно?


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}) не отримують виявлено.
Міша Лавров

@MishaLavrov спасибі, ти маєш рацію!
Окі

1

JavaScript (ES6), 37 36 байт

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

Редагувати: Збережено 1 байт, викравши трюк @ Арнольда.


Ви можете використовувати каррі: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

Математика, 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, дякую! Ідеальний гольф, як завжди ;-)
Олів'є Грегоар

ви можете мені пояснити, як це працює? Дякую тобі!
blurstream

1

Швидкий 4, 52 байти

{!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 байт як мовчазне -∧/2>(|2-/⊢)
Уріель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.