Problème
Définissons un ensemble de Cantor généralisé en supprimant de manière itérative certains segments de longueur rationnelle du milieu de tous les intervalles qui n'ont pas encore été supprimés, à partir d'un seul intervalle continu.
Compte tenu des longueurs relatives des segments à supprimer ou non, et du nombre d'itérations à effectuer, le problème est d'écrire un programme ou une fonction qui génère les longueurs relatives des segments qui ont ou non été supprimés après les n
itérations.
Exemple: supprimer de manière itérative les 4e et 6e huitième
Contribution:
n
- nombre d'itérations, indexées à partir de 0 ou 1
l
- liste des longueurs de segments sous forme d'entiers positifs avec gcd(l)=1
et longueur impaire, représentant les longueurs relatives des parties qui restent telles quelles ou sont supprimées, en commençant par un segment qui n'est pas supprimé. Étant donné que la longueur de la liste est impaire, les premier et dernier segments ne sont jamais supprimés. Par exemple, pour l'ensemble Cantor normal, ce serait [1,1,1] pour un tiers qui reste, un tiers qui est supprimé et encore un tiers qui ne le reste pas.
Production:
Liste entier o
, gcd(o)=1
, de longueurs de segment par rapport à la n
ième itération lorsque les segments qui ne sont pas supprimés dans l'itération précédente , sont remplacés par une copie réduite de la liste l
. La première itération est juste [1]
. Vous pouvez utiliser n'importe quelle méthode de sortie sans ambiguïté , même unaire.
Exemples
n=0, l=[3,1,1,1,2] → [1]
n=1, l=[3,1,1,1,2] → [3, 1, 1, 1, 2]
n=2, l=[3,1,1,1,2] → [9,3,3,3,6,8,3,1,1,1,2,8,6,2,2,2,4]
n=3, l=[5,2,3] → [125,50,75,100,75,30,45,200,75,30,45,60,45,18,27]
n=3, l=[1,1,1] → [1,1,1,3,1,1,1,9,1,1,1,3,1,1,1]
Vous pouvez supposer que l'entrée est valide. C'est le code-golf , donc le programme le plus court mesuré en octets l'emporte.
[0, 1, 2, 4, 6, 7]
au lieu de[3, 1, 1, 1, 2]
?Réponses:
Gelée ,
15 1312 octets-2 merci à Dennis (utiliser un lien plutôt qu'une chaîne permet d'utiliser le droit implicitement par
¡
; pas besoin d'envelopper le1
dans une liste car Jelly imprime les listes d'un article de la même manière que l'article)-1 merci à Erik the Outgolfer (à utiliser
Ɗ
pour éviter l' utilisation de la nouvelle ligneÇ
)Un programme complet imprimant une liste au format Jelly (donc
[1]
est imprimé comme1
)Essayez-le en ligne!
Comment?
la source
Python 2 ,
1201071041031009989 octetsEssayez-le en ligne!
Enregistré
la source
R , 94 octets
Essayez-le en ligne!
la source
Haskell ,
7658 octetsEssayez-le en ligne!
La fonction
(%)
prend la liste des longueurs de lignel
comme premier argument et le nombre d'itérationsn
comme deuxième entrée.Merci à Angs et Ørjan Johansen pour -18 octets!
la source
n
et#
en%
peut être raccourcil%a=do(x,m)<-zip a$a>>[l,[sum l]];(*x)<$>m
.JavaScript (Firefox 42-57), 80 octets
A besoin de ces versions spécifiques car il utilise à la fois les compréhensions de tableaux et l'exponentiation.
la source
JavaScript (Node.js) , 71 octets
Essayez-le en ligne!
la source
Java 10, 261 octets
Modifie la liste d'entrée au lieu d'en renvoyer une nouvelle pour enregistrer les octets.
Essayez-le en ligne.
la source
Gelée , 13 octets
Essayez-le en ligne!
Programme complet. Sorties
1
au lieu de[1]
. Chose ennuyeuse,ḋ
ne fonctionne pas comme×S¥
dans ce contexte etƭ
ne fonctionne pas bien avec les nilades. > _ <la source
APL (Dyalog Classic) , 20 octets
Essayez-le en ligne!
la source
K (ngn / k) , 27 octets
Essayez-le en ligne!
{
}
est une fonction avec des argumentsx
ety
(y;+/y)
une paire dey
et sa somme{
}[(y;+/y)]
projection (aka currying ou application partielle) d'une fonction dyadique avec un argument.x
sera(y;+/y)
ety
sera l'argument lorsqu'il sera appliqué.,1
liste singleton contenant 1x{
}[
]/
appliquer lesx
temps de projection(#y)#x
remodeler à la longueur du résultat actuel, c'est-à-dire alterner entre l'extérieury
et sa sommey*
multipliez chaque élément de ce qui précède par l'élément correspondant du résultat actuel,/
enchaînerla source
Rubis , 73 octets
Essayez-le en ligne!
la source
Pyth , 20 octets
L'entrée est un tableau de segments
l
, puis des itérationsn
. Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .la source