Étant donné deux entiers positifs p et q , votre tâche consiste à renvoyer le tableau A créé en appliquant l'algorithme suivant:
- Commencez avec A = [p, q] et d = 2
- Pour chaque paire (x, y) de nombres contigus dans A dont la somme est divisible par d , insérez (x + y) / d entre x et y .
- Si au moins une paire correspondante a été trouvée, incrémentez d et passez à l'étape 2. Dans le cas contraire, arrêt et retour A .
Exemple
Voici le détail du processus pour p = 1 et q = 21 .
1 21 | Iteration #1: we start with d = 2 and A = [1, 21]
\/ | 1 + 21 is divisible by 2 -> we insert 11
22/2=11 |
|
1 11 21 | Iteration #2: d = 3, A = [1, 11, 21]
\/ | 1 + 11 is divisible by 3 -> we insert 4
12/3=4 |
|
1 4 11 21 | Iteration #3: d = 4, A = [1, 4, 11, 21]
\/ | 11 + 21 is divisible by 4 -> we insert 8
32/4=8 |
|
1 4 11 8 21 | Iteration #4: d = 5, A = [1, 4, 11, 8, 21]
\/ \/ | 1 + 4 is divisible by 5 -> we insert 1
5/5=1 15/5=3 | 4 + 11 is divisible by 5 -> we insert 3
|
1 1 4 3 11 8 21 | Iteration #5: d = 6, A = [1, 1, 4, 3, 11, 8, 21]
| no sum of two contiguous numbers is divisible by 6
| -> we stop here
D'où la sortie attendue: [1, 1, 4, 3, 11, 8, 21]
Clarifications et règles
- L'entrée et la sortie peuvent être gérées dans n'importe quel format raisonnable. Les entiers p et q sont garantis supérieurs à 0. Si cela aide, vous pouvez supposer q ≥ p .
- La 2ème étape de l'algorithme ne doit pas être récursivement appliquée aux éléments qui viennent d'être insérés à la même itération. Par exemple, A = [1, 1] et d = 2 devrait conduire à [1, 1, 1] (pas une liste infinie de 1).
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte!
Cas de test
p | q | Output
----+-----+-------------------------------------------------------------------------------
1 | 1 | [1,1,1]
1 | 2 | [1,2]
1 | 3 | [1,1,2,3]
2 | 6 | [2,1,2,1,4,1,2,6]
3 | 13 | [3,1,8,1,3,1,7,1,2,1,5,1,3,2,13]
9 | 9 | [9,6,9,6,9]
60 | 68 | [60,13,1,4,31,2,3,5,2,19,64,7,13,1,2,5,2,27,44,3,4,8,2,1,12,1,5,3,28,2,4,16,1,
| | 2,12,1,2,1,10,1,6,68]
144 | 336 | [144,68,3,4,8,1,12,1,4,2,28,13,128,44,17,92,240,58,108,5,17,1,2,5,3,28,3,1,11,
| | 60,3,6,2,42,2,4,26,192,54,132,7,1,15,1,3,1,18,1,4,2,30,3,1,12,1,9,78,46,336]
Si vous souhaitez tester votre code sur un cas de test légèrement plus grand, voici la sortie attendue pour:
- p = 12096 (2 6 * 3 3 * 7)
- q = 24192 (2 7 * 3 3 * 7)
code-golf
array-manipulation
Arnauld
la source
la source
ü
marche ... cela m'a permis d'améliorer une de mes réponses précédentes :-)[1,2,3,4] ü = [[1,2],[2,3],[3,4]]
, également si vous ajoutez "-d" dans les arguments lors de l'exécution de 05AB1E, cela produit la sortie "debug" que j'ai jointe ci-dessus. (Ajout du lien de débogage ci-dessus également). La raison pour laquelle les paires sont nettes est que, pour les commandes qui vectorisent automatiquement, il applique simplement la commande par paires (l'exécutionü)
sur une liste le montre bien).-d
... je l'ai trouvé trop tard, après "débogage" avec,q
"imprimer et arrêter". C'était douloureux.=
car il ne saute pas, et imprime simplement le dernier élément poussé dans la pile.U
vous pouvez remplacerX
parŠ
.Mathematica,
72645958 octetsEssayez-le en ligne!
Comment ça marche
Nous prenons l'entrée comme une liste
{p,q}
. L'étape d'itération est reformulée comme suit:(a+b)/d
entre tous les deux élémentsa
etb
:(x+{##2,}&@@x)
calcule la séquence dea+b
, avec una+Null
à la fin. Nous divisons pard
etRiffle
insérons chacun(a+b)/d
entrea
etb
. Incrémentd
.Integer
éléments de la liste résultante. (Cela supprime également leNull
introduit par{##2,}
.)Ceci est répété jusqu'à ce que le résultat ne change pas (ce qui ne peut arriver que parce que nous avons supprimé tous les nouveaux éléments, car aucun d'entre eux n'était un entier).
-8 octets grâce à @MartinEnder d'utiliser
//.
au lieu deFixedPoint
(et de prendre l'entrée comme une liste).-6 de plus parce
ListConvolve
que ce n'est pas si bienla source
//.
atoutsFixedPoint
, et je prendrais juste l'entrée comme une paire d'entiers au lieu de deux entiers séparés:(d=2;#//.x_:>x~Riffle~ListConvolve[{1,1}/d++,x]~Cases~_Integer)&
//.
avecFixedPoint
, parce que je vraiment aime vraimentFixedPoint
.Integer
.Ruby , 80 octets
Essayez-le en ligne!
Fonction récursive
f
prenant l'entrée comme tableau[p, q]
.la source
Haskell,
8581 octetsEssayez-le en ligne!
L'entrée est considérée comme une liste, par exemple
[1,2]
.Edit: -4 octets grâce à @Laikoni.
la source
l%d|l==l#d=l|e<-d+1=l#d%e
.Python 2 ,
112110108105103 octets-2 octets grâce à Jonathan Frech
-5 octets grâce à Erik l'Outgolfer
Essayez-le en ligne!
la source
y+=[...]*(...);y+=b,
équivalent ày+=[...]*(...)+[b]
?Python 2 , 98 octets
Invoquer en tant que
f([p,q])
. Essayez-le en ligne!Jonathan Allan a économisé 12 octets. Merci ~!
Explication
f
est une fonction récursive:f(A, B, d)
évalue àf(next_A, A, d+1)
, saufA == B
, auquel cas elle retourneA
. (Ceci est géré parA*(A==B)or …
: si A ≠ B,A*(A==B)
est la liste vide, qui est faux-y, donc la…
partie est évaluée; si A = B alorsA*(A==B)
estA
, qui est non vide et donc véridique, et elle est retournée.)next_A
est calculé comme:Ceci est mieux expliqué par l'exemple. Quand
d = 5
et par exempleA = [1, 4, 11, 8, 21]
:la source
zip
à la place de l'énumération et en utilisant[A[0]]
commesum
valeur initiale de.[A[0]]
parA[:1]
:)A*(A==B)
.Python 2 , 111 octets
Essayez-le en ligne!
-8 grâce à Rod .
-2 merci à Lynn .
la source
i
eta[x:x]
est plus court quea.insert
o
: pzip
et économisez deux octets !for
boucle parwhile A[o+1:]:o+=1;s=A[o-1]+A[o];b=s%d<1;A[o:o]=[s/d]*b;m|=b;o+=b
Husk , 22 octets
Prend une liste à 2 éléments, retourne une liste d'entiers et de flottants. Essayez-le en ligne!
Explication
la source
Perl 5 , 92 + 1 (
-a
) = 93 octetsEssayez-le en ligne!
la source
Rétine , 111 octets
Essayez-le en ligne!
Prend l'entrée comme des nombres séparés par des espaces. Naïvement suit l'algorithme donné, avec la seule technique notable étant d'utiliser un symbole marqueur
a
, pour noter quand l'un des nombres a été conservé. Ceci est utilisé pour travailler avec les capacités de bouclage quelque peu limitées de Retina, qui vous permettent uniquement de boucler jusqu'à ce qu'un ensemble d'étages n'apporte aucun changement global à l'entrée de ces étages.Explication:
Cela utilisera le même exemple que dans la question.
Nous changeons le tableau de nombres en entrée en un tableau unaire séparé par des points-virgules, nous aurions donc:
Mettez
d
dans notre code au début, en nous donnant:C'est un peu plus compliqué.
{
démarre un groupe d'étapes qui seront exécutées jusqu'à ce qu'elles atteignent un point fixe. Ensuite,+
indique que cette étape elle-même doit être exécutée jusqu'à un point fixe. Cette étape ajoute chaque paire de nombres adjacents mais les insère sans le point-virgule supplémentaire. Maintenant, nous aurions:L'autre étape délicate, celle-ci accumule notre diviseur dans le premier groupe de capture et remplace n'importe quel nombre de notre liste sans point-virgule de fin avec ce nombre divisé par
d
. Nous ajoutons également un débuta
à ces nombres, pour indiquer que quelque chose a été conservé, ainsi que;
pour indiquer qu'il doit faire partie de façon permanente du tableau. Maintenant, nous aurions:Cela supprime les nombres qui n'étaient pas divisibles par
d
ni dans le tableau avant ce tour. Cela ne change rien à notre exemple.Cela correspond avec avidité du début de la chaîne à la dernière lettre
a
de l'entrée. Cela signifie qu'il peut y avoir au plus un match. Si nous avons apporté des modifications, nous en ajoutons uned
, sinon la laissant la même afin que nous puissions quitter la boucle.Le
)
ferme la boucle commencée par{
(ne le remettez pas en question!) Et sinon cette étape supprime simplement les marqueurs que nous avons posés plus tôt. Comme c'est la fin de la boucle, nous répéterions les étapes ci-dessus plusieurs fois, mais je vais juste continuer comme si j'avais oublié la boucle, car cela rend l'exemple plus continu.Cette étape supprime de notre sortie:
Cette étape remplace les nombres unaires par des nombres décimaux:
La dernière étape se débarrasse des points-virgules:
Évidemment, sauter la boucle nous donne un résultat incorrect ici, mais j'espère que ce n'est pas trop déroutant.
la source
JavaScript (ES6),
898782 octetsMerci @Arnauld pour -2 octets et pour avoir aidé à économiser 5 octets supplémentaires.
Prend entrée sous forme de tableau:
f([p,q])
.Cas de test
la source
v
(v+=b[++i]
) au lieu d'utilisers
pour enregistrer 1 octet. Vous pouvez enregistrer un autre octet avec|r
au lieu de&&r
(je pense que c'est sûr mais je n'ai pas revérifié).|r
effet réussi tous les cas de test.push()
.push
une seule fois au lieu de deux; Après avoir revisité cette idée , je suis venu à ce pour 86 octets. Peut-être que cela peut être amélioré?push(v,...)
, puis l'utiliser àv+=
nouveau pour 84 octets .Röda , 90 octets
Essayez-le en ligne!
la source
Java 8, 180 octets
Explication:
Essayez-le ici.
la source
C #, 280 octets
Première tentative de code golf, qui est tout le programme. Essaye-le
Tentative 2, 159 octets
Enlever l'échafaudage, car la tâche consiste à fournir une fonction qui peut prendre une paire de nombres (un tableau fonctionne) et renvoie un tableau. Étant donné qu'un Func <int [], int []> F peut être utilisé pour satisfaire les exigences, il suffit de définir F :
Testez le programme complet ici
Cela peut être plus petit si une liste générique est considérée comme une sortie valide (supprimez le .ToArray () pour économiser 10 octets).
Si l'entrée peut également être modifiée, le fait de passer un List <int> au lieu d'un tableau supprime la nécessité d'initialiser la sortie (sort à 126 octets).
Pour aller plus loin, il n'est pas vraiment nécessaire d'avoir une valeur de retour dans ce cas. L'utilisation d'une action à la place supprime les 9 octets utilisés par l'instruction return.
la source
Gelée , 19 octets
Essayez-le en ligne!
la source