Eu estava brincando com alguns números e encontrei uma sequência que, é claro, está no OEIS. É A005823 : Números cuja expansão ternária não contém 1's . Vai:
a (2n) = 3 * a (n) +2
a (2n + 1) = 3 * a (n + 1)
a (1) = 0
a = 0,2,6,8,18,20,24,26,54 ....
Escrevi um programa CJam que gera o primeiro n desses números convertendo o índice em binário, substituindo o 1 por 2 e convertendo de ternário para decimal.
Também notei que qualquer número par pode ser obtido pela soma de dois números na sequência (às vezes o número em si).
O desafio:
Dado qualquer número par não negativo como entrada, produza os índices de dois números na sequência que soma a ele. (Observe que às vezes vários pares são possíveis.)
As regras:
- Especifique se você está usando a indexação 0 ou 1.
- Se você estiver produzindo como uma sequência, coloque um delimitador entre os dois índices.
- Você tem permissão para emitir como um número complexo.
- Se desejar, você pode gerar todos os pares válidos.
- Code Golf: menor resposta ganha
Casos de teste
Eu uso a indexação 0. Aqui, listo todas as saídas possíveis para cada entrada, mas você só precisa produzir uma.
0: [0 0] 2: [1 0] 4: [1 1] 6: [2 0] 8: [2 1] [3 0] 10: [3 1] 12: [2 2] 14: [3 2] 16: [3 3] 18: [4 0] 30: [6 2] 32: [6 3] [7 2] 46: [7 5] 50: [7 6] 120: [10 10] 338: [19 18] 428: [30 23] [31 22] 712: [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1] 1016: [38 37] [39 36]Agradecemos a @Luis Mendo pela ajuda no caso de teste.
Relacionado: Está dentro do conjunto Cantor?
fonte
Respostas:
Husk ,
211413 bytes-7 bytes, graças à resposta JS de @ Neil
-1 byte inspirado na resposta Parradoc da betaveros
Usa indexação 0
Experimente online!
Explicação
Solução anterior de 21 bytes
Primeira vez que vi um uso para
»
.Experimente online!
Mais tempo, como eu estava lidando com carrega
fonte
JavaScript (ES6),
7571 bytesExplicação: Dividir a entrada e os elementos de A005823 por 2 não altera o problema, no entanto, torna a solução mais simples, pois as representações ternárias agora usam apenas 0s e 1s e, portanto, não há nada a considerar. Ele também salva uma etapa ao converter do elemento para seu índice (o ternário de cada elemento é duas vezes o binário de seu índice). Exemplos:
fonte
Gelatina ,
26, 22, 21 bytesExperimente online!
Um byte economizado graças a @JonathanAllan!
Explicação:
fonte
Œc
. E sim, Dennis explicou o problemaS=¥
comigo.Python 2 , 51 bytes
Experimente online!
A tarefa pode ser feita assim:
Podemos fazer a divisão em (3) convertendo
0->0,1->1,2->1
para uma lista e0->0,1->0,2->1
para a outra. Ou seja, ao verificar se o valor está acima de um limite de 0 ou 1.Os dois valores podem ser encontrados pelas respectivas funções recursivas:
A função
f
combina os dois em uma lista de compreensão. Isso o torna ineficiente devido à ramificação exponencial.Se números complexos pudessem ser gerados, poderíamos economizar 10 bytes com:
fonte
J,
3532 bytesExperimente online!
Indexado a 0 e a entrada é fornecida monadicamente. Retorna todas as somas possíveis para o valor (ele trata
a b
eb a
como diferentes somas possíveis).A conversão de uma matriz booleana em índices requer muito código ...
Também gostaria de remover o garfo à esquerda, para não precisar usar tantos parênteses e
@
-ats, mas não consigo descobrir uma boa maneira de fazer isso (minha abordagem alternativa não salva bytes )Explicação
Para propósitos de explicação e desatenção, considere os seguintes componentes da função principal
valid_nums produz uma matriz booleana em que os índices são os índices dos valores da sequência somada. Se houver um nesses índices, significa que os dois números somam o valor de entrada.
indices_of_ones é um idioma J para fornecer as coordenadas daquelas em uma matriz booleana de classificação arbitrária
A função principal é composta simplesmente como
valid_nums
indices_of_ones
,
-ravel funciona nesse caso, juntando cada linha à próxima.Podemos ver que, se essa fosse uma matriz booleana, as coordenadas de uma podem ser encontradas interpretando os índices da matriz deslocada como números na base da forma dessa matriz, usando o maior número possível de frases posicionais para ajudar a confundir o pobre leitor. .
fonte
MATL ,
22211917 bytesA saída é baseada em 1. O programa produz todos os pares de soluções. Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Pitão , 37 bytes
Indexado a 0
Certamente não jogava tão bem quanto poderia ser.
Experimente online!
fonte
hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU
. Pode definitivamente ser golfedhfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pitão , 29 bytes
Este retorna todos os pares possíveis de índices.
Experimente aqui.
Pitão , 30 bytes
Experimente aqui.
Isso retorna os pares de índices como
[LowerIndex, HigherIndex]
.Como é que isso funciona?
fonte
Paradoc (v0.2.10), 11 bytes (CP-1252)
Experimente online!
Algoritmicamente, é muito parecido com a resposta ES6 de Neil . Em um nível inferior, também notavelmente semelhante à resposta Husk de H.PWiz . Estou divertido por termos usado todas as três sobrecargas de
B
.Pega um número inteiro na pilha, deixa uma lista de dois números inteiros na pilha.
Explicação:
fonte
Python 3 ,
122120 bytes-2 bytes graças ao Sr. Xcoder!
Indexado a 0
Ungolfed:
Experimente online!
fonte
Mathematica, 94 bytes
Indexado 1
fonte
JavaScript,
120101 bytesExperimente online!
Indexado a 0.
Ele retorna o par de índices em que um índice é o menor possível (por exemplo, no caso de
428
retornar22,31
).fonte
Flak cerebral ,
220166 bytes-54 bytes consultando a função modulo no wiki, permitindo algumas mudanças estruturais
Experimente online!
Indexado a 0.
Explicação
Como muitas das outras soluções, isso calcula a expansão ternária
n/2
e a converte em dois números binários.Etapa 1: Divida a entrada por 2
Etapa 2: calcular a expansão ternária
Etapa 3: converter para solução
fonte
JavaScript (ES6), 70
72bytes(Indexado com 0 e aparentemente quase a mesma solução que o @Neil, mesmo que eu não tivesse visto a resposta dele)
Comecei com o retorno do índice de um número usando o inverso do processo: stringify com base 3, substitua every
2
por1
, analise com base 2.Para obter dois números, e para cada um, temos apenas metade da entrada - mas agora também
1
podem ocorrer dígitos. Portanto, substituí-lo por um0
no número e um2
no outro número, que não altera a soma dos dois, antes da etapa de substituição e análise. Aqui está o que eu criei (fazendo as duas substituições,1
-> 0 ou 2 e2
->1
em uma etapa):Obviamente, os dois mapas de substituição (strings) diferem apenas em um índice, portanto, devemos ser capazes de reduzir o literal da matriz apenas substituindo
1
e2
pord == 2 ? 1 : x
. Ord-1 || x
. Onde-1
faz o mesmo que os dois operadores unários - mas eles parecem mais assustadores :-)Tentando evitar a matriz literal e os parênteses
n/2
, também inventeimas não resultou frutífero.
fonte
["001","011"]
versão também (bem meus nomes de variáveis eram diferentes).replace(/./g,d=>d>>1|x)
economiza 2 bytes.d="0"
ex=1
- o dígito deve ficar0
Pitão, 22 bytes
Experimente online: Demonstração
Explicação:
fonte