回転平均


18

入力整数を指定するとn >= 10、整数のすべての重複排除された回転の平均を出力します。

たとえば、inputの123場合、回転は123(回転なし)、231(1回転)、312(2回転)です。それらの平均は(123 + 231 + 312) / 3または222です。

別の例として、取ります4928。回転は492892842849、と8492。これら4つの数値の平均を取ると等しい6388.25

別の例では、入力のために445445、重複除外回転があり445445454454および544544、したがって出力されます481481

inputの777場合、重複排除ローテーションは1つだけなので、出力は777です。

ルール

  • 該当する場合、入力/出力が言語のネイティブ整数型に適合すると想定できます。
  • 入力と出力は、任意の便利な方法で指定できます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

入力を数字のリストとして受け取ることはできますか?
デニス

3
@デニスは確かに、それは結構です。いくつかのバイトを保存してください。:p
AdmBorkBork

3
重複排除が実際に出力を変更する例はありますか?445445の例では、3つの固有の回転がそれぞれ2回発生するため、それらを残しても出力は変更されません。
カルド

@Kaldoいいえ、私は(手動で)1つを思い付くことができませんでしたが、それは1つが存在しないことを意味しないので、重複排除ルールをそのままにしました。
AdmBorkBork

13
@Kaldoレットは、dは桁数であり、Nおよびkは、回転することを最小の正の整数を、n個の k個の左を再生する桁N。取るQをし、0≤R <kのようにD = QK + R。回転nは両方DQK左の桁は、得なければならないNので、R = 0。つまり、一意の回転はそれぞれq回発生するため、平均を計算するために回転を重複排除する必要はありません。
デニス

回答:


11

Pythonの338の 36バイト

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

数字を個別の引数として受け取ります。Python 3を提案してくれた@Rodに感謝します。2バイト節約します。

オンラインでお試しください!


Python 2に戻り、floatの配列を取得することで、追加のバイトを節約できます。
デニス

あなたが別の引数として数字を取る必要はありませんが、定期的に古いリストはうまくありません
Asone Tuhid

9

APL(Dyalog)、9バイト

10⊥≢⍴+/÷≢

引数として数字のベクトルをとる単項関数。

オンラインでお試しください!

数字の平均を取り+/÷≢、それを入力の長さだけ繰り返し≢⍴、最後に10 進数から変換します。

概念的に、私は回転の合計を取ります(携帯せずに):

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

これは4+2+9+84回繰り返されます。次に、ベースから変換し10(これはキャリーを行います)、長さで除算します。以前は長さで割っていますが、これは同等でバイトを節約するためです。


1
それは優しい:D
レオ

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

@Nevayのおかげで-36バイト。@DennisのPython 3 answerのポートを作成
して@OlivierGrégoireに -61バイトを感謝します。 入力を文字列ではなく数字のリストとして取得することにより、-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バイト: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バイトのストリームアプローチ: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
orElse(0)代わりに使用しますgetAsDouble()
オリヴィエグレゴワール

他のソリューションに基づいて69バイト(int)必要に応じて、5モートバイトを使用して丸めます。
オリビエグレゴワール

ダブルとしてキャストする必要はありません。Math.powすでにそれを処理します。これで3バイト節約できます。
オリビエグレゴワール

@OlivierGrégoireそうすると、間違った結果が出ます。intへのキャストが使用されるため、9で整数で除算し、数字の合計を乗算できます。その場合にのみ、平均を取得するためにダブルにする必要があります。私は両方を削除した場合(int)*.1、それは、例えば、出力のための意志6388.888...の代わりに、6388.25入力のために4928。そして、すべてをキャストするか.powint代わりにをキャストすると、が出力されます6388
ケビンCruijssen

3

、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

、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
パズルには、少なくとも1 5バイトの解決策があります
-H.PWiz

@ H.PWizわかりませんが、ヒントを教えていただけますか?:P
レオ

そこにはしません@Leo ŀ、と(左の)最初の文字ではありませんA
H.PWiz

3

R84 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バイト。



@MickyT aaahhhリサイクルの賢い使用!
ジュゼッペ

@MickyT array(D,K+1:0)matrix(D,K+1,K)1バイトより短いです。
ジュゼッペ

2

vなしy、面白い。
魔法のタコ

gFÀD})¨Osg/私が考えていた場所でした。
魔法のタコ

.æ = pop a compute permutations by function, usage: .æ<FUNC>}まだコマンドの使用方法を知っていますか?私もどちらでもありませんが、これに合うようです。
魔法のタコ

yのない@MagicOctopusUrn vは、回転をg(input)回実行するために見つけることができる最短のソリューションです。.æをチェックしていますが、<FUNC>を登録しているようには見えません}
Kaldo

2

スタックス、6 バイト

ñJä⌠╤►

実行してデバッグする

このプログラムは、引用符で区切られた文字列を入力として使用し、平均値を小数部として表します。たとえば777/1 、回転を重複排除する必要はありません。結果が変わることはありません。

開梱されていない、コメントされていない、これはこのように見えます。

:)  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$_}

オンラインでお試しください!

平均は各小数点位置に適用される数字の平均であるため、数字の平均の111 ....倍1 x $_は、乗算によって文字列に強制される1の文字列を生成します。

入力として数字のリストを受け取ります。シーケンスは合計の前に.cacheを必要とし、数値または文字列の入力には.combが必要です。




1

ゼリー6 5バイト

ṙJḌÆm

オンラインでお試しください!

使い方

ṙ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

APL(Dyalog Unicode)21 14バイトSBCS

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

オンラインでお試しください!

暗黙のプレフィックス機能。入力を文字列として受け取ります。

啓発的な7バイトのセーブをしてくれたAdámに感謝

どうやって?

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

これは、H.PWizのJへの優れたAPLソリューションの移植版です。

引数として数字のリストを取ります。

説明:

+/%#数字の平均値(分割%桁の和を+/その数で#

#$桁数に従って平均のコピーのリストを作成します

10#. フォームベース10に変換

オンラインでお試しください!


1

Perl 5の -lpF24の 22バイト

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

オンラインでお試しください!

数字のリストとしてそれを行うことはたった1バイト短く、不正行為のように感じます:

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

オンラインでお試しください!


なにusrt?:P
ASCIIのみ

@ ASCII-only待って、/usrtディレクトリに実行可能ファイルがありませんか?とにかく、修正しました。ありがとう
トンホスペル




1

C ++、218208バイト

ザカリーのおかげで-10バイト

#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他の変数を使用して先頭に移動できる場合があります。
ザカリー

1
また、n=02番目のforループが必要になるとは思いません0m/=10;m+=std::pow(10.f,c-1)*t;=> m=m/10+std::pow(10.f,c-1)*t。そしてintauto仕事の代わりに使用しませんか?
ザカリー

int s=0;他の変数を使用して移動できますが、中括弧は必要s+=v;ですか?
ザカリー


n>0=>動作するn可能性があります。
ザカリー

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.