Dönme Ortalaması


18

Bir girdi tamsayı verildiğinde, tamsayıdaki n >= 10tüm tekilleştirilen rotasyonların ortalamasını alın.

Örneğin, giriş 123için dönüşler 123(dönüş yok), 231(bir dönüş) ve 312(iki dönüş) şeklindedir. Bunların ortalaması (123 + 231 + 312) / 3veya 222.

Başka bir örnek olarak alın 4928. Rotasyonları vardır 4928, 9284, 2849, ve 8492. Bu dört sayının ortalamasını almak eşittir 6388.25.

Başka bir örnek olarak, giriş için 445445, deduplicated rotasyonlar vardır 445445, 454454ve 544544çıkış, bu yüzden 481481.

Giriş 777için tek bir yinelenen tekil döndürme vardır, bu nedenle çıkış olur 777.

kurallar

  • Varsa, giriş / çıktının dilinizin yerel Tamsayı türüne uygun olacağını varsayabilirsiniz.
  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Girdileri rakam listesi olarak alabilir miyiz?
Dennis

3
@Dennis Tabii, sorun değil. Git biraz bayt kaydet. : p
AdmBorkBork

3
Tekilleştirmenin çıktıyı gerçekten değiştirdiği bir örneğiniz var mı? 445445 örneğinizde, her 3 benzersiz döndürme iki kez gerçekleşir, bu nedenle bırakıldığında çıktı değişmez.
Nisan'ta Kaldo

@Kaldo Hayır, (elle) bir tane bulamadım, ama bu birinin olmadığı anlamına gelmez, bu yüzden tekilleştirme kurallarını yerinde bıraktım.
AdmBorkBork

13
@Kaldo Let d basamak sayısı, n ve k , örneğin dönen en küçük pozitif tam sayı , n k sol yeniden üretir basamak n . Al q ve 0 ≤ r <k bu şekilde , d = QK + r . Döner n her ikisi de d ve QK solundaki hane verim gerekir N , böylece r = 0 . Bu, her bir benzersiz rotasyonun q kez gerçekleştiği anlamına gelir , bu nedenle ortalamayı hesaplamak için rotasyonların tekilleştirilmesine gerek yoktur.
Dennis

Yanıtlar:



9

APL (Dyalog) , 9 bayt

10⊥≢⍴+/÷≢

Bağımsız değişken olarak bir basamak vektörü alan monadik bir fonksiyon.

Çevrimiçi deneyin!

Rakamların ortalamasını alıyorum +/÷≢, daha sonra giriş uzunluğuna göre tekrar ediyorum ≢⍴ve son olarak taban 10'dan dönüştürüyorum.

Kavramsal olarak, rotasyonların toplamını alıyorum (taşımadan):

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

Bu sadece 4+2+9+84 kez tekrarlanır. Sonra tabandan dönüştürme 10(benim için taşıma yapar) ve uzunluğa bölünür. Her ne kadar uzunluğa göre bölünsem de, eşit olduğu ve bayt tasarrufu sağladığı için.


1
Bu güler yüzlü: D
Leo

@Leo FWIW, ortalamayı bir rep basamağı ile çarpan cevaplar aslında aynı şeyi yapıyor
H.PWiz

3

Java 10, 163 137 76 72 71 bayt

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

@Nevay sayesinde -36 bayt .
-61 sayesinde bayt @ OlivierGrégoire bir port oluşturarak @Dennis 'Python 3 cevap .
Girdi, String yerine bir rakam listesi olarak alınarak -1 bayt.

Açıklama:

Çevrimiçi deneyin.

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 bayt:, 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();}137 bayt ile akış yaklaşımı: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
Yerine orElse(0)kullanın getAsDouble().
Olivier Grégoire

Başkalarının çözümüne dayalı 69 bayt . (int)Gerekirse 5 mote bayt kullanarak yuvarlayın.
Olivier Grégoire

İki katına çıkmanıza gerek yok: Math.powzaten bununla ilgileniyor. Bu size 3 bayt kazandırır.
Olivier Grégoire

@ OlivierGrégoire Bunu yaparsam yanlış sonuç verir. Biz, böylece int döküm kullanılır tamsayı basamağı toplamı ile çarpın tarafından 9 -divide ve. Ancak o zaman ortalama almak için bir çift gerekir. Her ikisini de kaldırırsam (int)ve *.1örneğin girdi 6388.888...yerine çıktı alır . Ve her şeyi ya da sadece bir yerine dökersem, çıktı alır . 6388.254928.powint6388
Kevin Cruijssen

3

Kabuk , 5 bayt

d´MKA

Çevrimiçi deneyin!

açıklama

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

Kabuk , 7 bayt

A§modṙŀ

Çevrimiçi deneyin!

açıklama

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
Bir bulmaca için, en az bir 5bayt çözümü vardır
H.PWiz

@ H.PWiz Anlayamıyorum, bir ipucu verebilir misiniz? : P
Aslan

@Leo ya yok ya ŀda ilk karakter (solda) değilA
H.PWiz

3

R , 84 73 64 bayt

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

Çevrimiçi deneyin!

Rakam listesi olarak girin.

11 baytlık tıraş için MickyT'a teşekkürler! 8 bayt, Dennis'in tekilleştirmenin gereksiz olduğuna dair kanıtıyla tıraş edildi.


73
MickyT

@MickyT aaahhh akıllı geri dönüşüm kullanımı!
Giuseppe

@MickyT array(D,K+1:0)matrix(D,K+1,K) bir bayttan daha kısadır .
Giuseppe

2

05AB1E , 9 bayt

vÀD}\OIg/

Çevrimiçi deneyin!


vhayır y, ilginç.
Sihirli Ahtapot Urn

gFÀD})¨Osg/düşündüğüm yerdi.
Sihirli Ahtapot Urn

.æ = pop a compute permutations by function, usage: .æ<FUNC>}Komutu henüz nasıl kullanacağınızı biliyor musunuz ? Ben de istemiyorum, ama buna uygun görünüyor.
Sihirli Ahtapot Urn

@MagicOctopusUrn v y olmadan döndürme g (giriş) sürelerini gerçekleştirmek için bulabildiğim en kısa çözümdür. Ben kontrol ediyorum., <FUNC>}
Kaldo

2

Stax , 6 bayt

ñJä⌠╤►

Çalıştır ve hata ayıkla

Bu program girdi olarak bir alıntı ile sınırlandırılmış dize alır ve ortalamayı azaltılmış bir kesir olarak ifade eder. Örneğin777/1 , dönüşlerin çoğaltılması gerekli değildir. Sonucu asla değiştirmez.

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

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

Bunu çalıştır


2

Perl 6 , 15 bayt

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

Çevrimiçi deneyin!

Ortalama, her ondalık konuma uygulanan basamak ortalamasıdır, bu nedenle basamak ortalaması 111'dir. 1 x $_ , çarpma ile dizelere zorlanan 1 saniyelik bir dize üretir.

Rakamların bir listesini girdi olarak alır. Bir sekans, toplamdan önce bir .cache gerektirir ve bir sayı veya dize girişinin .comb olması gerekir.



1

JavaScript (Node.js) , 43 bayt

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

Çevrimiçi deneyin!

Girdileri rakam listesi olarak alabilir miyiz? - Dennis ♦ 7 dakika önce

@Dennis Tabii, sorun değil. Git biraz bayt kaydet. : p - AdmBorkBork 3 dakika önce


1

Jöle , 6 5 bayt

ṙJḌÆm

Çevrimiçi deneyin!

Nasıl çalışır

ṙ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 bayt

Girişi tek haneli dizelerden oluşan bir dizi olarak alır.

xpUÊ)÷UÊ

Dene


açıklama

             :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 bayt SBCS

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

Çevrimiçi deneyin!

Ön ek önek işlevi. Girişi dize olarak alır.

Aydınlatıcı 7 baytlık tasarruf için Adám'a teşekkürler .

Nasıl?

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

: | hala APL yorumlarına
sadece ASCII


1

Kömür , 11 bayt

I∕×ΣθI⭆θ1Lθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

    θ  θ  θ 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 bayt

10#.#$+/%#

Bu, H.PWiz'in J için harika APL çözümünün bir limanıdır.

Bağımsız değişken olarak rakamların listesini alır.

Açıklama:

+/%#basamak ortalama (bölmek %basamak toplamı +/sayılarına göre #)

#$basamak sayısına göre ortalamanın kopyalarının bir listesini oluşturur

10#. form tabanı 10 dönüştürmek

Çevrimiçi deneyin!






1

C ++, 218 bayt

Zacharý sayesinde -10 bayt

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

Ve test etmek için:

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

1
Sen arasında boşluk gerekmez #includeve <ve kaldırabilir {}hem etrafta ++c;ve s+=v;. int s=0Diğer değişkenlerinizle birlikte başlangıca hareket edebilirsiniz.
Zacharý

1
Ayrıca, n=0o 0zamana kadar ulaşmış olması gereken döngü için ikinci olarak ihtiyacınız olduğunu düşünmüyorum . m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t. Ve iş intyerine kullanmak istemez automisiniz?
Zacharý

Hala int s=0;diğer değişkenlerinizle birlikte hareket edebilirsiniz ve etrafında parantezlere ihtiyacınız var s+=v;mı?
Zacharý


n>0=> nişe yarayabilir.
Zacharý

0

Pyth, 12 bayt

csms.<zdlzlz

Muhtemelen geliştirilebilir.

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

Burada deneyin!


Yerleşik bir ortalama fonksiyon var o. Bunu yaparsanız ve G / Ç rakam listesi olarak yaparsanız, 8 bayta kadar düşürebilirsiniz .

Ah, "Varsa, giriş / çıktının dilinizin yerel Tamsayı türüne uygun olacağını varsayabilirsiniz." olarak alınırsa, bir tam sayı olması gerektiği anlamına gelir Q.
RK.

0

J, 23 Bayt

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

Girişi dize olarak alır

açıklama

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

0

Matlab, 65 bayt

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

Bunun üzerinde çalışacağım, daha iyi yapılabileceğinden eminim.


0

Clojure, 139 bayt

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

Karakter dizilerini tamsayılara dönüştürmek için oldukça uygun olmayan dil özellikleri.


0

dc, 37 bayt

Bu tam bir program, girişi okumak ve çıktıyı yazdırmak:

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

Sayıyı rakamlarına ayırarak ve rakamların ortalamasını uygun uzunluktaki repdigit ile çarparak çalışır (ki bu da dilerledikçe oluşturulur).

?                               # 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.