Remerciements à @ Agawa001 pour avoir posé cette question.
Explication
Mon nouveau "keybore" n'a que 2 boutons, à savoir +
et -
.
Le numéro en mémoire commence à 0
.
Chaque pression consécutive sur +
ou -
incrémentera / décrémentera la mémoire exactement pour combien de fois elle a été pressée consécutivement.
Par conséquent, si vous appuyez +
4 fois, la première fois, il ajoute 1, la deuxième fois, il ajoute 2, la troisième fois, il ajoute 3, la quatrième fois, il ajoute 4, ce qui vous donne 10
(dix).
Maintenant, si vous appuyez -
3 fois, la première fois, il soustrait 1, la deuxième fois 2, la troisième fois 3, vous laissant avec 4
(quatre).
TL; DR
Étant donné une chaîne de + et -, divisez-la à chaque changement de caractère. Ensuite, chaque chaîne résultante de m +
symboles ajoute le m-ème numéro de triangle, et chaque chaîne de n -
symboles soustrait le n-ème triangle.
Procédure pas à pas
Maintenant, si vous ne comprenez toujours pas, je vais vous montrer comment +++--+--
crée 1
.
Program | Counter | Memory
----------------------------
| 0 | 0
+ | +1 | 1
++ | +2 | 3
+++ | +3 | 6
+++- | -1 | 5
+++-- | -2 | 3
+++--+ | +1 | 4
+++--+- | -1 | 3
+++--+-- | -2 | 1
Tâche
- Vous prendrez un entier positif en entrée, soit comme argument fonctionnel, soit depuis STDIN.
- Ensuite, vous afficherez / imprimerez le nombre minimum de touches nécessaires pour créer ce nombre en utilisant la méthode ci-dessus.
Cas de test
Étant donné que le réarrangement des séquences +
ou -
donne le même nombre, pour chacun de ces groupes, seule la séquence lexicographiquement la plus ancienne est répertoriée.
Input | Output | Possible corresponding sequences
-------------------------------------------------
4 | 5 | -+++-
6 | 3 | +++
9 | 5 | ++++-
11 | 7 | +++-+++
12 | 7 | +++++--, ++++-++
19 | 8 | -++++++-
39 | 12 | +++++++++---
40 | 13 | +++++++++---+, ++++++++-+++-
45 | 9 | +++++++++
97 | 20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
361 | 34 | ++++++++++++++++++++++++++-+++-+++
Des ressources supplémentaires
- Preuve que n'importe quel nombre peut être fait : en gros, en répétant
++-
, vous pouvez obtenir n'importe quel nombre pair. Pour obtenir les nombres impairs, il suffit de mettre un+
à la fin. - Une autre façon générale d'obtenir n'importe quel numéro. Par exemple, pour générer
50
un moyen, appuyez sur+
50 fois, puis appuyez sur-
49 fois. - Solution des 50 premiers nombres .
- Obligatoire JSFiddle .
Notation
C'est du code-golf . La solution la plus courte en octets gagne.
la source
+++++--
c'est aussi une alternative, mais j'ai supprimé++-++++
car c'est équivalent à++++-++
). J'ai encore un cas de plus que j'aimerais ajouter plus tard au cas où quelqu'un trouverait une solution efficace, si je réussis à la générer.++-++++
supprimé. De plus, c'était MON montage, pas le vôtre.+++++--
(ou, de manière équivalente--+++++
), c'est pourquoi j'ai ressenti le besoin de modifier en premier lieu.Réponses:
Python 2, 119 octets
Approche par force brute très lente. La troisième ligne calcule le score d'une chaîne
x
; les autres lignes bouclent sur toutes les chaînes binaires possibles jusqu'à ce que celle dont le score est égal à l'argument soit trouvée.@Leaky a économisé trois octets!
la source
s/x==n and len/(x==n)*len/
s
division répétée, comme ceci:def f(n): \n while n>0:print n%2;n/=2
Pyth, 25 octets
Essayez-le en ligne.
Ceci est extrêmement inefficace et manque de mémoire pour
f(n)
≥ 11. Il calculef(22)
= 10 en environ 10 secondes sur mon ordinateur portable.Explication
T
. (f
)T
. (./T
).pM
)s
){
) Cette étape pourrait être supprimée, mais elle rend le code beaucoup plus rapide.f
)d
de la partition (*R
) par lui-même plus un (hd
). Cela donne le double du nombre à ajouter / soustraire au résultat.c
…2
)-M
).a
) Si le résultat était négatif, l'échange des additions et des soustractions obtient le résultat positif.qyQ
) Dans ce cas, la permutation de partition est correcte, renvoyez-la.T
. Retour et impressionT
.la source
MATL ,
4329 octetsC'est inefficace en mémoire et en temps. Le compilateur en ligne peut gérer jusqu'à l'entrée
45
uniquement.Essayez-le en ligne!
Voici une version modifiée avec tous les cas de test jusqu'à
40
(cela prend presque une minute dans le compilateur en ligne).Explication
Cela teste toutes les séquences de touches possibles de chaque longueur, par ordre de longueur croissante, jusqu'à ce qu'une séquence valide soit trouvée.
la source
Python,
105100octetsUtilise une recherche étendue inefficace.
h
est une liste utilisée comme file d'attentem
est la valeur de la séquence en tête de listet
est le dernier numéro ajouté àm
l
est la longueur de la séquence qui a générém
o
est +/- 1, le signe est en face du signe det
Edit: Leaky Nun a rasé cinq octets.
la source
s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
s/while m!=n/while m-n/