Średnia rotacyjna


18

Biorąc pod uwagę wejściową liczbę całkowitą n >= 10, wypisuje średnią wszystkich deduplikowanych obrotów liczby całkowitej.

Na przykład w przypadku danych wejściowych 123obrotami są 123(brak obrotu), 231(jeden obrót) i 312(dwa obroty). Średnia z nich to (123 + 231 + 312) / 3lub 222.

Jako inny przykład weźmy 4928. Obroty są 4928, 9284, 2849, i 8492. Przyjęcie średniej z tych czterech liczb jest równe 6388.25.

Inny przykład, do wejścia 445445, gdy obroty są zdeduplikowane 445445, 454454i 544544, więc wyjście jest 481481.

W przypadku danych wejściowych 777istnieje tylko jeden deduplikowany obrót, więc dane wyjściowe to 777.

Zasady

  • Jeśli ma to zastosowanie, możesz założyć, że wejście / wyjście będzie pasować do rodzimego typu Integer w twoim języku.
  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Czy możemy przyjmować dane wejściowe jako listę cyfr?
Dennis

3
@Dennis Pewnie, w porządku. Idź, zapisz trochę bajtów. : p
AdmBorkBork

3
Czy masz przykład, w którym deduplikacja faktycznie zmienia dane wyjściowe? W przykładzie 445445 każde 3 unikalne obroty występują dwa razy, więc pozostawienie ich nie zmienia wyniku.
Kaldo

@Kaldo Nie, nie byłem w stanie (ręcznie) wymyślić jednego, ale to nie znaczy, że nie istnieje, więc zostawiłem zasady deduplikacji.
AdmBorkBork

13
@Kaldo Niech d będzie liczbą cyfr n i k najmniejszą dodatnią liczbą całkowitą, tak że obrócenie n k cyfr w lewo odtwarza n . Weź q i 0 ≤ r <k tak, że d = qk + r . Obracanie n zarówno cyfr d, jak i qk w lewo musi dać n , więc r = 0 . Oznacza to, że każdy unikalny obrót występuje q razy, więc deduplikacja obrotów nie jest potrzebna do obliczenia średniej.
Dennis

Odpowiedzi:



9

APL (Dyalog) , 9 bajtów

10⊥≢⍴+/÷≢

Funkcja monadyczna przyjmująca jako argument wektor cyfr.

Wypróbuj online!

Biorę średnią cyfr +/÷≢, następnie powtarzam ją na podstawie długości danych wejściowych ≢⍴i na koniec przeliczam z podstawy 10.

Koncepcyjnie biorę sumę obrotów (bez przenoszenia):

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

Jest to 4+2+9+8powtarzane 4 razy. Następnie konwersja z bazy 10(która wykonuje dla mnie przewóz) i dzielenie przez długość. Chociaż wcześniej dzielę przez długość, ponieważ jest równa i oszczędza bajty.


1
To genialne: D
Leo

@Leo FWIW odpowiedzi, które mnożą średnią przez cyfrę powtórzeń, robią w zasadzie to samo
H.PWiz

3

Java 10, 163 137 76 72 71 bajtów

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

-36 bajtów dzięki @Nevay .
-61 bajtów dzięki @ OlivierGrégoire poprzez utworzenie portu odpowiedzi @Dennis na Python 3 .
-1 bajtów, przyjmując dane wejściowe jako listę cyfr zamiast ciągu.

Wyjaśnienie:

Wypróbuj 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 bajtów: 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();}podejście strumieniowe z 137 bajtami: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
Użyj orElse(0)zamiast getAsDouble().
Olivier Grégoire,

69 bajtów , w oparciu o rozwiązanie innych osób. W (int)razie potrzeby zaokrąglić za pomocą 5 bajtów mote.
Olivier Grégoire,

Nie musisz rzucać podwójnie: Math.powjuż się tym zajmuje. To pozwoli ci zaoszczędzić 3 bajty.
Olivier Grégoire,

@ OlivierGrégoire Jeśli to zrobię, otrzymam nieprawidłowe wyniki. Używa się rzutowania na liczbę całkowitą, abyśmy mogli podzielić liczbę całkowitą przez 9 i pomnożyć przez sumę cyfr. Dopiero wtedy należy podwoić, aby uzyskać średnią. Jeśli usunę oba (int)i *.1będzie to na przykład wyjście 6388.888...zamiast 6388.25wejścia 4928. A jeśli rzuciłem całą rzecz lub tylko na .pow, intzamiast tego, wyjdzie 6388.
Kevin Cruijssen

3

Łuska , 5 bajtów

d´MKA

Wypróbuj online!

Wyjaśnienie

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

Łuska , 7 bajtów

A§modṙŀ

Wypróbuj online!

Wyjaśnienie

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
W przypadku układanki istnieje co najmniej jedno 5rozwiązanie bajtowe
H.PWiz

@ H.PWiz Nie mogę tego rozgryźć, czy mógłbyś podpowiedzieć? : P
Leo

@Leo Nie ma lub ŀ, a pierwszym znakiem (po lewej) nie jestA
H.PWiz

3

R , 84 73 64 bajty

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

Wypróbuj online!

Wprowadź jako listę cyfr.

Dzięki MickyT za golenie 11 bajtów! 8 bajtów wygolonych dowodem Dennisa, że ​​deduplikacja jest niepotrzebna.


Z nieco innym sposobem obracania numeru dla 73
MickyT

@MickyT aaahhh sprytne wykorzystanie recyklingu!
Giuseppe,

@MickyT array(D,K+1:0)jest krótszy niż matrix(D,K+1,K)bajt.
Giuseppe,

2

05AB1E , 9 bajtów

vÀD}\OIg/

Wypróbuj online!


vnie y, interesujące.
Magic Octopus Urn

gFÀD})¨Osg/ było to, o czym myślałem.
Urna Magicznej Ośmiornicy

Czy wiesz już, jak korzystać z .æ = pop a compute permutations by function, usage: .æ<FUNC>}polecenia? Ja też nie, ale wydaje się, że to pasuje.
Urna Magicznej Ośmiornicy

@MagicOctopusUrn v bez y jest najkrótszym rozwiązaniem, jakie udało mi się znaleźć, aby wykonać obrotu g (wejściowe) razy. Sprawdzam .æ, nie wygląda na to, żeby rejestrował się <FUNC>}
Kaldo,

2

Stax , 6 bajtów

ñJä⌠╤►

Uruchom i debuguj

Ten program jako ciąg przyjmuje łańcuch rozdzielany cudzysłowem i wyraża średnią jako ułamek zredukowany. np 777/1 . nie jest konieczne kopiowanie obrotów. To nigdy nie zmienia wyniku.

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

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

Uruchom ten


2

Perl 6 , 15 bajtów

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

Wypróbuj online!

Średnia to średnia cyfr zastosowana do każdej pozycji dziesiętnej, więc średnia cyfra razy 111 .... 1 x $_daje ciąg 1s, które są wymuszane na ciągi przez mnożenie.

Pobiera na wejściu listę cyfr. Sekwencja wymagałaby .cache przed sumą, a wprowadzenie liczby lub łańcucha wymagałoby .comb.



1

JavaScript (Node.js) , 43 bajty

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

Wypróbuj online!

Czy możemy przyjmować dane wejściowe jako listę cyfr? - Dennis ♦ 7 minut temu

@Dennis Pewnie, w porządku. Idź, zapisz trochę bajtów. : p - AdmBorkBork 3 minuty temu


1

Galaretka , 6 5 bajtów

ṙJḌÆm

Wypróbuj online!

Jak to działa

ṙ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 bajtów

Pobiera dane wejściowe jako tablicę ciągów jednocyfrowych.

xpUÊ)÷UÊ

Spróbuj


Wyjaśnienie

             :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 bajtów SBCS

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

Wypróbuj online!

Funkcja ukrytego przedrostka. Pobiera dane wejściowe jako ciąg.

Dzięki Adám za oświecający 7-bajtowy zapis .

W jaki sposób?

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

: | wciąż nie mogę się przyzwyczaić do komentarzy APL
tylko ASCII


1

Węgiel drzewny , 11 bajtów

I∕×ΣθI⭆θ1Lθ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

    θ  θ  θ 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 bajtów

10#.#$+/%#

Jest to port doskonałego rozwiązania APL H.PWiz dla J.

Jako argument przyjmuje listę cyfr.

Wyjaśnienie:

+/%#średnia cyfr (podziel %sumę cyfr +/przez ich liczbę #)

#$tworzy listę kopii średniej zgodnie z liczbą cyfr

10#. konwertuj bazę formularza 10

Wypróbuj online!






1

C ++, 218 208 bajtów

-10 bajtów dzięki Zacharýowi

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

I do przetestowania:

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

1
Nie potrzebujesz spacji między #includei <, i możesz usunąć {}wokół nich zarówno ++c;i s+=v;. Możesz być w stanie przenieść int s=0początek na inne zmienne.
Zacharý

1
Poza tym nie sądzę, żebyś potrzebował n=0drugiej pętli for, ponieważ do tego czasu powinna była dotrzeć 0. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. I nie używałbyś intzamiast autopracy?
Zacharý

Nadal możesz poruszać się int s=0;przy innych zmiennych i czy potrzebujesz nawiasów klamrowych wokół s+=v;?
Zacharý


n>0=> nmoże działać.
Zacharý

0

Pyth, 12 bajtów

csms.<zdlzlz

Prawdopodobnie można to poprawić.

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

Wypróbuj tutaj!


Istnieje wbudowana średnia funkcja o. Jeśli to zrobisz i zrobisz operacje we / wy jako listy cyfr, możesz zmniejszyć to do 8 bajtów .

Ach, brałem „Jeśli dotyczy, możesz założyć, że wejście / wyjście będzie pasować do rodzimego typu Integer twojego języka”. oznacza to, że musi być liczbą całkowitą, jeśli zostanie przyjęty jako Q.
RK.

0

J, 23 bajtów

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

Pobiera dane wejściowe jako ciąg

Wyjaśnienie

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

0

Matlab, 65 bajtów

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

Popracuję nad tym, całkiem pewnie, że można to zrobić lepiej.


0

Clojure, 139 bajtów

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

Dość nieoptymalne funkcje językowe do konwersji sekwencji znaków na liczby całkowite.


0

dc, 37 bajtów

Jest to pełny program, odczytujący dane wejściowe i drukujący dane wyjściowe:

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

Działa poprzez rozdzielenie liczby na cyfry i pomnożenie średniej cyfr przez reprodukcję o odpowiedniej długości (która jest budowana w dmiarę upływu czasu).

?                               # 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.