Hay una pregunta en el sitio que pide implementar la división sin usar la división.
En mi caso, te pido que hagas lo mismo, pero solo usando la suma.
Lo que esto significa es básicamente: la suma es el único operador o función permitida que opera en números y devuelve otros números (es decir, no resta, multiplicación, exponenciación, inversión bit a bit, etc.). Cosas como si las declaraciones, los operadores de asignación y comparación, y para los bucles todavía están permitidos, siempre que dentro de ellos, solo use la suma.
Su tarea es construir una función divide(a, b)
que toma dos números enteros positivos a
y b
y devuelve el resultado de a
haber sido dividido por b
y redondeado hacia cero, pero el uso de la suma y no hay otros operadores aritméticos, y no hay otras construcciones de datos, además de los números.
El código que gana será el que requiere las operaciones de suma menor cantidad a realizar sobre el conjunto de entradas donde a
varía de 1
a 200
y b
varía de 1
a a
.
Para realizar un seguimiento de esto, se puede construir una versión alternativa de su código que reemplaza todas las instancias de a + b
la add(a, b)
y el programa add
para incrementar un mundial add_used
variable así como devolver la suma de los dos números.
fuente
Respuestas:
Escribir reglas es difícil, estas reglas en particular contienen incentivos para evitar adiciones a toda costa.
¿Hay algún premio por la respuesta más ridícula?
JavaScript - 0 adiciones
Ahora con un método alternativo que hace una solución descomunal para
a
'sy' s más grandesb
, y una estructura un poco más compacta para no romper el límite de caracteres. (Pfff, 30000 caracteres. ¿Qué es esto? Twitter?) Todavía no hay adiciones en el alcance medido.fuente
a
1 a 200, solo dice que juzgará la puntuación en función de las adiciones totales de ese rango de entradas. Todavía tiene que funcionar para enteros superiores a 200.Tcl, 0 adiciones
¿Por qué no usar cadenas?
fuente
Append
es similar a la suma, pero no es lo mismo. IJoined
listas usando una lógica similar, basado en recuentos.Haskell 0 adiciones, 29 bytes
esto redefine el operador de división (
/
). funciona haciendo una lista de0
hasta el infinito donde cada elemento se repite variasm
veces, y luego eligiendo el enésimo elemento de la lista (usando un índice basado en 0).fuente
([0..]>>=replicate m)!!n
? es casi lo mismoUtilice esta implementación en Java, adiciones 199206
Las siguientes son las funciones de ayuda
fuente
Python - 0 adiciones
Esto utiliza un iterador de longitud
a
y lo consume en grupos deb
hasta queStopIteration
se genera. En este puntoj
contiene el resultado.fuente
Mi solución es el código C / C ++ y hace muchas adiciones (200402), pero de todos modos ...
Y la salida es:
fuente
Python, adiciones 320703
Como siempre, una respuesta de referencia de último lugar. Esto simplemente agrega
1
un "cociente" yb
una variable de "remultiplicación" hasta que lleguea
.Aquí está el código de depuración:
fuente
Tcl, 0 adiciones.
Bueno, tuve que encontrar una forma que no use otras estructuras de datos pero que todavía no sea lo que quieres:
Utiliza el tamaño actual de la pila de diferentes hilos verdes.
fuente
C ++, 100201
fuente
a < b
el resultado fuera0
, no es un error.break
debería sercontinue
.Mathematica 100201 adiciones
Esto agrega el divisor,
b
, ac
(que se inicializa en 0) siempre que el total acumulado es menor que o igual al dividendo,a
. También agrega el valor actual dec
a una listat
, sin realizar ninguna operación aritmética.Cuando el
While
ciclo termina, la función genera la longitud det
, que corresponderá exactamente al cociente de la división entera. Por lo tanto, el número de adiciones para cualquier dadodivide[a,b]
será exactamente el cociente.100201 es la suma de los cocientes en la tabla 200 por 200. Así fue como
c
se incrementó muchas vecesb
. No se requirieron otras adiciones. Solo se usaron enteros positivos.Es más eficiente hacer una tabla de búsqueda, después de lo cual cada búsqueda será casi instantánea.
Uso
fuente
n++
cosa? Parece una adición para mí.n++
, que era totalmente innecesario. Por lo que puedo decir, (no sé TCL), mi solución es como la suya, pero almacena los elementos juntos en conjuntos múltiples en lugar de en cadenas.no other data constructs besides numbers
?R - 0 además
Utiliza el reciclaje de vectores R.
La segunda línea crea una matriz de longitud
a
poblada por un vector de longitudb
que se recicla hasta alcanzar la longituda
.La tercera línea divide la matriz de acuerdo con su valor y devuelve la longitud del último elemento (de ahí el resultado de la división entera de
a
byb
).Al rellenar una matriz con un vector cuya longitud no es múltiplo de la longitud de la matriz, se genera una advertencia, pero si la suprimimos de antemano (línea 1) funciona.
Para dar un ejemplo concreto si dividimos 5 por 3,
A
será un vector que contiene 1 2 3 1 2 (es decir, 1 2 3 reciclado a una longitud 5). El resultado de la operación de división será una lista con el primer elemento que contiene 1 1, el segundo 2 2 y el tercero 3 (ya que solo hay un 3 enA
). El resultado es, por lo tanto, 1.fuente
En rubí
No sé TCL, pero sospecho que este es el mismo enfoque que la (primera) respuesta de @Johannes.
fuente
d = 'x' * 5
=> "xxxxx".a << b
agrega cadenab
a cadenaa
. Aquí,d = "xxx"
y losd << 'x'
resultados end = "xxxx"
.Java: 92 987 adiciones
Yo uso recursividad binaria, eso
a/b == 2 * a/(2b) + maybe 1
. Para ese divisor y el resto son necesarios. Normalmente habría una resta a% (2b) - b, pero eso se resuelve manteniendo el resto como(rem, remNegative)
. Y2b = b+b
por supuestofuente
fuente
C # - 0 adiciones
Rellena una lista de enteros con tiempos
1..b
repetidosa
. El número de veces queb
aparece (excepto la aparición con un índice>a
) es el resultado.No estoy seguro de si la lista está permitida por las reglas, pero estoy enviando esto en el espíritu de las otras publicaciones que no toman las reglas tan en serio (después de todo, no usar la suma es básicamente pasar por alto el desafío por completo).
fuente
C - 85591 Adiciones
Aquí vamos. Creo que esto podría ser óptimo. Utiliza una técnica de "división inversa" por la cual a través de la multiplicación larga se acumula el mayor número
q
tal queq * b <= a
, usando solo+
y<=
. Es muy, muy rápido.Notas:
s(a,b)
devuelve la sumaa+b
y la variable de contador de incrementosz
cada vez que se realiza una suma. Sia
ob
es cero, se evita la adición innecesaria.d(a,b,p)
es una función recursiva para construir las porciones internas para comparación y adición. Utiliza las variables globalesq
,u
yv
. La profundidad máxima de recursión es el número de bitsa
, y la recursividad es lineal en lugar de un árbol. (Nota: elb
en esta función es el originalb
multiplicado por una potencia de 2.)divide(a,b)
devuelve el piso (a / b) según se requiera.fuente
J, 0 adiciones, 14 bytes
Inspirado por la respuesta de Alexei Kopylov .
No usa matemáticas en absoluto:
fuente