Problema:
Su objetivo es añadir dos números de entrada sin necesidad de utilizar cualquiera de los siguientes operadores matemáticos: +,-,*,/
.
Además, no puede usar ninguna función incorporada que esté diseñada para reemplazar esos operadores matemáticos.
Tanteo:
El código más pequeño (en número de bytes) gana.
Actualizar
La mayoría de los programas que he visto concatenan dos matrices que contienen sus números, o hacen
first number
un personaje, agregansecond number
caracteres y luego los cuentan.Contador de matriz más corto: APL con 8 caracteres, por Tobia
Concatenación de matriz más corta: Golfscript con 4 caracteres, por Doorknob
La solución logarítmica más corta: TI-89 Basic con 19 caracteres, por Quincunx
Solución de integración: Mathematica con 45 caracteres, por Michael Stern
Mejor, en mi opinión: operadores bit a bit en JavaScript, por Dave
fuente
Respuestas:
Smalltalk,
2113Todo lo siguiente solo funciona en enteros positivos. Vea la otra respuesta Smalltalk para una respuesta seria.
versión 1
cambiando a un número entero grande y pidiéndole su alto índice de bits (incorrecto, la indexación ST está basada en 1, por lo que necesito un desplazamiento a la derecha adicional):
versión 2
similar, e incluso un poco más corto (debido a las reglas de precedencia Smalltalk, y no se necesita un desplazamiento a la derecha):
version3
Otra variación del tema "tamaño de solicitud de concatenación de colección",
dados dos números ayb,
Usando Intervalos como colección, obtenemos una versión más amigable con la memoria ;-) en 21 caracteres:
Sin embargo, no se recomienda para el procesamiento de números pesados.
version4
Para su diversión, si desea cambiar el tiempo por la memoria, intente:
que suele ser lo suficientemente precisa (pero no hay garantía ;-)))
version5
escribir en un archivo y pedirle su tamaño
fuente
Javascript (25)
Esto agrega dos variables x e y, usando solo operaciones bit a bit, y almacena el resultado en x.
Esto también funciona con números negativos.
fuente
while(y)x^=y,y=(y&x^y)<<1
!for(;y;y=(y&x^y)<<1)x^=y
es 1 byte más corto :)C - 38 bytes
Aquí hago trampa un poco, dijo el OP para no usar ningún operador matemático .
El
*
en elprintf()
formato significa que el ancho del campo utilizado para imprimir el carácter se toma de un argumento deprintf()
, en este caso, 3 y 4. El valor de retorno deprintf()
es el número de caracteres impresos. Por lo tanto, está imprimiendo uno' '
con un ancho de campo de 3 y uno con un ancho de campo de 4, hace 3 + 4 caracteres en total.El valor de retorno son los números agregados en la
printf()
llamada.fuente
main
. Además, si no le importa lo que se imprime, se puede reemplazar uno' '
con0
y omitir el segundo.Python - 49 bytes
Asumiendo entrada por colocación en variables
x
yy
.Esta solución de 61 bytes es un programa completo:
Teniendo en cuenta que no prohibiste la exponenciación, tuve que publicar esto. Cuando simplifica la expresión usando propiedades de logaritmos, simplemente obtiene
print input() + input()
.Esto admite números negativos y de coma flotante.
Nota: Seguí el consejo de gnibbler y dividí esta respuesta en tres. Esta es la solución de Mathematica , y esta es la solución básica de TI-89 .
fuente
E^y
. UtilizandoLog[Log[(E^E^x)^E^y]]
parece funcionar bien.JavaScript [25 bytes]
fuente
Mathematica, 21 bytes
Hay varias maneras de hacer esto en Mathematica. Uno, use la función Acumular y arroje todo menos el número final en la salida. Al igual que con mi otra solución a continuación, supongo que los números de entrada están en las variables
a
yb
. 21 bytes.Más divertido, aunque tiene 45 caracteres, use los números para definir una línea e integrar debajo de ella.
Como beneficio adicional, ambas soluciones funcionan para todos los números complejos, no solo para enteros positivos, como parece ser el caso para algunas otras soluciones aquí.
fuente
function _(){return array_sum(func_get_args());}
. Tuve que desmontarlo porque no pude encontrar una manera corta de "arreglarlo".array_sum()
en php, que hace exactamente lo mismo.GolfScript,
64 caracteres / bytesEntrada en forma de
10, 5
(=>15
).El
+
es concatenación de matriz, no suma.Cómo funciona es que
,
se usa para crear una matriz de la longitud que tiene el número (0,1,...,n-2,n-1
). Esto se hace para ambos números, luego las matrices se concatenan.,
se usa nuevamente para un propósito diferente, para encontrar la longitud de la matriz resultante.Ahora, aquí está el truco . Realmente me gusta este porque abusa del formato de entrada. Se ve como si estuviera simplemente insertando una matriz, pero en realidad, ya que la entrada está siendo ejecutado como código GolfScript, el primero
,
ya está hecho por mí! (La versión anterior de 6 caracteres tenía~,\,+,
formato de entrada10 5
, que eliminé 2 caracteres al eliminar el\,
(matriz de intercambio)).Versión anterior (12) :
Crea una función
f
.El
*
y+
son cadenas de repetición y concatenación respectivamente, no funciones aritméticas.Explicación:
n
crea una cadena de un carácter (una nueva línea). Esto se repite variasa
veces y luego se hace lo mismob
. Las cadenas se concatenan y luego,
se utilizan para la longitud de la cadena.fuente
C,
2927 bytesUsando aritmética de puntero:
x
se define como un puntero, pero la persona que llama debe pasar un número entero.Un usuario anónimo sugirió lo siguiente: también 27 bytes, pero los parámetros son enteros:
fuente
int
s en los sistemas ahora comunes dondeint
tiene 32 bits, y los punteros tienen 64 bits. El segundo evita ese problema.Brainf * ck,
936Esto funciona sin usar la suma simple; pasa y deja un rastro de 1 y luego los cuenta
Nota: Los
+
y-
son simplemente incrementos individuales y no se puede hacer nada en brainf * ck sin ellos. No son realmente sumas / restas, así que creo que esto todavía cuenta.fuente
J (6)
No dijiste que no podíamos usar la función succ:
Uso:
Solo hace 9 repeticiones de
>:
8.El enfoque de la lista de concatenación funciona, también:
#@,&(#&0)
. Y, sé que va en contra de las reglas, no puedo dejar pasar esta respuesta sin la solución más J-ish:*&.^
(multiplicación bajo exponenciación).fuente
Postdata, 41
Definimos función con expresión de 41 bytes de longitud como:
Entonces lo llamamos, por ejemplo, como:
Lo que da
Maneja fácilmente negativos y flotadores, a diferencia de la mayoría de los competidores :-)
fuente
bash, 20 caracteres
fuente
Smalltalk (ahora en serio),
123 118105 (*)Perdón por responder dos veces, pero considera esta una respuesta seria, mientras que la otra era más como humor. Lo siguiente se ejecuta en este momento en todas nuestras máquinas (en hardware, sin embargo). Es extraño que no le viniera a la mente a nadie más ...
Al combinar dos medios sumadores y hacer todos los bits de las palabras en paralelo, obtenemos (entradas a, b; salida en s) versión legible:
El bucle es para llevar propagación. Las máscaras aseguran que se manejen los enteros con signo (sin ellos, solo son posibles los números sin signo). También definen la longitud de la palabra, lo anterior es para operación de 32 bits. Si prefiere la adición de 68 bits, cambie a 16rFFFFFFFFFFFFFFFFF.
versión de golf (123 caracteres) (evita la máscara larga reutilizándola en m):
(*) Al usar -1 en lugar de 16rFFFFFFFF, podemos jugar mejor al golf, pero el código ya no funciona para números de precisión arbitrarios, solo para smallIntegers del tamaño de palabras de máquina (la representación para largeIntegers no está definida en el estándar Ansi):
Esto reduce el tamaño del código a 105 caracteres.
fuente
APL, 8 y 12
Nada nuevo aquí, la versión de conteo de matrices:
y el registro ○ versión de registro:
¡Solo pensé que se veían geniales en APL!
fuente
≢∘∊⍳¨
sed, 359 bytes (sin el formato elegante)
Perdón por la respuesta tardía, y probablemente la respuesta más larga aquí con diferencia. Pero quería ver si esto es posible con sed:
Esto es similar a https://codegolf.stackexchange.com/a/38087/11259 , que simplemente incrementa los números en una cadena. Pero en cambio, realiza las operaciones de incremento en un bucle.
La entrada se toma de STDIN en la forma "x y". Eso se transforma primero en "x: 0 :: y:". Luego incrementamos todos los números que vienen después de los caracteres ":", hasta obtener "x: x: :( x + y):". Luego finalmente regresamos (x + y).
Salida
Tenga en cuenta que esto solo funciona para los números naturales. Sin embargo (al menos en teoría) funciona para enteros arbitrariamente grandes. Debido a que estamos haciendo operaciones de incremento de x en y, ordenar puede hacer una gran diferencia en la velocidad: x <y será más rápido que x> y.
fuente
Guión , 18 bytes
Requiere tiempo GNU 1.7 o superior. La salida es a STDERR.
Pruébalo en línea!
Tenga en cuenta que esto no funcionará en B ash, ya que su comando de tiempo incorporado difiere del tiempo de GNU.
A costa de un byte adicional,
\time
se puede usar en lugar detime
forzar a Bash a usar el comando externo.fuente
sleep -3
podría acelerar mis programas. Qué decepción.\time
debería funcionar también en Bash.Javascript (67)
Probablemente hay mucho mejor
fuente
joins
son innecesarios. ElArray
constructor hace una serie deundefineds
, que se pueden contar:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Number
constructor salva a 2 personajesparseInt
alert
, la salida aún iría a la consola, pero eso hace que la respuesta sea un poco menos divertida. También puede reutilizar laprompt
variable en lugar de alertar (el constructor alerta el argumento con la solicitud). De todos modos, buena respuesta!Ruby, 18 caracteres
Y dos variantes más detalladas, 29 caracteres.
Otra versión, 32 caracteres
fuente
C # - en la generación de código de vuelo
Sí, en realidad hay una adición allí, pero no el operador + y ni siquiera una función de marco que agrega, sino que generamos un método sobre la marcha que agrega.
fuente
Rubí 39
fuente
R 36
donde
rep
construye un vector dex
unos seguido dey
dos.fuente
length(rep(1:2,scan()))
TI Basic 89 - 19 bytes
Ejecute esto en su TI-89 (pantalla de inicio o aplicación de programación):
Esto utiliza reglas de registro para calcular
x+y
, al igual que en esta solución . Como beneficio adicional, funciona para números decimales y enteros. Funciona para todos los números reales. Si las reglas de logaritmo siguen siendo válidas con exponentes complejos, entonces esto también funciona para números complejos. Sin embargo, mi calculadora escupe basura cuando intento insertar exponentes complejos.fuente
ln
1 byte en TI Basic? Además, puede eliminar los paréntesis de cierre, reduciéndolo a 15 bytes.Gracias a Michael Stern por enseñarme la notación de Mathematica. .
Mathematica -
2120 bytesUtiliza el mismo enfoque que esta solución , pero está en Mathematica para acortarlo. Esto funciona para números negativos y de coma flotante, así como para enteros
x
yy
.Simplificar la expresión usando reglas de registro produce
x+y
, pero esto es válido ya que usa exponenciación, no uno de los 4 operadores básicos.fuente
C # - aritmética de cuerdas
Convertimos ambos números en cadenas, hacemos la suma con corte de cadena (con acarreo y todo, ya sabes), luego volvemos al entero. Probado con i1, i2 en 0..200, funciona de maravilla. ¡Encuentra una adición en este!
fuente
C (79)
fuente
Python - 22 caracteres
fuente
APL: 2
Esto convierte los números de la base 1, entonces (n * 1 ^ 1) + (m * 1 ^ 2) que es exactamente n + m.
Se puede probar en TryApl.org
fuente
TI-BASIC, 10
Agrega
X
yY
fuente
K, 2 bytes
Ejemplo de uso:
Aplique el operador "donde" (monádico
&
) a los números en una lista de entrada (posiblemente tomando la libertad con el formato de entrada). Esto producirá una lista que contiene el primer número de ceros seguido del segundo número de unos:Normalmente, este operador se utiliza como "reunión" para producir una lista de los índices de los elementos distintos de cero de una lista booleana, pero la forma generalizada resulta útil ocasionalmente.
Luego simplemente tome el recuento de esa lista (monádico
#
).Si mi interpretación de los requisitos de entrada es inaceptable, la siguiente solución un poco más larga hace el mismo truco:
fuente
Pyth , 29 bytes
Pruébalo en línea!
Mi primera presentación aquí!
Esto compila a:
fuente