Moyenne rotationnelle


18

Étant donné un entier en entrée n >= 10, affichez la moyenne de toutes les rotations dédupliquées de l'entier.

Par exemple, pour la saisie 123, les rotations sont 123(aucune rotation), 231(une rotation) et 312(deux rotations). La moyenne de ceux-ci est (123 + 231 + 312) / 3ou222 .

Comme autre exemple, prenez 4928. Les rotations sont 4928, 9284, 2849et 8492. Prendre la moyenne de ces quatre nombres est égal 6388.25.

Pour un autre exemple, pour les entrées 445445, les rotations sont dédupliquées 445445, 454454et 544544, de sorte que la sortie est 481481.

Pour l'entrée 777, il n'y a qu'une seule rotation dédupliquée, donc la sortie l'est 777.

Règles

  • Le cas échéant, vous pouvez supposer que l'entrée / sortie s'adaptera au type Integer natif de votre langue.
  • L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
  • Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.

Pouvons-nous prendre la saisie comme une liste de chiffres?
Dennis

3
@ Dennis Bien sûr, ça va. Allez enregistrer quelques octets. : p
AdmBorkBork

3
Avez-vous un exemple où la déduplication modifie réellement la sortie? Dans votre exemple 445445, chaque rotation unique de 3 se produit deux fois, donc les laisser ne change pas la sortie.
Kaldo

@Kaldo Non, je n'ai pas pu (manuellement) en proposer un, mais cela ne signifie pas qu'il n'existe pas, j'ai donc laissé les règles de déduplication en place.
AdmBorkBork

13
@Kaldo Soit d le nombre de chiffres de n et k le plus petit entier positif tel que la rotation de n k chiffres vers la gauche reproduit n . Soit q et 0 ≤ r <k tels que d = qk + r . Rotation n fois d et qk chiffres à gauche doivent céder n , alors r = 0 . Cela signifie que chaque rotation unique se produit q fois, donc la déduplication des rotations n'est pas nécessaire pour calculer la moyenne.
Dennis

Réponses:



9

APL (Dyalog) , 9 octets

10⊥≢⍴+/÷≢

Une fonction monadique prenant comme argument un vecteur de chiffres.

Essayez-le en ligne!

Je prends la moyenne des chiffres +/÷≢, puis je la répète par la longueur de l'entrée ≢⍴, et enfin convertis à partir de la base 10.

Conceptuellement, je prends la somme des rotations (sans porter):

 4  2  9  8
 2  9  8  4
 9  8  4  2
+8  4  2  9
 -----------
 23 23 23 23

Ceci est simplement 4+2+9+8répété 4 fois. Puis conversion de la base 10(qui fait le transport pour moi) et division par la longueur. Bien que je divise par la longueur plus tôt, car elle est équivalente et économise des octets.


1
C'est génial: D
Leo

@Leo FWIW les réponses qui multiplient la moyenne par un chiffre de répétition font essentiellement la même chose
H.PWiz

3

Java 10, 163 137 76 72 71 71 octets

n->(Math.pow(10,n.size())-1)/9*n.stream().mapToInt(i->i).sum()/n.size()

-36 octets grâce à @Nevay .
-61 octets grâce à @ OlivierGrégoire en créant un portage de réponse @Dennis 'Python 3 .
-1 octets en prenant l'entrée comme une liste de chiffres au lieu d'une chaîne.

Explication:

Essayez-le en ligne.

n->                                 // Method with String parameter and double return-type
  (Math.pow(10,n.size())-1)/9       //  Repunits the same length as the input-size
  *n.stream().mapToInt(i->i).sum()  //  multiplied by the sum of digits
  /n.size()                         //  divided by the input-size

1
151 octets n->{var s=new java.util.HashSet();var r=0d;for(int l=n.length(),x;l-->0;)if(s.add(x=new Integer(n=n.substring(1)+n.charAt(0))))r+=x;return r/s.size();}n->java.util.stream.IntStream.range(0,n.length()).map(i->new Integer(n.substring(i)+n.substring(0,i))).distinct().average().getAsDouble()
:,

1
Utilisez orElse(0)au lieu de getAsDouble().
Olivier Grégoire

69 octets , basé sur la solution des autres. Arrondissez en utilisant (int)pour 5 octets, si nécessaire.
Olivier Grégoire

Vous n'avez pas besoin de lancer en double: vous vous Math.powen occupez déjà. Cela vous épargnera 3 octets.
Olivier Grégoire

@ OlivierGrégoire Cela donnera des résultats incorrects si je fais ça. Le transtypage en int est utilisé afin que nous puissions entier- diviser par 9 et multiplier par la somme des chiffres. Alors seulement, il devrait doubler pour obtenir la moyenne. Si je supprime les deux (int)et *.1il sera par exemple en sortie 6388.888...au lieu de 6388.25pour l'entrée 4928. Et si je jette le tout ou simplement le .powvers un à la intplace, il sortira 6388.
Kevin Cruijssen

3

Husk , 5 octets

d´MKA

Essayez-le en ligne!

Explication

d´MKA
    A  Take the average of the digits
 ´MK   Replace each element of the original list with the average
d      Join the list to get a number

Husk , 7 octets

A§modṙŀ

Essayez-le en ligne!

Explication

A§modṙŀ
      ŀ  Take the range [1..length(input)]
 §m  ṙ   Rotate the input by each element of the range
   od    Convert each list of digits to a number
A        Take the average of the list

1
Pour un casse-tête, il existe au moins une 5solution d'octets
H.PWiz

@ H.PWiz Je ne peux pas le comprendre, pourriez-vous donner un indice? : P
Leo

@Leo Il n'y a pas de ou ŀ, et le premier caractère (à gauche) ne l'est pasA
H.PWiz

3

R , 84 73 64 octets

function(D,K=sum(D|1))mean(array(D,K+1:0)[1:K,1:K]%*%10^(K:1-1))

Essayez-le en ligne!

Saisie sous forme de liste de chiffres.

Merci à MickyT pour avoir rasé 11 octets! 8 octets rasés par la preuve de Dennis que la déduplication n'est pas nécessaire.


Avec une manière légèrement différente de faire pivoter le nombre pour 73
MickyT

@MickyT aaahhh utilisation intelligente du recyclage!
Giuseppe

@MickyT array(D,K+1:0)est plus court que matrix(D,K+1,K)d'un octet.
Giuseppe

2

05AB1E , 9 octets

vÀD}\OIg/

Essayez-le en ligne!


vsans y, intéressant.
Magic Octopus Urn

gFÀD})¨Osg/était où je pensais.
Urne de poulpe magique

Savez-vous encore comment utiliser la .æ = pop a compute permutations by function, usage: .æ<FUNC>}commande? Moi non plus, mais cela me semble approprié.
Urne de poulpe magique

@MagicOctopusUrn v sans y est la solution la plus courte que j'ai pu trouver pour effectuer les temps de rotation g (entrée). Je vérifie le .æ, il ne semble pas qu'il enregistre <FUNC>}
Kaldo

2

Stax , 6 octets

ñJä⌠╤►

Exécuter et déboguer

Ce programme prend en entrée une chaîne délimitée par des guillemets et exprime la moyenne sous forme de fraction réduite. par exemple777/1 il n'est pas nécessaire de dédoublonner les rotations. Cela ne change jamais le résultat.

Déballé, non golfé et commenté, il ressemble à ceci.

:)  get all character rotations
{em convert strings back to integers
:V  mean - integer inputs means result will be rational

Exécutez celui-ci


2

Perl 6 , 15 octets

{.sum/$_*1 x$_}

Essayez-le en ligne!

La moyenne est la moyenne des chiffres appliquée à chaque position décimale, donc la moyenne des chiffres multipliée par 111 ... 1 x $_ produit une chaîne de 1 qui est forcée aux chaînes par la multiplication.

Prend une liste de chiffres en entrée. Une séquence nécessiterait un .cache avant la somme, et une entrée de nombre ou de chaîne aurait besoin d'un .comb.



1

JavaScript (Node.js) , 43 octets

x=>eval(x.join`+`)*'1'.repeat(n=x.length)/n

Essayez-le en ligne!

Pouvons-nous prendre la saisie comme une liste de chiffres? - Dennis ♦ il y a 7 minutes

@ Dennis Bien sûr, ça va. Allez enregistrer quelques octets. : p - AdmBorkBork Il y a 3 minutes


1

Gelée , 6 5 octets

ṙJḌÆm

Essayez-le en ligne!

Comment ça fonctionne

ṙJḌÆm  Main link. Argument: A (digit array)

 J     Yield the indices of A, i.e., [1, ..., len(A)].
ṙ      Rotate A 1, ..., and len(A) units to the left, yielding a 2D array.
  Ḍ    Convert each rotation from decimal to integer.
   Æm  Take the arithmetic mean.

1

Japt , 8 octets

Prend l'entrée comme un tableau de chaînes à un chiffre.

xpUÊ)÷UÊ

Essayez-le


Explication

             :Implicit input of array U
 pUÊ         :Repeat each string length of U times
x   )        :Reduce by addition
     ÷UÊ     :Divide by the length of U

1

APL (Dyalog Unicode) , 21 14 octets SBCS

+/≢÷⍨⍳∘≢(⍎⌽)¨⊂

Essayez-le en ligne!

Fonction de préfixe tacite. Prend l'entrée sous forme de chaîne.

Merci à Adám pour une sauvegarde éclairante de 7 octets .

Comment?

+/≢÷⍨⍳∘≢(⍎⌽)¨⊂  Main fn, example argument '123'
                Enclose the argument (turns it into a scalar)
             ¨   Use each of the left arguments to
         ( ⌽)    Rotate, then
                Convert strings into numbers
      ⍳∘≢        Tally (≢) the argument, then index (⍳) from 1. 
                 Returns 1 2 3 for a 3 digit argument, and rotates the argument 1, 2, then 3 times.
                Use the result as left argument for
    ÷            Divide
                By the number of rotations
+/               And sum the results

: | ne peut toujours pas s'habituer aux commentaires APL
ASCII uniquement


1

Fusain , 11 octets

I∕×ΣθI⭆θ1Lθ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

    θ  θ  θ Input as a string
   Σ        Sum of digits
      ⭆ 1   Replace each character with the literal `1`
     I      Cast to integer
  ×         Multiply
         L  Length
 ∕          Divide
I           Cast to string
            Implicitly print

1

J , 10 octets

10#.#$+/%#

Ceci est un portage de la grande solution APL de H.PWiz à J.

Prend une liste de chiffres comme argument.

Explication:

+/%#la moyenne des chiffres (divisez %la somme des chiffres +/par leur nombre #)

#$crée une liste de copies de la moyenne en fonction du nombre de chiffres

10#. convertir la base de formulaire 10

Essayez-le en ligne!






1

C ++, 218 208 octets

-10 octets grâce à Zacharý

#include<set>
#include<cmath>
float a(int m){std::set<int>a;int n=m,t,c=0;for(;n>0;n/=10)++c;for(;n<c;++n){a.insert(m);t=m%10;m=m/10+std::pow(10.f,c-1)*t;}int s=0;for(int v:a){s+=v;}return float(s)/a.size();}

Et, pour tester:

int main() {
    printf("%f\n%f\n%f\n%f\n",a(123),a(4928),a(445445),a(777));
}

1
Vous n'avez pas besoin d'espaces entre #includeet <, et vous pouvez supprimer les {}deux autour ++c;et s+=v;. Vous pourrez peut-être déplacer le int s=0au début avec vos autres variables.
Zacharý

1
De plus, je ne pense pas que vous ayez besoin n=0de la seconde boucle for, car elle aurait dû atteindre d' 0ici là. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. Et ne pas utiliser à la intplace du autotravail?
Zacharý

Vous pouvez toujours vous déplacer int s=0;avec vos autres variables, et avez-vous besoin des accolades autour du s+=v;?
Zacharý


n>0=> npourrait fonctionner.
Zacharý

0

Pyth, 12 octets

csms.<zdlzlz

Probablement améliorable.

c         lz     Divide by the length of the input:
 s               Reduce by +
  m     lz       Map over d = [0 ... the length of the input]:
   s.<zd         Shift the input d characters to the left and cast to int

Essayez-le ici!


Il y a une fonction moyenne intégrée o. Si vous faites cela et que vous effectuez des E / S sous forme de listes de chiffres, vous pouvez les réduire à 8 octets .

Ah, je prenais "Le cas échéant, vous pouvez supposer que l'entrée / sortie s'adaptera au type Integer natif de votre langue." pour signifier qu'il devait être un entier s'il était pris en tant que Q.
RK.

0

J, 23 octets

(+/%#)".~.(|."0 1~i.@#)

Prend l'entrée sous forme de chaîne

Explication

          (|."0 1~i.@#)  | All rotations
        ~.               | Deduplicate
      ".                 | Convert each to int
(+/%#)                   | Average

0

Matlab, 65 octets

c=num2str(n);l=nnz(c);mean(str2num(c(mod((1:l)+(0:l-1)'-1,l)+1)))

Je vais y travailler, je suis sûr que cela peut être mieux fait.


0

Clojure, 139 octets

#(let[n(count %)G(set(apply map list(for[i(range n)](take n(drop i(cycle %))))))](/(apply +(for[g G](read-string(apply str g))))(count G)))

Fonctionnalités de langage assez peu optimales pour convertir des séquences de caractères en nombres entiers.


0

dc, 37 octets

Il s'agit d'un programme complet, lisant l'entrée et imprimant la sortie:

?1sd[O~rzsadO<x+ldO*1+sd]dsxxOkld*la/p

Il fonctionne en séparant le nombre en ses chiffres et en multipliant la moyenne des chiffres par le chiffre de longueur approprié (qui est construit au dfur et à mesure).

?                               # read input
 1sd                            # initialize d=1
    [                   ]dsxx   # define and execute recursive macro x:
     O~r                        #   remainder and quotient of /10
        zsa                     #   a = number of digits
           dO<x                 #   recurse if needed
               +ldO*1+sd        #   increment repdigit d
                             Ok         # after executing x, set precision 
                               ld*la/   # multiply by repdigit; divide by a
                                     p  # print the result
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.