Eu sou uma matriz insignificante?

40

Uma matriz insignificante é uma matriz de números inteiros positivos, em que as diferenças absolutas entre elementos consecutivos são menores ou iguais a 1 .

Por exemplo, a seguinte matriz é insignificante:

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

Porque as diferenças correspondentes (absolutas) são:

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

Quais são todos menores ou iguais a 1 .


Sua tarefa é determinar se uma determinada matriz de números inteiros é insignificante.

  • Você pode assumir que a matriz sempre contém pelo menos dois elementos.
  • Regras de entrada e saída padrão se aplicam. Você pode receber entrada (e saída) em qualquer formato razoável.
  • As brechas padrão são proibidas.
  • Os valores de verdade / falsidade devem ser distintos e consistentes.
  • Isso é , então a resposta mais curta em bytes vence.

Casos de teste

Entrada -> Saída

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

Eu usei os valores truee false.

Martin Ender
fonte
Os valores verdade / falsidade realmente precisam ser verdade / falsidade em nossa linguagem de escolha, ou podemos usar dois valores distintos e consistentes?
Martin Ender
11
@MartinEnder Quaisquer dois valores distintos e consistentes. PS Desculpe pela resposta tardia
2
O texto diz que você receberá uma matriz de números inteiros, mas que apenas matrizes de números inteiros positivos podem ser insignificantes. Devemos estar preparados para uma matriz de números inteiros negativos?
Mark S.

Respostas:

24

Gelatina , 3 bytes

IỊẠ

Experimente online!

Quão?

Apenas o desafio perfeito para Jelly.

I programa completo.

I incrementos; Obtenha a diferença entre elementos consecutivos.
 Ign insignificante; retornar abs (número) ≤ 1.
  Ạ tudo; retorna 1 se todos os elementos forem verdadeiros, 0 caso contrário.
Mr. Xcoder
fonte
2
Pnão funcionaria, porque se todas as diferenças fossem 1produzidas 1, mas se uma delas fosse 0produzidas 0? E se uma diferença fosse 5apenas uma 0, ainda faria 0?
Tas
11
E o requisito "números inteiros positivos"?
3D1T0R 23/09
19

JavaScript (ES7), 33 29 bytes

Guardado 4 bytes graças a @JohanKarlsson

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

Quão?

Quando coagidos Number, matrizes de pelo menos dois elementos são avaliadas NaN. Ao reutilizar a entrada a como a variável que mantém o valor anterior, a primeira iteração de some () sempre resulta em ([v0, v1, ...] - a [0]) ** 2 = NaN , independentemente da valor de um [0] . Portanto, o primeiro teste é sempre falso e as comparações reais começam na 2ª iteração, exatamente como pretendem.

Casos de teste

Arnauld
fonte
29 bytes:a=>!a.some(v=>(a-(a=v))**2>1)
Johan Karlsson
@JohanKarlsson Ah, sim, é garantido que a entrada contenha pelo menos 2 elementos, portanto é seguro. Muito obrigado!
Arnauld 22/09
7

Mathematica, 24 bytes

Max@Abs@Differences@#<2&
Martin Ender
fonte
#==Clip@#&@*Differencesé um byte mais curto.
Misha Lavrov #
7

Python 2 , 35 bytes

x=input()
while-2<x.pop(0)-x[0]<2:1

Existe com o código de status 1 para matrizes insignificantes, com o código de status 0 caso contrário.

Experimente online!

Dennis
fonte
6

Casca , 4 bytes

ΛεẊ-

Experimente online!

Explicação:

ΛεẊ- 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, o Outgolfer
fonte
6

Oitava , 21 bytes

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

Função anônima que insere um vetor numérico e gera, 1se insignificante ou 0não.

Experimente online!

Luis Mendo
fonte
6

Haskell , 34 33 bytes

all((<2).abs).(zipWith(-)=<<tail)

Experimente online! -1 byte graças a @ user1472751


A solução sem pontos é um dois novamente, apenas um byte ( graças a -1 byte de @Dennis ) menor que a abordagem recursiva:

f(a:b:r)=2>(a-b)^2&&f(b:r)
f _=1>0

Experimente online!

Laikoni
fonte
5

Pitão , 6 bytes

._MI.+

Verifique todos os casos de teste.


Pitão , 8 bytes

.A<R2aVt

Experimente online!

Explicação

._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
fonte
Eu não tenho idéia do por que pensei em I#vez de M.
Steven H.
5

Próton , 41 bytes

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

Experimente online!

-16 bytes graças ao Sr. Xcoder
-2 bytes
-6 bytes graças ao Sr. Xcoder

HyperNeutrino
fonte
@ Mr.Xcoder Acho que o espaço <2 forpode ser omitível.
Jonathan Frech 20/09
@JonathanFrech Não há espaço lá?
Sr. Xcoder
@ Mr.Xcoder oh yeah, eu não sei o que estava pensando com todas essas cadeias de funções loucas. Obrigado! : D
HyperNeutrino
5

Japonês , 6 bytes

äa e<2

Experimente online!

Explicação

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

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

-1 byte graças a Jeppe Stig Nielsen

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

A contagem de bytes também inclui:

using System.Linq;

Experimente online!

Explicação:

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
fonte
3
Pouca melhora: a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)evita a negação !.
Jeppe Stig Nielsen
@JeppeStigNielsen awesome, obrigado!
Grzegorz Puławski
5

Perl 6 , 25 bytes

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

Experimente online!

Isso deve ser bem legível. A única coisa menos óbvia aqui é que o operador zip Zirá parar de fechar quando a lista mais curta estiver esgotada (removemos o primeiro elemento da lista à direita) e que o subscrito vazio .[], chamado fatia Zen, fornece toda a lista. .skipretorna a lista sem o primeiro elemento.

Ramillies
fonte
Esses dois espaços são realmente necessários?
Jonathan Frech
@ JonathanFrech: O caminho certo provavelmente não. Também acabei de perceber que .rotatenão é necessário aqui.
Ramillies
Heck, mesmo o esquerdo poderia ser removido. Eu realmente não entendo onde é exigido o espaço em branco e onde não é ...
Ramillies
Você pode escrever em -2<vez de -1≤e em <2vez de ≤1salvar mais quatro bytes.
Sean
Acho que você realmente precisa reverter as comparações 2>...>-2para evitar interpretá <-las de maneira incorreta.
Sean
5

R , 30 26 bytes

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

Experimente online!

user2390246
fonte
3
Eu acho que function(a)all(diff(a)^2<2)economiza 3 bytes.
BLT
você pode pegar a entrada do console:all(diff(scan())^2<2)
flodel
@BLT bom ponto!
user2390246
11
@flodel Houve uma discussão recente sobre a necessidade de imprimir explicitamente a saída ao usar scan, mas ainda salva um byte!
user2390246
4

05AB1E , 5 bytes

¥Ä2‹P

Experimente online!

Explicação

¥        # calculate deltas
 Ä       # absolute values
  2‹     # smaller than 2
    P    # product
Emigna
fonte
@ Ok: Receio que não. Não vai funcionar, [5,2]por exemplo.
Emigna
4

Ohm v2 , 4 bytes

Δ2<Å

Experimente online!

Quão?

Δ2<Å   ~ Full program.

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

PowerShell , 62 bytes

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

Experimente online!

O PowerShell não tem um .mapou .somecomando ou similar, então aqui estamos verificando individualmente cada delta.

Tomamos entrada $ae definimos $ligual ao primeiro elemento. Em seguida, percorremos $ae retiramos cada elemento em que |?{...}a diferença $_-$lé -ino intervalo 1,0,-1. Em seguida, definimos $ligual ao elemento atual. Portanto, agora temos uma coleção de elementos em que o delta entre o vizinho anterior é 1. Nós analisamos .countisso e verificamos se é -equal para .counto conjunto como um todo. Se for, todo delta é 1 ou menos, portanto é uma matriz insignificante. Esse resultado booleano é deixado no pipeline e a saída é implícita.

AdmBorkBork
fonte
Você pode salvar 1 byte por se livrar do param e fazendo$l=($a=$args)[0]
briantist
@ briantist Isso não funciona, no entanto. Por exemplo. Isso ocorre porque está configurando $lpara ser toda a matriz de entrada da sua sugestão.
AdmBorkBork 21/09
Eu acho que isso requer apenas uma alteração na maneira como você fornece argumentos no TIO (cada elemento precisa ser especificado separadamente). Do jeito que você o tem agora, o primeiro elemento $argsé ele mesmo toda a matriz. Exemplo
briantist 21/09
Isso parece barato ...
AdmBorkBork /
Eu acho que é realmente a maneira correta de usar $args. Se você chamasse um script ou função com uma série de argumentos separados como espaços, ele entraria como elementos separados $argse, para o TIO, é assim que emular isso. Eu pessoalmente usado dessa maneira muitas vezes antes, mas a cada um o seu próprio :)
briantist
2

MATL ,6 5 bytes

d|2<A

-1 byte graças a Giuseppe

Experimente online! ou Verifique todos os casos de teste

Cinaski
fonte
Eu acho que por meta consenso você pode usar d|2<, pois uma matriz com um valor zero é falsey no MATL.
Giuseppe
11
Ou d|2<Apara algo mais próximo da sua resposta original.
Giuseppe
11
@ Giuseppe Não, eles não podem: Os valores de verdade / falsidade devem ser distintos e consistentes .
Sr. Xcoder
@ Mr.Xcoder "uma matriz de todos os 1s para verdade" e "uma matriz que contenha pelo menos um zero para falsey" não é distinta e consistente?
Giuseppe
2
@ Giuseppe "uma matriz de todos os 1s para verdade" e "uma matriz que contenha pelo menos um zero para falsey" não é distinta e consistente? - Não, isso não é aceitável, porque são inconsistentes.
2

anyfix , 9 bytes

I€A€2<»/&

Experimente 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

Esta é principalmente uma porta da solução 05AB1E, exceto terrível, porque anyfix não possui autovectorização e outras coisas legais

HyperNeutrino
fonte
2

C, 61 56 bytes

Obrigado a @scottinet por salvar cinco bytes!

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

Experimente online!

C (gcc), 47 bytes

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

Experimente online!

Steadybox
fonte
E se for permitido / se você quiser, poderá salvar mais 9 bytes armazenando o resultado em rvez de devolvê-lo. :-)
scottinet
@ scottinet Eu considerei isso, mas não é válido C, mesmo que funcione com o gcc. É permitido, no entanto, acho que vou incluí-lo como uma versão alternativa.
Steadybox 20/09/17
2
@scottinet A atribuição de uma variável no final de uma função coloca esse valor no endereço de retorno da função, fazendo parecer que ele está retornando o valor. No entanto, esse comportamento não faz parte das especificações C, portanto não é garantido que funcione. Também pode ser interrompido com determinados sinalizadores de compilação de otimização.
Jonathan Frech 20/09
2
@ scottinet Ah, me desculpe. Eu acho que isso não seria permitido, pois você não pode simplesmente atribuir variáveis ​​em sua solução de acordo com a regra acordada. Como exemplo, o uso de variáveis ​​definidas globalmente em vez de argumentos de função também não seria permitido. Sua tarefa é escrever um programa / função totalmente funcional.
Jonathan Frech 20/09
11
As linguagens @ Jonathan Jonathan são definidas por sua implementação aqui; portanto, se você tiver um compilador que produz resultados consistentes, a resposta é válida, mesmo que seja formalmente UB.
Quentin
2

Clojure, 35 bytes

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

Quão legal é isso?

NikoNyrh
fonte
2

TI-Basic, 6 7 bytes

prod(2>abs(ΔList(Ans

ou, 5 bytes se os erros contam como valor de retorno válido (retorna ERR:ARGUMENTse insignificante, caso contrário ERR:DOMAIN)

augment(sin⁻¹(ΔList(Ans
Tudo bem eu
fonte
11
Provavelmente isso deve ter abs(ΔList(Ans, ou então cai em mais de 1 (como em {5,3,1} ou no caso de teste {3,4,5,6,7,8,7,5}) não obtém detectou.
Misha Lavrov
@MishaLavrov obrigado, você está certo!
Oki
1

JavaScript (ES6), 37 36 bytes

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

Edit: Salvo 1 byte, roubando o truque de @ Arnauld.

Neil
fonte
Você poderia usar o curry:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
Bálint 24/09
1

Pitão, 7 bytes

._I#I.+

Suíte de teste

Retorna verdadeiro / falso.

Explicação:

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

Mathematica, 34 bytes

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

Explicação

                                 & (* 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 *)
ngenisis
fonte
1

Java (OpenJDK 8) , 60 bytes

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

Experimente online!

  • 5 bytes graças a @Nevay!
Olivier Grégoire
fonte
11
Você pode usar ro loop para calcular (p-n)apenas uma vez, >>1pode ser /2removido ou removido se usar em |vez de +: a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}(60 bytes).
Nevay 20/09
Saúde @Nevay, obrigado! De golfe perfeito, como de costume ;-)
Olivier Grégoire
você pode me explicar como isso funciona? obrigado!
Borrão 22/09/17
1

Swift 4, 52 bytes

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

Suíte de teste:

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

APL, 13 bytes

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

Primeira resposta da APL \ o /

Nota: Eu sou um bot de propriedade da Hyper Neutrino. Eu existo principalmente para testes de bate-papo.

Explicação

{×/(|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
fonte
11
11 bytes como tácito -∧/2>(|2-/⊢)
Uriel