Rata-rata rotasi

18

Diberikan integer input n >= 10, output rata-rata semua rotasi deduplicated dari integer.

Sebagai contoh, untuk input 123, rotasi adalah 123(tidak ada rotasi), 231(satu rotasi) dan 312(dua rotasi). Rata-rata dari mereka adalah (123 + 231 + 312) / 3atau 222.

Sebagai contoh lain, ambil 4928. Rotasi adalah 4928, 9284, 2849, dan 8492. Mengambil rata-rata dari keempat angka itu sama 6388.25.

Sebagai contoh lain, untuk input 445445, rotasi deduplicated yang 445445, 454454dan 544544, sehingga output 481481.

Untuk input 777, hanya ada satu rotasi deduplicated, jadi outputnya 777.

Aturan

  • Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
Bisakah kita mengambil input sebagai daftar digit?
Dennis
3
@ Dennis Tentu, tidak apa-apa. Pergi, simpan beberapa byte. : p
AdmBorkBork
3
Apakah Anda memiliki contoh di mana deduplikasi sebenarnya mengubah output? Dalam contoh 445445 Anda, masing-masing 3 rotasi unik terjadi dua kali, jadi membiarkannya tidak mengubah output.
Kaldo
@Kaldo Tidak, saya tidak dapat (secara manual) membuat satu, tapi itu tidak berarti tidak ada, jadi saya meninggalkan aturan deduplikasi di tempat.
AdmBorkBork
13
@ Kaldo Misalkan d adalah jumlah digit n dan k bilangan bulat positif terkecil sehingga berputar n k digit ke kiri mereproduksi n . Ambil q dan 0 ≤ r <k sehingga d = qk + r . Berputar n baik d dan QK Angka kiri harus menghasilkan n , sehingga r = 0 . Ini berarti setiap rotasi unik terjadi q kali, jadi deduplikasi rotasi tidak diperlukan untuk menghitung rata-rata.
Dennis

Jawaban:

11

Python 3 , 38 36 byte

lambda*n:10**len(n)//9*sum(n)/len(n)

Mengambil digit sebagai argumen terpisah. Terima kasih kepada @Rod untuk menyarankan Python 3, menghemat 2 byte.

Cobalah online!

Dennis
sumber
Byte tambahan dapat disimpan dengan beralih kembali ke Python 2 dan mengambil array float.
Dennis
Anda tidak perlu mengambil digit sebagai argumen terpisah, daftar lama yang biasa tidak apa
Asone Tuhid
9

APL (Dyalog) , 9 byte

10⊥≢⍴+/÷≢

Fungsi monadik mengambil vektor digit sebagai argumen.

Cobalah online!

Saya mengambil rata-rata digit +/÷≢ , kemudian mengulanginya dengan panjang input ≢⍴, dan akhirnya dikonversi dari basis 10.

Secara konsep, saya mengambil jumlah rotasi (tanpa membawa):

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

Ini baru 4+2+9+8diulang 4 kali. Kemudian mengkonversi dari basis 10(yang membawa untuk saya) dan membaginya dengan panjang. Meskipun saya membagi dengan panjang sebelumnya karena itu sama dan menyimpan byte.

H.Piz
sumber
1
Itu ramah: D
Leo
@ Leo FWIW jawaban yang menggandakan rata-rata dengan digit rep melakukan dasarnya hal yang sama
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 berkat @Nevay .
-61 byte terima kasih kepada @ OlivierGrégoire dengan membuat porta @Dennis 'Python 3 jawaban .
-1 byte dengan mengambil input sebagai Daftar digit, bukan String.

Penjelasan:

Cobalah 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
Kevin Cruijssen
sumber
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();}n->java.util.stream.IntStream.range(0,n.length()).map(i->new Integer(n.substring(i)+n.substring(0,i))).distinct().average().getAsDouble()
:,
1
Gunakan orElse(0)sebagai ganti getAsDouble().
Olivier Grégoire
69 byte , berdasarkan solusi orang lain. Bulat menggunakan (int)untuk 5 mote byte, jika perlu.
Olivier Grégoire
Anda tidak perlu berperan sebagai ganda: Math.powsudah mengurusnya. Itu akan menghemat 3 byte.
Olivier Grégoire
@ OlivierGrégoire Akan memberikan hasil yang salah jika saya melakukan itu. Cast ke int digunakan sehingga kita bisa integer -divide dengan 9 dan kalikan dengan jumlah digit. Hanya dengan demikian seharusnya dua kali lipat untuk mendapatkan rata-rata. Jika saya menghapus keduanya (int)dan *.1itu akan misalnya output 6388.888...bukan 6388.25untuk input 4928. Dan jika saya melemparkan seluruh hal atau hanya .powke intgantinya, itu akan menampilkan 6388.
Kevin Cruijssen
3

Sekam , 5 byte

d´MKA

Cobalah online!

Penjelasan

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

Sekam , 7 byte

A§modṙŀ

Cobalah online!

Penjelasan

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
Fyr
sumber
1
Untuk teka-teki, setidaknya ada satu 5solusi byte
H.PWiz
@ H.Piz. Saya tidak tahu, bisakah Anda memberikan petunjuk? : P
Leo
@ Leo Tidak ada atau ŀ, dan karakter pertama (di sebelah kiri) tidakA
H.Piz
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))

Cobalah online!

Input sebagai daftar digit.

Terima kasih kepada MickyT karena telah mengurangi 11 byte! 8 byte dicukur oleh bukti Dennis bahwa deduplikasi tidak diperlukan.

Giuseppe
sumber
Dengan cara yang sedikit berbeda untuk memutar nomor untuk 73
MickyT
@MickyT aaahhh pintar menggunakan daur ulang!
Giuseppe
@MickyT array(D,K+1:0)lebih pendek dari matrix(D,K+1,K)satu byte.
Giuseppe
2

05AB1E , 9 byte

vÀD}\OIg/

Cobalah online!

Kaldo
sumber
vtanpa y, menarik.
Guci Gurita Sihir
gFÀD})¨Osg/adalah tempat saya berpikir.
Guci Gurita Sihir
Apakah Anda tahu cara menggunakan .æ = pop a compute permutations by function, usage: .æ<FUNC>}perintah? Saya juga tidak, tapi sepertinya cocok untuk ini.
Guci Gurita Sihir
@ MagicOctopusUrn v tanpa y adalah solusi terpendek yang dapat saya temukan untuk melakukan rotasi g (input) kali. Saya sedang memeriksa .æ, sepertinya tidak sedang mendaftar <FUNC>}
Kaldo
2

Stax , 6 byte

ñJä⌠╤►

Jalankan dan debug itu

Program ini mengambil string yang dibatasi kutipan sebagai input, dan menyatakan rata-rata sebagai fraksi yang dikurangi. mis. 777/1 Tidak perlu menduplikasi duplikasi rotasi. Itu tidak pernah mengubah hasilnya.

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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

Jalankan yang ini

rekursif
sumber
2

Perl 6 , 15 byte

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

Cobalah online!

Rata-rata adalah digit rata-rata yang diterapkan ke setiap posisi desimal, jadi digit rata-rata kali .... 1 x $_ menghasilkan string 1s yang dipaksa untuk string oleh multiply.

Mengambil daftar digit sebagai input. Urutan akan membutuhkan .cache sebelum penjumlahan, dan angka atau masukan string akan memerlukan .comb.

Phil H
sumber
1

JavaScript (Node.js) , 43 byte

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

Cobalah online!

Bisakah kita mengambil input sebagai daftar digit? - Dennis ♦ 7 menit yang lalu

@ Dennis Tentu, tidak apa-apa. Pergi, simpan beberapa byte. : p - AdmBorkBork 3 mnt yang lalu

l4m2
sumber
1

Jelly , 6 5 byte

ṙJḌÆm

Cobalah online!

Bagaimana itu bekerja

ṙ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.
Dennis
sumber
1

Japt , 8 byte

Mengambil input sebagai array string satu digit.

xpUÊ)÷UÊ

Cobalah


Penjelasan

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

APL (Dyalog Unicode) , 21 14 byte SBCS

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

Cobalah online!

Fungsi awalan Tacit. Mengambil input sebagai string.

Terima kasih kepada Adám untuk menghemat 7 byte yang mencerahkan .

Bagaimana?

+/≢÷⍨⍳∘≢(⍎⌽)¨⊂  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
J. Sallé
sumber
: | masih belum terbiasa dengan komentar APL
ASCII
1

Python 2, 83 77 byte

def f(a):b={int(`a`[i:]+`a`[:i])for i in range(len(`a`))};print sum(b)/len(b)

EDIT: -6 byte terima kasih kepada @ovs

sonrad10
sumber
1

Arang , 11 byte

I∕×ΣθI⭆θ1Lθ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

    θ  θ  θ 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
Neil
sumber
1

J , 10 byte

10#.#$+/%#

Ini adalah port solusi APL H.PWiz yang hebat untuk J.

Mengambil daftar digit sebagai argumen.

Penjelasan:

+/%#rata-rata digit (bagi %jumlah digit +/dengan jumlah mereka #)

#$membuat daftar salinan rata-rata sesuai dengan jumlah digit

10#. konversi bentuk basis 10

Cobalah online!

Galen Ivanov
sumber
1

Perl 5 -lpF , 24 22 byte

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

Cobalah online!

Melakukannya sebagai daftar digit hanya 1 byte lebih pendek dan terasa seperti curang:

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

Cobalah online!

Ton Hospel
sumber
apa usrt? : P
ASCII-satunya
@ Khusus ASCII Tunggu, Anda tidak memiliki file executable di /usrtdirektori? Bagaimanapun, diperbaiki. Terima kasih
Ton Hospel
1

Ruby , 60 byte

->n{a=b=c=0.0;a,b,c,n=a+n%10,b*10+1,c+1,n/10while n>0;a*b/c}

Cobalah online!

GB
sumber
1

C ++, 218 208 byte

-10 byte terima kasih kepada 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();}

Dan, untuk menguji:

int main() {
    printf("%f\n%f\n%f\n%f\n",a(123),a(4928),a(445445),a(777));
}
HatsuPointerKun
sumber
1
Anda tidak perlu spasi di antara #includedan <, dan Anda dapat menghapus {}sekitar keduanya ++c;dan s+=v;. Anda mungkin dapat memindahkan int s=0ke awal dengan variabel Anda yang lain.
Zacharý
1
Juga, saya tidak berpikir Anda membutuhkan n=0yang kedua untuk loop, karena seharusnya sudah tercapai 0saat itu. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. Dan tidak akan menggunakan intalih-alih autobekerja?
Zacharý
Anda masih bisa bergerak int s=0;dengan variabel lain, dan apakah Anda perlu kawat gigi di sekitar s+=v;?
Zacharý
168 byte
ceilingcat
n>0=> nmungkin bekerja.
Zacharý
0

Pyth, 12 byte

csms.<zdlzlz

Mungkin bisa diperbaiki.

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

Coba di sini!

RK.
sumber
Ada fungsi rata-rata bawaan o. Jika Anda melakukan itu dan melakukan I / O sebagai daftar digit, Anda bisa mendapatkannya hingga 8 byte .
Ah, saya mengambil "Jika berlaku, Anda dapat mengasumsikan bahwa input / output akan sesuai dengan tipe Integer asli bahasa Anda." berarti bahwa itu harus bilangan bulat jika diambil sebagai Q.
RK.
0

J, 23 Bytes

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

Mengambil input sebagai string

Penjelasan

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

Matlab, 65 byte

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

Akan bekerja pada ini, cukup yakin itu bisa dilakukan dengan lebih baik.

Leander Moesinger
sumber
0

Clojure, 139 byte

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

Fitur bahasa yang kurang optimal untuk mengubah urutan karakter ke integer.

NikoNyrh
sumber
0

dc, 37 byte

Ini adalah program lengkap, membaca input dan mencetak output:

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

Ia bekerja dengan memisahkan angka ke dalam digit-digitnya, dan mengalikan mean dari digit-digit tersebut dengan repdigit panjang yang sesuai (yang dibangun dsaat kita mulai).

?                               # 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
Toby Speight
sumber