Trouver les pistes à l'intérieur d'un tableau
Une exécution est définie comme trois nombres ou plus qui incrémentent le précédent avec un pas constant. Par exemple, [1,2,3] serait une exécution avec l'étape 1, [1,3,5,7] serait une exécution avec l'étape 2 et [1,2,4,5] n'est pas une exécution.
Nous pouvons exprimer ces exécutions par la notation "i à j par s" où i est le premier numéro de l'analyse, j est le dernier numéro de l'analyse et s est l'étape. Cependant, les exécutions de l'étape 1 seront exprimées "i à j".
Donc, en utilisant les tableaux avant, nous obtenons:
[1,2,3] -> "1to3"
[1,3,5,7] -> "1to7by2"
[1,2,4,5] -> "1 2 4 5"
Dans ce défi, c'est votre tâche de le faire pour les tableaux qui peuvent avoir plusieurs exécutions.
Exemple de code Python avec récursivité:
def arr_comp_rec(a, start_index):
# Early exit and recursion end point
if start_index == len(a)-1:
return str(a[-1])
elif start_index == len(a):
return ''
# Keep track of first delta to compare while searching
first_delta = a[start_index+1] - a[start_index]
last = True
for i in range(start_index, len(a)-1):
delta = a[i+1] - a[i]
if delta != first_delta:
last = False
break
# If it ran through the for loop, we need to make sure it gets the last value
if last: i += 1
if i - start_index > 1:
# There is more than 2 numbers between the indexes
if first_delta == 1:
# We don't need by if step = 1
return "{}to{} ".format(a[start_index], a[i]) + arr_comp_rec(a, i+1)
else:
return "{}to{}by{} ".format(a[start_index], a[i], first_delta) + arr_comp_rec(a, i+1)
else:
# There is only one number we can return
return "{} ".format(a[start_index]) + arr_comp_rec(a, i)
Contribution
Tableau d'entrées positives triées (pas de doublons)
Production
Chaîne des exécutions séparées par un espace ou un tableau de chaînes des exécutions
N'a pas besoin d'être gourmand dans une direction particulière
Peut avoir un espace de fin
Cas de test
In: [1000, 1002, 1004, 1006, 1008, 1010]
Out: "1000to1010by2"
In: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
Out: "1to3 5 8 13 21 34 55 89 144 233"
In: [10, 20, 30, 40, 60]
Out: "10to40by10 60"
In: [5, 6, 8, 11, 15, 16, 17]
Out: "5 6 8 11 15to17"
In: [1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 30, 45, 50, 60, 70, 80, 90, 91, 93]
Out: "1to7 9to15by2 30 45 50to90by10 91 93"
C'est le code-golf donc le moins d'octets gagne.
la source
[4, 5, 6, 7, 9, 11, 13, 15]
ne peut pas l'être4to6 7to15by2
?)Réponses:
Gelée ,
4240 octets-2 merci à Kevin Cruijssen (filtrer les deux
ḟ2
, plutôt que de remplacer les deux par des zéros2,0y
)Un programme complet imprimant le résultat.
(En tant que lien monadique, une liste contenant un mélange d'entiers et de caractères serait produite)
Essayez-le en ligne!
(Trop inefficace pour que le plus grand cas de test se termine dans les 60s, j'ai donc supprimé
[1,2,3,4]
.)Comment?
la source
2,0ySƲÞ
peut être joué au golfḟ2SƊÞ
pour -2 octets.P
, plutôt qu'avec une sommeS
et j'aurais eu besoin des zéros.Swift, 246 octets
Essayez-le en ligne!
la source
K (ngn / k) , 102 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 129 octets
Renvoie un tableau de chaînes.
Essayez-le en ligne!
Comment?
Étape 1
Nous ajoutons d'abord à chaque numéro un suffixe composé d'un début
'-'
suivi de la différence avec le numéro suivant, à l'exception de la dernière entrée qui reste inchangée. Ce nouveau tableau est contraint à une chaîne.Exemple:
Étape 2
Nous identifions toutes les exécutions dans la chaîne résultante et les remplaçons par la notation appropriée.
Exemple:
Étape 3
Enfin, nous avons divisé la chaîne sur les suffixes restants, y compris les virgules de fin.
Exemple:
la source
Ruby ,
125118 bytesEssayez-le en ligne!
Explication
L'énumérable de Ruby a une
chunk
méthode utile qui fait précisément ce dont nous avons besoin ici - il regroupe les éléments par exécutions consécutives de la même valeur de retour du bloc, dans notre cas - la différence entre la valeur courante (x
) et précédente (y
).La mise en garde est qu'une telle stratégie ne capturera pas le premier élément de la course, par exemple ici seuls les deux derniers éléments sont regroupés:
Par conséquent, lors du mappage sur les chaînes correctement formatées, lorsque nous rencontrons une nouvelle exécution potentielle (bloc avec> 1 élément), nous devons suivre si l'élément précédent était unique (
i=1
) ou déjà utilisé dans une autre exécution (i=0
). S'il y a un élément unique inutilisé, il devient le point de départ de l'analyse et abaisse le seuil de taille de bloc de 3 à 2.la source
R ,
180175 octetsEssayez-le en ligne!
Conceptuellement, ceci est un portage de ma réponse Ruby , bien qu'évidemment assez différent techniquement.
5 octets enregistrés par JayCe.
la source
rle
mais j'étais trop paresseux ... vous pouvez enregistrer 1 octetsum(1|x)
enlength(x)
cat
pour 175 octets: TIOR ,
238217 octetsMerci @digEmAll pour -19 octets.
Essayez-le en ligne!
la source
F
au lieu den
comme il est déjà initialisé0
, ce qui devrait économiser quelques octets, je pense.split
,diff
etrle
. Malheureusement, la recherche gourmande de pistes signifie beaucoup de tripotage.'by'[D>1]
une bonne astuce.JavaScript (Node.js) ,
177173 octetsEssayez-le en ligne!
la source
Nettoyer ,
208... 185 octetsEssayez-le en ligne!
la source
Gelée , 41 octets
Essayez-le en ligne!
Programme complet.
la source
Python 2 ,
170166 octetsEssayez-le en ligne!
la source
Python 2 ,
138136 octets-2 octets grâce à Erik l'Outgolfer .
Essayez-le en ligne!
la source
gvm (commit 2612106 ) bytecode, 108 octets
Attend la taille du tableau sur une ligne, puis les membres chacun sur une ligne.
Hexdump:
Essais:
Assemblé manuellement à partir de ceci:
la source
05AB1E (hérité) ,
4950 octetsBeaucoup trop longtemps, mais je suis déjà content que ça marche. Ce défi est beaucoup plus difficile qu'il n'y paraît. Peut sans aucun doute être joué plus loin.
Σ€g2KO>}¤
est un portage de la réponse Jelly2,0ySƲÞṪ
de @JonathanAllan (merci!).Essayez-le en ligne. (REMARQUE: Délai d'expiration pour les grands cas de test.)
+1 octet comme correction de bogue car
0
est toujours placé à la fin du tri lors du tri.Explication:
la source
Perl 5 , 154 octets
Idem avec les espaces, les nouvelles lignes, les #comments et
sub by
:Essayez-le en ligne!
... pour réussir les tests de l'OP.
la source
Retina 0.8.2 , 77 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Convertissez en unaire.
Calculez les différences consécutives.
Convertissez les exécutions en
to...by
syntaxe.Supprimez les différences non converties et
by1
.Convertissez en décimal.
la source