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.

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:



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.


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

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

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.


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!


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


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.



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


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.

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

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

: | masih belum terbiasa dengan komentar APL
ASCII


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

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!


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!


apa usrt? : P
ASCII-satunya

@ Khusus ASCII Tunggu, Anda tidak memiliki file executable di /usrtdirektori? Bagaimanapun, diperbaiki. Terima kasih
Ton Hospel




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

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ý


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!


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

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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.