Se puede obtener cualquier número entero positivo comenzando con 1 y aplicando una secuencia de operaciones, cada una de las cuales es "multiplicar por 3" o "dividir por 2, descartando cualquier resto" .
Ejemplos (escribir f para * 3 yg para / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Escribe un programa con el siguiente comportamiento:
Entrada : cualquier número entero positivo, vía stdin o codificado. (Si está codificado, el número de entrada se excluirá de la longitud del programa).
Salida : una cadena de f y g tal que <input> = 1 <string>
(como en los ejemplos). Tal cadena en orden inverso también es aceptable. NB: La salida contiene solo f's y g's, o está vacía.
El ganador es la entrada con la menor cantidad de bytes de programa más salida cuando 41 es la entrada.
fuente
x mod 3
: six=3y
construye y y luego aplicaf
; six=3y+1
construye2y+1
y aplicaf
entoncesg
; six=3y+2
entonces se complica pero esencialmente es recursivo.Respuestas:
GolfScript, puntaje 64 (43-2 + 23)
(41 está codificado, por lo tanto, -2 caracteres para la puntuación). La salida es
que tiene 23 caracteres (sin nueva línea). Por construcción, el código garantiza que siempre devuelve (una de) las representaciones más cortas.
fuente
"1 "
no se debe incluir en la salida.Nos estamos ensuciando, amigos!
JAVA
210 207199 caracteresno golfizado:
salida: dependiendo de la fe de los antiguos dioses, la más corta que tuve fue 30. Tenga en cuenta que la salida debe leerse desde la derecha.
234
108
editar 45
puntos :
318199 + 30 = 229edit1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bene si usa Java 6 y no Java 7 mientras juega golf, puede usar
Estructura de 39 caracteres en lugar de una estructura estándar que tiene 53 caracteres de longitud.
fuente
(2*i+1)%3==0
es equivalente ai%3==1
if(X){A}else{if(Y){B}else{C}}
es más largo queif(X){A}else if(Y){B}else{C}
. También puede reemplazar sus==
condiciones con<
condiciones más cortas .Python, puntaje 124 (90-2 + 36)
90 caracteres de código (líneas nuevas como 1 cada uno) - 2 para el número de entrada codificado + 36 caracteres de salida
Salida:
fuente
m=f=0
, puede hacer el bucle externowhile(n!=x)*(m!=x)
y eliminar los descansos. Lo lleva a 95 caracteres de código.n
por3**f
.print'f'*f+'g'*g
, lo que daría un puntaje de 90-2 + 36 = 124.Python, puntaje 121 (87 - 2 + 36)
fuente
l,n,f=len(t),1,0
y eliminara la'1',
declaración impresa, su puntaje sería 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
da la misma cantidad de caracteres, ¿verdad? (Para cada variable, una=
y una nueva línea se reemplaza con dos,
s.)Perl, puntaje 89 (63 - 2 + 28)
Conjetura: si el enfoque ingenuo descrito en mi solución original a continuación llega a un ciclo, ese ciclo será [21, 7, 15, 5, 10, 21, ...] . Como no hay contraejemplos para 1 ≤ n ≤ 10 6 , parece probable que esto sea cierto. Para probar esto, sería suficiente demostrar que este es el único ciclo que puede existir, lo que puedo hacer o no en un momento posterior.
La solución anterior evita el ciclo inmediatamente, en lugar de adivinar (erróneamente) y evitarlo la segunda vez.
Salida (28 bytes):
Perl, puntaje 100 (69 - 2 + 33)
Usando un enfoque de adivinar y verificar. La cadena se construye utilizando operaciones inversas (convirtiendo el valor a 1 , en lugar de al revés), y la cadena se refleja en consecuencia, lo que está permitido por la especificación del problema.
Siempre que se encuentre un no múltiplo de tres, se multiplicará por dos, agregando uno si el resultado sería un múltiplo de tres. Cuando se encuentra un múltiplo de tres, se dividirá entre tres ... a menos que este valor se haya encontrado previamente, lo que indica un ciclo, por lo tanto, adivina y verifica.
Salida (33 bytes):
fuente
J, puntaje 103 (82-2 + 23)
* Nota: nombré mis verbos
f
yg
, para no confundirme con cadenas de salidaf
yg
.Codificado duro:
Funciones generales:
Eliminó la operación en bloques de números binarios, que fue el cambio más importante en cuanto a la compactación
g
. Cambié el nombre de las variables y eliminé algunos espacios en blanco por el gusto de hacerlo, pero todo sigue siendo funcionalmente igual. (Uso:g 41
)J, puntaje 197 (174 + 23)
Salida:
ffffffffggggggggfgffggg
f
convierte una lista de booleanos en números, usando 0s como*3
y 1s como/2
(yfloor
).#:i.2^i
crea una matriz de rango 2 que contiene todas las matrices booleanas de rango 1 de longitudi
.fuente