회전 평균


18

입력 integer가 주어지면 정수 n >= 10의 중복 제거 된 모든 회전의 평균을 출력합니다.

예를 들어 input 123의 경우 회전은 123(회전 없음), 231(1 회전) 및 312(2 회전)입니다. 그 평균은 (123 + 231 + 312) / 3또는 222입니다.

다른 예로서,을 가져 가라 4928. 회전에는 4928, 9284, 2849, 및 8492. 이 네 숫자의 평균을 얻는 것은 같습니다 6388.25.

다른 예를 들어, 입력 445445, 중복 제거 된 회전은 445445, 454454544544출력이되도록 481481.

입력 777의 경우 중복 제거 된 회전이 하나뿐이므로 출력은 777입니다.

규칙

  • 해당되는 경우 입력 / 출력이 해당 언어의 기본 정수 유형에 적합하다고 가정 할 수 있습니다.
  • 입력 및 출력은 편리한 방법 으로 제공 할 수 있습니다 .
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

숫자 목록으로 입력 할 수 있습니까?
Dennis

3
@Dennis Sure, 괜찮습니다. 바이트를 저장하십시오. : p
AdmBorkBork

3
중복 제거가 실제로 출력을 변경하는 예가 있습니까? 445445 예제에서 3 개의 고유 한 회전이 두 번 발생하므로 그대로두면 출력이 변경되지 않습니다.
Kaldo

@ 칼도 아니요, (수동으로) 하나를 만들 수 없었지만 이것이 존재하지 않는다는 의미는 아니므로 중복 제거 규칙을 그대로 두었습니다.
AdmBorkBork

13
@Kaldo하자는 d는 자릿수의 숫자 Nk는 예컨대 회전하는 작은 양의 정수를 n 개 (K)의 왼쪽 자리를 재생하여 N . d = qk + r이 되도록 q0 ≤ r <k를 취하십시오 . 회전 N 모두 DQK 왼쪽 자리 양보해야 N 있도록 R = 0 . 이것은 각각의 고유 한 회전이 q 번 발생한다는 것을 의미 하므로 평균을 계산하기 위해 회전을 중복 제거 할 필요가 없습니다.
Dennis

답변:



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

@Leo FWIW 대표 숫자에 평균을 곱한 답은 본질적으로 같은 일을하고 있습니다
H.PWiz

3

자바 (10), 163 (137) 76 72 71 바이트

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

@Nevay 덕분에 -36 바이트 .
-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 바이트 : 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().
Olivier Grégoire

다른 사람의 솔루션에 따라 69 바이트 . (int)필요한 경우 5 mote 바이트를 사용하여 반올림 합니다.
Olivier Grégoire

당신은 이중으로 캐스팅 할 필요가 없습니다 : Math.pow이미 그것을 처리합니다. 3 바이트를 절약 할 수 있습니다.
Olivier Grégoire

@ OlivierGrégoire 그렇게하면 잘못된 결과가 나옵니다. 캐스트는 int로 사용되므로 정수 를 9로 나누고 자릿수를 곱할 수 있습니다 . 그런 다음에 만 평균을 얻으려면 두 배가되어야합니다. 나는 모두를 제거하는 경우 (int)*.1는 예를 들어 출력을위한 것 6388.888...대신 6388.25입력에 적합한 4928. 나는 전체 일 또는 단지를 캐스팅한다면 .powint대신, 출력 것이다 6388.
Kevin 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
퍼즐 들어가 적어도 하나의 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))

온라인으로 사용해보십시오!

자릿수 목록으로 입력하십시오.

11 바이트를 줄여준 MickyT에게 감사드립니다! 중복 제거가 필요하지 않다는 Dennis의 증거로 8 바이트를 삭감했습니다.



재활용의 @MickyT aaahhh 영리한 사용!
Giuseppe

@MickyT array(D,K+1:0)matrix(D,K+1,K)바이트 보다 짧습니다 .
주세페

2

v아니 y, 재미있는.
Magic Octopus Urn

gFÀD})¨Osg/내가 생각하고 있었던 곳이었다.
Magic Octopus Urn

.æ = pop a compute permutations by function, usage: .æ<FUNC>}명령을 아직 사용하는 방법을 알고 있습니까? 나도 아니지만, 이것에 맞는 것 같습니다.
Magic Octopus Urn

y가없는 @MagicOctopusUrn v는 회전 g (입력) 시간을 수행 할 수있는 가장 짧은 솔루션입니다. .æ을 확인하고 있는데 <FUNC>}를 등록하는 것 같지 않습니다
Kaldo

2

Stax , 6 바이트

ñJä⌠╤►

실행 및 디버깅

이 프로그램은 따옴표로 구분 된 문자열을 입력으로 사용하여 평균을 축소 분수로 표시합니다. 예 :777/1 회전을 중복 제거 할 필요는 없습니다. 결과는 변경되지 않습니다.

포장을 풀고 포장을 풀고 주석을 달았습니다.

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

이것을 실행


2

펄 6 , 15 바이트

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

온라인으로 사용해보십시오!

평균은 각 소수 자릿수에 적용되는 자릿수 평균이므로 자릿수 평균 시간은 111 1 x $_입니다.

숫자 목록을 입력으로 사용합니다. 시퀀스에는 합계 전에 .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

Japt , 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

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

온라인으로 사용해보십시오!

암묵적 접두사 기능. 입력을 문자열로받습니다.

깨달은 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

C ++, 218 바이트

Zacharý 덕분에 -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다른 변수를 사용하여 시작 부분으로 이동할 수 있습니다 .
Zacharý

1
또한 n=0두 번째 for 루프 가 필요하다고 생각하지 않습니다 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

클로저, 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.