Reto:
Cree un programa que acepte un entero positivo y verifique si se puede escribir en forma de (3 ^ x) -1, donde X es otro entero positivo .
Si puede, salida X
Si no puede, envíe -1 o una declaración falsa .
Ejemplo de entradas / salidas
Entrada:
2
Se puede escribir como (3 ^ 1) - 1, por lo que sacamos x, que es 1
Salida:
1
Entrada:
26
26 se puede escribir como (3 ^ 3) - 1, por lo que sacamos x (3)
Salida:
3
Entrada:
1024
1024 no se puede escribir en forma de (3 ^ x) - 1, por lo que sacamos -1
Salida:
-1
Este es el código de golf, por lo que gana la menor cantidad de bytes
OEIS relacionados: A024023
3^0-1
una salida válida y, por lo tanto, no se podría usar como falso,log()
en su respuesta debe confirmar que da la respuesta correcta5
cuando se ingresa242
.Respuestas:
Mathematica,
2116 bytesHace uso de la computación simbólica de Mathematica. Si
#+1
es una potencia de tresLog[3,#+1]
, calculará un resultado entero que es un valor atómico. De lo contrario, nos pondremosLog[#+1]/Log[3]
como están. Como este no es un valor atómico, es una expresión que siempre tiene la formahead[val1,val2,...]
. En este caso, en realidad es algo asíTimes[Power[Log[3], -1], Log[#+1]]
.Distinguimos entre los dos casos aplicando otra función al resultado. Lo que aplica realmente es que reemplaza la
head
parte de una expresión. Como los resultados enteros son atómicos, aplicarles cualquier función no hace nada. En particularf @@ atom == atom
.Sin embargo, en el otro caso, la cabeza se reemplaza. La función que estamos utilizando es
-1&
una función simple que ignora sus argumentos y devuelve-1
. Entonces obtenemos algo-1&[Power[Log[3], -1], Log[#+1]]
en casos no enteros, que se evalúa directamente en-1
. Carcasa especial a través de la magia.fuente
Python,
4644 bytesPruébalo en línea!
En este caso,
0
sería el valor falso. Gracias a @ mbomb007 por señalar mi salida incorrecta, así como a 2 bytes sin[]
ahorro.fuente
[n for n in range(x)if 3**n-1==x]
-4 bytes, lista vacía como falsoHaskell, 35 bytes
Ejemplo de uso:
f 26
->3
.fuente
05AB1E , 7 bytes
Pruébalo en línea!
Explicación
fuente
<3zm©.ïi®
es lo más cerca que no estoy usando rangos como lo hizo.3DÝms<k
... No importa ... No puedo afeitarme un byte más, podría haber jurado que podría.Jalea , 5 bytes
Salidas x o 0 (Falsy).
Pruébalo en línea!
Cómo funciona
fuente
Python 2, 41 bytes
Una función recursiva que devuelve
0
entradas no coincidentes. Repetidamente el piso divide la entrada por 3, contando el número de pasosi
, que se emite al final. Pero, si algún paso produce un valorn
que no es 2 módulo 0, el número no era para3^i-1
, por lo que la salida se multiplica por 0.fuente
Perl, 31 bytes
Requiere
-E
bandera para correr:Explicaciones:
grep{3**$_-1==$i}0..($i=<>)
devuelve una lista de los elementos del rango0..$_
(es decir, de 0 a la entrada) que satisface la prueba3**$_-1==$i
. Solo un elemento como máximo puede satisfacer esta prueba, por lo que esta instrucción devolverá una matriz de 0 o 1 elemento. Luego imprimimos esta lista: ya sea elX
o nada (lo cual es falso).fuente
Pyth, 11 bytes
Convierte a base 3 y comprueba la igualdad a
[2, 2, ..., 2]
.fuente
?-2JjQ3ZlJ
, puesto<col> <num>
y<num> <col>
son intercambiables para-
en Pyth.JavaScript (ES7),
383634 bytesO solo
3029 bytes si está bien salir con un error en caso de error:Prueba
Mostrar fragmento de código
fuente
Java 8,
375867 bytesEste lambda encaja en una
Function<Integer, Integer>
referencia y utiliza el sencillo truco de base 3.Esta vez debería funcionar correctamente.
fuente
i->
. Además, si lo tomai
como unLong
, puede usarloa.toString(...)
(ides dará algunas advertencias sobre el uso incorrecto de las funciones estáticas, pero debe compilarse). Sin embargo, como dijo OP, debe devolver el valor, no solo Verdadero o Falso.Procesamiento,
6056 bytesSalidas
-1
si es falso.Explicación
void
es 1 byte más corto que el usofloat
, por eso esta función genera directamente en lugar de devolver un valor.Solución alternativa
para 63 bytes, pero creo que este alt puede ser más corto que la solución original. Estoy trabajando en ello.
fuente
0
ahora?0
nunca lo es en Java / Processing, que yo sepa.Brachylog , 8 bytes
Pruébalo en línea!
Emite el valor si es verdadero y
false.
si esto es imposible.Explicación
Esta es una transcripción directa de la relación dada:
fuente
+~^r~:3
, pero desafortunadamente~:
no hace lo que podría esperar (probablemente porque:
es una sintaxis en lugar de una incorporada), y parece ser tratado de manera idéntica:
.:
es un símbolo de control y~
solo funciona en predicados.Perl 6 ,
2524 bytesIntentalo
Eliminar el espacio después de los
**
trabajos porque es más largo que el otro operador infijo que podría coincidir*
.Entonces
…***…
se analiza como en… ** * …
lugar de… * ** …
.Intentalo
Expandido:
fuente
R, 24 bytes
¡Un enfoque diferente de la respuesta de plannapus , y un byte más corto!
Genera todos los enteros de
3^1-1
a3^99-1
y comprueba si stdin coincide. Si es así, devuelve el índice en el que coincide, que esx
. Si no, devuelveNA
como valor falso.Por cierto, aceptará múltiples valores como entrada y los probará a todos, lo cual es una característica interesante.
fuente
Prólogo, 20 bytes
Este lenguaje es genial como el infierno.
fuente
05AB1E , 9 bytes
Pruébalo en línea!
Imprime -1 para falsedad.
fuente
MATL , 8 bytes
Esto genera el número
x
si existe, o no genera nada, lo cual es falso.Pruébalo en línea!
Explicación
fuente
Japt , 11 bytes
Probarlo aquí .
¡Muchas gracias a ETHproductions por ayudar!
fuente
Python 3,
746664 bytes-10 bytes gracias a @ mbomb007, @FlipTack y @ nmjcman101
fuente
from math import*
. Tambiénreturn n==3**x-1and x
.STDOUT
, por lo que puede cambiar ese retorno a una impresión.import math
ymath.ceil
para un solo byte. También puede recurrir3**x-1==n and x
ax*(3**x-1==n)
Rubí, 30 bytes.
Devuelve
nil
(un valor falso) si no se encontró ningún número. [Pruébalo en línea]fuente
C, 56 bytes
agregue uno a la entrada y luego divida repetidamente por tres hasta que encuentre un resto, si se alcanza el uno, devuelva el recuento de divisiones más -1
fuente
a%3<1
lugar de!(a%3)
. Uno más con0
falso.a=--a?-1:n;
ahorrará 5 bytes. Si una función no nula no tiene retorno, solo usará la última asignación. También lo que dijo @Titus.a%3?0:(a/=3)
lugar de!(a%3)&&(a/=3)
Utilidades Bash / Unix,
3735 bytesPruébalo en línea!
Utiliza dc para convertir a base 3, comprueba que la cadena resultante es todo 2s, cuenta el número de caracteres (incluida una nueva línea) y luego usa bc para restar 1.
Si el número en la base 3 no es todo 2, entonces grep no genera nada (ni siquiera una nueva línea), por lo que el recuento de caracteres es 0, y restando 1 produce -1.
fuente
C compilado con Clang 3.8.1,
53,52,54, 51 Bytes@SteadyBox ya publicó una solución en C, pero estoy usando un enfoque diferente.
@ Gracias a Jasen por ayudar a guardar bytes.
fuente
log
vuelve,double
así que tal vez podría funcionar.C, 42 bytes, optimizado de Wade Tyler
Tratar
C, 37 bytes, sin
return
Tratar
n
es global pero(I)MUL
solo puede tener su operando de destino en un registro, por lo que debe ponerlo enEAX
(la opción habitual) y moverlo allíJavaScript 6, 32 bytes
Si la "falsedad" necesita ser la misma, 33 Bytes:
fuente
Pyt ,
109 bytesExplicación:
Guardado un byte utilizando la función de incremento en lugar de agregar explícitamente 1
fuente
Python, 64 bytes
Salidas
False
si el número no se puede escribir en ese formato.Esto también funciona en 64 bytes e imprime una cadena vacía como salida falsa:
Una solución creativa para 65 bytes,
0
que genera falsa:fuente
x
ni-1
.x
lugar den
en caso de una coincidencia.Pyth, 10 bytes
Pruébalo aquí!
fuente
Julia, 30 bytes
Es una función simple: crea un vector que tiene un
true
solo en la posición correspondiente en3^a-1
, dondea
es un vector que contiene enteros entre 0 yn
. Encuentra la "primera" posición que estrue
y resta 1 (si es todofalse
, el hallazgo se evalúa a cero y devuelve -1).Como lo
0:n
ha hecho0
en el primer punto, la resta 1 corrige la indexación y también permite la-1
respuesta falsa.fuente
Pyke,
96 bytesPruébalo aquí!
Versión antigua de 9 bytes:
Pruébalo aquí!
fuente
Pyth 8 bytes
Intenta aquí
fuente