Introducción
En este desafío debes dividir un número entero en dos partes. Como a nadie le gusta obtener el pastel más pequeño, su objetivo es ser lo más justo posible. Por ejemplo, si desea dividir el entero 7129
en dos partes, hay 3 formas posibles de hacerlo.
7,129
, 71,29
y 712,9
son todas las posibilidades, pero 71,29
es la forma más justa de dividirlo en dos partes porque minimiza la diferencia entre las dos:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Reto
Dado un número entero, determine la mejor forma posible de particionarlo como se describió anteriormente e informe la diferencia resultante.
Reglas
- Dividir solo tiene sentido para enteros de longitud de al menos dos, la entrada siempre será ≥ 10
- La entrada puede ser un número entero, una lista de dígitos o una cadena
- No tiene que manejar entradas no válidas
Casos de prueba
Solo necesita informar la diferencia resultante, la partición solo está aquí para ilustración:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
05AB1E , 9 bytes
Código:
Utiliza la codificación 05AB1E . Pruébalo en línea!
Explicación
fuente
£
con°‰
no necesitará¤â
más.Python 2 , 64 bytes
Pruébalo en línea!
fuente
Perl 6 , 40 bytes
Pruébalo
Expandido:
fuente
C, 94 bytes
Pruébalo en línea!
fuente
Python 2 , 51 bytes
Pruébalo en línea!
fuente
Prólogo (SWI) ,
195189154117112 bytes35 bytes guardados gracias a Eminga
Pruébalo en línea!
Este es mi primer intento en el prolog de golf, por lo que puede ser un poco horrible. Así es como funciona.
Al más alto nivel tenemos
*
.*
tomaA
yH
, y determina siH
es la forma más pequeña de dividirA
.La primera línea aquí usa una técnica de esta publicación SO , para realizar esencialmente un mapa del predicado
r(A)
sobre los enteros de0
aA
. Comor
confirma los valores de cada partición, esto nos dará los valores de todas las particiones posibles, además de una carga completa de basura adicional. Todas estas particiones se almacenaránL
sin ningún orden en particular. Una vez hecho esto, ordenamos la lista para encontrar el elemento más pequeño. Luego usamos un corte para evitar el retroceso.A continuación tenemos la definición de
r
. Primeror
calcula los dos resultados de la división nombrándolosX
yY
.Luego afirmamos que
C
es la diferencia de ellos y es positivo.fuente
X is div(A,10**B),Y is div(A,10**B)
siempre daráC=0
(el significadoH
siempre será 0 también). Debería serY is mod(A,10**B)
, supongo.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
ahorrando 32 bytes (si está utilizando al menos el prólogo SWI, no está seguro acerca de otras versiones).A*H
lugar del(A,H)
guardar otro 3. Y si está utilizando SWI, puede agregar un enlace TIO,!
¿verdad? No debería haber ningún retroceso en ese punto.,!
que no sería necesario, pero cuando pruebo el programa retrocede. Parece probar todos los pedidos posiblesL
y luego los ordena a todos. Lo que significa que dará los mismosA!
tiempos de respuesta .Haskell ,
6865 bytesPruébalo en línea!
Explicación
fuente
Carbón , 14 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Convenientemente puedo usar la variante de 2 arg de
Slice
. Explicación:fuente
Jalea ,
98 bytesPruébalo en línea!
-1 byte gracias a Dennis. La entrada es una lista de dígitos.
Explicación
fuente
Funky ,
15913499 bytesEn realidad, ajustar la especificación es más corto, parece.
Pruébalo en línea!
fuente
Retina , 36 bytes
Pruébalo en línea!
Explicación
Esto genera todas las particiones posibles en líneas separadas, así como una línea final con la entrada original.
Convierta cada número en cada partición a unario.
Elimine una cantidad máxima e igual de
1
s de ambas partes de cada partición (es decir, elimine el mínimo y reste del máximo, lo que da la diferencia absoluta).Ordenar las líneas.
Cuente la
1
s en la primera línea, lo que da la mínima diferencia absoluta.fuente
J ,
32, 2723 bytes-5 bytes gracias a FrownyFrog! -4 bytes si la entrada es una cadena.
Pruébalo en línea!
Original: toma un número como entrada
Cómo funciona:
Pruébalo en línea!
fuente
JavaScript (ES6), 64 bytes
Toma la entrada como una cadena.
Casos de prueba
Mostrar fragmento de código
Comentado
No recursivo (ES7), 65 bytes
Toma la entrada como una cadena.
Casos de prueba
Mostrar fragmento de código
Comentado
Nota : En ambas versiones,
l
se coacciona a una cadena en la primera iteración. Normalmente, debemos tener cuidado con los ceros iniciales en un literal numérico:0123 - 10 === 73
porque0123
se analiza como un valor octal (ahora está en desuso, pero aún es válido en modo no estricto). Pero'0123' - '10' === 113
, el cero inicial es esta vez ignorado. Entonces, es bueno hacerlo.De la especificación de la operación abstracta
ToNumber
aplicada a una cadena:fuente
APL (Dyalog) , 27 bytes
Pruébalo en línea!
¿Cómo?
¯1+≢⍵
- longitud den
menos 1∘.=⍨⍳
- matriz de identidad1,
- anteponer1
para cada fila↓
- dividido por filas⊂∘⍵¨
- para cada uno, particione la cadena por ella↑
- aplanar-/
- reducir cada par con resta|
- tomar valores absolutos⌊/
- mínimoAPL (Dyalog) , 35 bytes
Pruébalo en línea!
fuente
Jalea , 11 bytes
Pruébalo en línea!
-3 bytes gracias a dylnan
Cómo funciona
fuente
L=2$$Ðf
aṖLÐṂ
en este casoPython 2 , 58 bytes
Pruébalo en línea!
fuente
Pyth , 15 bytes
Pruébalo en línea!
fuente
MATL , 15 bytes
La entrada es una cadena que representa el entero.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Wolfram Language (Mathematica) , 66 bytes
Toma una lista de dígitos.
Pruébalo en línea!
fuente
Limpio ,
10683 bytesDefine la función
@
, tomando una cadena.Principalmente evidente, el único bit complicado es
f=toInt o(%)n
: Esto toma latoInt
clase de funciones y la compone (o
) con la clase de operador de corte al curry (%
) ya suministrada con el primer argumento (n
). Dado que solo hay un tipo (String
equivalente a{#Char}
) que tiene sobrecargas para ambos%
ytoInt
la línea realmente se compila, mientras que normalmente es difícil componer funciones cuando se juega al golf debido a la falta de información contextual dada al compilador.Pruébalo en línea!
fuente
Jalea , 12 bytes
Un enlace monádico que toma una lista de dígitos y devuelve el entero.
Pruébalo en línea!
¿Cómo?
fuente
Pyth, 10 bytes
Banco de pruebas
Toma la entrada como una cadena.
Esto utiliza una de las características más recientes de Pyth, que es que la aplicación de una función a una lista por defecto asigna la función a la lista, si no se define otro comportamiento. Esto significa que
v
aplicado a una lista de lista de cadenas evalúa todas las cadenas.Tenga en cuenta que la lista de divisiones permite la división en 1 pieza, pero el valor de esta siempre será mayor que el mínimo, por lo que se ignora con seguridad.
fuente
Tcl , 116 bytes
Pruébalo en línea!
Explicación
Funciona mediante el uso de un truco regex que permite un caso final degenerado que siempre calculará una diferencia mayor que la mínima. Para "12345" los valores son:
fuente
lmap
lugar deforeach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/…Ruby , 44 bytes
Pruébalo en línea!
fuente
APL + WIN, 31 bytes
Solicita la entrada en pantalla del entero como una cadena.
Explicación:
fuente
Perl 5 ,
5141 + 1 (-p
) = 42 bytesPruébalo en línea!
inspirado en el comentario de @ Nahuel-Fouilleul
fuente
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C # (.NET Core) ,
112107 + 18 = 125 bytesPruébalo en línea!
El recuento incluye los 18 bytes en
using System.Linq;
. Toma entrada como astring
.fuente
string.Remove
podría ahorrarle unos pocos bytesLisp común, 131 bytes
La primera vez que participé en código golf y decidí usar Lisp, ya que me gusta.
Aquí está mi solución:
La entrada debe ser una cadena, no un entero o una lista.
fuente