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 unacharmatriz. Hacemos un bucle sobre cada dígito,convertcolocando el dígitotoStringen la base2(es decir, convirtiendo el dígito en un número binario), luego.padLeftpara convertirlo en un número binario de cuatro dígitos. Esa matriz resultante de cadenas se edita-joinen una sola cadena y se vuelve a emitir como unacharmatriz 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$xy los caracteres restantes para$yusar la asignación múltiple. Luego, los fusionamos nuevamente$b=$y+$xpara mover el primer elemento al final, es decir, rotar efectivamente la matriz en uno. Eso se-joinedita en una cadena, que se utiliza como entrada a laconvertllamada para convertir la cadena de la base binaria2en unaInt64. Luego,sorttodos 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
0x1prefijo 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`slicetambié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/2cuatro 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:≢blongitud 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 los0s del BCD, pero son más golfistas).Cambie la
@s a_s (que representa la1s 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 sean0y1para 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 usarmaximumyminimumsinofoldl1 max(o lo mismo conminrespectivamente) y usar un shortr = foldr1.Ahora, definamos un operador
f#xque conviertaxa BCD, genere todas las rotaciones, reduzca estas usandofy conviértalo a decimal:Ahora solo es cuestión de usar este operador una vez con
maxy una vez conminy 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
-xbandera 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
dzen 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