Sua tarefa é, dado um número inteiro não assinado n
, encontrar o maior número que pode ser criado removendo um único byte (8 bits consecutivos) de dados.
Exemplo
Dado o número 7831
, primeiro o convertemos em binário (removendo quaisquer zeros iniciais):
1111010010111
Em seguida, encontramos o grupo consecutivo de 8 bits que, quando removido, produzirá o maior resultado novo. Nesse caso, existem 3 soluções, mostradas abaixo
1111010010111
^ ^
^ ^
^ ^
Removendo isso, qualquer um desses rendimentos 11111
, que depois convertemos de volta ao seu valor decimal 31
para a resposta.
Casos de teste
256 -> 1
999 -> 3
7831 -> 31
131585 -> 515
7854621 -> 31261
4294967295 -> 16777215 (if your language can handle 32 bit integers)
Regras
- É garantido que o comprimento do bit
n
será maior que 8. - Teoricamente, sua solução deve funcionar com qualquer bit
n
maior que 8, mas, na prática, só precisa funcionar para números inteiros 255 <n <2 16 - Entrada / Saída deve estar em decimal.
- Você pode enviar um programa completo ou uma função.
- Isso é código-golfe , então o programa mais curto (em bytes) vence!
Respostas:
Gelatina , 6 bytes
Um link monádico pegando um número e retornando um número.
Experimente online!
Quão?
Usa uma agradável rápida ,
Ƥ
desenvolvido por milhas ...fonte
J , 12 bytes
Experimente online!
fonte
&.
; esse é o tipo perfeito de problema para isso.Python 2 , 41 bytes
Experimente online!
fonte
JavaScript (ES6), 54 bytes
Funciona até 2 ** 31-1. Porque alguém pediu uma resposta um pouco tímida ...
fonte
Pitão , 21 bytes
Esta é uma função recursiva (deve ser chamada com
y
ou consulte o link).Experimente aqui!
fonte
Mathematica, 69 bytes
Experimente online!
Esta solução funciona para grandes números Experimente online!
-3 bytes de KellyLowder
fonte
Max[c=#~RealDigits~2;Array[Drop[c[[1]],#;;#+7]~FromDigits~2&,Last@c-7]]&
Python 3 ,
686660 bytes-2 bytes graças ao Sr. Xcoder!
-4 bytes graças a ovs!
-2 bytes graças a Erik, o Outgolfer!
Experimente online!
fonte
n.bit_length()-8
é equivalente alen(bin(n))-10
.Wolfram Language (Mathematica) , 46 bytes
Experimente online!
Esta versão pode lidar apenas com entradas de até 2 518 -1, caso contrário, corremos para o limite de tamanho de pilha do Mathematica. (O limite pode variar entre as instalações do Mathematica.) A segunda solução nesta resposta evita isso.
Como funciona
Uma abordagem recursiva baseada na seguinte lógica:
0
para qualquer entrada menor que256
, uma vez que retirar um byte do número consome o número inteiro. Este é o nosso caso base, e é por isso que está incluído, mesmo que as especificações nos prometam que não precisaremos lidar com essas entradas.Max
duas opções: coma o byte mais baixo (fornecendo a entrada dividida por256
) ou corte o bit mais baixo, recorra no número inteiro restante e acrescente o bit mais baixo quando terminarmos.Wolfram Language (Mathematica) , 55 bytes
Experimente online!
Uma versão alternativa que cria uma tabela em vez de recursão; portanto, funciona para números de qualquer tamanho que o Mathematica possa manipular.
fonte
Retina ,
716764 bytesExperimente online! O link inclui apenas os casos de teste mais rápidos, para não sobrecarregar indevidamente o servidor de Dennis. Editar: salvou 3 bytes graças a @MartinEnder. Explicação:
Converta de decimal para binário.
Construa uma lista de seqüências de caracteres obtidas excluindo 8 dígitos consecutivos de todas as maneiras possíveis.
Classifique-os na ordem inversa e pegue o primeiro (maior).
Converta de volta para decimal. (Veja a explicação de @ MartinEnder .)
fonte
Java (OpenJDK 8) ,
138134 bytesExperimente online!
fonte
i.toBinaryString(i)
pode seri.toString(i,2)
.ReRegex ,
294275 bytesEconomizou 19 bytes usando melhores definições de 'função'
Eu diria que isso é muito bom para um idioma exclusivo do Regex.
A lib base permite a conversão entre Unário e Decimal (o que é necessário, pois a especificação do desafio declara explicitamente decimal), mas não suporta Binário; Então eu tive que escrever isso como parte do script, adicionando 120 bytes a ele.
Experimente online!
Por regexes individuais.
Passos
Primeiramente, importamos a biblioteca 'base', que fornece duas regexes. Um que se converte
u<numbers>
em unário. E um que converted<unary_underlines>
novamente em decimal. Isso ocorre porque o desafio requer E / S na base10.Em seguida, definimos um punhado de expressões regulares que convertem unário em binário.
O primeiro deles,
b(\d*):(_*)\2_b/b1$1:$2b/
buscab
, opcionalmente seguido por alguns dígitos binários, depois a:
, Então qualquer quantidade de sublinhados, seguido pela mesma quantidade exata de sublinhados mais um e, finalmente, outrob
.Em seguida, substituímos isso por
b1
seguido pelos dígitos binários de antes:
, e apenas a primeira metade dos sublinhados e, finalmente, o últimob
.Portanto, isso verifica se o unário não é divisível por dois e, em caso afirmativo, acrescenta 1 aos dígitos binários, depois o divide menos um por dois.
O segundo,
b(\d*):(_+)\2b/b0$1:$2b/
é quase idêntico, no entanto, não verifica um extra_
, o que significa que só corresponde se for divisível por dois e, nesse caso, precede um0
.O terceiro verifica se estamos com dígitos unários e, nesse caso, retira o preenchimento para deixar os dígitos binários.
O último verifica se nunca houve dígitos binários fornecidos e, nesse caso, apenas sai
0
.O próximo grupo de Regexes que definimos é converter o binário novamente em unário e é um pouco mais simples.
O primeiro desse grupo,
B(_*):1/B$1$1_:/
assim como sua antítese, detecta aB
, seguido por qualquer quantidade de dígitos unários:1
. Não verifica a correspondênciaB
nesse caso, pois está procurando apenas um dígito por vez. Se isso corresponder, ele dobra a quantidade anteriormente combinada de dígitos unários e adiciona um, depois o remove.O segundo
B(_*):0/B$1$1:/
,, é quase idêntico ao primeiro, exceto que corresponde0
a um1
e não a e não adiciona um dígito unário adicional.O último deles,
B(_*):B/$1/
verifica se não há mais dígitos binários e, se for o caso, desembrulha o unário. Ao contrário de sua antítese, isso não precisa de um caso 0 especial.Em seguida, definimos as
j
expressões regulares, que atuam como uma função de divisão.O primeiro,
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
faz a maior parte do trabalho pesado. Ele procuraj
, opcionalmente seguido por dígitos binários que são o "incrementador", depois uma vírgula seguida pelo incrementador e, em seguida, exatamente 8 dígitos binários seguidos pelo restante do número binário, depois a:
. O primeiro dos 8 dígitos é anexado ao incrementador, incrementando-o e, em seguida, tudo, exceto os 8 dígitos da entrada binária, é acrescentado após o:
seguinte a,
. Então (se estivéssemos usando 2 dígitos em vez de 8)j,1001:
ficariaj1:1001:,01
entãoj10:1001,01,11
. Além disso, os elementos da matriz anexados são agrupados emB
s, para convertê-los novamente em unários.O outro
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
verifica se há menos de 8 dígitos binários para verificar após o incrementador e, se houver, remove tudo que não seja a matriz agrupada em,
s. Por exemplo.,_,___,
Durante e após a criação da matriz, definimos os regexes de comparação.
O primeiro deles
,((_+)_+),(\2),/,$1,/
verifica uma vírgula seguida de uma quantidade de sublinhados e, em seguida, um pouco mais, seguida por uma vírgula e, em seguida, a primeira quantidade de sublinhados, que uma vírgula. Em seguida, o substitui pela quantidade total de sublinhados no primeiro elemento cercado por,
s.O último,
,(_+),(\1_*),/,$2,/
verifica uma vírgula seguida por uma quantidade de sublinhados seguida por outra vírgula, depois a mesma quantidade ou mais sublinhados e uma última vírgula. Em vez disso, isso deixará o elemento certo.Finalmente, quando houver um elemento à esquerda correspondente
^,(_*),$
, removemos as vírgulas ao redor e as convertemos novamente em decimal viad<>
. Em seguida, não mais regexes podem ser acionadas e a saída é apresentada.A entrada é inicialmente colocada no modelo
j,b:u<(?#input)>b:
, que primeiro converte a entrada decimal em unária, por exemplo5
- ->j,b:_____b:
, depois a unária resultante em binária.j,101:
Em seguida , divide o binário (que não funciona no exemplo), obtém o maior elemento e converte de volta ao decimal e pronto.fonte
C (gcc),
91bytes-23 bytes de Colera Su
Suporta até
2**31-1
Experimente online!
Começa com os 8 bits baixos
(j=0)
e aumenta, alterando a saída se o número com bits[j,j+8)
cortados for maior que a atual e continuando até que x não tenha bits acimaj+8
fonte
x>>j+8
ex>>j+8<<j|x%(1<<j)
em uma variável (parênteses removidos) reduzirá para 68 bytes .Geléia , 12 bytes
Experimente online!
Bytes salvos graças a Jonathan Allan !
fonte
JavaScript (ES6),
9491 bytes-3 bytes graças a Justin Mariner
Estou lançando uma solução baseada em string JavaScript, mas espero que alguém publique uma solução baseada em bits separada para que eu possa aprender alguma coisa.
Minha solução pega recursivamente um pedaço de 8 bits da string, assumindo o valor máximo encontrado.
Mostrar snippet de código
fonte
+(...)
que se converte'0b'+c[1]+c[2]
em um número, porqueMath.max
já faz isso. Experimente online! ( Spec para referência futura )C # (.NET Core) ,
122 + 13 = 135120 + 13 = 133 bytesExperimente online!
+13 para
using System;
Eu imagino que existe uma maneira de fazer isso sem usar
Convert
. De qualquer maneira, tenho certeza que isso pode ser reduzido.Agradecimentos
-2 bytes graças a Kevin Cruijssen
UnGolfed
fonte
while
afor
e colocando ovar b
em que:for(var b=Convert.ToString(n,2);i<b.Length-7;)
,t
e não usandoMath.Max
, mas uma verificação manual:n=>{int m=0,i=0,t;for(var b=Convert.ToString(n,2);i<b.Length-7;m=t>m?t:m)t=Convert.ToInt32(b.Remove(i++,8),2);return m;}
( 120 + 13 bytes )PHP, 67 + 1 bytes
Execute como pipe
-nR
ou experimente online .fonte
Pitão, 19 bytes
Resposta alternativa:
Explicação:
A outra resposta usa uma abordagem semelhante, exceto que ela gira primeiro para a direita e obtém todos os bits, exceto os últimos 8.
fonte
MATL ,
2321 bytesExperimente online!
Infelizmente,
Bn8-:8:!+q&)
apenas produz as fatias a serem removidas, e não o restante que gostaríamos de manter.fonte
Bn8-:"GB[]@8:q+(XBvX>
(Atribuir[]
com(
em vez de usar&)
, e substituir&:
por:
e adição)Java (OpenJDK 8) , 73 bytes
Experimente online!
fonte
Oitava ,
8180 bytesExperimente online!
Esta é uma solução diferente da minha tentativa original, economizando mais 14 bytes.
O código é dividido da seguinte maneira:
Na sexta linha, o número de grupos é calculado encontrando o expoente da próxima potência de dois maiores que a entrada (número de bits no número de entrada) e subtraindo 7 ao removermos 8 bits de cada grupo - o número resultante é armazenado
b
para mais tarde.Em seguida, calculamos um conjunto de potências de dois na quinta linha, que é grande o suficiente para todos os grupos possíveis que podem ser removidos. Guardamos isso na variável
c
para mais tarde.Na próxima linha acima (quarta linha), multiplicamos a entrada pela matriz de potências de duas (essencialmente deslocando cada número para cima) e convertemos o resultado em binário. Se usarmos o exemplo de 7831, isso resultará em uma matriz 2D contendo:
Se então cortarmos o centro de 8 bits, isso equivale a remover cada um dos grupos de 8 bits. Isso é feito pela terceira linha.
A matriz resultante é convertida novamente em decimal na segunda linha. Também temos que dividir
c
para desfazer o dimensionamento que foi feito para cada grupo inicialmente.Finalmente, na primeira linha, uma função anônima é declarada e o valor máximo de todos os grupos é calculado.
nextpow2(x+1)
vez dennz(bin2dec(x))
Tentativa original -
120 9895 bytesExperimente online!
O código é dividido da seguinte forma:
Basicamente, calcula uma matriz contendo os possíveis grupos de valores que podem ser removidos e, em seguida, elabora o que acaba dando o maior número.
Trabalhando linha por linha, a quinta linha calcula os grupos que podem ser removidos. Por exemplo, pegue 7831. Este é um número de 13 bits, fornecendo aos grupos:
O resultado da quinta linha é uma matriz lógica 2D que pode ser usada para indexação.
A quarta linha do código converte a entrada em uma matriz de bits (representada como caracteres '0' e '1') e depois a replica
n
-7 vezes (n
em número de bits), fornecendo uma linha para cada agrupamento possível. A máscara de grupo acima é usada para remover cada um dos grupos possíveis.Na terceira linha, o resultado é reconfigurado para desfazer o achatamento indesejado resultante da aplicação da máscara de grupo. A segunda linha é convertida novamente em uma matriz de números decimais resultantes. E a primeira linha define a função anônima como o valor máximo da matriz de grupos possíveis.
fonte
Perl 5 , 78 + 1 (
-p
) = 79 bytesExperimente online!
fonte
Rubi , 55 bytes
Experimente online!
fonte
Perl, 53 bytes
(a
use 5.10.1
para levar o perl para o nível 5.10.1 do lanugage é gratuito)Dê o número de entrada no STDIN. Ficará sem memória para grandes números, mas o número de 32 bits na entrada ainda não é um problema
fonte