Promedio rotacional


18

Dado un entero de entrada n >= 10, genera el promedio de todas las rotaciones deduplicadas del entero.

Por ejemplo, para la entrada 123, las rotaciones son 123(sin rotación), 231(una rotación) y 312(dos rotaciones). El promedio de esos es (123 + 231 + 312) / 3o 222.

Como otro ejemplo, tómalo 4928. Las rotaciones son 4928, 9284, 2849, y 8492. Tomar el promedio de esos cuatro números es igual 6388.25.

Para otro ejemplo, para la entrada 445445, las rotaciones deduplicados son 445445, 454454, y 544544, por lo que la salida es 481481.

Para la entrada 777, solo hay una rotación deduplicada, por lo que la salida es 777.

Reglas

  • Si corresponde, puede suponer que la entrada / salida se ajustará al tipo entero nativo de su idioma.
  • La entrada y salida se pueden dar por cualquier método conveniente .
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

¿Podemos tomar la entrada como una lista de dígitos?
Dennis

3
@ Dennis Claro, está bien. Ve a guardar algunos bytes. : p
AdmBorkBork

3
¿Tiene un ejemplo donde la deduplicación realmente cambia la salida? En su ejemplo 445445, cada 3 rotaciones únicas ocurren dos veces, por lo que dejarlas no cambia la salida.
Kaldo

@Kaldo No, no pude (manualmente) crear una, pero eso no significa que no exista, así que dejé las reglas de deduplicación en su lugar.
AdmBorkBork

13
@Kaldo Sea d el número de dígitos de n y k, el entero positivo más pequeño, de modo que al girar n k dígitos hacia la izquierda se reproduce n . Tome q y 0 ≤ r <k tal que d = qk + r . Rotación n ambos d y qk dígitos a la izquierda deben ceder n , por lo que r = 0 . Esto significa que cada rotación única ocurre q veces, por lo que no es necesario deduplicar las rotaciones para calcular el promedio.
Dennis

Respuestas:



9

APL (Dyalog) , 9 bytes

10⊥≢⍴+/÷≢

Una función monádica que toma un vector de dígitos como argumento.

Pruébalo en línea!

Tomo el promedio de los dígitos +/÷≢, luego lo repito por la longitud de la entrada ≢⍴y finalmente convierto desde la base 10.

Conceptualmente, estoy tomando la suma de las rotaciones (sin llevar):

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

Esto solo se 4+2+9+8repite 4 veces. Luego, convertir desde la base 10(que hace el transporte por mí) y dividir por la longitud. Aunque divido por la longitud anterior porque es equitativo y guarda bytes.


1
Eso es genial: D
Leo

@Leo FWIW las respuestas que multiplican el promedio por un dígito de repetición están haciendo esencialmente lo mismo
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 gracias a @Nevay .
-61 bytes gracias a @ OlivierGrégoire al crear un puerto de @Dennis 'Python 3 respuesta .
-1 bytes tomando la entrada como una Lista de dígitos en lugar de String.

Explicación:

Pruébalo en línea.

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();}, enfoque de flujo con 137 bytes: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
Usar en orElse(0)lugar de getAsDouble().
Olivier Grégoire

69 bytes , basado en la solución de otros. Redondear utilizando (int)5 bytes de mote, si es necesario.
Olivier Grégoire

No necesita lanzar como doble: Math.powya se encarga de eso. Eso te ahorrará 3 bytes.
Olivier Grégoire

@ OlivierGrégoire Dará resultados incorrectos si hago eso. La conversión a int se usa para poder dividir enteros por 9 y multiplicar por la suma de dígitos. Solo entonces debería ser un doble para obtener el promedio. Si elimino ambos (int)y *.1, por ejemplo, saldrá en 6388.888...lugar de 6388.25la entrada 4928. Y si lanzo todo o solo .powa un inten su lugar, saldrá 6388.
Kevin Cruijssen

3

Casco , 5 bytes

d´MKA

Pruébalo en línea!

Explicación

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

Casco , 7 bytes

A§modṙŀ

Pruébalo en línea!

Explicación

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 un rompecabezas, hay al menos una 5solución de byte
H.PWiz

@ H.PWiz No puedo entenderlo, ¿podrías dar una pista? : P
Leo

@Leo No hay o ŀ, y el primer personaje (a la izquierda) no esA
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))

Pruébalo en línea!

Entrada como lista de dígitos.

¡Gracias a MickyT por reducir 11 bytes! 8 bytes afeitados por la prueba de Dennis de que la deduplicación es innecesaria.


Con una forma ligeramente diferente de rotar el número para 73
MickyT

@MickyT aaahhh uso inteligente del reciclaje!
Giuseppe

@MickyT array(D,K+1:0)es más corto que matrix(D,K+1,K)un byte.
Giuseppe

2

05AB1E , 9 bytes

vÀD}\OIg/

Pruébalo en línea!


vcon no y, interesante
Magic Octopus Urn

gFÀD})¨Osg/fue donde estaba pensando.
Urna mágica del pulpo

¿Ya sabes cómo usar el .æ = pop a compute permutations by function, usage: .æ<FUNC>}comando? Yo tampoco, pero parece adecuado para esto.
Urna mágica del pulpo

@MagicOctopusUrn v sin y es la solución más corta que pude encontrar para realizar la rotación g (entrada) veces. Estoy revisando el ... no parece que se esté registrando <FUNC>}
Kaldo

2

Stax , 6 bytes

ñJä⌠╤►

Ejecutar y depurarlo

Este programa toma una cadena delimitada por comillas como entrada y expresa el promedio como una fracción reducida. Por ejemplo 777/1 , no es necesario desduplicar las rotaciones. Nunca cambia el resultado.

Desempaquetado, sin golf y comentado, se ve así.

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

Ejecute este


2

Perl 6 , 15 bytes

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

Pruébalo en línea!

El promedio es el promedio de dígitos aplicado a cada posición decimal, por lo que el promedio de dígitos multiplicado por 111 ... 1 x $_produce una cadena de 1s que se multiplican por cadenas.

Toma una lista de dígitos como entrada. Una secuencia requeriría un .cache antes de la suma, y ​​una entrada de número o cadena necesitaría un .comb.



1

JavaScript (Node.js) , 43 bytes

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

Pruébalo en línea!

¿Podemos tomar la entrada como una lista de dígitos? - Dennis ♦ Hace 7 minutos

@ Dennis Claro, está bien. Ve a guardar algunos bytes. : p - AdmBorkBork Hace 3 minutos


1

Jalea , 6 5 bytes

ṙJḌÆm

Pruébalo en línea!

Cómo 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

Japt , 8 bytes

Toma la entrada como una matriz de cadenas de un solo dígito.

xpUÊ)÷UÊ

Intentalo


Explicación

             :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

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

Pruébalo en línea!

Función de prefijo tácito. Toma la entrada como una cadena.

Gracias a Adám por un ahorro esclarecedor de 7 bytes .

¿Cómo?

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

: | sigue sin poder acostumbrarse a los comentarios de APL
solo ASCII el


1

Carbón , 11 bytes

I∕×ΣθI⭆θ1Lθ

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

    θ  θ  θ 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#.#$+/%#

Este es un puerto de la gran solución APL de H.PWiz para J.

Toma una lista de dígitos como argumento.

Explicación:

+/%#el promedio de los dígitos (divida %la suma de los dígitos +/por su número #)

#$crea una lista de copias del promedio de acuerdo con el número de dígitos

10#. convertir formulario base 10

Pruébalo en línea!






1

C ++, 218 208 bytes

-10 bytes gracias 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();}

Y, para probar:

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

1
No necesita espacios entre #includey <, y puede eliminar el {}alrededor de ambos ++c;y s+=v;. Es posible que pueda mover int s=0al principio con sus otras variables.
Zacharý

1
Además, no creo que necesite el n=0bucle for en el segundo, ya que debería haber llegado 0para entonces. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. ¿Y no usaría en intlugar de autotrabajar?
Zacharý

Todavía puedes moverte int s=0;con tus otras variables, ¿y necesitas las llaves alrededor del s+=v;?
Zacharý


n>0=> npodría funcionar.
Zacharý

0

Pyth, 12 bytes

csms.<zdlzlz

Probablemente mejorable.

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

Pruébalo aquí!


Hay una función promedio incorporada o. Si hace eso y hace E / S como listas de dígitos, puede reducirlo a 8 bytes .

Ah, estaba tomando "Si corresponde, puede suponer que la entrada / salida se ajustará al tipo entero nativo de su idioma". querer decir que tenía que ser un número entero si se tomaba como Q.
RK.

0

J, 23 bytes

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

Toma la entrada como una cadena

Explicación

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

Voy a trabajar en esto, bastante seguro de que se puede hacer mejor.


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

Funciones de lenguaje bastante subóptimas para convertir secuencias de caracteres en enteros.


0

cc, 37 bytes

Este es un programa completo, que lee la entrada e imprime la salida:

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

Funciona separando el número en sus dígitos y multiplicando la media de los dígitos por el digito de longitud apropiado (que se acumula a dmedida que avanzamos).

?                               # 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.