Considere los dígitos de cualquier base integral por encima de uno, enumerados en orden. Subdivídalos exactamente por la mitad repetidamente hasta que cada trozo de dígitos tenga una longitud impar:
Base Digits Subdivided Digit Chunks
2 01 0 1
3 012 012
4 0123 0 1 2 3
5 01234 01234
6 012345 012 345
7 0123456 0123456
8 01234567 0 1 2 3 4 5 6 7
9 012345678 012345678
10 0123456789 01234 56789
11 0123456789A 0123456789A
12 0123456789AB 012 345 678 9AB
...
16 0123456789ABCDEF 0 1 2 3 4 5 6 7 8 9 A B C D E F
...
Ahora, para cualquier fila de esta tabla, lea los fragmentos de dígitos subdivididos como números en la base de esa fila y suméelos. Proporcione el resultado en base 10 para mayor comodidad.
Por ejemplo...
- para la base 3 solo hay un número para sumar: 012 3 = 12 3 = 5 10
- para la base 4 hay 4 números para sumar: 0 4 + 1 4 + 2 4 + 3 4 = 12 4 = 6 10
- base 6: 012 6 + 345 6 = 401 6 = 145 10
- base 11: 0123456789A 11 = 2853116705 10
Desafío
Escriba un programa que tome un entero mayor que uno como base y realice este procedimiento de subdivisión de la suma, generando la suma final en la base 10 . (Entonces, si la entrada es 3
la salida es 5
, si la entrada es 6
la salida es 145
, etc.)
Escriba una función que tome y devuelva un número entero (o una cadena ya que los números pueden ser bastante grandes) o use stdin / stdout para ingresar y generar los valores.
El código más corto en bytes gana.
Notas
- Puede usar cualquier función de conversión base incorporada o importada.
- No hay límite superior para el valor de entrada (además de un valor razonable
Int.Max
). Los valores de entrada no se detienen en 36 solo porque "Z" se detiene allí .
Respuestas:
CJam,
1715Funciona si hay una nueva línea final en la entrada.
Una versión más obvia para aquellos que no saben
x & -x
:Cómo funciona
fuente
x & -x
es realmente inteligente.Pitón,
8278¿Eh?
El número de grupos de dígitos que produce la subdivisión, G , es simplemente la mayor potencia de dos que divide el número de dígitos (es decir, la base), b . Está dado por G = b ^ (b & (b - 1)) , donde ^ es bitwise-XOR. Si estás familiarizado con el hecho de que n es una potencia de dos iff n & (n - 1) = 0, entonces debería ser bastante fácil ver por qué. De lo contrario, resuelva algunos casos (en binario) y quedará claro.
El número de dígitos por grupo, g , es simplemente b / G .
El primer grupo de dígitos, 012 ... (g-1) , como un número en la base b , es .
El siguiente grupo, g (g + 1) ... (2g-1) , como un número en la base b , es la suma .
Más generalmente, el grupo n -ésimo (basado en cero), como un número en la base b , a n , es.
Recuerde que hay grupos G , por lo tanto, la suma de todos los grupos es
lo que calcula el programa.
fuente
~
:b/G-i-1
puede serb/g+~i
y(G-1)*b/2
puede ser~-G*b/2
CJam (instantánea), 19 bytes
Tenga en cuenta que la última versión estable (0.6.2) tiene un error que puede hacer
mf
que se devuelvan enteros en lugar de largos. Paradójicamente, esto se puede eludir al convertir a entero (:i
).Para ejecutar esto con CJam 0.6.2 (por ejemplo, con el intérprete en línea ), debe usar el siguiente código:
Alternativamente, puede descargar y construir la última instantánea ejecutando los siguientes comandos:
Casos de prueba
Cómo funciona
fuente
Haskell,
746955ejemplos:
fuente
CJam, 41 bytes
Esta es básicamente la solución de Ell en CJam:
Pruébalo en línea aquí
Mi presentación original:
No funciona correctamente para la base 11 y superior
Intentaré ver si puedo hacer que funcione para la base 11 y superior, sin aumentar mucho el tamaño.
fuente
Mathematica, 114 bytes (o 72 bytes)
Hm, esto se hizo más largo de lo que pensaba:
Y sin golfos:
Alternativamente, si solo porto la ingeniosa fórmula de Ell, son 72 bytes:
fuente
J - 22 char
Función que toma un solo argumento (llámelo
y
para los propósitos de este golf) a la derechaPrimero usamos
1&q:
para obtener el número de veces quey
es divisible por 2, y luego dividimos-y
por 2 tantas veces. Esto nos da el negativo del ancho en el que necesitamos dividir las cosas, lo cual es perfecto, porque]\
tomará piezas superpuestas si el argumento es positivo, y no se superpondrá si es negativo.Entonces dividimos
i.y
—los enteros de 0y-1
a— en vectores de estos anchos, y los usamos#.
para convertirlos de basey
a base 10. Finalmente,+/
sumamos y terminamos.Ejemplos: (la entrada en J REPL está sangrada, la salida queda al ras)
fuente
JavaScript
9989 byteso
La segunda función es similar a la de Ell. El primero utiliza un enfoque más tradicional. Ambos tienen 89 caracteres de tamaño.
Pruebe aquí: http://jsfiddle.net/wndv1zz8/1/
fuente
Jalea ,
109 bytesPruébalo en línea!
Esencialmente solo una traducción de la respuesta CJam de jimmy23013, excepto el uso
n & -n
directo como el número de fragmentos para dividir.(El
ð
no tiene nada que ver con el mapeo:ḅ
simplemente vectoriza sobre su argumento izquierdo, yð
está ahí para separarseḅS
como una nueva cadena diádica que toma el resultadoḶœsÇ
como argumento izquierdo y el argumento del enlace principal como argumento derecho).fuente