Cada número pode ser representado usando uma sequência restante infinitamente longa. Por exemplo, se pegarmos o número 7 e executar 7mod2
, então 7mod3
, então 7mod4
e assim por diante, obteremos 1,1,3,2,1,0,7,7,7,7,....
.
No entanto, precisamos da subsequência restante mais curta possível que ainda possa ser usada para distingui-la de todos os números inferiores. Usar 7 novamente, [1,1,3]
é a subsequência mais curta, porque todas as subsequências anteriores não começam com [1,1,3]
:
0: 0,0,0,0...
1: 1,1,1,1...
2: 0,2,2,2...
3: 1,0,3,3...
4: 0,1,0,4...
5: 1,2,1,0...
6: 0,0,2,1...
Observe que [1,1]
não funciona para representar 7, porque também pode ser usado para representar 1. No entanto, você deve produzir [1]
com uma entrada 1.
Entrada / Saída
Sua entrada é um número inteiro não negativo. Você deve produzir uma sequência ou lista da sequência de tamanho mínimo dos restantes, conforme definido acima.
Casos de teste:
0: 0
1: 1
2: 0,2
3: 1,0
4: 0,1
5: 1,2
6: 0,0,2
7: 1,1,3
8: 0,2,0
9: 1,0,1
10: 0,1,2
11: 1,2,3
12: 0,0,0,2
30: 0,0,2,0
42: 0,0,2,2
59: 1,2,3,4
60: 0,0,0,0,0,4
257: 1,2,1,2,5,5
566: 0,2,2,1,2,6,6
1000: 0,1,0,0,4,6,0,1
9998: 0,2,2,3,2,2,6,8,8,10
9999: 1,0,3,4,3,3,7,0,9,0
Aqui estão as primeiras 10.000 seqüências , caso você esteja interessado (os números das linhas são 1 em menos).
Como é um código de golfe , faça com que seja o mais curto possível no seu idioma favorito. Pontos de bônus falsos para respostas rápidas!
fonte
Respostas:
Mathematica,
6053 bytesUm pouco rápido (ele lida com 10000 em ~ 0,1 segundo, mas provavelmente ficará sem memória para 100000).
O código gera um erro, mas calcula o resultado corretamente.
Explicação
Descobrimos anteriormente no bate-papo que os divisores necessários sempre podem ser determinados como a lista mais curta
{1, 2, ..., n}
cujo múltiplo menos comum excede a entrada. Um breve argumento sobre o motivo: se o LCM for menor que a entrada, subtrair o LCM da entrada deixaria todos os divisores inalterados, para que a representação não seja exclusiva. No entanto, para todas as entradas menores que o LCM, os restantes serão únicos; caso contrário, a diferença entre dois números com restos iguais seria um múltiplo menor de todos os divisores.Quanto ao código ... como sempre, a ordem de leitura do Mathematica golfado é um pouco engraçada.
Isso nos fornece uma lista
[1, 2, 3, ..., n+2]
para entradan
. O+2
é garantir que ele funcione corretamente para0
e1
.Mapeie
2~Range~#
(açúcar sintático paraRange[2,#]
) sobre esta lista, para obterEssas são listas de divisores candidatos (é claro que em geral isso é muito mais do que precisamos). Agora encontramos o primeiro deles cujo LCM excede a entrada com:
Mais sintaxe:
x_
é um padrão que corresponde a qualquer uma das listas e o chamax
. Ele/;
anexa uma condição a esse padrão. Esta condição éLCM@@x>#
onde@@
aplica a função à lista, ou seja,LCM@@{1,2,3}
significaLCM[1,2,3]
.Por fim, simplesmente obtemos todos os demais, usando o fato de que
Mod
éListable
, ou seja, ele mapeia automaticamente uma lista se um dos argumentos for uma lista (ou se os dois forem listas do mesmo tamanho):fonte
Gelatina , 14 bytes
Isso usa o fato de que a solução (se houver) de um sistema de congruências lineares é o único módulo do LCM dos módulos. Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
MATL , 24 bytes
Agradecemos a @nimi por apontar um erro em uma versão anterior desta resposta (agora corrigida)
Isso fica sem memória no compilador online para os dois maiores casos de teste (mas funciona em um computador com 4 GB de RAM).
Experimente online!
Explicação
Isso aplica a definição de maneira direta. Para entrada
n
que calcula uma matriz 2D contendomod(p,q)
comp
de0
paran
eq
a partir de1
an+1
. Cadap
um é uma coluna e cadaq
um é uma linha. Por exemplo, com entrada,n=7
essa matriz éAgora, a última coluna, que contém o restante de
n
, é comparada a cada elemento com cada coluna dessa matriz. Isso geraonde
1
indica igualdade. A última coluna é obviamente igual a si mesma e, portanto, contém todas. Precisamos encontrar a coluna que tem o maior número de iniciais , além da última coluna, e anotar esse número de iniciaism
. (Nesse caso, é a segunda coluna, que contém asm=3
iniciais). Para esse fim, calculamos o produto cumulativo de cada coluna:então a soma de cada coluna
e depois classifique de forma não crescente e pegue o segundo valor, que é
3
. Este é o desejadom
, que indica quantos restos precisamos escolher.fonte
Geléia ,
1311 bytesIsso não ganhará nenhum ponto de velocidade brownie ... Experimente online! ou verifique os casos de teste menores .
Como funciona
fonte
Python 3.5,
1179578 bytesRequer Python 3.5 e sympy (
python3 -m pip install --user sympy
). Agradecemos a @Dennis que me notifique que o Python 3.5 permite o*l
truque com argumentos padrão.fonte
M>n and l
paral*(M>n)
.Python 2,
73706965 bytesUm programa completo. O @Dennis salvou 4 bytes, melhorando a maneira como o zero é tratado.
fonte
Haskell,
66605150 bytesExemplo de uso:
f 42
->[0,0,2,2]
. É o algoritmo descrito na resposta de @Martin Büttner .Manterei a versão anterior para referência, porque é bem rápida:
Haskell, 51 bytes
Leva 0,03s para o
f (10^100)
meu laptop de cinco anos.Edit: @xnor encontrou um byte para salvar. Obrigado!
fonte
h i=mod i<$>[2..2+sum[1|l<-scanl1 lcm[2..i],l<=i]]
Pyth,
51 Bytes66 BytesExperimente!
Versão com 39 bytes de velocidade muito mais alta (não funciona para 0-2):
Parece funcionar para números absurdamente grandes, como 10 10 3
Nota: esta resposta não funciona para 0, 1 e 2.Corrigido!fonte
JavaScript (ES6),
8177 bytesIsso recursivamente cria a resposta até que o LCM exceda o número original. O GCD também é calculado recursivamente, é claro.
Editar: salvou 4 bytes graças a @ user81655.
fonte
Ruby, 52 bytes
Esta solução verifica todas as possíveis
m
partidas a partir de 2 e o restante que torna a sequência única. O que torna o últimom
exclusivo não é o restante em si, masm
o último membro do menor intervalo em(2..m)
que o mínimo múltiplo comum (LCM) desse intervalo é maior quen
. Isso ocorre devido ao Teorema do Restante Chinês, onde para determinar exclusivamente qualn
é o número com um número de remanescentes, o LCM desses remanescentes deve ser maior quen
(se selecionarn
de(1..n)
; se selecionarn
dea..b
, o LCM precisa ser maior queb-a
)Nota: Coloquei
a<<n%m
no final do código porque osuntil n<t=t.lcm(m+=1)
curtos-circuitos anterioresa
receberam o último elemento para torná-lo único.Se alguém tiver alguma sugestão de golfe, informe-me nos comentários ou no chat do PPCG .
Ungolfing:
fonte
Julia,
3633 bytesExperimente online!
fonte
Python 3,5,
194181169152149146 bytes:( Obrigado a @ Sherlock9 por 2 bytes! )
Funciona perfeitamente e também é bastante rápido. O cálculo da sequência mínima restante de
100000
saídas[0, 1, 0, 0, 4, 5, 0, 1, 0, 10, 4, 4]
e levou apenas cerca de 3 segundos. Foi capaz de calcular a sequência para a entrada1000000
(1 milhão), a saída[0, 1, 0, 0, 4, 1, 0, 1, 0, 1, 4, 1, 8, 10, 0, 9]
e levou cerca de 60 segundos.Explicação
Basicamente, o que essa função faz é primeiro criar uma lista,
y
com tudoj mod i
ondej
está todo número inteiro no intervalo0=>7
(incluindo 7) ei
todo número inteiro no intervalo0=>100
. O programa entra em umwhile
loop infinito e compara o mesmo número de conteúdos de cada sublist na primeira até a penúltima sublista dey
(y[:-1:]
) com o mesmo número de itens na última sublist (y[-1]
) da listay
. Quando sublisty[-1]
é diferente de qualquer outra sublist, o loop é interrompido e a sequência mínima restante correta é retornada.Por exemplo, se a entrada for 3,
y
seria:Então, quando entra no loop while, compara cada sub-lista na lista
y[:-1:]
com o mesmo número de itens na sub-listay[-1]
. Por exemplo, ele primeiro compararia[[0],[1],[0]]
e[1]
. Como a última sub-lista está no restantey
, ela continuaria e depois compararia[[0,0],[0,1],[0,2]]
e[1,0]
. Como[1,0]
agora NÃO está no restantey
nessa ordem específica , essa é a sequência mínima de lembrete e, portanto,[1,0]
seria retornada corretamente.fonte
y[:c:]
é o mesmo quey[:c]
C89, 105 bytes
Compila (com avisos) usando
gcc -std=c89
. Pega um número único em stdin e gera a sequência de restos separados por espaços em stdout.fonte
C, 89 bytes
Compile com o gcc. Experimente online: n = 59 , n = 0 .
fonte