Desafio:
Crie um programa que aceite um número inteiro positivo e verifique se ele pode ser gravado na forma de (3 ^ x) -1, onde X é outro número inteiro positivo .
Se puder, produza X
Se não puder, imprima -1 ou uma declaração falsa .
Exemplo de entradas / saídas
Entrada:
2
Como pode ser escrito como (3 ^ 1) - 1, produzimos x que é 1
Saída:
1
Entrada:
26
26 pode ser escrito como (3 ^ 3) - 1, então produzimos x (3)
Saída:
3
Entrada:
1024
1024 não pode ser escrito na forma de (3 ^ x) - 1, então produzimos -1
Saída:
-1
Isso é código-golfe, portanto, menos quantidade de bytes ganha
OEIS relacionado: A024023
3^0-1
uma saída válida e, portanto, não utilizável como falsa,log()
sua resposta deve confirmar que ela fornece a resposta correta5
quando242
é inserida.Respostas:
Mathematica,
2116 bytesFaz uso da computação simbólica do Mathematica. Se
#+1
for uma potência de três,Log[3,#+1]
calculará um resultado inteiro que é um valor atômico. Caso contrário, teremos oLog[#+1]/Log[3]
que é. Como esse não é um valor atômico, é uma expressão sempre da formahead[val1,val2,...]
. Neste caso, é realmente algo parecidoTimes[Power[Log[3], -1], Log[#+1]]
.Distinguimos entre os dois casos, aplicando outra função ao resultado. O que a aplicação realmente faz é que ela substitua a
head
parte de uma expressão. Como os resultados inteiros são atômicos, a aplicação de qualquer função a eles não faz nada. Em particularf @@ atom == atom
.No entanto, no outro caso, a cabeça é substituída. A função que estamos usando é
-1&
uma função simples que ignora seus argumentos e retornos-1
. Então, obtemos algo-1&[Power[Log[3], -1], Log[#+1]]
em casos não inteiros, que são avaliados diretamente para-1
. Invólucro especial via mágica.fonte
Python,
4644 bytesExperimente online!
Nesse caso,
0
seria o valor falso. Obrigado a @ mbomb007 por apontar minha saída incorreta, bem como 2 bytes sem[]
economia.fonte
[n for n in range(x)if 3**n-1==x]
para -4 bytes, lista vazia como FalsasHaskell, 35 bytes
Exemplo de uso:
f 26
->3
.fonte
05AB1E , 7 bytes
Experimente online!
Explicação
fonte
<3zm©.ïi®
é o mais próximo que eu não tenho usando intervalos como ele fez.3DÝms<k
... deixa pra lá ... Não posso raspar mais um byte, poderia jurar que eu poderia.Gelatina , 5 bytes
Saídas x ou 0 (falsy).
Experimente online!
Como funciona
fonte
Python 2, 41 bytes
Uma função recursiva que retorna
0
para entradas não correspondentes. Divide a entrada repetidamente no piso por 3, contando o número de etapas emi
que é gerado no final. Mas, se qualquer etapa produzir um valorn
que não seja 2 módulo 0, o número não será de3^i-1
, portanto, a saída será multiplicada por 0.fonte
Perl, 31 bytes
Requer
-E
sinalizador para executar:Explicações:
grep{3**$_-1==$i}0..($i=<>)
retorna uma lista dos elementos do intervalo0..$_
(ou seja, de 0 à entrada) que satisfazem o teste3**$_-1==$i
. Somente um elemento, no máximo, pode satisfazer esse teste; portanto, esta instrução retornará uma matriz de 0 ou 1 elemento. Em seguida, imprimimos esta lista: ou theX
ou nothing (o que é falso).fonte
Pitão, 11 bytes
Converte na base 3 e verifica a igualdade em
[2, 2, ..., 2]
.fonte
?-2JjQ3ZlJ
, uma vez<col> <num>
e<num> <col>
são intercambiáveis para-
em Pyth.JavaScript (ES7),
383634 bytesOu apenas
3029 bytes, se estiver OK sair com um erro na falha:Teste
Mostrar snippet de código
fonte
Java 8,
375867 bytesEste lambda se encaixa em uma
Function<Integer, Integer>
referência e usa o truque simples da base 3.Desta vez, ele deve funcionar corretamente.
fonte
i->
. Além disso, se você usari
como aLong
, poderá usá-loa.toString(...)
(o ides fornecerá alguns avisos sobre o uso incorreto de funções estáticas, mas deverá compilar). No entanto, como OP disse, você precisa retornar o valor, não apenas True ou False.Processando,
6056 bytesSaídas
-1
se falsas.Explicação
void
é 1 byte menor que o usofloat
, é por isso que essa função gera diretamente em vez de retornar um valor.Solução alternativa
por 63 bytes, mas acho que esse alt pode ser mais curto que a solução original. Eu estou trabalhando nisso.
fonte
0
agora?0
nunca é falso no Java / Processing que eu conheço.Braquilog , 8 bytes
Experimente online!
Emite o valor se true e
false.
se isso for impossível.Explicação
Esta é uma transcrição direta da relação fornecida:
fonte
+~^r~:3
, mas infelizmente~:
não faz o que você espera (provavelmente porque:
é uma sintaxe e não um builtin), e parece ser tratado de forma idêntica:
.:
é um símbolo de controle e~
funciona apenas em predicados.Perl 6 ,
2524 bytesTente
Remover o espaço após o
**
trabalho, porque é mais longo que o outro operador de infixo que pode corresponder*
.Então,
…***…
é analisado em… ** * …
vez de… * ** …
.Tente
Expandido:
fonte
R, 24 bytes
Uma abordagem diferente da resposta do plannapus e um byte mais curto!
Gera todos os números inteiros de
3^1-1
até3^99-1
e verifica se stdin corresponde. Nesse caso, ele retorna o índice no qual corresponde, o que éx
. Caso contrário, retornaNA
como valor falso.Aliás, ele aceitará vários valores como entrada e testará todos eles, o que é um recurso interessante.
fonte
Prolog, 20 bytes
Essa linguagem é legal como o inferno.
fonte
05AB1E , 9 bytes
Experimente online!
Imprime -1 por falsidade.
fonte
MATL , 8 bytes
Isso gera o número,
x
se existir, ou, caso contrário, não gera nada, o que é falso.Experimente online!
Explicação
fonte
Japonês , 11 bytes
Experimente aqui .
Muito obrigado à ETHproductions por ajudar!
fonte
Python 3,
746664 bytes-10 bytes graças a @ mbomb007, @FlipTack e @ nmjcman101
fonte
from math import*
. Tambémreturn n==3**x-1and x
.STDOUT
, para que você possa alterar esse retorno para uma impressão.import math
emath.ceil
para um único byte. Também você pode ligar3**x-1==n and x
parax*(3**x-1==n)
Ruby, 30 bytes
Retorna
nil
(um valor falso) se nenhum número foi encontrado. [Experimente online]fonte
C, 56 bytes
adicione um à entrada e, em seguida, divida-o repetidamente por três até encontrar o restante, se esse for alcançado, retorne a contagem de divisões else -1
fonte
a%3<1
vez de!(a%3)
. Mais um0
por falsidade.a=--a?-1:n;
para economizar 5 bytes. se uma função não nula não tiver retorno, ela usará apenas a última atribuição. Também o que @Titus disse.a%3?0:(a/=3)
vez de!(a%3)&&(a/=3)
Utilitários Bash / Unix,
3735 bytesExperimente online!
Usa dc para converter na base 3, verifica se a sequência resultante é todos os 2s, conta o número de caracteres (incluindo uma nova linha) e usa bc para subtrair 1.
Se o número na base 3 não for todos os 2s, o grep não produzirá nada (nem mesmo uma nova linha); portanto, a contagem de caracteres é 0 e a subtração de 1 resulta em -1.
fonte
C compilado com Clang 3.8.1,
53,52,54, 51 bytesA @SteadyBox já postou uma solução em C, mas estou usando uma abordagem diferente.
@ Obrigado a Jasen por ajudar a salvar bytes.
fonte
log
retorna,double
então talvez possa funcionar.C, 42 bytes, otimizado a partir de Wade Tyler
Experimentar
C, 37 bytes, sem
return
Experimentar
n
é global, mas(I)MUL
só pode ter seu operando dest em um registro; portanto, é necessário colocarEAX
(a escolha usual) e mover para láJavaScript 6, 32 bytes
Se o "falso" precisar ser o mesmo, 33 bytes:
fonte
Pyt ,
109 bytesExplicação:
Salva um byte usando a função de incremento em vez de adicionar explicitamente 1
fonte
Python, 64 bytes
Saída
False
se o número não puder ser gravado nesse formato.Isso também funciona em 64 bytes e imprime uma string vazia como uma saída falsa:
Uma solução criativa para 65 bytes, com saída
0
para falsy:fonte
x
nem-1
.x
vez den
no caso de uma correspondência.Pitão, 10 bytes
Experimente aqui!
fonte
Julia, 30 bytes
É uma função simples - cria um vetor que possui
true
apenas na posição correspondente em3^a-1
, ondea
é um vetor que contém números inteiros entre 0 en
. Ele encontra a "primeira" posição que étrue
e subtrai 1 (se for tudofalse
, a descoberta é avaliada como zero e retorna -1).Como
0:n
tem0
, em primeiro lugar, os subtrair 1 corrige para indexação e também permite que a-1
resposta falsa.fonte
Pyke,
96 bytesExperimente aqui!
Versão antiga de 9 bytes:
Experimente aqui!
fonte
Pyth 8 bytes
Tente aqui
fonte