Diferença BCD
Dado um número inteiro n, converta-o para BCD ( decimal com código binário ) substituindo cada dígito decimal pela sua representação binária de 4 dígitos
234 -> 0 0 1 0 0 0 1 1 0 1 0 0
Em seguida, gire a lista de dígitos binários para encontrar os números maiores e menores, representáveis por essa lista sem outros rearranjos.
max: 1 1 0 1 0 0 0 0 1 0 0 0 (the entire list rotated left 6 times)
min: 0 0 0 0 1 0 0 0 1 1 0 1 (the entire list rotated right 2 times)
Converta esses números de volta para decimal, tratando a lista de bits como binário regular e subtraia o menor do maior:
1 1 0 1 0 0 0 0 1 0 0 0 -> 3336
0 0 0 0 1 0 0 0 1 1 0 1 -> 141
3336 - 141 -> 3195
A saída é a diferença dos números maiores e menores encontrados.
Casos de teste:
234 -> 3195
1234 -> 52155
12 -> 135
975831 -> 14996295
4390742 -> 235954919
9752348061 -> 1002931578825
fonte
Max@#-Min@#&
salva um byte. direita?Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&
89 bytes E eficiente. caramba esse byte!1-9,10-99,100-999...
aqui estão algumas zooms diferentes: imgur.com/RXLMkcoGelatina , 13 bytes
Experimente online!
Como funciona
fonte
Python 3 ,
115108 bytesgraças a Jonathan Frech por -7 bytes
Experimente online!
fonte
PowerShell , 153 bytes
Experimente online!
Chamadas estúpidas do .NET para converter de / para binários realmente aumentam o tamanho aqui. ;-)
Tomamos a entrada como
$args
, envolvemos em uma string e achar
lançamos como um array. Passamos um loop sobre cada dígito,convert
digitando o dígitotoString
na base2
(ou seja, transformando o dígito em um número binário) e, em seguida, transformando-o em um número binário de.padLeft
quatro dígitos. Essa matriz resultante de seqüências de caracteres é-join
editada em uma única sequência e lançada novamente como umachar
matriz antes de ser salva$b
.Em seguida, fazemos o loop
$b
, o que garante um tempo suficiente para dar conta de cada rotação. A cada iteração, destacamos o primeiro caractere$x
e os demais caracteres$y
usando várias atribuições. Em seguida, os juntamos novamente$b=$y+$x
para mover o primeiro elemento até o fim, ou seja, girando efetivamente o array por um. Isso é-join
ed em uma string, que é usada como entrada para aconvert
chamada para transformar a string da base binária2
em umaInt64
. Em seguida,sort
todos esses números resultantes e os armazenamos$c
. Finalmente, pegamos o maior[-1]
e subtraímos o menor[0]
. Isso é deixado no pipeline e a produção está implícita.fonte
Ohm v2 , 15 bytes
Experimente online!
Explicação:
fonte
JavaScript (ES6),
11810099 bytesEditar: salvou 11 bytes graças a @RickHitchcock. Economizou 1 byte graças a @ETHproductions. Explicação: O
0x1
prefixo faz com que a entrada seja reparada como um número hexadecimal, cujo binário é o mesmo que o BCD do número original com um prefixo 1 (acho que isso é mais golfista do que qualquer outra maneira de preencher com vários dígitos de 4) . Excluindo o prefixo, que é alterado de 1 para 0, a sequência resultante é então girada em cada posição possível e convertida de binário de volta para decimal. Finalmente, o máximo e o mínimo são subtraídos.fonte
.join``
no caso em que você precisa triplicar backticks etc.n=>(g=m=>Math[m](...[...s=(+`0x1${n}`).toString(2).slice(1)].map(_=>`0b${s=s.slice(1)+s[0]}`)))`max`-g`min`
slice
também!m=>Math[m]
truque é ótimo. Talvez mude(+`0x1${n}`)
para('0x1'+n-0)
ou similar?Python 2 ,
115113 bytesExperimente online!
fonte
Pitão , 29 bytes
Experimente aqui! ou Confira a suíte de testes.
fonte
Casca , 18 bytes
Experimente online!
Deve haver uma maneira mais curta de converter um dígito em sua representação binária de 4 bits ...
Explicação
fonte
APL (Dyalog) , 31 bytes
Corpo do programa completo. Solicita o número de STDIN. Imprime o resultado em STDOUT.
Experimente online!
⍞
solicitar linha de texto de STDIN⍎¨
executar (avaliar) cada (caractere)(
…)⊤
Codifique (anti-base) no seguinte sistema numérico:4/2
quatro bits binários⍉
transpor,
ravel (achatar)b←
armazenar emb
(por b inário)⊂
coloque (para que possamos usar toda a lista para cada rotação)(
…)⌽¨
Gire (esquerda) de cada uma das seguintes quantidades:≢b
Comprimento deb
⍳
i ndices de que2⊥¨
decodifique cada um da base-2.(
…)
Aplique a seguinte função tácita a esse⌈/
o máximo (redução)-
menos⌊/
o min (-redução)fonte
APL (Dyalog) ,
3734 bytesExperimente online!
fonte
Gelatina , 21 bytes
Experimente online!
fonte
Ruby ,
9691 bytesExperimente online!
fonte
Mathematica,
11099 bytesExperimente online!
fonte
Python 3, 141 bytes
Experimente online
fonte
Retina ,
9689 bytesExperimente online! Um pouco lento, portanto, o link inclui apenas um pequeno caso de teste. Editar: salvou 7 bytes graças a @MartinEnder. Explicação:
Prefixe três
@
s para cada dígito. (Eles representam os0
s do BCD, mas são mais golfistas.)Altere os
@
s para_
s (representando os1
s do BCD), onde apropriado.Corrija o último dígito do BCD.
Gere todas as rotações.
Classifique-os em ordem crescente.
Converta-os em unários.
Subtraia o primeiro do último número, ignorando os números intermediários e converta para decimal.
fonte
%
para o binário para conversão unário e você pode economizar um pouco mais bytes usando outros personagens do que0
e1
de binário: tio.run/##K0otycxL/...Haskell , 130 bytes
Experimente online!
Explicação / Ungolfed
Como vamos usar
foldl1((+).(2*))
para converter de binário em decimal, é melhor não usarmosmaximum
e, emminimum
vez dissofoldl1 max
(ou o mesmo com,min
respectivamente) e usar um pequenor = foldr1
.Agora, vamos definir um operador
f#x
que convertex
em BCD, gera todas as rotações, reduza-as usandof
e converte-as em decimal:Agora é apenas uma questão de usar esse operador uma vez
max
e uma vez commin
e subtrair seus resultados:fonte
PHP,
156153 bytesExperimente online!
fonte
Japonês
-x
, 20 bytesExperimente online!
Entrada como uma matriz de dígitos.
Explicação:
fonte
-x
sinalizador para salvar 2 bytes.Pitão, 24/26 bytes
Recebe a entrada como uma string entre aspas. 26 bytes se precisar receber entrada como um número inteiro; anexar
dz
nesse caso.Casos de teste (entrada como cadeias, 24 bytes)
Casos de teste (entrada como números, 26 bytes)
fonte
J, 43 bytes
Experimente online!
Às vezes, o estilo tácito dificulta as coisas. Mas provavelmente existe uma maneira de fazê-lo com um estilo tácito que é muito mais conciso do que isso. Acho que me lembro de uma maneira melhor de dividir um número em outros dígitos,
"."0@":
mas não consigo me lembrar dele ...Explicação
O pré-anexo e a remoção 8 são para garantir que o número certo de zeros esteja presente (J remodelará suas matrizes para que sejam do tamanho do elemento de comprimento máximo e 8 é de 4 dígitos em binário, para que seja usado).
fonte
APL (NARS), 34 caracteres, 68 bytes
algum pequeno teste:
fonte
Perl 5 ,
979189 + 2 (-F
) =999391 bytesExperimente online!
fonte