Media rotazionale


18

Dato un intero di input n >= 10, genera la media di tutte le rotazioni deduplicate dell'intero.

Ad esempio, per l'input 123, le rotazioni sono 123(nessuna rotazione), 231(una rotazione) e 312(due rotazioni). La media di quelli è (123 + 231 + 312) / 3o 222.

Come altro esempio, prendi 4928. Le rotazioni sono 4928, 9284, 2849e 8492. Prendendo la media di questi quattro numeri è uguale 6388.25.

Per un altro esempio, per l'ingresso 445445, le rotazioni sono deduplicati 445445, 454454e 544544, e il suo output 481481.

Per l'input 777, esiste una sola rotazione deduplicata, quindi l'output è 777.

Regole

  • Se applicabile, puoi supporre che l'input / output si adatti al tipo intero nativo della tua lingua.
  • L'input e l'output possono essere forniti con qualsiasi metodo conveniente .
  • È accettabile un programma completo o una funzione. Se una funzione, è possibile restituire l'output anziché stamparlo.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Possiamo prendere input come un elenco di cifre?
Dennis,

3
@Dennis Certo, va bene. Vai a salvare alcuni byte. : p
AdmBorkBork

3
Hai un esempio in cui la deduplicazione modifica effettivamente l'output? Nel tuo esempio 445445, ogni 3 rotazioni univoche avvengono due volte, quindi lasciarle non cambia l'output.
Kaldo,

@Kaldo No, non sono stato in grado di crearne (manualmente) uno, ma ciò non significa che non ne esista uno, quindi ho lasciato in atto le regole di deduplicazione.
AdmBorkBork,

13
@Kaldo Sia d sia il numero di cifre di n e k il più piccolo intero positivo tale che ruotando n k cifre a sinistra riproduce n . Prendi q e 0 ≤ r <k tale che d = qk + r . Ruotando di n sia le cifre d che qk verso sinistra, si deve ottenere n , quindi r = 0 . Ciò significa che ogni rotazione univoca si verifica q volte, quindi non è necessario deduplicare le rotazioni per calcolare la media.
Dennis,

Risposte:



9

APL (Dyalog) , 9 byte

10⊥≢⍴+/÷≢

Una funzione monadica che prende come argomento un vettore di cifre.

Provalo online!

Prendo la media delle cifre +/÷≢, quindi la ripeto per la lunghezza dell'input ≢⍴e infine converto dalla base 10.

Concettualmente, sto prendendo la somma delle rotazioni (senza trasportare):

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

Questo è solo 4+2+9+8ripetuto 4 volte. Quindi la conversione dalla base 10(che fa il trasporto per me) e la divisione per la lunghezza. Anche se divido per la lunghezza in precedenza perché è equivalente e salva byte.


1
È geniale: D
Leo,

@Leo FWIW le risposte che moltiplicano la media per una cifra rep stanno sostanzialmente facendo la stessa cosa
H.Pwiz

3

Java 10, 163 137 76 72 71 byte

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

-36 byte grazie a @Nevay .
-61 byte grazie a @ OlivierGrégoire creando un port della risposta Python 3 di @Dennis .
-1 byte prendendo l'input come Elenco di cifre anziché String.

Spiegazione:

Provalo online.

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 byte: 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();}avvicinamento al flusso con 137 byte:n->java.util.stream.IntStream.range(0,n.length()).map(i->new Integer(n.substring(i)+n.substring(0,i))).distinct().average().getAsDouble()
Nevay,

1
Usa orElse(0)invece di getAsDouble().
Olivier Grégoire,

69 byte , in base alla soluzione altrui. Arrotondare usando (int)per 5 byte mote, se necessario.
Olivier Grégoire,

Non è necessario eseguire il cast come doppio: Math.powgià se ne occupa. Ciò ti risparmierà 3 byte.
Olivier Grégoire,

@ OlivierGrégoire Se lo faccio, darò risultati errati. Viene utilizzato il cast su int in modo che possiamo integer -divide per 9 e moltiplicare per la somma delle cifre. Solo allora dovrebbe raddoppiare per ottenere la media. Se rimuovo entrambi (int)e *.1sarà ad esempio output 6388.888...anziché 6388.25per l'input 4928. E se invece eseguo il cast dell'intero oggetto o solo del .powverso int, verrà emesso 6388.
Kevin Cruijssen,

3

Buccia , 5 byte

d´MKA

Provalo online!

Spiegazione

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

Buccia , 7 byte

A§modṙŀ

Provalo online!

Spiegazione

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
Per un puzzle, esiste almeno una 5soluzione di byte
H.Pwiz,

@ H.PWiz Non riesco a capirlo, potresti dare un suggerimento? : P
Leone,

@Leo Non c'è o ŀ, e il primo personaggio (a sinistra) non èA
H.Pwiz

3

R , 84 73 64 byte

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

Provalo online!

Immettere come elenco di cifre.

Grazie a MickyT per la rasatura di 11 byte! 8 byte raccolti dalla prova di Dennis secondo cui la deduplicazione non è necessaria.


Con un modo leggermente diverso di ruotare il numero per 73
MickyT

@MickyT aaahhh uso intelligente del riciclo!
Giuseppe,

@MickyT array(D,K+1:0)è più corto di matrix(D,K+1,K)un byte.
Giuseppe,

2

05AB1E , 9 byte

vÀD}\OIg/

Provalo online!


vcon no y, interessante.
Magic Octopus Urn,

gFÀD})¨Osg/era dove stavo pensando.
Magic Octopus Urn,

Sai come usare .æ = pop a compute permutations by function, usage: .æ<FUNC>}ancora il comando? Nemmeno io, ma sembra adatto a questo.
Magic Octopus Urn,

@MagicOctopusUrn v senza y è la soluzione più breve che ho trovato per eseguire i tempi di rotazione g (input). Sto controllando il .æ, non sembra che stia registrando <FUNC>}
Kaldo,

2

Stax , 6 byte

ñJä⌠╤►

Esegui ed esegui il debug

Questo programma accetta come input una stringa delimitata da virgole ed esprime la media come frazione ridotta. es. 777/1 Non è necessario de-duplicare le rotazioni. Non cambia mai il risultato.

Disimballato, non golfato e commentato, sembra così.

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

Esegui questo


2

Perl 6 , 15 byte

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

Provalo online!

La media è la media delle cifre applicata a ciascuna posizione decimale, quindi la media delle cifre per 111 .... 1 x $_produce una stringa di 1s che viene forzata in stringhe dal moltiplicare.

Prende un elenco di cifre come input. Una sequenza richiederebbe un .cache prima della somma e un numero o input di stringa avrebbe bisogno di un .comb.



1

JavaScript (Node.js) , 43 byte

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

Provalo online!

Possiamo prendere l'input come un elenco di cifre? - Dennis ♦ 7 minuti fa

@Dennis Certo, va bene. Vai a salvare alcuni byte. : p - AdmBorkBork 3 minuti fa


1

Gelatina , 6 5 byte

ṙJḌÆm

Provalo online!

Come funziona

ṙ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 byte

Accetta l'input come una matrice di stringhe a una cifra.

xpUÊ)÷UÊ

Provalo


Spiegazione

             :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 byte SBCS

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

Provalo online!

Funzione prefisso tacita. Accetta l'input come stringa.

Grazie ad Adám per un illuminante salvataggio di 7 byte .

Come?

+/≢÷⍨⍳∘≢(⍎⌽)¨⊂  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

: | non riesco ancora ad abituarmi ai commenti APL
solo ASCII il


1

Carbone , 11 byte

I∕×ΣθI⭆θ1Lθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

    θ  θ  θ 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 byte

10#.#$+/%#

Questa è una porta della grande soluzione APL di H.PWiz per J.

Prende un elenco di cifre come argomento.

Spiegazione:

+/%#la media delle cifre (dividere %la somma delle cifre +/per il loro numero #)

#$crea un elenco di copie della media in base al numero di cifre

10#. converti dalla base 10

Provalo online!


1

Perl 5 -lpF , 24 22 byte

#!/usr/bin/perl -lpF
$_=1x@F/s/./+$&/g*eval

Provalo online!

Farlo come un elenco di cifre è solo di 1 byte più corto e sembra come imbrogliare:

#!/usr/bin/perl -p
$;+=$_}{$_=1x$./$.*$

Provalo online!


cosa usrt? : P
ASCII il

@ Solo ASCII Aspetta, non hai i tuoi eseguibili nella /usrtdirectory? Comunque, riparato. Grazie
Ton Hospel,




1

C ++, 218 208 byte

-10 byte grazie a 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();}

E, per testare:

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

1
Non hai bisogno di spazi tra #includee <, e si può rimuovere il {}giro sia ++c;e s+=v;. Potresti essere in grado di spostarti int s=0all'inizio con le altre variabili.
Zacharý,

1
Inoltre, non penso che tu abbia bisogno del n=0secondo nel ciclo, come avrebbe dovuto raggiungere 0da allora. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. E non usare al intposto del autolavoro?
Zacharý,

Puoi ancora spostarti int s=0;con le altre variabili e hai bisogno delle parentesi graffe intorno al s+=v;?
Zacharý,


n>0=> npotrebbe funzionare.
Zacharý,

0

Pyth, 12 byte

csms.<zdlzlz

Probabilmente migliorabile.

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

Provalo qui!


There's a built-in average function o. If you do that and do I/O as lists of digits, you can get it down to 8 bytes.

Ah, I was taking "If applicable, you can assume that the input/output will fit in your language's native Integer type." to mean that it had to be an integer if taken in as Q.
RK.

0

J, 23 Bytes

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

Takes input as a string

Explanation

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

0

Matlab, 65 bytes

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

Gonna work on this, pretty sure it can be done better.


0

Clojure, 139 bytes

#(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)))

Quite sub-optimal language features for converting sequences of characters to integers.


0

dc, 37 bytes

This is a full program, reading input and printing the output:

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

It works by separating the number into its digits, and multiplying the mean of the digits by the appropriate length repdigit (which is built up in d as we go).

?                               # 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.