Su desafío, si elige aceptarlo, es crear una función o un programa que arroje "sí" si un número dado es divisible por 13 y arroje "no" si no lo es.
Reglas:
- No puedes usar el número 13 en ningún lado.
- Tampoco hay sinónimos de eliminación para 13 (como usar 15-2).
- Se otorgarán puntos de bonificación por no usar el módulo, bonificación adicional por no usar la división.
Puntaje:
- Su puntaje será el número de bytes en su código (espacio en blanco no incluido) multiplicado por su bono.
- Si no usaste el módulo, ese bono es 0.90; si no usaste división, ese bono es 0.90.
- Si tampoco usaste, ese bono es 0.80.
- Cuanto más bajo sea tu puntaje, mejor.
La entrada siempre será un número entero mayor que 0 y menor que 2 ^ 32.
Su salida debe ser un simple "sí" o "no".
Aclaraciones:
- Es aceptable usar algún método indirecto para generar el número 13 para su uso. Los sinónimos aritméticos simples como (10 + 3) no están permitidos.
- La función o el programa debe literalmente generar "sí" o "no" para si el número dado es divisible por 13.
- Como siempre, se recomiendan soluciones inteligentes, pero no son necesarias.
fuente
function f(n){return "yes"}
. Esto devolverá 'sí' para todos los números que se pueden dividir por 13Using some roundabout method of generating the number 13 for use is acceptable.
¿Cómo se determina qué es "lo suficientemente indirecto"?Respuestas:
Java (puntaje
60.859.2)Puntuación: (76 - 2 espacios en blanco) caracteres * 0.8 = 59.2
fuente
println
->print
?ASM: 16 bits x86 en el shell de comandos de WinXP
ejecutable - 55 bytes * 0.8 = 44
fuente - 288 caracteres * 0.8 = 230.4
El número 13 ni siquiera aparece en el archivo .com ensamblado.
Montar usando A86.
fuente
The input will always be an integer greater than 0 and less than 2^32
. No puedes usar 16 bitsPython 3.x: 54 * 0.8 = 43.2
Puede ser una evasión tener una cadena de longitud 13, pero aquí va:
Funciona construyendo una cadena de n espacios (la elección del delimitador es arbitraria, pero elegí el espacio por razones obvias) y separando las subcadenas de 13 espacios hasta que quede una cadena que contenga n% 13 espacios.
fuente
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
con' '*6+' '
al ahorro 5 caracteres - pero luego me encontré que los espacios no contaban para nada ...GolfScript, 32 caracteres
Quería probar algo diferente de los demás, por lo que mi solución calcula la raíz digital de base 14 del número, convirtiendo repetidamente el número en base 14 y sumando los dígitos hasta que el resultado ya no sea más pequeño. Esto es esencialmente lo mismo que calcular el resto del módulo 13, excepto que el resultado estará en el rango de 1 a 13 en lugar de 0 a 12.
Dado que verificar si la raíz digital es igual a 13 sería difícil sin usar el número 13 en sí (o alguna solución poco convincente como 12 + 1), lo que realmente hago es incrementar el número de entrada en uno antes del ciclo y disminuir el resultado después. De esa manera, el resultado para números divisibles por 13 será de hecho cero, lo cual es mucho más fácil de verificar.
Aquí hay una versión comentada del programa:
Este programa realmente manejará cualquier entrada entera no negativa, ya que GolfScript usa aritmética bignum. Por supuesto, las entradas extremadamente grandes pueden consumir demasiado tiempo y / o memoria.
El código no utiliza módulos ni divisiones directamente, aunque sí utiliza el operador de conversión de base de GolfScipt, que casi con seguridad hace algunas divisiones y toma de residuos internamente. Dejaré que GigaWatt decida si esto me califica para el bono o no.
fuente
C, 68 * 0.8 = 54.4
Después de 24 respuestas, a nadie se le ocurrió este algoritmo obvio todavía:
fuente
JavaScript (27.9)
Versión actual (31 caracteres * 0.90 bonus = 27.9).
Demostración: http://jsfiddle.net/9GQ9m/2/
Edición 1: renunciar a la segunda bonificación mediante el uso de módulo para reducir la puntuación considerablemente y evitar el
for
bucle También elimine~~
y guarde dos caracteres (gracias@copy
).Versión anterior (48 caracteres * 0.80 bonus = 38.4)
fuente
~~
supuesto de entrada válida; de lo contrarioprompt()<<1
funcionará también.BrainFuck
Puntuación: 200 * 0.8 = 160
Lee de stdin. Probablemente no sea la solución más inteligente, pero obtener algo que funcione en BF es bueno. Sin embargo, es bastante compacto.
fuente
Scala (38 * 0.9 = 34.2)
Similar a
0xD
(hex) o015
(oct).El valor ASCII de
CR
es 13.fuente
Haskell, 28 * 0.8 = 22.4
fuente
Pitón:
P.ej
da
fuente
20
)f=lambda n:pow(8,n,79)-1 and "no" or "yes"
lo arregla, 43 * 0.8 = 34.4C, 54,4 == 68 * .8
80 * .8fuente
\r
: pensé que solo es bueno para el soporte de Windows. Pero ¿por quéc>0
cuándoc
lo haría?>0
no es bueno. Pero en lugar de notar que su función no los admite, pensé que==
era bueno.ECMAScript 6, 25 × 0.9 = 22.5
Sí, es una forma aburrida de obtener 13.
fuente
APL ((21 - 1) × 0.8 = 16)
⎕IO
debe establecerse en 0 para que esto funcione correctamente en Dyalog APL. Para generar 13, tomamos el piso (⌊
) del logaritmo natural (⍟
) de 9 a la potencia de 6 (9*6
). Después de eso, encontramos el MCD (∨
) de nuestra entrada (⎕
) y 13, y luego probamos si eso es igual a 1. Esto se usa para indexar ([...]
) el vector de respuestas.Si alguien quiere ser pedante acerca de la mención de bytes en la especificación de puntuación, la puntuación para la versión codificada UTF-8 es
(29 - 1) × 0.8 = 22.4
. :)fuente
C, 88
Truco de Fibonacci.
fuente
Perl - 44 × 0.8 = 35.2
Contando el shebang como un byte.
Llegué un poco tarde al juego, pero pensé en compartir el algoritmo, ya que ninguna otra publicación hasta el momento lo ha utilizado.
Esto funciona bajo la observación de que si n es divisible por 13 , entonces ⌊ n / 10 ⌋ + n% 10 * 4 también es divisible por 13 . Los valores 13 , 26 y 39 se ciclan sobre sí mismos. Todos los otros múltiplos de 13 , finalmente, llegará a uno de estos valores en no más de log 10 n iteraciones.
En otras bases
Es cierto que
chop
es una especie de evasión. Con una representación de base 10, es equivalente adivmod
. Pero el algoritmo funciona perfectamente bien en otras bases, por ejemplo, la base 4 u 8.Seudocódigo de estilo Python del algoritmo anterior (base 10):
En la base 2:
En la base 4:
En la base 8:
etc. Cualquier base menor de 13 funciona igual de bien.
fuente
Javascript: 59 * 0.8 = 47.2 (?)
violín :
Incluyendo la mejora de mellamokb (57 * 0.8 = 45.6):
fuente
return n-c?'no':'yes'
y omitiendo el segundo punto y coma.prompt
como entrada yalert
salida, lo que hace que el programa sea interactivo y ahorre algunos caracteres.Perl: (51-4 espacios) * 0.9 = 42.3
fuente
Perl (19.8)
21 bytes * .9
nota: mi primer programa Perl. Débilmente escrito es bueno para el golf, supongo.
fuente
en C (K&R): 47 * 0.8 = 37.6
EDITAR1: está bien, eliminó todas las dependencias de las funciones externas, ¡lo anterior funcionará siempre que coloque esta línea en la línea 13 del archivo! :) Si
__LINE__
está bien ser reemplazado por decir,0xd
entonces puede guardar otros 5 caracteres (puntuación: 33.6)fuente
J - 22.4 = 28 * 0.8
Residencia en el inteligente método cíclico de mxmul .
Ejemplos:
fuente
JavaScript (108 menos 0 para espacios en blanco) => 108, x 0.8 (sin módulo, sin división) = 86.4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Este método utiliza el siguiente algoritmo: 1. Tome el último dígito, multiplíquelo por cuatro, agréguelo al resto del número truncado. 2. Repita el paso 1 para 99 iteraciones ... 3. Pruébelo una vez más usando el paso 1, si el número resultante es él mismo, ha encontrado un múltiplo de 13.
Actualización anterior, eliminada
var
lógica e inversa en la alerta para eliminar más caracteres mediante el uso de condicional de resta-falso.Técnicamente, el resultado final es que eventualmente alcanzará un número de dos dígitos como 13, 26 o 39, que cuando se ejecute nuevamente en el paso 1 dará 13, 26 o 39 respectivamente. Entonces, probar que la iteración 100 sea la misma confirmará la divisibilidad.
fuente
Cheddar, 20 bytes (sin competencia)
El puntaje es 20 * 0.9 = 18
Una respuesta directa.
fuente
Lisp común (71 bytes * 0.8) = 56.8
Recurrencia simple, de verdad.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Sin golf:
fuente
Rubí (
5048 * 0.9 = 43.2)Forma inteligente de usar
eval
fuente
D 56 caracteres .80 bonus = 44.8
Esto podría haber sido una evasión con el uso de 1/13 y un doble puede almacenar cualquier número de 32 bits exactamente
editar: esto funciona multiplicando con 1/13 y verificando la parte fraccionaria si es diferente de 0 (permitiendo errores de redondeo) o, en otras palabras, verificando la parte fraccionaria de i / 13
fuente
Python 2.7
(20-1 espacio en blanco) * 0.9 (sin división) = 17.1
sí / no en lugar de verdadero / falso: 31 * 0.9 (sin división) = 27.9
aprovecha Python
int
para convertir otras bases de cadenas en enteros de base 10. puedes ver en ambas versiones que usan una base diferente (pero con la misma longitud de caracteres)editar: 1 char guardar en versión sí / no
edit2: ¡otros 2 caracteres afeitados!
edit3: gracias de nuevo a los comentarios! incluso más caracteres eliminados mediante el uso de representaciones octales incorporadas de Python (
015
==13
...) en lugar de la traducción base de intfuente
print['no','yes'][input()%int('d',14)==0
14-1
o26/2
. Acabo de tomarme la libertad creativa para representar a 13Perl, 95 * 0.8 = 76
Los saltos de línea se agregaron para mayor claridad. Probablemente podría haber hecho esta respuesta mucho más corta, pero siento que esta respuesta representa una forma única de abordar el problema.
fuente
Python - puntaje 27.9
(31 caracteres * 0.90) : renuncia a alguna bonificación por código más corto.
versión anterior: (47 caracteres * 0.80) - estafa completa de la respuesta Javascript de mellamokb, pero en Python.
versión anterior: (60 caracteres * 0.80)
versión anterior: (105 caracteres * 0.80)
fuente
(1,10,9,12,3,4)
salvaría 1 personaje pero no se resolvería a un valor menor que 13.En Q:
fuente
Gramática lineal derecha - ∞ puntos
Luego, dependiendo de cómo elija 'ejecutarlo', generará 'sí' o 'no'.
No es una entrada seria, solo un poco de diversión;)
EDITAR: Tal vez debería explicar un poco.
Una gramática es un conjunto de reglas (producciones) que definen un lenguaje . Un lenguaje puede considerarse como todas las cadenas posibles formadas por un alfabeto, que se ajustan a las reglas de su gramática.
Aquí el alfabeto es el conjunto de todos los dígitos decimales. Las reglas de la gramática son que todas las cadenas deben formar enteros decimales que sean divisibles por 13.
Podemos usar la gramática anterior para probar si una cadena pertenece a nuestro idioma.
Las reglas de la gramática contienen símbolos terminales (que son elementos en el lenguaje), así como símbolos no terminales que se reemplazan recursivamente.
Es más fácil explicar lo que está sucediendo con un ejemplo:
Digamos, por ejemplo, que la cadena que estamos probando es 71955.
Siempre hay un símbolo de inicio (que no es terminal), en el caso de la gramática anterior es 'S'. En este punto no hemos leído ningún carácter de nuestra cadena:
Ahora, leemos el primer símbolo en nuestra cadena que es '7', luego buscamos una regla en la gramática que tenga cualquiera de los no terminales en nuestro patrón actual en el lado izquierdo del '->' y que tiene nuestro símbolo en el lado derecho de '->'. Afortunadamente, hay uno (S-> 7G), por lo que reemplazamos los símbolos no terminales en nuestro patrón actual con el lado derecho de la nueva regla:
Ahora tenemos la 'G' no terminal en nuestro patrón, y el siguiente símbolo a leer es '1', así que buscamos una regla en nuestra gramática que comience con 'G-> 1 ". Encontramos que hay una (G-> 1F), por lo que reemplazamos el no terminal con el RHS de nuestra nueva regla:
Sigue repitiendo este proceso:
Siguiente regla: F-> 9D
Siguiente regla: D-> 5F
Siguiente regla: F-> 5S
En este punto no tenemos más símbolos en nuestra cadena, pero tenemos otro símbolo no terminal allí. Vemos de la primera regla en la gramática que podemos reemplazar 'S' con la cadena vacía (ε): S-> ε
Hacerlo nos da el patrón actual: 71955ε, que es el equivalente a 71955.
Hemos leído todos los símbolos en nuestra cadena, y el patrón no contiene símbolos no terminales. Lo que significa que la cadena pertenece al idioma y, por lo tanto, 71955 es de hecho divisible por 13.
Es decir, el objetivo es tener patrón = cadena. Si le quedan símbolos no terminales, después de leer todos los símbolos en su cadena, la cadena no pertenece al idioma. Del mismo modo, si todavía tiene más símbolos en su cadena para leer, pero no hay reglas en la gramática que le permitan avanzar, entonces la cadena no pertenece al idioma.
fuente