ค่าเฉลี่ยการหมุน


18

รับค่าอินพุตจำนวนเต็มn >= 10ส่งออกค่าเฉลี่ยของการหมุนที่ซ้ำซ้อนทั้งหมดของจำนวนเต็ม

ตัวอย่างเช่นสำหรับอินพุต123การหมุนคือ123(ไม่มีการหมุน), 231(หนึ่งการหมุน) และ312(การหมุนสองครั้ง) ค่าเฉลี่ยของผู้ที่เป็นหรือ(123 + 231 + 312) / 3222

เป็นอีกตัวอย่าง4928หนึ่ง หมุนเป็น4928, 9284, และ2849 การเฉลี่ยของผู้ที่ตัวเลขสี่เท่ากับ84926388.25

สำหรับอีกตัวอย่างหนึ่งสำหรับการป้อนข้อมูล445445ที่ผลัดซ้ำมี445445, 454454และเพื่อส่งออกเป็น544544481481

สำหรับการป้อนข้อมูลมีเพียงหนึ่งหมุนซ้ำเพื่อให้ออกเป็น777777

กฎระเบียบ

  • หากเป็นไปได้คุณสามารถสันนิษฐานได้ว่าอินพุต / เอาท์พุตจะพอดีกับภาษาของคุณ Integer
  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

เราสามารถรับข้อมูลเป็นรายการตัวเลขได้หรือไม่?
Dennis

3
@Dennis แน่นอนนั่นเป็นเรื่องปกติ ไปบันทึกไบต์ : p
AdmBorkBork

3
คุณมีตัวอย่างที่การลดการซ้ำซ้อนจริงเปลี่ยนผลลัพธ์หรือไม่? ในตัวอย่าง 445445 ของคุณการหมุนที่ไม่ซ้ำกัน 3 ครั้งจะเกิดขึ้นสองครั้งดังนั้นการปล่อยให้พวกมันไม่เปลี่ยนผลลัพธ์
Kaldo

@ Kaldo ไม่ฉันไม่สามารถ (ด้วยตนเอง) เกิดขึ้นได้ แต่นั่นไม่ได้หมายความว่าไม่มีอยู่จริงดังนั้นฉันจึงทิ้งกฎการขจัดความซ้ำซ้อนไว้
AdmBorkBork

13
@Kaldo Let dเป็นจำนวนตัวเลขของnและkจำนวนเต็มบวกที่เล็กที่สุดเช่นที่หมุนn kตัวเลขการผลิตซ้ำทางซ้ายn ใช้Qและ0 ≤ R <kดังกล่าวว่าd = QK + R หมุนnทั้งDและQKตัวเลขไปทางซ้ายจะต้องให้ผลผลิตnดังนั้นr = 0 ซึ่งหมายความว่าแต่ละการหมุนที่ไม่ซ้ำกันเกิดขึ้นq คูณดังนั้นการซ้ำซ้อนของการหมุนจึงไม่จำเป็นต้องคำนวณค่าเฉลี่ย
Dennis

คำตอบ:


11

Python 3 , 38 36 ไบต์

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

นำตัวเลขเป็นอาร์กิวเมนต์แยกกัน ขอบคุณ @Rod ที่แนะนำ Python 3 ประหยัด 2 ไบต์

ลองออนไลน์!


สามารถบันทึกไบต์เพิ่มเติมได้โดยสลับกลับไปที่ Python 2 และรับอาร์เรย์เป็นแบบลอย
Dennis

คุณไม่จำเป็นต้องใช้ตัวเลขเป็นข้อโต้แย้งแยกรายการเก่าปกติทำได้ดี
Asone Tuhid

9

APL (Dyalog)ขนาด 9 ไบต์

10⊥≢⍴+/÷≢

ฟังก์ชัน monadic ที่ใช้เวกเตอร์ของตัวเลขเป็นอาร์กิวเมนต์

ลองออนไลน์!

ฉันหาค่าเฉลี่ยของตัวเลข+/÷≢จากนั้นทำซ้ำตามความยาวของอินพุต≢⍴และในที่สุดก็แปลงจากฐาน 10

ตามแนวคิดฉันกำลังหาผลรวมของการหมุน (โดยไม่ต้องถือ):

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

นี่เป็นเพียงแค่4+2+9+8ทำซ้ำ 4 ครั้ง จากนั้นแปลงจากฐาน10(ซึ่งแบกสำหรับฉัน) และหารด้วยความยาว แม้ว่าฉันจะหารด้วยความยาวก่อนหน้านี้เพราะมันมีความเท่าเทียมและประหยัดไบต์


1
นั่นเป็นความใจดี: D
Leo

@Leo FWIW คำตอบที่ทวีคูณโดยเฉลี่ยโดยตัวแทนหลักกำลังทำสิ่งเดียวกัน
H.PWiz

3

Java 10, 163 137 76 72 71 ไบต์

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

-36 ไบต์ขอบคุณที่@Nevay
-61 ไบต์ขอบคุณที่@ OlivierGrégoireโดยการสร้างพอร์ตของ@Dennis 'งูใหญ่ 3 คำตอบ
-1 ไบต์โดยการป้อนข้อมูลเป็นรายการหลักแทนที่จะเป็นสตริง

คำอธิบาย:

ลองออนไลน์

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();}n->java.util.stream.IntStream.range(0,n.length()).map(i->new Integer(n.substring(i)+n.substring(0,i))).distinct().average().getAsDouble()
:,

1
ใช้แทนorElse(0) getAsDouble()
Olivier Grégoire

69 ไบต์ขึ้นอยู่กับโซลูชันของผู้อื่น ปัดเศษ(int)เป็นไบต์ 5 โมทย์หากจำเป็น
Olivier Grégoire

คุณไม่จำเป็นต้องแสดงเป็นสองเท่า: Math.powดูแลเรื่องนี้อยู่แล้ว นั่นจะทำให้คุณว่าง 3 ไบต์
Olivier Grégoire

@ OlivierGrégoireมันจะให้ผลลัพธ์ที่ไม่ถูกต้องถ้าฉันทำอย่างนั้น cast to int ถูกใช้เพื่อให้เราสามารถจำนวนเต็ม -divide ด้วย 9 และคูณด้วยผลรวมของตัวเลข เท่านั้นจึงควรเป็นสองเท่าเพื่อให้ได้ค่าเฉลี่ย ถ้าผมเอาทั้งสอง(int)และ*.1มันจะยกตัวอย่างเช่นการส่งออก6388.888...แทนสำหรับการป้อนข้อมูล6388.25 4928และถ้าเราขับสิ่งทั้งหมดหรือเพียงแค่.powกับผู้แทนมันจะออกint 6388
Kevin Cruijssen

3

Husk , 5 ไบต์

d´MKA

ลองออนไลน์!

คำอธิบาย

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 ไบต์

A§modṙŀ

ลองออนไลน์!

คำอธิบาย

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
สำหรับปริศนาจะมี5วิธีแก้ปัญหาอย่างน้อยหนึ่งไบต์
H.PWiz

@ H.PWiz ฉันไม่สามารถคิดออกคุณช่วยให้คำใบ้? : P
Leo

@Leo ไม่มีหรือŀอักขระตัวแรก (ทางซ้าย) ไม่ใช่A
H.PWiz

3

R , 84 73 64 ไบต์

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

ลองออนไลน์!

ป้อนเป็นรายการตัวเลข

ขอบคุณ MickyT สำหรับการโกนขนาด 11 ไบต์! 8 ไบต์ถูกลบล้างโดยหลักฐานของ Dennis ที่ไม่จำเป็นต้องใช้คำซ้ำซ้อน


ด้วยวิธีที่แตกต่างกันเล็กน้อยในการหมุนหมายเลขสำหรับ 73
MickyT

@MickyT aaahhh ใช้การรีไซเคิลอย่างชาญฉลาด!
Giuseppe

@MickyT array(D,K+1:0)สั้นกว่าmatrix(D,K+1,K)ไบต์
Giuseppe

2

05AB1E , 9 ไบต์

vÀD}\OIg/

ลองออนไลน์!


vไม่yน่าสนใจ
Magic Octopus Urn

gFÀD})¨Osg/คือสิ่งที่ฉันคิด
Magic Octopus Urn

คุณรู้วิธีใช้.æ = pop a compute permutations by function, usage: .æ<FUNC>}คำสั่งหรือยัง ฉันไม่ทำอย่างใดอย่างหนึ่ง แต่มันก็เหมาะสมกับเรื่องนี้
Magic Octopus Urn

@ MagicOctopusUrn v โดยไม่มี y เป็นทางออกที่สั้นที่สุดที่ฉันสามารถหาเพื่อดำเนินการหมุน g (อินพุท) ครั้ง ฉันกำลังตรวจสอบ. æดูเหมือนจะไม่ได้ลงทะเบียน <FUNC>}
Kaldo

2

Stax , 6 ไบต์

ñJä⌠╤►

เรียกใช้และแก้ไขข้อบกพร่อง

โปรแกรมนี้ใช้สตริงที่คั่นด้วยเครื่องหมายคำพูดเป็นอินพุตและแสดงค่าเฉลี่ยเป็นเศษส่วนที่ลดลง เช่น777/1 ไม่จำเป็นต้องยกเลิกการหมุนซ้ำ ไม่เคยเปลี่ยนผลลัพธ์

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

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

เรียกใช้อันนี้


2

Perl 6 , 15 ไบต์

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

ลองออนไลน์!

ค่าเฉลี่ยคือค่าเฉลี่ยตัวเลขที่ใช้กับตำแหน่งทศนิยมแต่ละตำแหน่งดังนั้นค่าเฉลี่ย1 x $_ตัวเลขคูณ111 ... จะสร้างสตริง 1s ซึ่งได้รับการรวมกับสตริงด้วยจำนวนทวีคูณ

ใช้รายการของตัวเลขเป็นอินพุต ลำดับจะต้องมี. cache ก่อนการรวมและการป้อนตัวเลขหรือสตริงจะต้องมี. com



1

JavaScript (Node.js) , 43 ไบต์

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

ลองออนไลน์!

เราสามารถรับข้อมูลเป็นรายการตัวเลขได้หรือไม่? - เดนนิส♦ 7 นาทีที่แล้ว

@Dennis แน่นอนนั่นเป็นเรื่องปกติ ไปบันทึกไบต์ : p - AdmBorkBork 3 นาทีที่แล้ว



1

Japtet , 8 ไบต์

รับอินพุตเป็นอาร์เรย์ของสตริงหลักเดียว

xpUÊ)÷UÊ

ลองมัน


คำอธิบาย

             :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 ไบต์SBCS

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

ลองออนไลน์!

ฟังก์ชั่นนำหน้า Tacit รับอินพุตเป็นสตริง

ขอขอบคุณที่อดัมenlightening 7 ไบต์ประหยัด

อย่างไร?

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

: | ยังไม่สามารถใช้กับความคิดเห็น APL
เฉพาะ ASCII เท่านั้น


1

ถ่าน 11 ไบต์

I∕×ΣθI⭆θ1Lθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

    θ  θ  θ 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 ไบต์

10#.#$+/%#

นี่เป็นพอร์ตของโซลูชั่น APL ที่ยอดเยี่ยมของ H.PWiz สำหรับ J

ใช้รายการของตัวเลขเป็นอาร์กิวเมนต์

คำอธิบาย:

+/%#ค่าเฉลี่ยของตัวเลข (หาร%ผลรวมของตัวเลข+/ด้วยหมายเลข#)

#$สร้างรายการสำเนาของค่าเฉลี่ยตามจำนวนหลัก

10#. แปลงฐานแบบฟอร์ม 10

ลองออนไลน์!


1

Perl 5 -lpF , 24 22 ไบต์

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

ลองออนไลน์!

การทำมันเป็นรายการของตัวเลขนั้นสั้นลงเพียง 1 ไบต์และรู้สึกว่าโกง:

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

ลองออนไลน์!


สิ่งที่usrt? : P
ASCII เท่านั้น

@ ASCII เท่านั้นรอคุณไม่มีไฟล์ปฏิบัติการใน/usrtไดเรกทอรีใช่หรือไม่ ยังไงก็ตามคง ขอบคุณ
Ton Hospel




1

C ++, 218 208 ไบต์

-10 ไบต์ขอบคุณ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();}

และเพื่อทดสอบ:

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

1
คุณไม่จำเป็นต้องเว้นวรรคระหว่าง#includeและ<และคุณสามารถลบ{}รอบทั้งสองและ++c; s+=v;คุณอาจจะสามารถย้ายint s=0ไปยังจุดเริ่มต้นด้วยตัวแปรอื่น ๆ ของคุณ
Zacharý

1
นอกจากนี้ฉันไม่คิดว่าคุณต้องการn=0วินาทีในการวนซ้ำเพราะมันควรจะถึง0ตอนนั้น =>m/=10;m+=std::pow(10.f,c-1)*t; m=m/10+std::pow(10.f,c-1)*tและจะไม่ใช้intแทนการautoทำงานใช่ไหม
Zacharý

คุณยังสามารถย้ายไปint s=0;พร้อมกับตัวแปรอื่น ๆ ของคุณและคุณต้องการวงเล็บปีกกาs+=v;?
Zacharý


n>0=> nอาจทำงานได้
Zacharý

0

Pyth, 12 ไบต์

csms.<zdlzlz

น่าจะเป็นไปไม่ได้

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

ลองที่นี่!


มีฟังก์ชั่นเฉลี่ยในoตัว ถ้าคุณทำเช่นนั้นและทำ I / O เป็นรายการของตัวเลขที่คุณจะได้รับมันลงไป8 ไบต์

อ๊ะฉันกำลังใช้ "ถ้าเป็นไปได้คุณสามารถสันนิษฐานได้ว่าอินพุต / เอาท์พุตจะพอดีกับชนิดของจำนวนเต็มในภาษาของคุณ" Qหมายความว่ามันจะต้องเป็นจำนวนเต็มถ้าถ่ายในขณะที่
RK

0

J, 23 ไบต์

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

รับอินพุตเป็นสตริง

คำอธิบาย

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

0

Matlab, 65 ไบต์

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

จะทำงานในเรื่องนี้ค่อนข้างแน่ใจว่าสามารถทำได้ดีกว่า


0

Clojure, 139 ไบต์

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

มีคุณสมบัติภาษาที่เหมาะสมที่สุดสำหรับการแปลงลำดับอักขระเป็นจำนวนเต็ม


0

dc, 37 ไบต์

นี่เป็นโปรแกรมแบบเต็มอ่านอินพุตและพิมพ์เอาต์พุต:

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

มันทำงานโดยการแยกตัวเลขลงในตัวเลขของตนและการคูณค่าเฉลี่ยของตัวเลขโดย repdigit ความยาวที่เหมาะสม (ซึ่งถูกสร้างขึ้นในdขณะที่เราไป)

?                               # 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.