Défi:
Créez un programme qui accepte un entier positif et vérifie s'il peut être écrit sous la forme de (3 ^ x) -1, X étant un autre entier positif .
Si possible, sortie X
Si ce n'est pas le cas, indiquez -1 ou une instruction falsy .
Exemple d'entrées / sorties
Contribution:
2
Il peut être écrit (3 ^ 1) - 1, donc nous produisons x qui est 1
Sortie:
1
Contribution:
26
26 peut être écrit comme (3 ^ 3) - 1, donc nous produisons x (3)
Sortie:
3
Contribution:
1024
1024 ne peut pas être écrit sous la forme de (3 ^ x) - 1, donc nous produisons -1
Sortie:
-1
C’est du code-golf donc moins d’octets gagnés
3^0-1
une sortie valide et donc non utilisable comme fausse,log()
dans sa réponse devrait confirmer qu'il donne la bonne réponse5
quand il le saisit242
.Réponses:
Mathematica,
2116 octetsUtilise le calcul symbolique de Mathematica. Si
#+1
est une puissance de trois alorsLog[3,#+1]
calculera un résultat entier qui est une valeur atomique. Sinon, nous obtiendronsLog[#+1]/Log[3]
tel quel. Puisque ce n'est pas une valeur atomique, c'est une expression qui est toujours de la formehead[val1,val2,...]
. Dans ce cas, c'est en fait quelque chose commeTimes[Power[Log[3], -1], Log[#+1]]
.Nous distinguons les deux cas en appliquant une autre fonction au résultat. En réalité, l’application remplace la
head
partie d’une expression. Puisque les résultats entiers sont atomiques, leur appliquer n'importe quelle fonction ne fait rien du tout. En particulierf @@ atom == atom
.Cependant, dans l’autre cas, la tête est remplacée. La fonction que nous utilisons est
-1&
une fonction simple qui ignore ses arguments et retourne-1
. Nous obtenons donc quelque chose-1&[Power[Log[3], -1], Log[#+1]]
dans les cas non entiers, ce qui évalue directement à-1
. Boîtier spécial par magie.la source
Python,
4644 octetsEssayez-le en ligne!
Dans ce cas,
0
serait la valeur de la fausseté. Merci à @ mbomb007 pour avoir signalé ma sortie incorrecte ainsi qu’à une[]
économie de 2 octets .la source
[n for n in range(x)if 3**n-1==x]
pour -4 octets, liste vide sous falsyHaskell, 35 octets
Exemple d'utilisation:
f 26
->3
.la source
05AB1E , 7 octets
Essayez-le en ligne!
Explication
la source
<3zm©.ïi®
est le plus proche que je n'ai pas utilisé des gammes comme il l'a fait.3DÝms<k
... Peu importe ... Je ne peux pas supprimer un octet de plus, je pourrais jurer.Gelée , 5 octets
Sorties x ou 0 (fausseté).
Essayez-le en ligne!
Comment ça marche
la source
Python 2, 41 octets
Une fonction récursive qui renvoie
0
les entrées non correspondantes. De manière répétée, le plancher divise l’entrée par 3, en comptant le nombre de pasi
, qui est finalement sortie. Mais si une étape produit une valeurn
qui n'est pas 2 modulo 0, le nombre n'était pas de for3^i-1
, la sortie est donc multipliée par 0.la source
Perl, 31 octets
Nécessite le
-E
drapeau pour fonctionner:Explications:
grep{3**$_-1==$i}0..($i=<>)
renvoie une liste des éléments de la plage0..$_
(c'est-à-dire de 0 à l'entrée) satisfaisant le test3**$_-1==$i
. Un seul élément au plus peut satisfaire à ce test. Cette instruction renvoie donc un tableau de 0 ou 1 élément. Nous imprimons ensuite cette liste: soit leX
soit rien (ce qui est faux).la source
Pyth, 11 octets
Convertit en base 3 et vérifie l’égalité en
[2, 2, ..., 2]
.la source
?-2JjQ3ZlJ
, puisque<col> <num>
et<num> <col>
sont interchangeables-
en Pyth.JavaScript (ES7),
383634 octetsOu juste
3029 octets s'il est possible de quitter avec une erreur en cas d'échec:Tester
Afficher l'extrait de code
la source
Java 8,
375867 octetsCe lambda correspond à une
Function<Integer, Integer>
référence et utilise le tour simple base 3.Cette fois, cela devrait fonctionner correctement.
la source
i->
. De plus, si vous prenez eni
tant queLong
, vous pouvez alors utilisera.toString(...)
(les ides donneront des avertissements sur l’utilisation incorrecte des fonctions statiques, mais ils devraient être compilés). Cependant, comme OP l’a dit, vous devez renvoyer la valeur, pas seulement Vrai ou Faux.Traitement,
6056 octetsSorties
-1
si fausseté.Explication
void
est plus court que 1 octetfloat
, c'est pourquoi cette fonction affiche directement au lieu de renvoyer une valeur.Solution alternative
pour 63 octets, mais je pense que cette variante peut être plus courte que la solution originale. J'y travaille.
la source
0
maintenant?0
n'est jamais faux en Java / Traitement que je connaisse.Brachylog , 8 octets
Essayez-le en ligne!
Affiche la valeur si vrai et
false.
si cela est impossible.Explication
Ceci est une transcription directe de la relation donnée:
la source
+~^r~:3
, mais~:
ne fait malheureusement pas ce à quoi vous pouvez vous attendre (probablement parce que:
c’est la syntaxe plutôt qu’une commande intégrée), et semble être traité de manière identique:
.:
c'est un symbole de contrôle qui~
ne fonctionne que sur les prédicats.Perl 6 ,
2524 octetsL'essayer
La suppression de l'espace après
**
fonctionne car il est plus long que l'autre opérateur infixe qui pourrait correspondre*
.Ainsi
…***…
est analysé comme… ** * …
plutôt que… * ** …
.L'essayer
Étendu:
la source
R, 24 octets
Une approche différente de celle de plannapus , et un octet plus court!
Tous les entiers de Génère
3^1-1
à3^99-1
, et vérifie si les matchs de stdin. Si tel est le cas, il renvoie l'index auquel il correspond, qui estx
. Sinon, retourneNA
comme valeur de fausseté.Incidemment, il acceptera plusieurs valeurs en entrée et les testera toutes, ce qui est une fonctionnalité intéressante.
la source
Prolog, 20 octets
Cette langue est cool comme l'enfer.
la source
05AB1E , 9 octets
Essayez-le en ligne!
Imprime -1 pour la fausseté.
la source
MATL , 8 octets
Cela renvoie le nombre
x
s’il existe, ou ne renvoie rien sinon, ce qui est faux.Essayez-le en ligne!
Explication
la source
Japt , 11 octets
Essayez ici .
Un grand merci à ETHproductions pour son aide!
la source
Python 3,
746664 octets-10 octets grâce à @ mbomb007, @FlipTack et @ nmjcman101
la source
from math import*
. Aussireturn n==3**x-1and x
.STDOUT
, vous pouvez donc changer ce retour en impression.import math
etmath.ceil
pour un seul octet. Aussi, vous pouvez vous tourner3**x-1==n and x
versx*(3**x-1==n)
Ruby, 30 octets
Renvoie
nil
(une valeur de fausseté) si aucun nombre n'a été trouvé. [Essayez-le en ligne]la source
C, 56 octets
ajoute un à l'entrée, puis divise plusieurs fois par trois jusqu'à trouver un reste
la source
a%3<1
au lieu de!(a%3)
. Un de plus avec0
pour falsy.a=--a?-1:n;
vous économiserez 5 octets. Si une fonction non vide n'a pas de retour, il utilisera simplement la dernière affectation. Aussi ce que @ Titus a dit.a%3?0:(a/=3)
lieu de!(a%3)&&(a/=3)
Utilitaires Bash / Unix,
37 à35 octetsEssayez-le en ligne!
Utilise dc pour convertir en base 3, vérifie que la chaîne résultante est composée de 2 caractères, compte le nombre de caractères (y compris une nouvelle ligne), puis utilise bc pour soustraire 1.
Si le nombre en base 3 n'est pas tous les 2s, alors grep ne génère rien (pas même une nouvelle ligne), le nombre de caractères est donc 0 et la soustraction 1 donne -1.
la source
C compilé avec Clang 3.8.1,
53,52,54, 51 octets@SteadyBox a déjà posté une solution en C, mais j'utilise une approche différente.
@Merci à Jasen pour avoir aidé à économiser des octets.
la source
log
revientdouble
donc peut-être que ça va marcher.C, 42 octets, optimisé par Wade Tyler
Essayer
C, 37 octets, sans
return
Essayer
n
est global mais(I)MUL
ne peut avoir que son opérande dest dans un registre, il faut donc le mettre dansEAX
(le choix habituel) et le déplacerJavaScript 6, 32 octets
Si le "faux" doit être identique, 33 octets:
la source
Pyt ,
10 à9 octetsExplication:
Enregistré un octet en utilisant la fonction d'incrémentation au lieu d'ajouter explicitement 1
la source
Python, 64 octets
Sorties
False
si le nombre ne peut pas être écrit dans ce format.Cela fonctionne également en 64 octets et affiche une chaîne vide sous forme de sortie falsifiée:
Une solution créative pour 65 octets, sortie
0
pour falsy:la source
x
ni-1
.x
au lieu den
dans le cas d'une correspondance.Pyth, 10 octets
Essayez-le ici!
la source
Julia, 30 octets
C'est une fonction simple - il crée un vecteur qui a un
true
seul dans la position correspondante dans3^a-1
, oùa
est un vecteur contenant des entiers compris entre 0 etn
. Il trouve la "première" position qui esttrue
et soustrait 1 (si c'est toutfalse
, la recherche est évaluée à zéro et renvoie -1).Comme
0:n
a0
en premier lieu, il faut soustraire 1 corrige les pour l' indexation et permet également la-1
réponse fausse.la source
Pyke,
9 à6 octetsEssayez-le ici!
Ancienne version à 9 octets:
Essayez-le ici!
la source
Pyth 8 octets
Essayez ici
la source