Los créditos para la idea del desafío van a @AndrewPiliser. Su propuesta original en la caja de arena fue abandonada y, dado que no ha estado activo aquí durante varios meses, he asumido el desafío.
El ternario equilibrado es un sistema de numeración no estándar. Es como ternario en que los dígitos aumentan en valor en un factor de 3 a medida que avanza hacia la izquierda, así100
es9
y1001
es 28.
Sin embargo, en lugar de tener valores de 0, 1 y 2, los dígitos tienen valores de -1, 0 y 1 . (Todavía puede usar esto para expresar cualquier número entero).
Para este desafío, el significado del dígito +1
se escribirá como +
, -1
se escribirá como -
y 0
es justo 0
. El ternario equilibrado no usa el -
símbolo delante de los números para negarlos como lo hacen otros sistemas de numeración; vea ejemplos.
Su tarea es escribir un programa completo que tome un entero con signo decimal de 32 bits como entrada y lo convierta en ternario equilibrado. No se permiten funciones de conversión de base incorporadas de ningún tipo (Mathematica probablemente tiene una ...). La entrada puede estar en entrada estándar, argumentos de línea de comandos, etc.
Los ceros a la izquierda pueden estar presentes en la entrada pero no en la salida, a menos que la entrada lo esté 0
, en cuyo caso la salida también debería estarlo 0
.
Ejemplos
Estas son conversiones de ternario balanceado a decimal; Tendrás que convertir a la inversa.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
fuente
Respuestas:
Python 2: 58 caracteres
Genera el ternario balanceado dígito por dígito desde el final. El último dígito se da por el residuo
n%3
ser-1
,0
o+1
. Luego eliminamos el último dígito y dividimos entre 3 usando la división de piso de Pythonn=(n+1)/3
. Luego, procedemos recursivamente con el nuevo último dígito hasta que el número sea 0.Se necesita un caso especial para que la entrada
0
dé en0
lugar de la cadena vacía.Las especificaciones no permiten esto, pero si uno pudiera escribir una función en lugar de un programa y generar la cadena vacía para 0, sería posible una solución de 40 caracteres.
fuente
n*"."and
en el caso de solo funciones. Tambiénprint s or 0
funciona mejor: Ps or 0
. Lo intentén*"."and
, pero falla cuandon<0
.CJam, 24 bytes
Se me ocurrió esto de forma independiente y creo que esta es, probablemente, la única forma de manejar esto.
Algorítmicamente, es similar a la respuesta de xnor.
Pruébalo en línea aquí
Cómo funciona :
fuente
JavaScript (E6) 68
Un programa completo, según lo solicitado, con E / S a través de una ventana emergente. El núcleo es la función R, 49 bytes.
No es muy diferente de las otras soluciones recursivas, supongo. Aprovechando la conversión automática entre cadena y número para evitar un caso especial para "0"
Pruebe en la consola FireFox / FireBug, utilizando solo la función R
Salida
fuente
d=(n%3+3)%3
cuando sed=n%3
produce el mismo valor parad
?Pyth,
712423Esta es una solución recursiva, basada en la función recursiva de 40 caracteres de @ xnor.
y
construye el ternario balanceado de la entrada, encontrando el último dígito usando el índice mod 3, y luego usa el hecho de que el resto de los dígitos son iguales al ternario balanceado para (n + 1) / 3, usando la división en pisos. Luego, llama a la función, devolviendo el resultado, o 0 si la entrada es 0.Pruébalo aquí.
fuente
Mathematica -
157154146128La versión de golf:
Y con sangría para legibilidad:
Uso:
Salida:
Muchas gracias a Martin Büttner por reducir el número de personajes.
fuente
Mathematica, 54 caracteres
Similar a la recursión de xnor
Símbolos Unicode se utilizan para reemplazar
Floor
,Part
,!=
Salida
Almacenado como
f
brevedad y escrito sin Unicode en caso de que no pueda verfuente
GNU sed, 236 bytes
Pruébalo en línea!
Explicación
La primera mitad del código (menos la primera línea) traduce decimal a unario y viene directamente de " Consejos para jugar golf en sed ". Luego traduce unario a ternario equilibrado un trit a la vez, lo que demostraré trabajando un ejemplo manualmente.
Antes de la salida final, los dígitos ternarios
-
,0
y+
están representados por!
,:
y+
, respectivamente.Para un resultado interesante, comenzamos con
-48
, que se ha convertido a unario (con el-
intacto). Para calcular el primer trit (más a la derecha), tenemos que calcular el resto de 48 ÷ 3. Podemos hacer esto reemplazando la111
s con3
s:48 ÷ 3 no tiene resto, por lo que no
1
quedan s, y sabemos que nuestro primer trit es:
(para 0), por lo que lo reemplazamos:Ahora tenemos nuestro "lugar de unos", por lo que sabemos que los
3
s restantes representan el lugar de tres. Para mantener las matemáticas funcionando, tenemos que dividirlas entre 3, es decir, reemplazarlas con1
s:Revisemos nuestras matemáticas: tenemos 16 (unario
1111111111111111
) en el lugar de tres y cero (:
) en el lugar de las unidades. Eso es 3✕16 + 1✕0 = 48. Hasta ahora todo bien.Ahora comenzamos de nuevo. Reemplace
111
s con3
s:Esta vez nuestro resto es
1
, así que colocamos+
el lugar de tres y reemplazamos los3
s restantes con1
s:Tiempo de comprobación de cordura: Tenemos un 5 (unario
11111
) en el lugar de los nueve, 1 (+
) en el lugar de los tres y 0 (:
) en el lugar de las unidades: 9✕5 + 3✕1 + 1✕0 = 48. ¡Genial! Nuevamente reemplazamos la111
s con3
s:Esta vez nuestro resto es 2 (
11
). Eso ocupa dos trits (+!
), lo que significa que tenemos un carry. Al igual que en la aritmética decimal, eso significa que tomamos el dígito más a la derecha y agregamos el resto a la columna a la izquierda. En nuestro sistema, eso significa que colocamos!
el lugar de los nueves y agregamos otros tres a su izquierda, luego reemplazamos todos los3
s con1
s para representar el lugar 27:Ahora no nos quedan 3s, por lo que podemos reemplazar los dígitos unarios restantes con sus trits correspondientes. Dos (
11
) es+!
:En el código real, esto se hace en dos pasos
s/1/+/
yy/1:/!0/
para guardar bytes. El segundo paso también reemplaza:
s con0
s, por lo que en realidad hace esto:Ahora verificamos si tenemos un número negativo. Lo hacemos, así que tenemos que deshacernos del signo y luego invertir cada trit:
Finalmente, reemplazamos
!
s con-
s:¡Eso es!
fuente
Stax , 17 bytes
Ejecutar y depurarlo
La respuesta más corta hasta ahora, pero debería ser fácilmente superada por algunos idiomas de golf. El algoritmo es el mismo que la respuesta Python de @ xnor.
ASCII equivalente:
fuente
JavaScript
108102 (ES6, sin llamadas recursivas)Entrada original en 108
No es tan elegante como la respuesta de @ edc65 ... Agradecería cualquier ayuda para reducir esto aún más ...
fuente
Clojure, 242 bytes
¿Es esta la respuesta Clojure más larga hasta ahora?
Sin golf (con comentarios):
fuente
8º ,
179171167 caracteresAquí es un programa completo en octavo que toma un entero con signo decimal como entrada y lo convierte en ternario equilibrado
Prueba
La primera vez que el programa solicita un número para convertir (según sea necesario). Entonces, es posible invocar la palabra
f
para convertir más números como en la siguiente línea:Salida
Explicación del código
Este es el código para el manejo de entrada. El núcleo del código está dentro de la palabra
f
. Lejos del campo de golf , habría usado la palabra en>bt
lugar def
. Aquí hay una versión sin golf def
(con comentarios):fuente
Java,
327269 caracteresMi primer intento en el golf de código. No conozco ninguno de esos lenguajes realmente cortos, así que aquí hay una solución en Java. Agradecería consejos para acortarlo aún más.
Pruébelo aquí: http://ideone.com/fxlBBb
EDITAR
Reemplazado
BufferedReader
porScanner
, lo que me permite eliminar lathrows
cláusula, pero tuve que cambiar la importación (+2 caracteres). SustituidoInteger
porint
. Por desgracia, el programa no se compila si no esString[] h
enmain
.fuente
Scanner
lugar de suBufferedReader
. Además,String[] h
ythrows java.lang.Exception
probablemente no sea necesario, y puede guardar algunos bytes más al usar enint
lugar deInteger
.JavaScript (ES6), 51 bytes
Recorrer los personajes. Primero multiplique el total anterior por 3, luego, si isNaN (carácter) es verdadero, convierta la cadena (carácter + "1") en un número y agréguelo, de lo contrario cero.
fuente
Stax , 14 bytes
Ejecutar y depurarlo
fuente
05AB1E , 20 bytes
Pruébalo en línea!
fuente
APL (NARS), 26 caracteres, 52 bytes
prueba:
posible, podría ser menos si se usa ⊥ pero está prohibido ...
fuente