Diferencia BCD
Dado un número entero n, conviértalo a BCD ( decimal codificado en binario ) reemplazando cada dígito decimal con su representación binaria de 4 dígitos
234 -> 0 0 1 0 0 0 1 1 0 1 0 0
Luego gire la lista de dígitos binarios para encontrar los números más grandes y más pequeños, representables por esta lista sin otras reorganizaciones.
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)
Convierta estos números de nuevo a decimal, tratando la lista de bits como binario regular y reste el más pequeño del más grande:
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
La salida es la diferencia de los números más grandes y más pequeños encontrados.
Casos de prueba:
234 -> 3195
1234 -> 52155
12 -> 135
975831 -> 14996295
4390742 -> 235954919
9752348061 -> 1002931578825
fuente
Max@#-Min@#&
Guarda un byte. ¿Derecha?Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&
89 bytes Y eficiente. ¡Maldita sea ese byte!1-9,10-99,100-999...
aquí hay algunos zooms diferentes: imgur.com/RXLMkcoJalea , 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python 3 ,
115108bytesgracias a Jonathan Frech por -7 bytes
Pruébalo en línea!
fuente
PowerShell , 153 bytes
Pruébalo en línea!
Estúpidas llamadas largas de .NET para convertir a / desde binario realmente aumentan la longitud aquí. ;-)
Tomamos la entrada como
$args
, la envolvemos en una cadena y luego la convertimos en unachar
matriz. Hacemos un bucle sobre cada dígito,convert
colocando el dígitotoString
en la base2
(es decir, convirtiendo el dígito en un número binario), luego.padLeft
para convertirlo en un número binario de cuatro dígitos. Esa matriz resultante de cadenas se edita-join
en una sola cadena y se vuelve a emitir como unachar
matriz antes de guardarla$b
.A continuación, hacemos un bucle
$b
, lo que garantiza que hagamos bucles suficientes veces para tener en cuenta cada rotación. En cada iteración, quitamos el primer carácter$x
y los caracteres restantes para$y
usar la asignación múltiple. Luego, los fusionamos nuevamente$b=$y+$x
para mover el primer elemento al final, es decir, rotar efectivamente la matriz en uno. Eso se-join
edita en una cadena, que se utiliza como entrada a laconvert
llamada para convertir la cadena de la base binaria2
en unaInt64
. Luego,sort
todos esos números resultantes y los almacenamos$c
. Finalmente, tomamos la más grande[-1]
y restamos la más pequeña[0]
. Eso queda en la tubería y la salida es implícita.fuente
Ohm v2 , 15 bytes
Pruébalo en línea!
Explicación:
fuente
JavaScript (ES6),
11810099 bytesEditar: Guardado 11 bytes gracias a @RickHitchcock. Guardado 1 byte gracias a @ETHproductions. Explicación: El
0x1
prefijo hace que la entrada se vuelva a analizar como un número hexadecimal, cuyo binario es el mismo que el BCD del número original con un prefijo 1 (creo que es más elegante que cualquier otra forma de relleno a un múltiplo de 4 dígitos) . Excluyendo el prefijo, que se cambia de 1 a 0, la cadena resultante se gira en cada posición posible y se convierte de binario a decimal. Finalmente se restan el máximo y el mínimo.fuente
.join``
en cuyo caso necesita tres puntos de retroceso, 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
también.m=>Math[m]
truco es genial. Tal vez cambiar(+`0x1${n}`)
a('0x1'+n-0)
o similar?Python 2 ,
115113 bytesPruébalo en línea!
fuente
Pyth , 29 bytes
Pruébalo aquí! o Echa un vistazo a la suite de prueba.
fuente
Casco , 18 bytes
Pruébalo en línea!
Debería haber una forma más corta de convertir un dígito en su representación binaria de 4 bits ...
Explicación
fuente
APL (Dyalog) , 31 bytes
Programa completo del cuerpo. Solicita el número de STDIN. Imprime el resultado en STDOUT.
Pruébalo en línea!
⍞
solicitud de línea de texto desde STDIN⍎¨
ejecutar (evaluar) cada (personaje)(
...)⊤
codificar (anti-base) en el siguiente sistema de números:4/2
cuatro bits binarios⍉
transponer,
ravel (aplanar)b←
tienda enb
(para b de ciertas piezas)⊂
adjuntar (para que usemos esta lista completa para cada rotación)(
...)⌽¨
rotar (izquierda) en cada una de las siguientes cantidades:≢b
longitud deb
⍳
I nices de eso2⊥¨
decodificar cada uno de base-2.(
...)
aplique la siguiente función tácita a eso⌈/
el max (-reducción)-
menos⌊/
el min (-reducción)fuente
APL (Dyalog) ,
3734 bytesPruébalo en línea!
fuente
Jalea , 21 bytes
Pruébalo en línea!
fuente
Ruby ,
9691 bytesPruébalo en línea!
fuente
Mathematica,
11099 bytesPruébalo en línea!
fuente
Python 3, 141 bytes
Pruébalo en línea
fuente
Retina ,
9689 bytesPruébalo en línea! Algo lento, por lo que el enlace solo incluye un pequeño caso de prueba. Editar: Guardado 7 bytes gracias a @MartinEnder. Explicación:
Prefije tres
@
sa cada dígito. (Estos representan los0
s del BCD, pero son más golfistas).Cambie la
@
s a_
s (que representa la1
s del BCD) cuando corresponda.Arregle el último dígito del BCD.
Genera todas las rotaciones.
Clasifícalos en orden ascendente.
Conviértalos en unarios.
Resta el primero del último número, ignorando los números intermedios, y convierte a decimal.
fuente
%
la conversión de binario a unario y puede guardar algunos bytes más utilizando otros caracteres que no sean0
y1
para binario: tio.run/##K0otycxL/…Haskell , 130 bytes
Pruébalo en línea!
Explicación / Ungolfed
Dado que vamos a usar
foldl1((+).(2*))
para convertir de binario a decimal, bien podríamos no usarmaximum
yminimum
sinofoldl1 max
(o lo mismo conmin
respectivamente) y usar un shortr = foldr1
.Ahora, definamos un operador
f#x
que conviertax
a BCD, genere todas las rotaciones, reduzca estas usandof
y conviértalo a decimal:Ahora solo es cuestión de usar este operador una vez con
max
y una vez conmin
y restando sus resultados:fuente
PHP
156153 bytesPruébalo en línea!
fuente
Japt
-x
, 20 bytesPruébalo en línea!
Ingrese como una matriz de dígitos.
Explicación:
fuente
-x
bandera para guardar 2 bytes.Pyth, 24/26 bytes
Toma la entrada como una cadena entre comillas. 26 bytes si necesita tomar la entrada como un entero; agregar
dz
en ese caso.Casos de prueba (entrada como cadenas, 24 bytes)
Casos de prueba (entrada como números, 26 bytes)
fuente
J, 43 bytes
Pruébalo en línea!
A veces el estilo tácito dificulta las cosas. Pero probablemente haya una manera de hacerlo con un estilo tácito que sea mucho más conciso que esto. Creo que recuerdo una mejor manera de dividir un número en dígitos que no sean
"."0@":
pero parece que no puedo recordarlo ...Explicación
La preposición y eliminación de 8 es para garantizar que esté presente el número correcto de ceros (J cambiará la forma de sus matrices para que tengan el tamaño de su elemento de longitud máxima, y 8 tiene 4 dígitos en binario para que se use).
fuente
APL (NARS), 34 caracteres, 68 bytes
alguna pequeña prueba:
fuente
Perl 5 ,
979189 + 2 (-F
) =999391 bytesPruébalo en línea!
fuente