Já definimos um número dobrável aqui .
Mas agora vamos definir um número super dobrável. Um número Super Folding é um número que, se dobrado o suficiente, chegará a um a menos que a potência de dois. O método de dobrar é um pouco diferente do que na questão do número de dobras.
O algoritmo de dobragem é o seguinte:
Pegue a representação binária
por exemplo, 5882
1011011111010
Derramado em três partições. Primeira metade, última metade e dígito do meio (se tiver um número ímpar de dígitos)
101101 1 111010
Se o dígito do meio for zero, esse número não poderá ser dobrado
Inverta a segunda metade e sobreponha na primeira metade
010111 101101
Adicione os dígitos no lugar
111212
- Se houver 2s no resultado, o número não pode ser dobrado, caso contrário, o novo número é o resultado do algoritmo de dobragem.
Um número é um número super dobrável, se puder ser dobrado em uma sequência contínua de unidades. (Todos os números dobráveis também são números super dobráveis)
Sua tarefa é escrever o código que recebe um número e gera um valor verdadeiro se o número for um número Super Folding e, caso contrário, falsificará. Você será pontuado no tamanho do seu programa.
Exemplos
5200
Converter em binário:
1010001010000
Dividido ao meio:
101000 1 010000
O meio é um, então continuamos Sobreponha as metades:
000010
101000
Adicionados:
101010
Não há dois, então continuamos Divididos ao meio:
101 010
Dobra:
010
101
111
O resultado é 111
(7 em decimal), portanto, este é um número super dobrável.
Casos de teste
Os primeiros 100 números super dobráveis são:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
infiltrou nos casos de teste novamente? Não consigo ver como ela pode ser dobrada, pois se divide em1 1
, dando imediatamente um2
. Ou você está dizendo que dobrá-lo zero vezes também conta?Respostas:
Aqui está minha primeira tentativa no código de golfe:
Python 3, 167 bytes
167 bytes se tabulações ou espaços únicos forem usados para indentação
Edit: Graças à ajuda de todos abaixo, o código acima foi reduzido de um tamanho original de 232 bytes!
fonte
:
, retornando0
e em1
vez deTrue
eFalse
.Java 7, 202 bytes
Foi preciso um pouco de esforço para tornar a função de dobrar antiga recursável, mas aqui está. É feio como o pecado, para ser honesto. Vou ter que dar uma olhada de manhã para ver se posso jogar mais, já que mal posso suportar olhar agora.
Com quebras de linha:
fonte
CJam ,
4744 bytesExperimente online! ou gere uma lista de números super dobráveis até um determinado número.
Tentativas de golfe podem ser vistas aqui .
O código divide-se nas seguintes fases:
EDIT: Esta versão tem mais ou menos uma abordagem da Lei de De Morgan para a versão anterior.
* O problema com a execução de singletons é que ficamos presos com uma string vazia após a fatia.
** Se um número binário é super dobrável, sua imagem no espelho (com 0s à esquerda, se necessário) é. Isso economiza um byte ao pegar a metade direita.
fonte
JavaScript, 149 bytes
Define uma função recursiva.
Explicação:
fonte
m=l>>1
,/2/.test(n)
,n.slice(l-m)
(Ou cortar a corda invertida). Eu acho que se você alternar os casos de falha e sucesso, poderá usar/0/.test(n)?f(...):1
.JavaScript (ES6),
113109108 bytesFormatado e comentado
Demo
fonte
Perl,
7170 bytesInclui +1 para
-p
Dê o número em STDIN
superfolding.pl
:fonte
Python 2, 151 bytes
ideona
Uma função duplamente recursiva que pega um número inteiro,,
n
e retorna0
ou1
.Uma variável
r
é mantida para permitir o resultado da dobra e para saber se atualmente: temos um número inteiro (apenas o primeiro); tenha uma nova string binária para tentar dobrar (externa); ou estão dobráveis (interno).Na primeira passagem,
n
é um número inteiro, que está<''
no Python 2, portanto a recursão começa convertendo para uma sequência binária.A próxima execução tem
r=''
e, portanto, o teste{'1'}==set(n)
é executado para verificar se há uma sequência contínua de1
s (o RHS não pode ser{n}
o que talvez seja necessário para passar esse ponto posteriormente comr=''
e vazion
quando isso seria um dicionário que não seja igual a{'1'}
um conjunto).Se isso não for atendido, o critério da cauda interna será testado (mesmo que desnecessário): if
n in'1'
será avaliado como True quandon
for uma string vazia ou uma única1
, após o que uma nova recursão externa é iniciada, colocandor
, pela string binária então dobrada, emn
e''
para dentror
. O literal2
é adicionado ao resultado dessa chamada de função para permitir que não ocorra a próxima parte (à direita de uma lógicaor
) que é corrigida posteriormente.Se esse não for um valor verdadeiro (todos os números inteiros diferentes de zero são verdadeiros em Python), o critério de recursão da cauda externa é testado para:
n!=0
exclui o caso com um meio0
e os dois caracteres externos são testados aos quais não são somados2
pela concatenação da string'11'!=n[0]+n[-1]
; se ambos são verdadeiros, os bits externos são descartados den
comn[1:-1]
e, em seguida, a1
é anexado ar
se houver um fora, caso contrário a0
é, usando o fato de que'1'>'0'
em Python commax(n[0],n[-1])
.Finalmente, a adição de
2
cada recursão interna é corrigida com%2
.fonte
PHP, 113 bytes
sai com erro (código
1
) se o argumento não for super dobrável, código0
mais. Corra com-r
.A entrada
0
retornará true (código0
).demolir
fonte
PHP, 197 bytes
Expandido
Valores verdadeiros <10000
fonte