Я незначительный массив?


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.


Должны ли истинные / ложные ценности на самом деле быть правдивыми / ложными в нашем языке выбора, или мы можем использовать какие-то две разные и непротиворечивые ценности?
Мартин Эндер,

1
@MartinEnder Любые два разных и непротиворечивых значения. PS Извините за поздний ответ

2
В тексте говорится, что вам дадут массив целых чисел, но что только массивы натуральных чисел могут быть незначительными. Должны ли мы быть готовы к массиву отрицательных целых чисел?
Марк С.

Ответы:


24

Желе , 3 байта

IỊẠ

Попробуйте онлайн!

Как?

Просто идеальный вызов для желе.

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

I увеличивает; Получите разницу между последовательными элементами.
 Ị незначительный; возврат абс (число) ≤ 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 в качестве переменной, содержащей предыдущее значение, первая итерация some () всегда приводит к ([v0, v1, ...] - a [0]) ** 2 = NaN , независимо от того, значение [0] . Итак, первый тест всегда ложный, и фактические сравнения начинаются со 2-й итерации, как и предполагалось.

Контрольные примеры


29 байтов:a=>!a.some(v=>(a-(a=v))**2>1)
Йохан Карлссон

@JohanKarlsson Ах да, входные данные гарантированно содержат как минимум 2 элемента, так что это безопасно. Большое спасибо!
Arnauld




6

Шелуха , 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



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 байтов благодаря Mr. Xcoder
-2 байта
-6 байтов благодаря Mr. Xcoder



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

@JonathanFrech Там нет места там?
Мистер Кскодер

@ 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)избегает отрицания !.
Джеппе Стиг Нильсен

@JeppeStigNielsen офигенно, спасибо!
Гжегож Пулавски

5

Perl 6 , 25 байт

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

Попробуйте онлайн!

Это должно быть довольно читабельным. Единственное менее очевидное здесь то, что оператор zip Zперестанет архивировать, когда исчерпан более короткий список (мы удаляем первый элемент списка справа), и что пустой нижний индекс .[], так называемый фрагмент Zen, дает весь список. .skipвозвращает список без первого элемента.


Эти два пространства действительно необходимы?
Джонатан Фрех

@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 хороший момент!
user2390246

1
@flodel В последнее время обсуждалась необходимость явной печати вывода при использовании scan, но он все равно сохраняет байт!
user2390246



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

@briantist Это не работает, хотя. Например. Это связано с тем, что $lв вашем предложении будет задан весь входной массив.
AdmBorkBork

Я думаю, что это просто требует изменения способа предоставления аргументов в TIO (каждый элемент должен быть указан отдельно). То, как вы это делаете сейчас, первым элементом $argsявляется весь массив. Пример
бриантист

Это кажется обманом ...
AdmBorkBork

Я думаю, что это на самом деле правильный способ использования $args. Если бы вы вызвали сценарий или функцию с серией аргументов, разделенных пробелами, они бы появились как отдельные элементы $args, и для TIO это то, как это эмулировать. Я лично использовал это так много раз прежде, но каждому свое :)
briantist



2

MATL ,6 5 байт

d|2<A

-1 байт благодаря Джузеппе

Попробуйте онлайн! или проверить все тесты


Я думаю, что для мета-консенсуса вы можете использовать d|2<вместо этого, так как массив с нулевым значением является ошибочным в MATL.
Джузеппе

1
Или d|2<Aдля чего-то ближе к вашему первоначальному ответу.
Джузеппе

1
@Giuseppe Нет, они не могут: Истинные / ложные ценности должны быть четкими и последовательными .
г-н Xcoder

@ Mr.Xcoder "массив всех 1 для правды" и "массив, содержащий хотя бы один ноль для фалси", не различимы и непротиворечивы?
Джузеппе

2
@Giuseppe «массив всех 1 для правды» и «массив, содержащий хотя бы один ноль для фалси», не различимы и непротиворечивы? - Нет, это не приемлемо, потому что они противоречивы.

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 Я обдумал это, но он не действителен в C, хотя и работает с gcc. Это разрешено, хотя, поэтому я думаю, что я просто включу его в качестве альтернативной версии.
Steadybox

2
@scottinet Присвоение переменной в конце функции помещает это значение в адрес возврата функции, создавая ощущение, что оно возвращает значение. Тем не менее, это поведение не является частью спецификаций C, поэтому не гарантируется работа. Это может также порвать с некоторыми оптимизирующими флагами компилятора.
Джонатан Фрех

2
@ Scottinet Ах, прости. Я думаю, что это не будет разрешено, поскольку вы не можете просто назначить переменные в своем решении в соответствии с согласованным правилом. Например, использование глобально определенных переменных вместо аргументов функции также не допускается. Ваша задача - написать полнофункциональную программу / функцию.
Джонатан Фрех

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

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, спасибо! Идеальный гольф, как обычно ;-)
Оливье Грегуар,

Можете ли вы объяснить мне, как это работает? Спасибо!
Blurstream

1

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