Você coleciona dados de um Advanced Collecting Device Controller ™ há muito tempo. Você verifica os logs e, para seu horror, descobre que algo deu muito errado: os dados contêm apenas os últimos bits dos números!
Felizmente, você sabe o valor inicial e que o valor nunca muda rapidamente. Isso significa que você pode recuperar o resto apenas encontrando a distância desde o início.
Desafio
Você escreverá um programa ou uma função para calcular a quantidade que um valor mudou, dado um módulo N
e uma lista do módulo de valores intermediários N
.
A mudança entre cada par de números é sempre menor queN/2
, portanto, haverá apenas uma resposta válida para cada caso de teste.
Você receberá como entrada um número inteiro N
> 2 e uma lista de valores, em um formato de sua escolha. A entrada pode ser fornecida via STDIN ou linha de comando ou argumentos de função.
Você produzirá um único inteiro, a quantidade que o valor original mudou. A saída pode ser impressa em STDOUT ou retornada.
Regras
- Seu programa deve funcionar para qualquer distância e módulo menor que
2^20
. - Você pode assumir que:
N
é pelo menos3
.- A lista possui pelo menos 2 valores.
- Todos os valores na lista são pelo menos 0 e menores que
N
. - Todas as alterações nos números são menores que
N/2
.
- Qualquer outra coisa é uma entrada inválida, e seu programa pode fazer o que quiser.
- São proibidas brechas padrão, quaisquer bibliotecas não padrão e funções internas para esse fim exato.
- Isso é código-golfe , então o programa mais curto em bytes vence.
Casos de teste de exemplo
Entrada:
3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Resultado:
4
Explicação (com valor de exemplo):
Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value: 0 1 2 2 3 4 3 2 1 2 3 4 5 4 4
Entrada:
10
5 2 8 9 5
Resultado:
-10
Explicação (com valor de exemplo):
Value mod 10: 5 2 8 9 5
Value: 15 12 8 9 5
Entradas inválidas:
2
0 0 0 0 0
(módulo muito pequeno)
6
2 5 4 2
(alteração muito grande entre 2 e 5)
:^;[5 2 8 9 5](\
?Respostas:
TI-BASIC, 15 bytes
Retira a lista
Ans
e o módulo deInput
.fonte
Python 2, 53 bytes
Super resposta direta. Gostaria de saber se existe um caminho mais curto.
fonte
.:_2
gerar pares até ver sua resposta - eu estava usando zip.Mathematica, 30 bytes
Esta é uma função anônima que recebe dois argumentos. Exemplo de uso:
Isso funciona usando os
Differences
elementos sucessivos, agrupando-os no intervalo-n/2
para+n/2
withMod
e seu parâmetro de deslocamento e, em seguida, considerando o total comTr
(rastreamento da matriz, soma dos elementos diagonais).Note que mesmo sem ser golpeado, são apenas 43 bytes!
fonte
@
é desnecessário quando você já está chamando a função entre colchetes. Ter os dois é um erro de sintaxe.J, 24 bytes
Uso:
Vai tentar jogar mais e adicionar algumas explicações depois disso.
Experimente online aqui.
fonte
Pitão,
2019 bytesRoubou
.:_2
de Jakube, idéia de Mauris.fonte
R, 38 bytes
Isso cria uma função sem nome que aceita um número inteiro e um vetor como entrada e retorna um único número inteiro. Para chamá-lo, dê um nome, por exemplo
f=function(n,v)...
.Ungolfed + explicação:
Exemplos:
fonte
MatLab, 33 bytes
Lamentamos, esta é a minha primeira resposta neste site. Digitar isso no MatLab e, em seguida, usar a entrada
ans(modulus_value, [intermediate_values])
retornará o valor solicitado, onde 'modulus_value' é o valor do módulo e 'intermed_values' é uma lista dos valores intermediários separados por espaços ou vírgulas.Exemplo:
A função anônima aproveita MatLab de
mod
,diff
esum
funções para calcular a resposta. Primeiro, a diferença entre cada um dos valores intermediários é calculada. O resultado é então compensado pelo módulo dividido por dois, resultando em um conjunto de valores de diferença vinculados por [-modulus / 2 modulus / 2]. O resultado é então deslocado e somado novamente.Eu acho que isso pode ser mais golfe, volto em breve com uma atualização. Agradecimentos especiais a @ 2012rcampion pela ideia.
Edit: A
unwrap
função do Matlab quase funciona aqui, mas é difícil jogar golfe. O código a seguir retorna uma matriz em que o último valor é a quantidade que o primeiro valor alterou:@(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)
Os valores intermediários são redimensionados para o intervalo de [-pi pi] e, em seguida, "desembrulhados", de modo que nenhum valor consecutivo tenha mais do que pi separados. Esses valores são redimensionados e alterados, resultando em uma matriz de distâncias do valor inicial.
Interessante, mas não muito prático para este desafio: D
fonte
Pitão, 29 bytes
Experimente on-line: Compilador / Executor Pyth
fonte
CJam, 27 bytes
Teste aqui.
fonte
Pip , 39 bytes
Requer a lista de dados como argumentos de linha de comando e o módulo em STDIN. Se isso for muito exagerado, eu tenho uma versão que usa dois argumentos da linha de comando por mais 5 bytes.
Explicação:
E apenas para provar que essa pontuação não tão competitiva reflete mais minhas habilidades no golfe do que minha linguagem, aqui está um exemplo da solução Python da Mauris em 30 bytes :
fonte
Geléia , não concorrente
6 bytes Esta resposta não é competitiva, pois o desafio antecede a criação do Jelly.
Experimente online!
Como funciona
fonte