Para verificar si un número decimal es divisible por 7:
Borra el último dígito. Multiplique por 2 y reste de lo que queda. Si el resultado es divisible por 7, el número original es divisible por 7.
(también descrito, por ejemplo, aquí )
Esta regla es buena para la verificación manual de divisibilidad. Por ejemplo:
¿Es 2016 divisible por 7?
Restar
6*2
de 201; obtenemos 189. ¿Es esto divisible por 7? Para verificarlo, apliquemos la regla nuevamente.Restar
9*2
de 18; obtenemos 0. Por lo tanto, 2016 es divisible por 7.
En este desafío, debe aplicar esta regla hasta que el estado de divisibilidad sea obvio , es decir, el número no sea mayor que 70 (sin embargo, consulte los detalles a continuación). Hacer una función o un programa completo.
Entrada : un entero positivo; su código debe admitir entradas de hasta 32767 (la compatibilidad con enteros de precisión arbitraria es una ventaja; consulte a continuación).
Salida : un número entero (posiblemente negativo), no mayor que 70, que es el resultado de aplicar la regla de divisibilidad por 7 cero o más veces.
Casos de prueba:
Input Output Alternative output
1 1
10 10 1
100 10 1
13 13 -5
42 42 0
2016 0
9 9
99 -9
9999 -3
12345 3
32767 28 -14
---------- Values below are only relevant for the bonus
700168844221 70 7
36893488147419103232 32 -1
231584178474632390847141970017375815706539969331281128078915168015826259279872 8
Cuando se especifican dos salidas posibles, cualquiera de los resultados es correcto: el segundo corresponde a aplicar la regla una vez más. Está prohibido aplicar la regla en un número de un solo dígito: si borra el dígito, no queda nada (no 0).
Bonificación : si tu algoritmo
- Admite enteros de precisión arbitraria
- Realiza solo una pasada en la entrada
- Tiene complejidad espacial
o(n)
(es decir, menor queO(n)
); y - Tiene complejidad de tiempo
O(n)
,
donde n
es el número de dígitos decimales:
Resta el 50% del recuento de bytes de tu código.
Bonificación real :
Además, si su algoritmo lee la entrada en la dirección normal, comenzando desde el dígito más significativo, reste 50% una vez más; su puntaje es el 25% de su conteo de bytes (parece posible, pero no estoy absolutamente seguro).
fuente
1000000000000000000001
.long long
s o algún tipo equivalente incorporado?Respuestas:
Golfscript,
2722 bytesPuedes usarlo de esta manera:
Explicación
¡5 bytes guardados gracias a Dennis!
fuente
@wizzwizz4
(@
luego mi nombre de usuario) al comienzo (o en cualquier lugar) de un comentario.{...}{}if
parte como{...}*
, que solo aplicará el bloque de código cero de una vez, dependiendo del valor introducido>
. Además, se nos permite realizar una iteración más (por lo que reemplazar70
con9
guardar un byte), y no creo que necesite hacer estallar el bloque;
.Haskell, 35 bytes
Ejemplo de uso:
until(<71)(\n->div n 10-2*mod n 10) 36893488147419103232
->32
.No hay mucho que explicar, es una implementación directa del algoritmo.
fuente
Jalea, 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python 2, 38 bytes
Pruébalo aquí !
Enfoque recursivo simple. Imprime x si su <70 aplica la regla de divisibilidad y se llama a sí mismo con el resultado.
fuente
)
f=lambda x:x*(x<70)or f(x/10-x%10*2)
x*(x<70) != 0
la condición final. Si x llega a 0, como lo hace con 2016, la condición final nunca ocurre.Pyth, 13 bytes
Pruébelo en línea: demostración o pruebas
Esto imprimirá todas las respuestas alternativas.
Explicación:
fuente
Julia,
2726 bytesEsta es una función recursiva que acepta un número entero y devuelve a
BigInt
. Si la entrada es un número grande como en el último ejemplo, Julia lo analiza como unBigInt
, por lo que no es necesaria la conversión manual.El enfoque es solo una implementación directa del algoritmo. Producirá las salidas alternativas. Tomar el módulo cuando se divide por 10 produce el último dígito y el cociente de la división de enteros por 10 produce todo menos el último dígito.
¡Ahorré un byte gracias a Dennis!
fuente
70
con9
guardar un byte.Pyth, 17 bytes
Pruébalo aquí!
El mismo enfoque recursivo que en mi respuesta de Python . Define un lambda
y
que se llama así:y12345
.El contador de bytes en el intérprete en línea muestra 19 bytes porque le agregué la llamada lambda, por lo que puede intentarlo presionando el botón de ejecución.
Explicación
fuente
CJam - 19 bytes
Versión Do-while:
Pruébelo en línea o mientras que la versión # 1:
Pruébelo en línea o mientras que la versión # 2:
Pruébalo en línea .
fuente
Oracle SQL 11.2, 116 bytes
Sin golf
fuente
Haskell,
157192184167159147138 + 5 bytes - 50% = 71.5 bytesO (1) espacio, O (n) tiempo, un solo paso!
Use como
0![6,1,0,2]
para aplicar la regla a 2016, es decir, pasarle un número en forma de flujo con la cifra menos significativa primero. De esta manera, pasará el número dígito por dígito, aplicando la regla con O (1) complejidad de espacio.El código sin golf está aquí:
La esencia de cómo funciona esto es que implementa un algoritmo de resta dígito a dígito , pero aprovecha el hecho de que cada número que se restará es como máximo de 2 dígitos, por lo que podemos restar una cantidad arbitraria de estos 1- o números de 2 dígitos del principal (además de comer los dígitos menos significativos).
El algoritmo de resta es O (1) y solo almacena el valor actual de 'préstamo'. Modifiqué esto para agregar el dígito adicional (ya sea 0 o 1), y notamos que este valor de préstamo está limitado (dentro del rango [-2,2] por lo que necesitamos solo 3 bits para almacenar esto).
Los otros valores almacenados en la memoria son variables temporales que representan el número actual de 2 dígitos para agregar, una sola vista anticipada en la secuencia y aplicar un paso del algoritmo de resta (es decir, toma dos dígitos y un valor de préstamo, y devuelve un dígito y un nuevo valor de préstamo).
Finalmente, al final, procesa los dos últimos dígitos de la secuencia a la vez para devolver un número de un solo dígito en lugar de una lista de dígitos.
NB La
sev
función en la versión sin golf funcionará en unaInteger
, convirtiéndola en la forma de flujo inverso.fuente
Mod[18 - Quotient[n, 10] - 2*n, 21] - 18 + Quotient[n, 10]
funciona empíricamente para n entre 10 y 99, pero se complica más las más dígitos n tiene ...0
al llamar!
, por ejemplo, como una sección(0!)
(+ una nueva línea), es decir, +5 bytes. Por otro lado, puede acortar el primero para crear patrones de coincidencias de!
ap![d]=
yp![d,e]=
. Además, patrón de uso guarda en lugar de lalet
:p!(d:e:f)|(b,a)<-quotRem(2*d)10,(q,r)<-h$e-a-p=(b+q)!(r:f)
.(0!)
a una línea propia.(0!)
es la función que le das como respuesta. Se0
requiere, pero no tiene nada que ver con la entrada, por lo que no puede subcontratarlo a la persona que llama. Por supuesto, también podría usarf x=0!x
, pero esto es más largo.GNU dc,
2015 bytesEsto define mi primer (nunca) la función de corriente continua,
F
. Toma entrada en la parte superior de la pila y deja su salida en la parte superior de la pila. Ejemplo de uso:fuente
Mathematica,
4744 bytesEnfoque recursivo simple. Probablemente podría jugar más golf.
fuente
#0[{1,-2}.QuotientRemainder[#,10]]
guarda un byte.R, 43 bytes
Explicación:
Ejecuciones de muestra:
fuente
JavaScript ES6, 38 bytesFalla con
36893488147419103232
y usando~~(1/10)
también fallará por700168844221
Prueba:
fuente
Fail
s ... 70 y 32f=n=>n>70?f((n-n%10*21)/10):n
es una versión más corta pero aún funciona solo hasta2**56
.Mathematica, 33 bytes
Caso de prueba
fuente
Perl 5,
4746 bytesTuve que usar
bigint
para el último caso de prueba. (Devuelve 20 sin)No estoy realmente seguro de que sea un candidato para el bono, así que no lo tomé en cuenta. (Creo que sí, pero no estoy acostumbrado a los conceptos)
Pruébalo aquí!
fuente
ES6, 108 bytes
Funciona para 2²⁵⁷ y 1000000000000000000001, pero podría usar más golf.
fuente
JavaScript ES6,
140142 bytesEsta es una verdadera matemática de precisión arbitraria, incluso funciona en el caso de prueba más grande.
Esta función elimina de forma recursiva el último dígito de la cadena, luego resta 2 * el último dígito de la cadena numérica restante incrementando iterativamente la cantidad de dígitos que se aplicarán al minuendo hasta que la diferencia sea positiva. Luego agrega esa diferencia al final de la cadena con
0
s apropiadamente rellenada y se llama recursivamente hasta que su valor numérico sea menor o igual a9
.fuente
1000000000000000000001
.s.replace(/.$/,'-$&*2')
. No tengo ideas obvias para el resto, aunque lo siento.C #,
111104bytesfuente
Brain-Flak ,
368360 bytesPruébalo en línea!
Explicación
Para comenzar, todo el código está en un bucle que se ejecuta hasta que la parte superior de la pila sea inferior a cero:
Dentro del bucle ejecutamos el algoritmo divisible por siete:
Duplicar la parte superior de la pila.
Tome el mod 10 de la parte superior de la pila (último dígito)
Esto es un poco complicado, pero hace el resto del algoritmo. Podría explicarlo más tarde, pero no recuerdo completamente cómo funciona:
fuente
C, 56 bytes - 75% = 14
Aunque esto no da exactamente los mismos números que los casos de prueba, satisface el espíritu de la pregunta (y posiblemente más). Identifica correctamente múltiplos exactos de 7 y proporciona el resto exacto para otros números (ya que nunca usa números negativos).
No hay multiplicación o división en el algoritmo, solo suma y resta, y los dígitos se procesan en una sola pasada de izquierda a derecha. Funciona de la siguiente manera, comenzando con 0 en el acumulador:
El paso "multiplicar por tres" se escribe
n-=-n-n
para guardar un byte y evitar el operador de multiplicación.Cuando llegamos al final, no restamos sietes, por lo que el resultado estará en el rango de 0-24; si desea un módulo estricto (0-7), sustitúyalo
*c
por*c||n>6
enfor
condición de bucle.Califica para la bonificación mejorada, porque
Programa de prueba y resultados
Versión alternativa
Aquí hay uno que se repite (querrá habilitar las optimizaciones del compilador para realizar una transformación de cola o puede desbordar su pila; yo solía
gcc -std=c89 -O3
):Llámalo con '0' como segundo argumento.
Ambas versiones calculan el resto-módulo-siete de un número de 60,000 dígitos en menos de 50 milisegundos en mi máquina.
fuente
PHP, 50 bytes
usa salida alternativa; funciona hasta
PHP_INT_MAX
versión de cadena, funciona para cualquier número (positivo) (64 bytes):
fuente
Java, 133 bytes
Odio lo detallado que
Integer.parseInt
es. Sin golf:fuente