J'ai parcouru ce site pendant un certain temps, mais récemment je me suis vraiment intéressé à essayer certains des défis. J'avais l'intention de m'essayer à certains des sujets de golf de code existants, mais je n'ai pas eu accès à Internet depuis un moment hier, et en attendant, j'ai pensé à mon propre défi.
Votre tâche consiste à créer un programme ou une fonction qui prend un tableau de flottants a
et un entier n
, puis définit chaque valeur dans a
la moyenne des deux à côté, n
fois. Lorsqu'il est utilisé à plusieurs reprises avec des valeurs croissantes de n
, cela génère un mouvement ondulatoire:
Détails:
- S'il se trouve qu'il n'y a qu'un seul élément dans
a
, ou sin
est 0 ou moins, le programme doit retourner le tableau d'origine. - Les entrées et sorties peuvent être dans n'importe quel format que vous désirez, tant qu'elles sont visiblement séparées.
Pour chaque étape:
- Le premier élément
a
doit devenir la moyenne de lui-même et l'élément suivant. - Le dernier élément
a
doit devenir la moyenne de lui-même et de l'élément précédent. - Tout autre élément
a
doit devenir la moyenne de l'élément précédent et de l'élément suivant. - Assurez-vous de calculer à partir du tableau de l'étape précédente et non de celui en cours!
Cas de test: REMARQUE: vos entrées / sorties ne doivent pas nécessairement être dans ce format!
[0, 0, 1, 0, 0], 1 -> [0, 0.5, 0, 0.5, 0]
[0, 0, 1, 0, 0], 2 -> [0.25, 0, 0.5, 0, 0.25]
[0, 0, 1, 0, 0], 0 -> [0, 0, 1, 0, 0]
[0, 0, 1, 0, 0], -39 -> [0, 0, 1, 0, 0]
[0, 16, 32, 16, 0], 1 -> [8, 16, 16, 16, 8]
[0, 1, 2, 3, 4, 5], 1 -> [0.5, 1, 2, 3, 4, 4.5]
[0, 64], 1 -> [32, 32]
[0], 482 -> [0]
[32, 32, 32, 16, 64, 16, 32, 32, 32], 4 -> [33, 27, 40, 22, 44, 22, 40, 27, 33]
C'est le code-golf , donc la réponse la plus courte en octets l'emporte. Le gagnant sera choisi dans une semaine (le 1er août). Bonne chance!
Edit: Félicitations au gagnant, @issacg , avec un énorme 18 octets!
la source
n
non fournis eta
non fournis - ils n'ajoutent pas vraiment grand-chose.n
devrait être 4, pas 5.Réponses:
Pyth,
4618 octetsCe code attend une entrée dans le formulaire
iterations, [wave1, wave2, wave3 ...]
, comme le montre le premier lien ci-dessous.Manifestation. Harnais de test.
Le programme fonctionne en appliquant le code de la fonction Reduce (
u
) à la liste d'entrée, autant de fois que le nombre d'itérations.Je vais démontrer la fonction de propagation des ondes sur la liste
[0, 1, 2, 3, 4, 5]
, qui se trouve dansG
:+hGG
ajouteG
le premier élément àG
, formant[0, 0, 1, 2, 3, 4, 5]
.t+GeG
ajouteG
le dernier élément deG
et supprime son premier élément, formant[1, 2, 3, 4, 5, 5]
.sV
la première forme des paires à partir des listes, donnant[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]
avec le dernier élément de la première liste tronqué. Ensuite, les paires sont additionnées via las
fonction, donnant[1, 2, 4, 6, 8, 9]
.cR2
Utilisations flottantes division du point de diviser tous les nombres par 2, ce qui donne le résultat souhaité,[0.5, 1.0, 2.0, 3.0, 4.0, 4.5]
.la source
Snowman 1.0.0 , 219 caractères
Avec des sauts de ligne pour la "lisibilité":
Version non golfée / non minimisée:
Exemple de format d'E / S:
la source
Pyth -
2524 octetsUtilise énumérer, réduire pour effectuer des itérations.
Essayez-le en ligne ici .
la source
Raquette,
164145 octetsNon golfé
Remarque, vous devrez peut-être la
#lang racket
ligne pour exécuter cela.la source
R, 109 octets
Cela crée une fonction sans nom qui accepte un vecteur et un entier et renvoie un vecteur. L'approche ici consiste à traiter l'entrée comme une série temporelle univariée et à appliquer un filtre de convolution linéaire.
Non golfé + explication:
Exemples:
la source
Haskell, 76 caractères
L'astuce consiste à ajouter le premier nombre au début de la liste et le dernier à la fin de la liste au lieu de traiter les conditions aux limites.
Tests:
la source
if then else
, c'est-à-direc
devienta#n|n<1=a|1<2=iterate f a!!n
ets
devientx!y=(x+y)/2
(et est appelé...zipWith(!)(x:a)...
).c
un opérateur infixe dire#
:a#n|n<1=a|1<2=iterate f a!!n
. Appelez ça comme[0, 0, 1, 0, 0] # 2
.CJam,
2322 octetsEssayez-le en ligne
L'entrée est au format de liste CJam, par exemple pour le dernier exemple:
La sortie est également une liste CJam:
L'approche de base est qu'à chaque étape, le vecteur est décalé d'une position vers la gauche et d'une position vers la droite. Chacun des deux vecteurs est complété par le premier / dernier élément, puis la moyenne des deux vecteurs est calculée.
Explication:
la source
Java, 181 octets
Voici la version golfée:
Non golfé:
J'ai essayé de raccourcir autant que possible les affectations et les conditions avec Java. Bien entendu, les améliorations sont les bienvenues.
la source
JavaScript (ES6),
15313267 caractèresJe reviens à ma première réponse 6 mois plus tard et que dois-je faire? Golf à 50%, c'est quoi. ;)
Cette version s'appelle à plusieurs reprises jusqu'à ce qu'elle
n
soit inférieure à 1, décrémentantn
de 1 à chaque fois.Une solution non récursive (
15113078 caractères):Non golfé: (obsolète)
Récursif:
Non récursif:
la source
if(n<2)return b;return s(b,n-1)
pourrait être réduit àreturn n<2?b:s(b,n-1)
Java, 203 octets
Essayer mon premier put avec Java. Les conseils d'amélioration sont les bienvenus :)
Assez imprimé:
la source
for
boucle externe dans l'instruction d'incrémentation de la boucle? Commefor(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;
? Ensuite, vous devriez pouvoir vous débarrasser des accolades.++i
uns des autres par des virgules au lieu de points-virgules). Essaye le. :)f(a;b;c){d;e;}
doit être complètement identique àf{a;b;}{d;e;c;}
, et donc également àf(a;b;e,c)d;
. Cependant, avec votre code réarrangé qui ne fonctionne plus, car vous ne pouvez pas déplacer l'for
intérieur de l'autrefor
, donc je suppose que tout cela n'a plus d'importance. ;)Python 2, 98 octets
A adopté l'approche simple, utilisée
exec
pour éviter d'utiliser une boucle while. Je pense qu'il y a une meilleure façon de faire la logique pour déterminer les positions de cas spéciaux, mais cela fonctionne pour l'instant. L'entrée doit être formatée comme[list], times
.Non golfé:
la source
Mathematica, 81 octets
J'ai le sentiment qu'il pourrait être plus joué au golf si je pouvais trouver une meilleure façon de gérer la condition de positivité.
À noter: Mathematica propose de nombreuses solutions intégrées potentielles dans sa gamme de fonctions de traitement de liste et de filtrage
CellularAutomaton
. J'ai choisiNest[... ListConvolve ...]
parce que c'était le moyen le plus simple de résoudre les problèmes à la fin de la liste, mais d'autres angles pourraient se révéler plus courts.la source
Matlab, 109
Exemples:
la source
Scala,
195 caractères (186 avec sortie paresseuse, c'est-à-dire187 caractèresStream
)probablement pas optimal, cartographie
sliding(3)
est très utile dans ce cas.tests:
la source
q (27 caractères)
Exemples
la source
R, 93 octets
En tant que fonction sans nom
Étendu
Les tests
la source
Japt,
3937 octets (non concurrent)Cette réponse n'est pas concurrente car la langue est plus récente que le défi. Je voulais juste voir à quel point ma langue de golf pouvait tenir mon premier défi.
Essayez-le en ligne!
la source
C ++ 14, 158 octets
Nécessite une entrée pour être un conteneur
value_type==double
, commevector<double>
.Non golfé:
la source
Raquette 223 octets
Non golfé:
Essai:
Sortie:
la source
Gelée , 14 octets
Essayez-le en ligne!
Programme complet.
la source
C # (Visual C # Interactive Compiler) ,
160144 octetsUtilise une bonne récursion.
Essayez-le en ligne!
la source