Média rotacional


18

Dado um número inteiro de entrada n >= 10, produza a média de todas as rotações deduplicadas do número inteiro.

Por exemplo, para entrada 123, as rotações são 123(sem rotação), 231(uma rotação) e 312(duas rotações). A média desses é (123 + 231 + 312) / 3ou 222.

Como outro exemplo, tome 4928. As rotações são 4928, 9284, 2849, e 8492. Tomando a média desses quatro números é igual 6388.25.

Para um outro exemplo, para a entrada 445445, as rotações são deduplicados 445445, 454454, e 544544, portanto, a saída é 481481.

Para entrada 777, há apenas uma rotação deduplicada, portanto a saída é 777.

Regras

  • Se aplicável, você pode supor que a entrada / saída caiba no tipo Inteiro nativo do seu idioma.
  • A entrada e saída podem ser fornecidas por qualquer método conveniente .
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

Podemos considerar a entrada como uma lista de dígitos?
Dennis

3
@ Dennis Claro, tudo bem. Vá salvar alguns bytes. : p
AdmBorkBork

3
Você tem um exemplo em que a desduplicação realmente altera a saída? No seu exemplo 445445, cada 3 rotação única acontece duas vezes, portanto, deixá-las não altera a saída.
Kaldo

@ Kaldo Não, eu não consegui (manualmente) criar um, mas isso não significa que ele não exista, então deixei as regras de deduplicação em vigor.
AdmBorkBork

13
@Kaldo Let d ser o número de dígitos de n e k o menor número inteiro positivo, tal que a rotação n k dígitos para os reproduz esquerda n . Tome q e 0 ≤ r <k de modo que d = qk + r . Rotativa n ambos d e qk dígitos à esquerda deve produzir N , então r = 0 . Isso significa que cada rotação exclusiva ocorre q vezes, portanto, a desduplicação das rotações não é necessária para calcular a média.
Dennis

Respostas:



9

APL (Dyalog) , 9 bytes

10⊥≢⍴+/÷≢

Uma função monádica tomando um vetor de dígitos como argumento.

Experimente online!

Pego a média dos dígitos +/÷≢, repito-a pelo comprimento da entrada ≢⍴e, finalmente, converto da base 10.

Conceitualmente, estou tomando a soma das rotações (sem carregar):

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

Isso é 4+2+9+8repetido apenas 4 vezes. Em seguida, convertendo da base 10(que carrega para mim) e dividindo pelo comprimento. Embora eu divida pelo comprimento anteriormente, porque é equivalente e salva bytes.


1
Isso é genial: D
Leo

@Leo FWIW as respostas que se multiplicam a média de um dígito rep estão fazendo essencialmente a mesma coisa
H.PWiz

3

Java 10, 163 137 76 72 71 bytes

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

-36 bytes graças a @Nevay .
-61 bytes graças a @ OlivierGrégoire , criando uma porta de resposta do @Dennis 'Python 3 .
-1 bytes, tomando a entrada como uma lista de dígitos em vez de String.

Explicação:

Experimente 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 bytes 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
Use em orElse(0)vez de getAsDouble().
Olivier Grégoire

69 bytes , com base na solução de outras pessoas. Arredonde usando (int)5 bytes de mote, se necessário.
Olivier Grégoire

Você não precisa usar o dobro: Math.powjá cuida disso. Isso lhe poupará 3 bytes.
Olivier Grégoire

@ OlivierGrégoire Dará resultados incorretos se eu fizer isso. O fundido para int é utilizado para que possamos inteiro -divide por 9 e multiplicar pela soma dos dígitos. Só então deve dobrar para obter a média. Se eu remover os dois (int)e *.1será, por exemplo, saída em 6388.888...vez de 6388.25para a entrada 4928. E se eu transmitir a coisa toda ou apenas a .powum em intvez disso, ela será exibida 6388.
Kevin Cruijssen

3

Casca , 5 bytes

d´MKA

Experimente online!

Explicação

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

Casca , 7 bytes

A§modṙŀ

Experimente online!

Explicação

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
Para um quebra-cabeça, existe pelo menos uma 5solução de byte
#

@ H.PWiz Não consigo descobrir, você poderia dar uma dica? : P
Leo

@Leo Não há ou ŀ, e o primeiro caractere (à esquerda) não éA
H.PWiz

3

R , 84 73 64 bytes

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

Experimente online!

Insira como lista de dígitos.

Obrigado ao MickyT por remover 11 bytes! 8 bytes raspados pela prova de Dennis de que a desduplicação é desnecessária.


Com uma maneira ligeiramente diferente de girar o número para 73
MickyT 16/04/19

@MickyT aaahhh uso inteligente da reciclagem!
Giuseppe

@MickyT array(D,K+1:0)é mais curto que matrix(D,K+1,K)em um byte.
Giuseppe

2

05AB1E , 9 bytes

vÀD}\OIg/

Experimente online!


vsem y, interessante.
Urna Mágica de Polvo

gFÀD})¨Osg/era onde eu estava pensando.
Urna Mágica de Polvo

Você já sabe como usar o .æ = pop a compute permutations by function, usage: .æ<FUNC>}comando? Eu também não, mas parece adequado para isso.
Urna Mágica de Polvo

@MagicOctopusUrn v sem y é a solução mais curta que eu poderia encontrar para executar os tempos de rotação g (entrada). Estou checando o ....., não parece que ele esteja se registrando <FUNC>}
Kaldo 17/04/18

2

Stax , 6 bytes

ñJä⌠╤►

Execute e depure

Este programa usa uma string delimitada por aspas como entrada e expressa a média como uma fração reduzida. Por exemplo 777/1 , não é necessário duplicar as rotações. Isso nunca muda o resultado.

Descompactado, não jogado e comentado, parece com isso.

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

Execute este


2

Perl 6 , 15 bytes

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

Experimente online!

A média é a média de dígitos aplicada a cada posição decimal, portanto, a média dos dígitos vezes 111 .... 1 x $_produz uma sequência de 1s que é coagida pelas seqüências pela multiplicação.

Leva uma lista de dígitos como entrada. Uma sequência exigiria um .cache antes da soma, e uma entrada de número ou sequência precisaria de um .comb.



1

JavaScript (Node.js) , 43 bytes

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

Experimente online!

Podemos considerar a entrada como uma lista de dígitos? - Dennis ♦ 7 mins atrás

@ Dennis Claro, tudo bem. Vá salvar alguns bytes. : p - AdmBorkBork 3 mins atrás


1

Gelatina , 6 5 bytes

ṙJḌÆm

Experimente online!

Como funciona

ṙ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

Japonês , 8 bytes

Recebe a entrada como uma matriz de cadeias de um dígito.

xpUÊ)÷UÊ

Tente


Explicação

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

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

Experimente online!

Função de prefixo tácito. Recebe a entrada como uma sequência.

Agradecemos a Adám por uma economia esclarecedora de 7 bytes .

Quão?

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

: | ainda não pode se acostumar com comentários da APL
somente ASCII


1

Carvão , 11 bytes

I∕×ΣθI⭆θ1Lθ

Experimente online! Link é a versão detalhada do código. Explicação:

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

10#.#$+/%#

Esta é uma porta da ótima solução de APL da H.PWiz para a J.

Leva uma lista de dígitos como argumento.

Explicação:

+/%#a média dos dígitos (divida %a soma dos dígitos +/pelo número #)

#$cria uma lista de cópias da média de acordo com o número de dígitos

10#. converter base de formulário 10

Experimente online!






1

C ++, 218 208 bytes

-10 bytes graças 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, para testar:

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

1
Você não precisa de espaços entre #includee <, e pode remover os {}dois ++c;e s+=v;. Você pode mover int s=0o início com suas outras variáveis.
Zacharý

1
Além disso, não acho que você precise do n=0segundo loop for, como deveria ter chegado 0até lá. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. E não usaria em intvez de autotrabalhar?
Zacharý

Você ainda pode se mover int s=0;com suas outras variáveis ​​e precisa das chaves ao redor do s+=v;?
Zacharý


n>0=> npode funcionar.
Zachary

0

Pitão, 12 bytes

csms.<zdlzlz

Provavelmente improvável.

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

Experimente aqui!


Há uma função média embutida o . Se você fizer isso e fizer E / S como listas de dígitos, poderá reduzi-lo para 8 bytes .

Ah, eu estava usando "Se aplicável, você pode supor que a entrada / saída caiba no tipo Inteiro nativo do seu idioma". para significar que tinha que ser um número inteiro se considerado como Q.
RK.

0

J, 23 bytes

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

Recebe entrada como uma string

Explicação

          (|."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)))

Vou trabalhar nisso, com certeza pode ser melhor.


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

Recursos de linguagem bastante otimizados para converter seqüências de caracteres em números inteiros.


0

dc, 37 bytes

Este é um programa completo, lendo a entrada e imprimindo a saída:

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

Ele funciona separando o número em seus dígitos e multiplicando a média dos dígitos pelo repdigit de comprimento apropriado (que é construído à dmedida que avançamos).

?                               # 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.