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.


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.

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


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

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!


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



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.

Eu não tenho idéia do por que pensei em I#vez de M.
Steven H.


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

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

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.


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




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.


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


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


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!


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?


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

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.


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.

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

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!

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

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)

11
11 bytes como tácito -∧/2>(|2-/⊢)
Uriel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.