Un número está equilibrado si la suma de los dígitos en cada mitad del número es igual, entonces: 1423
está equilibrado porque 1+4 = 2+3
, así es: 42615
porque 4+2=1+5
. Tenga en cuenta que el dígito del medio no se incluye en ninguno de los lados (o se incluye en ambos lados) si hay un número impar de dígitos.
Reto:
Tome un entero positivo como entrada y genere un valor verdadero si está equilibrado y un valor falso si no está equilibrado.
Casos de prueba (verdadero)
1
6
11
141
1221
23281453796004414
523428121656666655655556655656502809745249552466339089702361716477983610754966885128041975406005088
Casos de prueba (falso)
10
12
110
15421
5234095123508321
6240911314399072459493765661191058613491863144152352262897351988250431140546660035648795316740212454
No habrá números que comiencen con cero, por ejemplo, en 00032
lugar de 32
. Debe admitir números de hasta al menos 100 dígitos (tan grande como 2^64-1
). Como siempre, formato de entrada opcional, por lo que puede rodear el número con apóstrofos si lo desea.
Ë
lugar de`Q
?Ë
era un comando diferente cuando se hizo este desafío, así que desafortunadamente no.> <> ,
3129 bytesPruébalo en línea!
Línea 1: bucle de entrada estándar
Línea 2: deseche el -1 en la parte superior de la pila, presione dos ceros y gire uno hacia la parte inferior de la pila (esto asegura que las entradas de longitud <3 no agoten la pila más adelante en el programa)
Línea 3: si la longitud de la pila es> 3, agregue los dos elementos superiores e inferiores de la pila juntos.
Línea 4: Si la parte superior e inferior de la pila son iguales, salida 1, 0 de lo contrario.
Editar: me di cuenta de que no es necesario tomar los caracteres mod 12, 2 bytes guardados
fuente
Haskell,
6463 bytesUn byte guardado gracias a nimi
fuente
b(a:t@(r:s))=a-last t+b(init t);b _=0
Brachylog , 20 bytes
Pruébalo en línea!
Explicación
fuente
Java, 85 bytes
Nota: la entrada se da como
String
Java no puede manejar sinBigInteger
(yBigInteger
s se construyen usando un ...String
)Pruebas y sin golf:
fuente
for (; i < l / 2;s += n.charAt(i) - n.charAt(l - ++i));
.Mathematica, 57 bytes
Explicación
Realmente esperaba poder usar este enfoque en algún idioma, y parece estar funcionando bastante bien en Mathematica. La idea es evitar tener que obtener tanto la mitad frontal como la posterior combinando la lista con su reverso y mirando solo la mitad frontal.
Primero, convertimos la entrada en una lista de dígitos decimales y pasamos el resultado a la función sin nombre a la izquierda.
Ahora restamos el reverso de la lista de la lista misma. Si los dígitos son entonces el resultado será .
{a1,a2,...,an}
{a1-an,a2-an-1,...,an-a1}
Extraemos la primera mitad de esta lista (excluyendo el dígito del medio, aunque eso en realidad no importa, porque la diferencia correspondiente será de
0
todos modos).Y luego sumamos esta lista. Así que eso es:
Reorganizando:
La entrada se equilibra si las dos mitades tienen la misma suma. Por lo tanto, esta expresión es cero si la entrada está equilibrada. Entonces eso es lo que verificamos:
fuente
JavaScript (ES6),
5955514442 bytesResulta que estaba usando la estrategia equivocada por completo. Esta versión encuentra recursivamente la suma de la primera mitad menos la suma de la segunda mitad, luego devuelve el NOT lógico del resultado.
Si pudiéramos devolver falsedad en lugar de verdad y viceversa, esto sería 35 bytes:
Fragmento de prueba
Mostrar fragmento de código
fuente
n[i*2]
! Buena esa.f=([x,...a])=>!(a[0]?x-a.pop()+f(a):0)
?PowerShell v2 +, 85 bytes
Toma la entrada
$a
como una cadena (necesaria para admitir números>2^64-1
sin entrar extremadamente torpe[biginteger]
conversión en la línea de comando).Para la explicación, supongamos la entrada de
'1423'
. Entonces estamos construyendo una nueva cadena. Las dos rebanadas de matriz son obvias ($a[...]
), y que está rodeado por tres cadenas adicionales(
,0)-(
y0)
, la formulación de una matriz dechar
s ystring
s. Tenga,
en cuenta el frente para aplicar la concatenación de matriz, no la concatenación de cadenas.Esa matriz completa se
-join
edita junto con+
, dando como resultado una cadena como(+1+4+0)-(+2+3+0)
, y puede ver que los0
s son necesarios para evitar errores de sintaxis. Eso se introduce en|iex
(abreviaturaInvoke-Expression
y similar aeval
), que calculará el resultado matemático. Mientras la cadena esté equilibrada, obtendrá0
como salida, que encapsulamos en parens y tomamos el booleano, no del mismo!(...)
, para generarTrue
. Si se trata de un número entero distinto de cero, se generaráFalse
.Casos de prueba
fuente
Perl, 29 bytes
Incluye +5 para
-lpF
Dar número en STDIN
balanced.pl
:fuente
C #, 83 bytes
Pruébalo en línea!
Fuente completa, incluido el caso de prueba:
El tipo de datos BigInteger permite cualquier longitud de número. Si el número es demasiado grande, el compilador se queja ( error CS1021: la constante integral es demasiado grande ), entonces BigInteger.Parse (String) se utiliza el método .
La solución en realidad se puede reducir a 72 bytes considerando que la entrada es una cadena (y actualizando el programa en consecuencia):
fuente
t[l-++i]
lugar det[l-1-i++]
y enreturn !r
lugar dereturn r==0
?Python 3,
10710276 bytes-26 bytes por @Rod !
fuente
floor(l/2)
conl//2
yceil(l/2)
conl//2+l%2
para guardar 7 bytes, y luego eliminar la importación matemática, ahorrando más 180
encendidon[0:l//2]
yn[l//2+l%2:]
podría sern[-(l//2):]
. O se podría mover el//2
al=len(n)//2
, y utilizarn[:l]
, yn[-l:]
Ruby, 63 bytes
Nota: arg
s
debe ser una cadena.Prueba (se requiere minitest 5+):
fuente
Haskell, 55 bytes
La función recursiva
g
desenvuelve una cadena de números de ambos extremos tomando repetidamente la cabeza y luego invirtiendo. Resta el resultado recursivo de la cabeza, lo que provoca coeficientes alternos de +1 y -1, con +1 aplicado a la primera mitad y -1 a la segunda mitad.Entonces, toma la suma de la primera mitad menos la suma de la segunda mitad. Esto tiene el problema de que con un número impar de dígitos, el centro se rompe a la izquierda, pero la función principal lo corrige
(<*"xx")
, lo que duplica cada carácter, es decir, "12345" se convierte en "1122334455". De esa manera, el dígito del medio se divide de manera uniforme en ambos lados y se cancela.fuente
Retina,
6444 bytesPruébalo en línea
La primera etapa divide la cadena en el medio, omitiendo el carácter del medio si hay uno (
tomado y modificado a partir de aquí .Cortesía de Martin). Luego, reemplace los dígitos con su representación unaria y haga coincidir si las dos mitades son de igual longitud.fuente
(.)*?
(cada iteración empuja una captura en la pila 2). Luego tratamos de llegar al final volviendo a aparecer desde la pila con(?<-2>.)*$
(después de un dígito medio opcional). La primera vez que esto es posible es cuando hemos capturado exactamente la mitad de los dígitos (redondeados hacia abajo) en el grupo 2.JavaScript (ES6),
7467...5950 bytesSuma recursivamente la diferencia del primer y último dígito hasta que queden menos de dos dígitos:
fuente
(s-=i<0?v:-v)
.Math.sign()
.R
10596 bytesResulta que R es muy detallado. Toma la entrada como un personaje.
Formateado muy bien:
Explicación
y<-as.numeric(unlist(strsplit(x,"")))
Divida la entrada (una cadena_, y conviértala en un vector en lugar de una lista, y luego vuelva a convertirla en enteros.sum(tail(y,
:tail
toma los últimos n elementos, encontrados por:length(y)%/%2))
, donde%/%
está la división de enteros, para obtener el techo del cociente, donde la longitud es impar.sum(head(y,length(y)%/%2))
: comotail
,head
toma los primeros n elementos del vector, encontrados de la misma manera.Ediciones
=
lugar de<-
, guardado otros dos bytes.fuente
length(y)%/%2
alguna manera a una variable y usar eso dentro de las llamadas detail
yhead
?Cerebro-Flak ,
410206204178 + 3 = 181 bytesAquí hay una versión de 178 bytes que usa la
-a
bandera.26 bytes de golf de DJMcMayhem
Pruébalo en línea
Aquí hay una versión más larga de 410 bytes que no usa la
-a
bandera.Pruébalo en línea
Explicación
Aquí hay una explicación de la solución más corta.
Para comenzar, el número se convierte a todos sus valores ASCII mediante la
-a
bandera.Empujamos la altura de la pila (es decir, el número de dígitos) y la dividimos por dos.
Por cada número menor que el número que acabamos de presionar, movemos un dígito a la otra pila
Si las pilas tienen diferentes alturas, eliminamos el elemento superior de la pila actual
Queremos la diferencia entre las sumas de cada pila. Entonces usamos el siguiente algoritmo para sumar cada pila.
Esto supone que ningún dígito tiene un valor ASCII de cero, que es una suposición válida.
Ejecutamos esto para ambas pilas y tomamos la diferencia (El
<(())>
es necesario para la siguiente parte.Ahora queremos negar la suma. Si la suma es cero, se abrirá la parte superior revelando la que presionamos anteriormente; de lo contrario, eliminará tanto el número como el uno y colocará un cero en la parte superior.
fuente
([]){[{}]{}([])}{}
para sumar cada pila?({{}})
debería funcionar bien, y dado que está tomando la entrada ASCII, no tiene que preocuparse de que los 0 arruinen el ciclo.En realidad,
1716 bytesEsta respuesta está inspirada en la respuesta de Python 2 de ElPedro y su idea de usar
[-b:]
. Sugerencias de golf bienvenidas. Pruébalo en línea!Ungolfing
fuente
Perl 6 ,
42 3933 bytesPruébalo
Pruébalo
Pruébalo (de Jo King )
Explicación:
fuente
..
maneja los no enteros). ¿Qué tal 33 bytes en su lugarJavascript, 73 bytes
Buenos viejos bucles ES5
¿Que esta pasando aqui?
fuente
Python 2, 73 bytes
Las pruebas están en ideone
Tenemos que usar en
str()
lugar de `` ya quen
puede estar fuera del rango de int firmado.fuente
Python 2,
8377 bytesEDITAR
reducido a 77 con ayuda de @Rod
Ejemplos:
fuente
map(int,input())
en su lugar[int(h)for h in raw_input()]
,len(g)/2
siempre será int, no es necesario convertir, yor b==0
no es realmente necesariob==0
es necesariolen=1
, pero puede acortarlo ab<1
PHP,
73676057 bytesRequiere PHP 7.1 para compensaciones de cadena negativas:
Correr:
Versión previa
Nota: requiere PHP 7 para el operador de la nave espacial.
Corre así:
Explicación
Itera sobre los dígitos en el número. Comprueba si el dígito pertenece a la primera mitad o la segunda mitad (o es el dígito del medio) comparando el índice del dígito con la longitud de la entrada con la comparación combinada (
2 * $x <=> $l - 1
). Luego multiplique eso con el dígito, tome la suma de todos los dígitos. Si es un número equilibrado, la suma será0
.Ejemplo con entrada
15324
:Ajustes
$d
, solo itere la longitud de la entrada. Guardado 5 bytes.null
No es necesario convertir el desplazamiento de cadenaint
para que PHP lo interprete0
. Guardado 1 byte.$argn
fuente
Clojure,
6664 bytesActualización: se eliminó
str
de lamap int
función.Esto se habría acortado si el formato de entrada fuera más flexible, ahora tenía que asignar primero el entero en una secuencia de valores ASCII. El interior
map
calcula las diferencias de valores por pares de las dos mitades, y esto verifica si la suma de deltas es cero.((comp f g h) x y z)
=(f (g (h x y z))
.En realidad, esto terminó teniendo la misma longitud que simplemente hacer el mapeo dentro de ay
let
solo definir una sola función.fuente
sed (165 + 1 para -r) 166
Salida:
1 para verdadero
0 para falso
Pruébalo en línea!
fuente
Python 2.7,
10292 bytesPara el bucle funciona mejor: /
La misma idea, solo usa la longitud - i para obtener el otro lado. Nunca llegará al centro de un número impar.
Código antiguo
Obtiene la entrada
Guarda la longitud de la entrada
Función recursiva para obtener la suma de la cadena
Compare la primera mitad de la suma con la segunda mitad de la suma
Tratando de llegar por debajo de 100, pero es difícil: /
fuente
Función C, 74
Ideona
fuente
#include"string.h"\n
, lo que agrega 19 a tu puntaje.char *n
l;i;t;f(char*n){..return!t;}
-2 bytesRaqueta 204 bytes
Versión detallada:
Pruebas:
Salida:
fuente
Pyke, 20 bytes
Pruébalo aquí!
fuente
not [0]
era 0 no 1Mathematica, 69
fuente
...;;]]&@*IntegerDigits
@*
es la abreviatura deComposition
.f@*g
esf[g[##]]&
.