Tout entier positif peut être obtenu en commençant par 1 et en appliquant une séquence d'opérations, chacune étant soit «multipliée par 3», soit «divisée par 2, en éliminant tout reste» .
Exemples (écrire f pour * 3 et g pour / 2):
4 = 1 *3 *3 /2 = 1 ffg
6 = 1 ffggf = 1 fffgg
21 = 1 fffgfgfgggf
Écrivez un programme avec le comportement suivant:
Entrée : tout entier positif, via stdin ou codé en dur. (S'il est codé en dur, le numéro d'entrée sera exclu de la longueur du programme.)
Sortie : une chaîne de f et de g telle que <input> = 1 <string>
(comme dans les exemples). Une telle chaîne dans l'ordre inverse est également acceptable. NB: La sortie ne contient que des f et g, ou est vide.
Le gagnant est l'entrée avec le moins d'octets de programme-plus-sortie lorsque 41 est l'entrée.
x mod 3
: six=3y
construire y puis appliquerf
; six=3y+1
construire2y+1
et appliquerf
alorsg
; six=3y+2
alors cela devient compliqué mais essentiellement récursif.Réponses:
GolfScript, score 64 (43-2 + 23)
(41 est codé en dur, donc -2 caractères pour la partition). La sortie est
qui est de 23 caractères (sans nouvelle ligne). Par construction, le code garantit qu'il renvoie toujours (l'une des) représentations les plus courtes.
la source
"1 "
ne doit pas être inclus dans la sortie.Nous devenons sales, amis!
JAVA
210 207199 caractèresnon-golfé:
sortie: selon la foi des anciens dieux, la plus courte que j'ai eue était de 30. Notez que la sortie doit être lue à droite.
234
108
modifier 45
points :
318199 + 30 = 229edit1 (2 * i + 1)% 3 == 0 -> (2 * i)% 3 == 1
Nota Bene si vous utilisez Java 6 et non Java 7 pendant le golf, vous pouvez utiliser
Structure de 39 caractères au lieu d'une structure standard de 53 caractères.
la source
(2*i+1)%3==0
est équivalent ài%3==1
if(X){A}else{if(Y){B}else{C}}
est plus long queif(X){A}else if(Y){B}else{C}
. Vous pouvez également remplacer vos==
conditions par des<
conditions plus courtes .Python, score 124 (90-2 + 36)
90 caractères de code (sauts de ligne à 1 chacun) - 2 pour le chiffre d'entrée codé en dur + 36 caractères de sortie
Production:
la source
m=f=0
vous pouvez faire la boucle extérieurewhile(n!=x)*(m!=x)
et supprimer les pauses. Le porte à 95 caractères de code.n
par3**f
.print'f'*f+'g'*g
, ce qui donnerait un score de 90-2 + 36 = 124.Python, score 121 (87-2 + 36)
la source
l,n,f=len(t),1,0
et supprimiez le'1',
de la déclaration imprimée, votre score serait de 87-2 + 36 = 121.1,
.l,n,f=len(t),1,0
donne le même nombre de caractères, non? (Pour chaque variable, une=
et une nouvelle ligne sont remplacées par deux,
s.)Perl, score 89 (63-2 + 28)
Conjecture: Si l'approche naïve décrite dans ma solution originale ci-dessous atteint un cycle, ce cycle sera [21, 7, 15, 5, 10, 21, ...] . Comme il n'y a pas de contre-exemples pour 1 ≤ n ≤ 10 6 , cela semble vraisemblablement vrai. Pour le prouver, il suffirait de montrer que c'est le seul cycle qui puisse exister, ce que je pourrai faire ou ne pas faire plus tard.
La solution ci-dessus évite le cycle immédiatement, au lieu de deviner (à tort), et de l'éviter la deuxième fois.
Sortie (28 octets):
Perl, score 100 (69-2 + 33)
Utiliser une approche de deviner et de vérifier. La chaîne est construite à l'aide d'opérations inverses (conversion de la valeur en 1 , au lieu de l'inverse), et la chaîne est reflétée en conséquence, ce qui est autorisé par la spécification du problème.
Chaque fois qu'un non-multiple de trois est rencontré, il sera multiplié par deux, en ajoutant un si le résultat serait alors un multiple de trois. Lorsqu'un multiple de trois est rencontré, il sera divisé par trois ... sauf si cette valeur a déjà été rencontrée, indiquant un cycle, donc devinez et vérifiez.
Sortie (33 octets):
la source
J, score 103 (82-2 + 23)
* Remarque: j'ai nommé mes verbes
f
etg
, à ne pas confondre avec les chaînes de sortief
etg
.Codé en dur:
Fonctions générales:
Supprimé le fonctionnement sur des blocs de nombres binaires, ce qui était le changement le plus important en ce qui concerne le compactage
g
. Changement de nom des variables et suppression d'espaces pour le mieux, mais tout est toujours le même sur le plan fonctionnel. (Utilisation:g 41
)J, score 197 (174 + 23)
Production:
ffffffffggggggggfgffggg
f
convertit une liste de booléens en nombre, en utilisant 0 comme as*3
et 1 comme as/2
(etfloor
).#:i.2^i
crée un tableau de rang 2 contenant tous les tableaux booléens de rang 1 de longueuri
.la source