Trung bình quay


18

Cho một số nguyên đầu vào n >= 10, xuất trung bình của tất cả các phép quay được lặp lại của số nguyên.

Ví dụ, đối với đầu vào 123, các phép quay là 123(không quay), 231(một vòng quay) và 312(hai vòng quay). Trung bình của những người là (123 + 231 + 312) / 3hoặc 222.

Một ví dụ khác, lấy 4928. Các phép quay là 4928, 9284, 2849, và 8492. Lấy trung bình của bốn số đó bằng nhau 6388.25.

Ví dụ khác, ví đầu vào 445445, các phép quay không trùng lặp là 445445, 454454544544, vì vậy sản lượng là 481481.

Đối với đầu vào 777, chỉ có một vòng quay trùng lặp, vì vậy đầu ra là 777.

Quy tắc

  • Nếu có thể, bạn có thể giả sử rằng đầu vào / đầu ra sẽ phù hợp với loại Số nguyên gốc của ngôn ngữ của bạn.
  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện .
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Chúng ta có thể lấy đầu vào là một danh sách các chữ số?
Dennis

3
@Dennis Chắc chắn, điều đó tốt. Đi lưu một số byte. : p
admBorkBork

3
Bạn có một ví dụ trong đó sự trùng lặp thực sự thay đổi đầu ra? Trong ví dụ 445445 của bạn, mỗi 3 vòng quay duy nhất xảy ra hai lần, do đó, chúng không làm thay đổi đầu ra.
Kaldo

@Kaldo Không, tôi không thể (bằng tay) đưa ra một cái, nhưng điều đó không có nghĩa là nó không tồn tại, vì vậy tôi đã để lại các quy tắc chống trùng lặp.
admBorkBork

13
@Kaldo Gọi d là số chữ số của nk là số nguyên dương nhỏ nhất sao cho xoay n k chữ số sang trái tái tạo n . Lấy q0 r <k sao cho d = qk + r . Xoay n cả hai chữ số dqk sang trái phải mang lại n , do đó r = 0 . Điều này có nghĩa là mỗi lần quay duy nhất xảy ra q lần, do đó, việc lặp lại các phép quay không cần thiết để tính trung bình.
Dennis

Câu trả lời:


11

Python 3 , 38 36 byte

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

Lấy các chữ số làm đối số riêng biệt. Cảm ơn @Rod đã đề xuất Python 3, tiết kiệm 2 byte.

Hãy thử trực tuyến!


Một byte bổ sung có thể được lưu bằng cách chuyển trở lại Python 2 và lấy một mảng float.
Dennis

Bạn không cần phải lấy các chữ số làm đối số riêng biệt, một danh sách cũ thông thường sẽ hoạt động tốt
Asone Tuhid

9

APL (Dyalog) , 9 byte

10⊥≢⍴+/÷≢

Một hàm đơn trị lấy một vectơ các chữ số làm đối số.

Hãy thử trực tuyến!

Tôi lấy trung bình của các chữ số +/÷≢, sau đó lặp lại nó theo độ dài của đầu vào ≢⍴, và cuối cùng chuyển đổi từ cơ sở 10.

Về mặt khái niệm, tôi đang lấy tổng số vòng quay (không mang theo):

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

Điều này chỉ được 4+2+9+8lặp lại 4 lần. Sau đó chuyển đổi từ cơ sở 10(mà thực hiện cho tôi) và chia cho chiều dài. Mặc dù tôi chia cho độ dài trước đó vì nó tương đương và tiết kiệm byte.


1
Đó là thể loại: D
Leo

@Leo FWIW các câu trả lời nhân trung bình với một chữ số đại diện về cơ bản là giống nhau
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 nhờ @Nevay .
-61 bytes nhờ @ OlivierGrégoire bằng cách tạo ra một cổng của @Dennis Python 3 câu trả lời ' .
-1 byte bằng cách lấy đầu vào làm Danh sách các chữ số thay vì Chuỗi.

Giải trình:

Hãy thử trực tuyến.

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();}, cách tiếp cận luồng với 137 byte: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
Sử dụng orElse(0)thay vì getAsDouble().
Olivier Grégoire

69 byte , dựa trên giải pháp của người khác. Làm tròn bằng (int)5 byte, nếu cần.
Olivier Grégoire

Bạn không cần phải đóng vai đôi: Math.powđã quan tâm đến điều đó. Điều đó sẽ tiết kiệm cho bạn 3 byte.
Olivier Grégoire

@ OlivierGrégoire Nó sẽ cho kết quả không chính xác nếu tôi làm điều đó. Chuyển từ sang int được sử dụng để chúng ta có thể chia số nguyên bằng 9 và nhân với tổng các chữ số. Chỉ sau đó nó nên tăng gấp đôi để có được mức trung bình. Nếu tôi loại bỏ cả hai (int)*.1nó sẽ cho đầu ra ví dụ 6388.888...thay vì 6388.25cho đầu vào 4928. Và nếu tôi đúc toàn bộ điều hay chỉ là .powmột intthay vào đó, nó sẽ ra 6388.
Kevin Cruijssen

3

Husk , 5 byte

d´MKA

Hãy thử trực tuyến!

Giải trình

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

Husk , 7 byte

A§modṙŀ

Hãy thử trực tuyến!

Giải trình

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
Đối với một câu đố, có ít nhất một 5giải pháp byte
H.PWiz

@ H.PWiz Tôi không thể tìm ra nó, bạn có thể đưa ra một gợi ý? : P
Leo

@Leo Không có hoặc ŀ, và ký tự đầu tiên (bên trái) thì khôngA
H.PWiz

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

Hãy thử trực tuyến!

Nhập dưới dạng danh sách các chữ số.

Cảm ơn MickyT đã cạo sạch 11 byte! 8 byte được cạo bởi bằng chứng của Dennis rằng sự trùng lặp là không cần thiết.


Với một cách hơi khác để xoay số cho 73
MickyT

@MickyT aaahhh sử dụng tái chế thông minh!
Giuseppe

@MickyT array(D,K+1:0)ngắn hơn matrix(D,K+1,K)một byte.
Giuseppe

2

05AB1E , 9 byte

vÀD}\OIg/

Hãy thử trực tuyến!


vkhông y, thú vị
Bạch tuộc ma thuật Urn

gFÀD})¨Osg/là nơi tôi đã suy nghĩ.
Bạch tuộc ma thuật Urn

Bạn đã biết cách sử dụng .æ = pop a compute permutations by function, usage: .æ<FUNC>}lệnh chưa? Tôi cũng không, nhưng có vẻ phù hợp với điều này.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn v mà không có y là giải pháp ngắn nhất tôi có thể tìm thấy để thực hiện vòng quay g (đầu vào) lần. Tôi đang kiểm tra .æ, có vẻ như nó không đăng ký <FUNC>}
Kaldo

2

Stax , 6 byte

ñJä⌠╤►

Chạy và gỡ lỗi nó

Chương trình này lấy một chuỗi phân tách trích dẫn làm đầu vào và biểu thị mức trung bình dưới dạng phân số giảm. ví dụ: 777/1 Không cần thiết phải sao chép lại các phép quay. Nó không bao giờ thay đổi kết quả.

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

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

Chạy cái này


2

Perl 6 , 15 byte

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

Hãy thử trực tuyến!

Trung bình là trung bình chữ số được áp dụng cho từng vị trí thập phân, do đó, trung bình chữ số nhân 111 .... 1 x $_tạo ra một chuỗi 1s được ép buộc thành chuỗi theo bội số.

Đưa ra một danh sách các chữ số làm đầu vào. Một chuỗi sẽ yêu cầu một .cache trước tổng và một đầu vào số hoặc chuỗi sẽ cần một .comb.



1

JavaScript (Node.js) , 43 byte

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

Hãy thử trực tuyến!

Chúng ta có thể lấy đầu vào là một danh sách các chữ số? - Dennis ♦ 7 phút trước

@Dennis Chắc chắn, điều đó tốt. Đi lưu một số byte. : p - admBorkBork 3 phút trước


1

Thạch , 6 5 byte

ṙJḌÆm

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ṙ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

Lấy đầu vào là một chuỗi các chuỗi số đơn.

xpUÊ)÷UÊ

Thử nó


Giải trình

             :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

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

Hãy thử trực tuyến!

Hàm tiền tố ngầm. Đưa đầu vào dưới dạng một chuỗi.

Cảm ơn Adám vì đã tiết kiệm được 7 byte .

Làm sao?

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

: | vẫn không thể quen với các bình luận APL
ASCII - chỉ


1

than củi , 11 byte

I∕×ΣθI⭆θ1Lθ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Đây là một cổng của giải pháp APL tuyệt vời của H.PWiz cho J.

Lấy một danh sách các chữ số làm đối số.

Giải trình:

+/%#trung bình của các chữ số (chia %tổng các chữ số cho số +/của chúng# )

#$tạo một danh sách các bản sao trung bình theo số chữ số

10#. chuyển đổi cơ sở mẫu 10

Hãy thử trực tuyến!






1

C ++, 218 208 byte

-10 byte nhờ 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();}

Và, để kiểm tra:

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

1
Bạn không cần khoảng trắng giữa #include<, và bạn có thể xóa {}khoảng xung quanh cả hai ++c;s+=v;. Bạn có thể có thể di chuyển int s=0từ đầu với các biến khác của bạn.
Zacharý

1
Ngoài ra, tôi không nghĩ rằng bạn cần n=0vòng lặp thứ hai, vì nó đã đạt đến 0lúc đó. m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. Và sẽ không sử dụng intthay vì autolàm việc?
Zacharý

Bạn vẫn có thể di chuyển int s=0;với các biến khác của mình và bạn có cần niềng răng xung quanh s+=v;không?
Zacharý


n>0=> ncó thể hoạt động.
Zacharý

0

Bình thường, 12 byte

csms.<zdlzlz

Có lẽ là ngẫu hứng.

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

Hãy thử nó ở đây!


Có một chức năng trung bình tích hợp o. Nếu bạn làm điều đó và thực hiện I / O dưới dạng danh sách các chữ số, bạn có thể lấy nó xuống còn 8 byte .

À, tôi đã lấy "Nếu có thể, bạn có thể giả sử rằng đầu vào / đầu ra sẽ phù hợp với loại Số nguyên gốc của ngôn ngữ của bạn." có nghĩa là nó phải là một số nguyên nếu được sử dụng dưới dạng Q.
RK.

0

J, 23 byte

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

Lấy đầu vào dưới dạng chuỗi

Giải trình

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

Gonna làm việc này, khá chắc chắn rằng nó có thể được thực hiện tốt hơn.


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

Khá nhiều tính năng ngôn ngữ phụ tối ưu để chuyển đổi chuỗi ký tự thành số nguyên.


0

dc, 37 byte

Đây là một chương trình đầy đủ, đọc đầu vào và in đầu ra:

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

Nó hoạt động bằng cách tách số thành các chữ số của nó và nhân giá trị trung bình của các chữ số với chữ số có độ dài phù hợp (được xây dựng dkhi chúng ta đi).

?                               # 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.