Défi
Étant donné une séquence de nombres, créez une fonction qui renvoie les étapes de la séquence.
- Supposons qu'une séquence sera
N >= 3
- La séquence répétera les étapes au moins une fois
- La séquence ne contiendra que des nombres naturels
- Votre fonction ou programme doit retourner la séquence d'étapes la plus courte possible
Exemple:
Contribution: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
Production: [1, 1, 2]
Explication: La séquence initiale va de 1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)
. Ensuite, il se répète. La sortie est alors[1 step, 1 step, 2 steps] => [1, 1, 2]
Un autre exemple:
Contribution: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
Production: [3, 1, 1, 1]
[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
\ /\ /\ /\ /
3 1 1 1 Then it repeats...
Cas de test
Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]
Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]
Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]
Input: [5, 6, 7] => Output: [1]
Clarifications
- La longueur d'entrée - 1 est divisible par la longueur de sortie
- Supposons que la séquence va toujours augmenter
C'est le code-golf , donc la réponse la plus courte en octets gagne.
la source
Réponses:
Gelée ,
97 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
JavaScript (ES6), 58 octets
Génère une chaîne séparée par des virgules (avec une virgule de début).
Essayez-le en ligne!
Ou 56 octets si nous utilisons
,-
comme séparateur et nous supposons que la séquence est toujours strictement croissante.Comment?
Nous convertissons d'abord le tableau d'entrée a [] en une liste de différences consécutives avec:
Parce que p est initialement défini sur une valeur non numérique (la fonction de rappel de map () ), la première itération donne NaN .
Exemple:
Nous contraignons ensuite le résultat à une chaîne:
Enfin, nous recherchons le modèle 1 le plus court d'entiers séparés par des virgules (
,\d+
) commençant juste après "NaN" et se répétant jusqu'à la fin de la chaîne:1: utiliser le non gourmand
*?
la source
/(,.+?)\1*$/
.Brachylog , 11 octets
Essayez-le en ligne!
Serait de 5 octets s'il y avait un intégré pour les différences consécutives.
Explication
la source
Pyth, 11 octets
Essayez-le ici
Explication
la source
Japt ,
1412 octetsEssayez-le
Explication
Original
Essayez-le
la source
R ,
4946 octetsProgramme complet:
Essayez-le en ligne!
R ,
725854 octetsSoumission de la fonction d'origine avec tous les cas de test en un seul endroit:
Essayez-le en ligne!
Merci à JayCe pour avoir suggéré l'itinéraire complet du programme et -4 octets sur la fonction, et à Giuseppe pour -3.
la source
a<-
ici non plusJ ,
2219 octets3 octets économisés grâce à FrownyFrog!
Essayez-le en ligne!
[Essayez-le en ligne!] [TIO-ji2uiwla]
Comment?
la source
/:
au lieu de#\
, vous pouvez0{"1[:~.
enregistrer 1 octet."0 1
est"{
05AB1E , 8 octets
Enregistré 3 octets grâce à Kevin Cruijssen .
Essayez-le en ligne!
05AB1E , 11 octets
Essayez-le en ligne!
13 octets
Une alternative mignonne, l'OMI:
Essayez-le en ligne!
la source
.œ
.Javascript, 49
56octetsModifier 7 octets enregistrés merci (devinez qui?) Arnauld
Même idée regex qu'Arnauld, mais curieusement si différente dans la mise en œuvre ...
Renvoyer une chaîne avec des étapes séparées par une virgule (et une virgule de début)
Tester
la source
match
était une mauvaise décision de ma part. Vous pouvez me surpasser encore plus . :-)MATL ,
141312 octetsEssayez-le en ligne!
Je viens de découvrir que MATL a une fonction circulante!
Explication
d
- Obtenez les différences entre les termes successifs, sous forme de tableaut5YL
- dupliquez cela, puis appelez la fonctionYL
('galerie') avec l'5
option ('circulant'). Crée une matrice avec le vecteur donné comme première ligne, puis les lignes successives sont le même vecteur décalé circulairement, jusqu'à ce qu'il s'enroule.FTF#Xu
- Vérifiez les lignes uniques et obtenez leurs numéros de ligne (vous ne savez pas s'il existe un moyen plus court de le faire). Lorsque les étapes de séquence se répètent, la ligne décalée circulairement sera la même que la première ligne et les lignes suivantes seront répétées. Ainsi, cela obtient les indices de la première série d'étapes de séquence avant de commencer à se répéter.)
- indexer en utilisant cela dans le tableau des différences d'origine, pour obtenir la réponse.Plus âgée:
Essayez-le en ligne!
(-1 octet grâce à Giuseppe)
Explication:
la source
Python 2 , 101 octets
Essayez-le en ligne!
Génère d' abord les deltas d , puis trouve le premier préfixe p de d qui, répété ⌊len (L) / len (p) ⌋ fois, donne L , où L est la liste d'entrée.
la source
Rubis , 62 octets
S'appuie sur la logique Regex adaptée de la réponse d' Arnauld .
Essayez-le en ligne!
Détermination alternative des différences de pas, également 62 octets:
Essayez-le en ligne!
la source
Java 10,
104100 octetsRegex
( ?.+?)\1*$
pour répéter la plus courte de la sous - chaîne @Neil 's commentaire sur @Arnauld ' JavaScript s (ES6) réponse .Essayez-le en ligne.
Explication:
la source
APL + WIN, 39 octets
Demander l'entrée.
Essayez-le en ligne! Gracieuseté de Dyalog Classic
Explication:
la source
Python 2 ,
8685 octetsEssayez-le en ligne!
Construisez les différences comme
d
; sid
répète avec la taille de l'unité,n
alorsd[n:]==d[:-n]
; sinon recurse.la source
Retina 0.8.2 , 42 octets
Essayez-le en ligne! Le lien inclut des cas de test. La sortie inclut une virgule principale. Explication:
Convertissez en unaire.
Calculez les différences avant, à l'exception du premier nombre, qui est laissé pour compte.
Faites correspondre les différences récurrentes.
Convertissez en décimal.
la source
05AB1E ,
1413 octetsEssayez-le en ligne ou vérifiez tous les cas de test .
Je sais qu'il y a déjà deux réponses 05AB1E plus courtes publiées par @ Mr.Xcoder , mais je voulais essayer cette approche alternative en utilisant la rotation et le contrôle d'égalité.
Pourrait être capable de jouer au golf sur quelques octets sans perdre
Á
.-1 octet après une pointe de @Emigna pour supprimer les registres global_variable (
©
et 2x®
) et utiliser un Duplicate (D
) et un Triplicate (Ð
).Explication:
la source
Haskell, 107 octets
x est le tableau d'entrée.
la source
f x=
. L'utilisation deinits
requiert égalementimport Data.List
, car elle ne fait pas partie de Prelude: Essayez-la en ligne!(init x)
peut être simplementx
parce quezip
tronque automatiquement si l'une des listes est plus longue que l'autre. Etmap(uncurry(-))$zip
existe une accumulation dans:zipWith(-)
. Au lieu def x=let i=...in
vous pouvez utiliser un agent de modèle:f x|i<-...=
.filter
,!!0
au lieu dehead
etcycle
au lieu deconcat$repeat
: Essayez-la en ligne!Stax ,
86 octetsExécuter et déboguer
Voici une version annotée non emballée pour montrer comment cela fonctionne.
Exécutez celui-ci
la source
Perl 6 , 57 octets
Essaye-le
La sortie est séparée par des espaces (
"1 1 2"
)Étendu:
la source
~(.skip Z-$_)
05AB1E , 9 octets
Explication:
Alternative à 9 octets:
Même algo, mais au lieu de comparer à la liste des deltas (qui doit être sauvegardée / restaurée), cela utilise
.¥
(undelta) puis se compare à l'entrée (implicite).Essayez-le en ligne!
la source
K4 , 30 octets
Solution:
Exemples:
Explication:
Semble lourd pour ce que nous essayons de résoudre. Obtenez les deltas de l'entrée, puis créez des séquences et déterminez la plus courte qui lui correspond.
la source
Wolfram Language (Mathematica) , 26 octets
Essayez-le en ligne!
Renvoie un
Sequence
contenant les étapes.+2 octets pour la
List
sortie:Essayez-le en ligne!
la source
Perl 5
-p
, 55 octetsEssayez-le en ligne!
Les nombres sont entrés sous forme de liste séparée par des espaces. La sortie est du même format.
la source