Étant donné une séquence arithmétique finie d'entiers positifs avec certains termes retirés du milieu, reconstruisez la séquence entière.
La tâche
Considérons une séquence arithmétique: une liste d'entiers positifs dans laquelle la différence entre deux éléments successifs est la même.
2 5 8 11 14 17
Supposons maintenant qu'un ou plusieurs entiers soient supprimés de la séquence, sous réserve des contraintes suivantes:
- Les entiers supprimés seront des termes consécutifs de la séquence.
- Le premier et le dernier entier de la séquence ne seront pas supprimés.
- Au moins trois entiers resteront dans la séquence.
Pour la séquence ci-dessus, les suppressions possibles incluent:
2 5 8 14 17 (removed 11)
2 5 17 (removed 8 11 14)
2 14 17 (removed 5 8 11)
Votre tâche: étant donné l'une de ces séquences partielles, reconstruisez la séquence complète d'origine.
Détails
Vous pouvez supposer que l'entrée est valide (a une solution) et qu'il manque au moins un terme. Tous les nombres de la séquence seront des entiers positifs (> 0). La séquence peut avoir une différence positive ou négative entre les termes (c'est-à-dire qu'elle peut augmenter ou diminuer). Ce ne sera pas une séquence constante (par exemple5 5 5
).
Votre solution peut être un programme complet ou une fonction . N'importe laquelle des méthodes d'entrée et de sortie par défaut sont acceptables.
Vos entrées et sorties peuvent être une chaîne (avec tout délimiteur raisonnable), une liste de chaînes ou une liste de nombres. Vous pouvez représenter les nombres dans la base qui convient à votre langue.
Veuillez mentionner toute méthode / format d'E / S inhabituel dans votre soumission, afin que d'autres puissent tester votre code plus facilement.
Cas de test
In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100
C'est du golf de code ; la réponse la plus courte dans chaque langue l'emporte.
2 5 ... 17
Réponses:
Haskell , 63 octets
Essayez-le en ligne!
Fonctionne essentiellement en essayant de construire le résultat de l'avant et, si cela échoue, de l'arrière. Cela utilise le fait que les premier et dernier membres de l'entrée seront toujours corrects, le fait que les membres supprimés doivent être consécutifs et le fait qu'il y aura toujours au moins trois éléments dans l'entrée. Tout ce que je dois faire, c'est supposer que les avant-derniers ou avant-derniers membres sont exacts et vérifier si cela fonctionne. Heureusement, Haskell a une très belle syntaxe pour créer des séries arithmétiques.
EDIT: merci à @xnor pour avoir signalé un bug et fourni une solution!
la source
[1,3,4,5]
donne[1,3,5]
.all(`elem`s)c
devrait le réparer avec le même nombre d'octets.05AB1E ,
98 octetsEssayez-le en ligne!
Explication
1 octet enregistré en utilisant
gcd of deltas
au lieu demin delta
, inspiré par user202729la source
Brachylog v2, 9 octets
Essayez-le en ligne!
Ceci est une soumission de fonction. L'interpréteur Brachylog peut être fait pour évaluer une fonction comme s'il s'agissait d'un programme complet en la donnant
Z
comme argument de ligne de commande; dans ce cas, l'entrée est spécifiée dans le format, par exemple,[1, 2, 4]
et la sortie est retournée dans un format similaire, par exempleZ = [1, 2, 3, 4]
. (Bien sûr, pour une soumission de fonction, l'entrée et la sortie ne sont pas du tout dans n'importe quel format; ce sont juste des listes.)Cela résout en fait un problème plus difficile que celui demandé par l'OP: il élabore la séquence arithmétique la plus courte d'entiers contenant les valeurs spécifiées dans l'ordre spécifié, que les suppressions soient consécutives ou non. Parce qu'il utilise la force brute, il peut être très lent si de nombreuses valeurs sont supprimées.
Explication
Le programme comprend trois parties principales.
⊆
trouve une superséquence de l'entrée (c'est-à-dire une séquence qui a l'entrée comme sous-séquence). Lorsqu'il existe plusieurs sorties possibles d'un programme Brachylog, la sortie choisie est la première sortie dans l'ordre de départage, et l'ordre de départage est déterminé par la première commande du programme qui a une opinion à ce sujet; dans ce cas,⊆
spécifie un ordre qui privilégie les sorties courtes aux sorties longues. Ainsi, la sortie que nous obtiendrons sera la plus courte superséquence de l'entrée qui obéit aux restrictions dans le reste du programme..
…∧
Est utilisé pour sortir la valeur qu'il considère comme entrée (c'est-à-dire la super-séquence dans ce cas), mais aussi pour affirmer qu'une condition spécifique est maintenue. En d'autres termes, nous produisons la plus courte séquence qui obéit à une condition spécifique (et ignorons les résultats intermédiaires utilisés pour voir si elle obéit à la condition).Enfin, nous avons
s₂ᵇ-ᵐ
=
, c'est-à-dire "tous les deltas de la séquence sont égaux", la condition que nous appliquons à la sortie. (La valeur de retour de ceci est une liste de deltas, plutôt que la super-séquence elle-même, c'est pourquoi nous avons besoin du.
…∧
pour nous assurer que la bonne chose est sortie.)Brachylog est freiné ici par le fait de ne pas avoir de commandes internes capables de gérer le calcul des deltas, d'appliquer une opération aux paires se chevauchant d'une liste, ou similaire. Au lieu de cela, nous devons dire ce que nous voulons dire explicitement:
s₂ᵇ
trouve toutes les (ᵇ
) sous-chaînes (s
) de longueur 2 (₂
) (l'utilisation deᵇ
est requise pour conserver un lien entre les inconnues dans les sous-chaînes et dans la super-séquence; le plus couramment utiliséᶠ
romprait cela lien). Effectue ensuite-ᵐ
une soustraction sur chacune de ces paires pour produire un delta. C'est ennuyeux d'avoir à écrire cinq octetss₂ᵇ-ᵐ
pour quelque chose que la plupart des langages de golf modernes ont intégré, mais c'est ainsi que le codegolf se passe parfois, je suppose.la source
Python 2,
104978983716760 octetsMerci à Chas Brown d' avoir économisé 4 octets.
Merci à ovs pour avoir économisé 7 octets.
Saisissez la liste par arguments.
Essayez-le en ligne!
Explication:
Les éléments supprimés étant consécutifs, il suffit de vérifier les différences entre deux paires d'éléments consécutifs.
la source
b if b%c else c
par[c,b][b%c>0]
.key=abs
! Il semble qu'à peu près, les gens omettent souvent laf=
partie à moins qu'une fonction récursive soit utilisée; afin que vous puissiez économiser 2 octets de cette façon.a[-1]-a[-2]
para[2]-a[1]
- la logique est la même et vous obtenez 2 autres octets.Pyth , 11 octets
Essayez-le ici!
Merci à Steven H. pour avoir sauvé un octet!
Pyth , 12 octets
Essayez-le ici!
Comment ça marche
la source
Q
afin que vous puissiez trier et prendre le premier élément au lieu deabs(GCD(Q))
comme%hS.+SQ}hQe
pour 11 octets. Suite de testsGelée , 8 octets
Essayez-le en ligne!
Remarques:
Ne fonctionne que sur une ancienne version de Jelly. ( cette validation par exemple) (où
g
usefractions.gcd
, dont le résultat est le même que le signe d'entrée, au lieu demath.gcd
, qui renvoie toujours une valeur positive).Le lien TIO ci-dessus est le lien TIO Python 3, le code Python se compose du code source Jelly du commit que j'ai mentionné ci-dessus, à l'exception de tout (3 fichiers) regroupés dans le même fichier (pour TIO à exécuter) et
dictionary.py
a été réduit à seulement quelques lignes. Néanmoinsdictionary.py
, elle n'est pas liée à cette réponse, car elle n'utilise pas de chaîne compressée. (la“...»
construction)Explication:
Premièrement, comme un segment continu est supprimé et qu'il reste au moins 3 éléments, il reste deux numéros consécutifs dans l'ancienne liste et les deltas seront tous des multiples de l'étape. Par conséquent, la liste
gcd
des différences (I
, incréments) sera la valeur absolue de l'étape.Heureusement le
gcd
est signé (voir note ci-dessus)Le programme:
Une gamme entière croissante de l'
Ṃ
inimum à l'Ṁ
aximum.Modulaire, choisissez chaque élément n.
La
$
chaîne monadique ( ) combineI
(incréments, différences) etg/
(réduitgcd
les éléments de la liste). Si les incréments sont positifs, legcd
sera positif et la liste de retour sera de gauche à droite (croissante), et vice-versa.la source
gcd
au lieu demin
nous a fait attacher. Dommage que j'obtienne un gcd avec signe, sinon je serais à 7;)MATL , 13 octets
Essayez-le en ligne!
Explication:
la source
JavaScript (ES6),
9290Modifier 2 octets enregistrés thx Arnauld
Facile, car il suffit de vérifier les différences entre les deux premiers et les deux derniers. Mais toujours incroyablement long.
Moins golfé
Tester
la source
a-=d=e*e>d*d?d:e
devrait fonctionner et enregistrer 2 octets.Wolfram Language (Mathematica) , 50 octets
Essayez-le en ligne!
la source
{##}
etLast@{##}
mais le meilleur que j'ai pu obtenir était de 51 octets.Rubis ,
65 62 5554 octetsEssayez-le en ligne!
-1 octet grâce à Justin Mariner
la source
h
, vous laissant aveca,*,b,c
. Essayez-le en ligne!Haskell ,
7369 octetsEssayez-le en ligne!
la source
J ,
49, 4746 octetsInspiré par la solution d'Emigna.
Comment ça marche:
Essayez-le en ligne!
la source
Coque , 9 octets
Essayez-le en ligne!
Merci beaucoup à H.PWiz d' avoir divisé par deux le nombre d'octets, en soulignant que l'application
…
sur une liste le classifie! ...la source
F⌋
être remplacé par▼
?gcd
était de gérer les deltas négatifsC # (.NET Core) ,
167 + 13 = 180145 + 13 = 158 octetsEssayez-le en ligne!
+13 pour
using System;
Étonnamment, ce défi avait plus de nuances que je l'avais initialement prévu.
Remerciements
-22 octets enregistrés grâce à quelques simplifications soignées de @DLosc.
DeGolfed
la source
Python 2 , 147 octets
Essayez-le en ligne!
la source
Python 2 , 78 octets
Essayez-le en ligne!
la source
Gelée , 8 octets
Essayez-le en ligne!
la source
dc , 64 octets
Essayez-le en ligne!
la source
Japt , 12 octets
Essayez-le
Explication
Générez un tableau d'entiers (
õ
) du dernier élément du tableau d'entrée (Ì
) au premier (Ug
). Calculez le pas entre les éléments en obtenant les deux paires d'éléments de l'entrée et en les réduisant par différence absolue (Uäa
) puis en triant (ñ
) ce tableau et en prenant le premier élément (g
).la source