Estaba jugando con algunos números y encontré una secuencia que, por supuesto, está en OEIS. Es A005823 : Números cuya expansión ternaria no contiene 1's . Va:
a (2n) = 3 * a (n) +2
a (2n + 1) = 3 * a (n + 1)
a (1) = 0
a = 0,2,6,8,18,20,24,26,54 ....
Escribí un programa CJam que genera el primer n de estos números al convertir el índice a binario, reemplazando los 1 con 2 y convirtiendo de ternario a decimal.
También noté que se puede obtener cualquier número par tomando la suma de dos números en la secuencia (a veces el número consigo mismo).
El reto:
Dado cualquier número par no negativo como entrada, genera los índices de dos números en la secuencia que se suman. (Tenga en cuenta que a veces son posibles varios pares).
Las normas:
- Especifique si está usando indexación 0 o 1.
- Si sale como una cadena, coloque un delimitador entre los dos índices.
- Puede salir como un número complejo.
- Si lo desea, puede generar cada par válido.
- Code Golf: gana la respuesta más corta
Casos de prueba
Yo uso 0-indexación. Aquí enumero cada salida posible para cada entrada, pero solo necesita emitir una.
0: [0 0] 2: [1 0] 4: [1 1] 6: [2 0] 8: [2 1] [3 0] 10: [3 1] 12: [2 2] 14: [3 2] 16: [3 3] 18: [4 0] 30: [6 2] 32: [6 3] [7 2] 46: [7 5] 50: [7 6] 120: [10 10] 338: [19 18] 428: [30 23] [31 22] 712: [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1] 1016: [38 37] [39 36]Gracias a @Luis Mendo por la ayuda en casos de prueba.
Relacionado: ¿Está dentro del conjunto de Cantor?
fuente
Respuestas:
Casco ,
211413 bytes-7 bytes, gracias a la respuesta JS de @ Neil
-1 byte inspirado en la respuesta Parradoc de betaveros
Utiliza indexación 0
Pruébalo en línea!
Explicación
Solución anterior de 21 bytes
Primera vez que he visto un uso para
»
.Pruébalo en línea!
Más tiempo, ya que estaba lidiando con acarreos
fuente
JavaScript (ES6),
7571 bytesExplicación: Dividir la entrada y los elementos de A005823 por 2 no altera el problema, sin embargo, simplifica la solución ya que las representaciones ternarias ahora solo usan 0s y 1s y, por lo tanto, no hay que tener en cuenta. También guarda un paso al convertir del elemento a su índice (el ternario de cada elemento es el doble del binario de su índice). Ejemplos:
fuente
Gelatina ,
26, 22, 21 bytesPruébalo en línea!
¡Un byte guardado gracias a @JonathanAllan!
Explicación:
fuente
Œc
. Y sí, Dennis me explicó el problemaS=¥
.Python 2 , 51 bytes
Pruébalo en línea!
La tarea se puede hacer así:
Podemos dividir en (3) convirtiendo
0->0,1->1,2->1
para una lista y0->0,1->0,2->1
para la otra. Es decir, al verificar, el valor está por encima de un umbral de 0 o 1.Los dos valores se pueden encontrar mediante las respectivas funciones recursivas:
La función
f
combina los dos en una lista de comprensión. Esto lo hace ineficiente debido a la ramificación exponencial.Si se pudieran generar números complejos, podríamos guardar 10 bytes con:
fuente
J,
3532 bytesPruébalo en línea!
0 indexado y la entrada se da de forma monádica Devuelve todas las sumas posibles al valor (trata
a b
yb a
como diferentes sumas posibles).La conversión de una matriz booleana a índices requiere mucho código ...
También me gustaría eliminar el tenedor de la izquierda para no tener que usar tantos paréntesis y
@
-ats, pero no puedo encontrar una buena manera de hacerlo (mi enfoque alternativo no guarda ningún byte )Explicación
Para fines de explicación y desinterés, considere los siguientes componentes de la función principal
valid_nums produce una matriz booleana donde los índices son los índices de los valores de secuencia sumados. Si hay uno en esos índices, significa que los dos números suman el valor de entrada.
indices_of_ones es un lenguaje J para dar las coordenadas de los que están en una matriz booleana de rango arbitrario
La función principal se compone simplemente como
números_válidos
indices_de_ones
,
-ravel funciona en este caso uniendo cada fila a la siguiente.Podemos ver que si se tratara de una matriz booleana, las coordenadas de las mismas se pueden encontrar interpretando los índices de la matriz desordenada como números en la base de la forma de esa matriz utilizando tantas frases preposicionales como sea posible para ayudar a confundir al lector pobre .
fuente
MATL ,
22211917 bytesLa salida está basada en 1. El programa produce todos los pares de soluciones. Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Pyth , 37 bytes
0 indexado
Ciertamente no ha jugado golf tan bien como podría ser.
Pruébalo en línea!
fuente
hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU
. Definitivamente se puede jugar al golfhfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pyth , 29 bytes
Este devuelve todos los posibles pares de índices.
Pruébalo aquí
Pyth , 30 bytes
Pruébalo aquí
Esto devuelve los pares de índices como
[LowerIndex, HigherIndex]
.¿Como funciona esto?
fuente
Paradoc (v0.2.10), 11 bytes (CP-1252)
Pruébalo en línea!
Algorítmicamente es muy parecido a la respuesta ES6 de Neil . En un nivel inferior, también sorprendentemente similar a la respuesta de H.PWiz's Husk . Me divierte que podamos usar las tres sobrecargas de
B
.Toma un entero en la pila, deja una lista de dos enteros en la pila.
Explicación:
fuente
Pitón 3 ,
122120 bytes-2 bytes gracias al Sr. Xcoder!
0 indexado
Sin golf:
Pruébalo en línea!
fuente
Mathematica, 94 bytes
1 indexado
fuente
JavaScript,
120101 bytesPruébalo en línea!
0 indexado.
Devuelve el par de índices donde un índice es el más pequeño posible (por ejemplo, en el caso de
428
que devuelva22,31
).fuente
Cerebro-Flak ,
220166 bytes-54 bytes buscando la función de módulo en la wiki, permitiendo algunos cambios estructurales
Pruébalo en línea!
0 indexado.
Explicación
Al igual que muchas de las otras soluciones, esto calcula la expansión ternaria
n/2
y la convierte en dos números binarios.Paso 1: Divida la entrada por 2
Paso 2: calcular la expansión ternaria
Paso 3: Convertir a solución
fuente
JavaScript (ES6), 70
72bytes(Índice 0, y aparentemente casi la misma solución que @Neil, incluso si no hubiera visto su respuesta)
Comencé con recuperar el índice de un número usando el reverso del proceso: stringify con base 3, reemplazar cada
2
con1
, analizar con base 2.Para obtener dos números, y eso para cada par, solo tenemos la mitad de la entrada, pero ahora también
1
pueden aparecer dígitos. Por lo tanto, lo reemplazamos con a0
en el número uno y a2
en el otro número, lo que no cambia la suma de los dos, antes del paso de reemplazar y analizar. Esto es lo que se me ocurrió (haciendo los dos reemplazos,1
-> 0-o-2 y2
->1
en un solo paso):Por supuesto, los dos mapas de reemplazo (cadenas) difieren solo en un índice, por lo que deberíamos poder acortar el literal de la matriz solo reemplazando
1
y2
cond == 2 ? 1 : x
. Od-1 || x
. ¿Dónde-1
hace lo mismo que los dos operadores unarios, pero parecen más aterradores :-)Tratando de evitar la matriz literal y el paréntesis alrededor
n/2
, también se me ocurriópero no resultó fructífero.
fuente
["001","011"]
versión (bueno, mis nombres de variables eran diferentes).replace(/./g,d=>d>>1|x)
ahorra 2 bytes.d="0"
yx=1
- el dígito debería quedarse0
Pyth, 22 bytes
Pruébelo en línea: demostración
Explicación:
fuente