Em matemática, uma maneira de descobrir qual é o tipo de uma determinada relação (linear, quadrática etc.) para calcular as diferenças. Para fazer isso, você pega uma lista de valores y para os quais a diferença entre os valores correspondentes x é a mesma e subtrai cada um do número acima, criando uma lista de números um menor que a lista anterior. Se a lista resultante for completamente composta por números idênticos, a relação terá uma diferença de 1 (é linear). Se eles não forem idênticos, repita o processo na nova lista. Se eles agora são idênticos, a relação tem uma diferença de 2 (é quadrática). Se eles não forem idênticos, você simplesmente continua esse processo até que sejam. Por exemplo, se você tiver a lista de valores y [1,6,15,28,45,66] para aumentar incrementalmente os valores x:
First Differences:
1
6 1-6 =-5
15 6-15 =-9
28 15-28=-13
45 28-45=-17
66 45-66=-21
Second differences:
-5
-9 -5+9 =4
-13 -9+13 =4
-17 -13+17=4
-21 -17+21=4
As these results are identical, this relation has a difference of 2
Sua tarefa:
Escreva um programa ou função que, ao receber uma matriz de números inteiros como entrada, retorne a diferença da relação descrita pela matriz, conforme explicado acima.
Entrada:
Uma matriz de números inteiros, que pode ter qualquer tamanho> 1.
Saída:
Um número inteiro que representa a diferença da relação descrita pela entrada.
Casos de teste:
Input => Output
[1,2,3,4,5,6,7,8,9,10] => 1
[1,4,9,16,25,36] => 2
[1,2,1] => 2 (when there is only one value left, all values are automatically identical, so the largest difference an array can have is equal to the length of the array-1)
"Hello World" => undefined behavior (invalid input)
[1,1,1,1,1,1,1,1,1] => 0 (all elements are already identical)
[1, 3, 9, 26, 66, 150, 313, 610] => 6
Pontuação:
Isso é código-golfe , a menor pontuação em bytes em cada idioma ganha para esse idioma. A pontuação mais baixa geral recebe a marca de seleção verde.
fonte
[1,2,1]
dar 2?[1,2,1] -> [1,-1] -> [-2]
[1,3,9,26,66,150,313,610]
->6
se desejarRespostas:
Casca , 6 bytes
Obrigado Leo por me deixar usar sua versão que funciona para
[1,1,1,1,1,1]
Experimente online!
Explicação
fonte
[1,1,1,1]
, posso usar o seu?JavaScript (ES6), 47 bytes
Casos de teste
Mostrar snippet de código
fonte
MATL , 8 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
Isso compara diferenças consecutivas iterativamente até que o resultado seja todos os zeros ou vazios. A saída é o número necessário de iterações menos 1.
fonte
R ,
5044 bytesExperimente online!
Tira um
diff
del
, define comol
e verifica se o resultado contém algum valor diferente de zero. Se isso acontecer, o incrementoF
(inicializado comoFALSE
implicitamente), e retornaF*1
para converterFALSE
para0
no caso de todosl
é idêntico já.fonte
+F
truque para 5 bytes . Resposta pura btw!Mathematica, 49 bytes
thanx @alephalpa para -6 bytes e @hftf -1 byte
e aqui está outra abordagem do @hftf
Mathematica, 49 bytes
fonte
(s=#;t=0;While[UnsameQ@@s,s=Differences@s;t++];t)&
UnsameQ[1,2,1]
é falso;!SameQ[1,2,1]
é verdade. Eu também não acho que o loop manual salva caracteres:Length@NestWhileList[Differences,#,!SameQ@@#&]-1&
já é do mesmo tamanho que o seu depois de substituirUnsameQ
por!SameQ
.Geléia , 7 bytes
Experimente online!
Explicação
fonte
IÐĿE€ċ0
Japonês ,
107 bytesExperimente online!
Confia no fato de que o resultado é garantido dentro do comprimento da matriz de entrada.
Explicação
No final, isso mapeará a matriz
[1, 3, 9, 26, 66, 150, 313, 610]
para[true, true, true, true, true, true, false, false]
,que contém
6
true
s.Versão anterior de 10 bytes
Experimente online!
fonte
Perl 6 , 37 bytes
Experimente online!
Explicação: A função aceita a entrada como uma lista. Em seguida, ele cria uma sequência recursiva como esta: o primeiro elemento é a lista original (
$_
), os próximos elementos são retornados ao{@(@$_ Z- .[1..*])}
serem chamados no elemento anterior e são iterados até que a condição*.none
seja verdadeira, o que acontece apenas quando a lista é vazio ou contém apenas zeros (ou, tecnicamente, outros valores de falsey). Em seguida, pegamos a lista e subtraímos 2, o que a força primeiro ao contexto numérico (e as listas no contexto numérico são iguais ao número de seus elementos) e, no final, retorna 2 menor que o número de elementos no Lista.O bloco estranho
{@(@$_ Z- .[1..*])}
apenas pega a lista fornecida (.[]
- chamada fatia Zen - a indexação com colchetes vazios gera a lista inteira), fecha o zíper usando o operador menos (Z-
) com a mesma lista sem o primeiro elemento (.[1..*]
) e o força a uma lista (@(...)
- precisamos disso porque o zip retorna apenas uma Seq, que é basicamente uma lista unidirecional que pode ser iterada apenas uma vez. É algo que não gostamos.) E é isso.fonte
@(.[] Z- .[1..*])
para[.[] Z-.[1..*]]
deve salvar dois bytes.Java 8,
191 + 58 = 249198140 bytes.Obrigado PunPun1000 por 51 bytes.
Obrigado Nevay por 58 bytes.
Experimente Online!
Experimente Online (versão de 198 bytes)
Portanto, esta é minha primeira vez postando aqui no PPCG (e a primeira vez em um desafio de código de golfe). Qualquer crítica construtiva é bem-vinda e apreciada. Tentei seguir as diretrizes para publicação, se algo não estiver certo, fique à vontade para apontar.
Versão embelezada:
fonte
java.util.stream.IntStream k = java.util.Arrays.stream(a);
public
não precisa ser incluído na contagem de bytes. 2) Você não deve aceitar um segundo parâmetro, mas removê-lo pode realmente salvar bytes. 3) você pode remover alguns suportes desnecessários láHaskell, 46 bytes
isso simplesmente se repete -
zipWith(-)l$last l
é a lista de diferenças del
. eg
é a função que responde à pergunta.fonte
Kotlin , 77 bytes
primeiro post, tentou editar a última resposta no kotlin 2 vezes; D
fez parte do teste de @jrtapsell
TryItOnline
fonte
APL (Dyalog Classic) ,
2217 bytesExperimente online!
Graças a @ngn por -5 bytes!
Quão?
{ ... }
, a função1=≢∪⍵:0
, se todo elemento for igual no argumento, retorne0
1+∇2-/⍵
caso contrário, retorne 1 +n
das diferenças (ou sejan-1
, adicionar uma delas fornecen
)fonte
{1=≢∪⍵:0⋄1+∇2-/⍵}
Geléia , 7 bytes
Experimente online!
Explicação
-1 byte graças a Jonathan Allan
fonte
IÐĿEÐḟL
por sete (vejo Miles também encontrou sete usando recursão).05AB1E , 7 bytes
Experimente online!
Explicação
fonte
JavaScript (ES6), 58 bytes
fonte
Python 2 , 65 bytes
-7 bytes graças a Jonathan Allan.
Experimente online!
fonte
c
em1
, decrementando e depois usandoprint-c
.f=lambda l,c=1:any(l)and f([j-i for i,j in zip(l,l[1:])],c-1)or-c
max(...,0)
passar nos[1, 1, 1, 1, ...]
casos de teste.Dyalog APL, 19 bytes
Explicação:
fonte
≢-1+∘≢2-/⍣{1=≢∪⍵}⊢
k , 21 bytes
Isso funciona em k, mas não em OK, porque o loop while de OK é executado antes de verificar a condição (em vez de primeiro verificar a condição e depois executar o código). Portanto, em OK, o
1 1 1 1 1
exemplo não funcionará corretamente.Experimente oK online!
Explicação:
fonte
~&/1_=':
->1<#?
Haskell ,
666160 bytesExperimente online!
Economizou 5 bytes graças a Christian Sievers
Guardado 1 byte graças a proud-haskeller
iterate(z(-))
calcula as listas de diferenças.or.z(/=)
testa se há elementos não iguais nessas listas.length.takeWhile
conta as listas de diferenças com elementos não iguais.fonte
or.z(/=)
z=(=<<tail).zipWith
, um byte mais curtoJava (OpenJDK 8) ,
9894 bytesExperimente online!
fonte
Japonês , 7 bytes
A mesma abordagem (mas derivada de forma independente) que Justin com uma implementação diferente.
Teste-o
Explicação
Entrada implícita da matriz
U
.Mapa sobre cada elemento.
Pegue cada par sequencial (
ä
) de elementosU
e reduza-o pela diferença absoluta (a
).Reatribua essa matriz para
U
.Count (
è
) o número de sub-matrizes que retornam verdade (ou seja, diferentes de zero) quando reduzidas pela adição.fonte
TI-Basic, 19 bytes
Por padrão, as variáveis começam em zero. Além disso, nunca pensei que eu estaria usando
IS>(
para algo útil.fonte
C # (.NET Core) ,
7069 + 18 bytes-1 byte graças a Kevin Cruijssen
Deve ser atribuído 0 ao chamar para operar corretamente. Também incluído na contagem de bytes:
Experimente online!
Explicação:
Versão iterativa 84 + 18 bytes:
Experimente online!
fonte
(y,z)=>y-z
. Mas boa resposta, +1 de mim.Clojure, 62 bytes
Bem
=
pode aceitar qualquer número de argumentos, e um único argumento é idêntico a "ele mesmo".(apply = [1 2 3])
é executado como(= 1 2 3)
.fonte
Pitão , 15 bytes
Verifique todos os casos de teste.
Quão?
Explicação nº 1
fonte
Wtl{Q=hZ=.+Q)Z
WP{Q=hZ=.+Q)Z
. Obrigado!Perl 5 , 83 + 1 (-a) = 84 bytes
Experimente online!
Insira como uma lista de números separados por um espaço.
fonte
Pyke , 11 bytes
Experimente aqui!
fonte
Pitão, 10 bytes
Se conseguirmos indexar a partir de 1, podemos salvar um byte removendo o líder
t
.Experimente Online
Explicação
fonte
Kotlin , 83 bytes
Embelezado
Teste
TryItOnline
fonte
lang-kotlin
simplesmentekotlin
nas dicas do marcador.Swift 4 , 90 bytes
Implementação alternativa baseada em fechamento:
casos de teste:
fonte