Introdução
Neste desafio, estaremos lidando com uma certa ordenação dos números inteiros positivos. A ordem é assim:
3, 5, 7, 9, 11, ...
2*3, 2*5, 2*7, 2*9, 2*11, ...
4*3, 4*5, 4*7, 4*9, 4*11, ...
8*3, 8*5, 8*7, 8*9, 8*11, ...
16*3, 16*5, 16*7, 16*9, 16*11, ...
...
... 64, 32, 16, 8, 4, 2, 1
Primeiro, listamos todos os números inteiros ímpares maiores que 1 em ordem crescente. Em seguida, listamos duas vezes números inteiros ímpares maiores que 1, depois 4 vezes, depois 8 vezes e assim por diante: para todo k , listamos 2 k vezes os números inteiros ímpares maiores que 1 em ordem crescente. Finalmente, listamos os poderes de dois em ordem decrescente , terminando em 1. Todo número inteiro positivo ocorre nesta "lista" exatamente uma vez.
Mais explicitamente, considere dois inteiros positivos distintos A = n · 2 p e B = m · 2 q , em que n, m ≥ 1 são ímpares ep, q ≥ 0 . Em seguida, A vem antes de B na ordem, se uma das seguintes condições ocorrer:
- n> 1 , m> 1 e p <q
- 1 <n <m e p = q
- n> m = 1
- n = m = 1 e p> Q
Essa ordem aparece no surpreendente resultado matemático conhecido como teorema de Sharkovskii , que diz respeito aos pontos periódicos dos sistemas dinâmicos. Não vou entrar em detalhes aqui.
A tarefa
Sua tarefa neste desafio é calcular a ordem acima. Suas entradas são dois números inteiros positivos A e B , que podem ser iguais. Sua saída é um valor verdadeiro se A for anterior a B na ordem e um valor falso caso contrário. Se A = B , sua saída deve ser verdadeira. Você pode pegar A e B em qualquer ordem, desde que seja consistente.
Você não precisa se preocupar com excesso de números inteiros, mas seu algoritmo deve teoricamente funcionar para entradas arbitrariamente grandes.
Casos de teste
Instâncias verdadeiras
3 11
9 6
48 112
49 112
158 158
36 24
14 28
144 32
32 32
32 8
3 1
1 1
Instâncias de falsidade
1 2
1 5
11 5
20 25
2 8
256 255
256 257
72 52
2176 1216
2176 2496
fonte
a&1|~b&1&f(a/2,b/2)
?b<2
eventualmente será verdade. Agora, outro problema é que você processará mais iterações do que o necessário e obterá valores de ponto flutuante. Mas não consigo encontrar nenhum contra-exemplo que não funcione conforme o esperado.b<2
originalmente, mas acho que funcionará agora.f(a/2,b/2)
apenas os retornos0
,1
,false
outrue
, eu nem sequer precisa do&1
.Python 2,
8771 bytesIsso provavelmente não ganhará nenhum prêmio de tamanho, mas essa resposta funciona construindo uma tupla com três expressões usando um número inteiro que, quando ordenado lexicograficamente, resultará na ordenação correta.
Em termos legíveis, a tupla é para A = n · 2 p :
fonte
Python 2, 50 bytes
Cada número é mapeado para um triplo cuja ordem classificada é a ordem desejada.
[-n][n&n-1:]
, que lida com os poderes de 2 no final. O bit a bit "e"n&n-1
é zero exatamente quandon
é uma potência de2
. Nesse caso, obtemos a lista[-n]
e, caso contrário, a lista vazia[]
. Isso coloca todos os poderes de 2 no final do pedido, em ordem decrescente.n&-n
extrai o fator de potência 2 den
.n
tiebreaks de valor final são iguais a 2 em favor do número maior.As respectivas tuplas são passadas
cmp
para ver se essa comparação é<=0
. O Python 3 salvaria um byte com divisão float(n&n-1<1)/n
pelo primeiro valor no triplo, mas faltacmp
.fonte
cmp(...)<=0
equivalente acmp(...)<1
?~
em vez de<1
JavaScript (ES6),
7064 bytesProvavelmente poderia ser jogado um pouco mais, mas como uma primeira tentativa:
Recebe entrada com sintaxe de currying
(x)(y)
. Retorna0
/1
.Casos de teste
Mostrar snippet de código
fonte
b>a||(b==a&&y>=x)
, não fará diferença na execução.[1, 5]
seria incorretamente identificada como verdade.Perl 6 ,
8984 bytes( Experimente online. )
Não é exatamente curto, mas pensei que seria interessante escrever uma solução que realmente gerasse a sequência de pedidos (até um limite superior seguro para cada subseqüência) e depois verifique qual entrada aparece primeiro.
Por exemplo:
Para entrada
... e depois observa o que2, 3
, gera:3
aparece antes2
.Para entrada
... e depois observa o que9, 6
, gera:9
aparece antes6
.Poderia ser mais inteligente e gerar ainda menos da sequência, mas isso exigiria mais bytes de código.
fonte
Python 2, 54 bytes
Uma solução recursiva semelhante à de Neil.
fonte
f(158,158)
é falso ef(2,8)
é verdadeiro.f(1,5)
é falso.f(1,5)
deveria ser False, mas o código dá True.Mathematica, 65 bytes
Função sem nome, obtendo uma lista de números inteiros positivos e retornando
True
se a lista formar uma sequência crescente na ordem Sharkovskii,False
caso contrário. (Em particular, a lista de entrada não precisa ter apenas dois elementos - obtemos a funcionalidade adicionada gratuitamente.)O coração do algoritmo é a função
{1,#}&/@#//.{a_,b_/;EvenQ@b}->{2a,b/2}
, que move repetidamente os fatores 2 para converter um número inteiro da formam*2^k
, comm
ímpar, para o par ordenado{2^k,m}
(e o faz para todos os elementos da lista de entrada).OrderedQ
depois decide se a lista resultante de pares ordenados já está classificada; por padrão, isso significa em ordem crescente pelo primeiro elemento e, em seguida, ordem crescente pelo segundo elemento.É exatamente isso que queremos, exceto números com potências de 2 que seguem regras diferentes. Portanto, antes de fazer check-in
OrderingQ
, aplicamos uma última regra/.{a_,1}->{∞,-a}
, que converte (por exemplo){64,1}
em{∞,-64}
; que coloca potências de 2 no local correto na ordem.fonte
Haskell,
143138 bytesBasicamente, uma implementação relativamente direta dos critérios:
Experimente online!
fonte
Python,
159158153 153142142141 bytesSalvo
um2 bytes graças a Kritixi Lithos!Isto é principalmente apenas para praticar golfe no meu Python!
Usou a fórmula dada pelo OP e não as formas de todas as respostas mais inteligentes
fonte
(a, b)
na segunda linha, onde é possível remover o espaço entre a vírgula eb
.APL (Dyalog Extended) , 27 bytes
Experimente online!
Uma função diádica tácita cujo argumento esquerdo é
a
e o direito éb
.A abordagem é quase idêntica à solução Python 2 do xnor , pois convertemos cada número em um array aninhado e fazemos uma comparação lexicográfica entre eles.
Parte 1: Converter número em matriz aninhada
Parte 2: compare duas matrizes aninhadas
A sintaxe dfn suporta declarações condicionais, por exemplo ,
{a:x ⋄ b:y ⋄ z}
significadoif a then x else if b then y else z
, mas é muito detalhada para usar neste caso.fonte
05AB1E , 14 bytes
Experimente online! ou validar todos os casos de teste .
fonte