Середня ротаційна ціна


18

З огляду на ціле вхідне число n >= 10, виведіть середнє значення всіх подвійних обертів цілого числа.

Наприклад, для введення 123обертання - це 123(немає обертання), 231(одне обертання) і 312(два обертання). Середнє значення таких становить (123 + 231 + 312) / 3або 222.

В якості іншого прикладу візьміть 4928. Повороти є 4928, 9284, 2849, і 8492. Якщо середнє число цих чотирьох чисел дорівнює 6388.25.

В якості іншого прикладу, для введення 445445, Дедупліціруемие повороти 445445, 454454і 544544, таким чином , вихід 481481.

Для введення 777є лише одне подвоєне обертання, тому вихід є 777.

Правила

  • Якщо можливо, ви можете припустити, що введення / вихід відповідатиме вашому рідному типу Integer.
  • Введення та вихід можуть бути надані будь-яким зручним методом .
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Стандартні лазівки заборонені.
  • Це тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Чи можемо ми взяти введення як список цифр?
Денніс

3
@Dennis Звичайно, це добре. Іди збережи кілька байт. : p
AdmBorkBork

3
Чи є у вас приклад, коли дедупликація насправді змінює вихід? У вашому прикладі 445445 кожен 3 унікальних повороту відбувається двічі, тому їх залишення не змінює результат.
Калдо

@Kaldo Ні, я не зміг (вручну) придумати його, але це не означає, що його не існує, тому я залишив правила дедуплікації на місці.
AdmBorkBork

13
@Kaldo Нехай d - число цифр n і k найменше додатне ціле число, таке, що обертається n k цифр вліво відтворює n . Візьміть q і 0 ≤ r <k такі, що d = qk + r . Обертання n і d, і qk цифр вліво повинно дати n , тому r = 0 . Це означає, що кожне унікальне обертання відбувається Q разів, тому для обчислення середнього значення не потрібне подвоєння обертань.
Денніс

Відповіді:


11

Python 3 , 38 36 байт

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

Цифри приймає як окремі аргументи. Завдяки @Rod, що запропонував Python 3, економив 2 байти.

Спробуйте в Інтернеті!


Додатковий байт можна зберегти, повернувшись до Python 2 та взявши масив плавців.
Денніс

Вам не потрібно сприймати цифри як окремі аргументи, звичайний старий список справді чудовий
Асона Тухід

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+8повторюється 4 рази. Потім перетворення з основи 10(що робить перенесення для мене) і ділення на довжину. Хоча я ділюсь на довжину раніше, тому що це рівносильно і економить байти.


1
Це геніально: D
Лев

@Leo FWIW відповіді, які помножують середнє значення на цифру
повтору

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 'Python 3 .
-1 байт, взявши введення як список цифр замість String.

Пояснення:

Спробуйте в Інтернеті.

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()
Невай

1
Використовуйте orElse(0)замість getAsDouble().
Олів'є Грегоар

69 байт на основі рішення інших. Округніть, використовуючи (int)5 байт, якщо потрібно.
Олів'є Грегоар

Не потрібно виступати в ролі подвійного: Math.powвже про це піклується. Це позбавить вас 3 байти.
Олів'є Грегоар

@ OlivierGrégoire Це дасть неправильні результати, якщо я це зроблю. Заголовок до int використовується, тому ми можемо скласти ціле число- поділити на 9 і помножити на суму цифр. Тільки тоді він повинен удвічі отримати середнє значення. Якщо я видалю як (int)і *.1це буде, наприклад , вихід 6388.888...замість 6388.25для входу 4928. І якщо я передаю всю річ або лише .powїї intзамість, вона виведе 6388.
Кевін Круїссен

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 Немає або ŀ, і першого символу (зліва) немає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 байт, поголених доказом Денніса, що дедупликація непотрібна.


Трохи іншим способом повернути число на 73
MickyT

@MickyT aaahhh розумне використання переробки!
Джузеппе

@MickyT array(D,K+1:0)коротше, ніж matrix(D,K+1,K)на байт.
Джузеппе

2


gFÀD})¨Osg/було там, де я думав.
Чарівний восьминіг Урна

Чи знаєте ви, як використовувати .æ = pop a compute permutations by function, usage: .æ<FUNC>}команду ще? Я теж ні, але, здається, підходить до цього.
Чарівний восьминіг Урна

@MagicOctopusUrn v без y є найкоротшим рішенням, яке я міг би знайти для обертання g (введення) разів. Я перевіряю., Не здається, що це реєстрація <FUNC>}
Калдо

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

Перл 6 , 15 байт

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

Спробуйте в Інтернеті!

Середнє значення - це розряд середнього значення, застосований до кожної десяткової позиції, тому середнє значення цифр 111 .... 1 x $_створює рядок у 1s, який примушується до рядків множенням.

Візьме список цифр як вхідний. Послідовність вимагає .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 байт .

Як?

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

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каталозі? У будь-якому випадку, виправлено. Спасибі
Тон Євангелія




1

C ++, 218 208 байт

-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другий цикл, як він повинен був досягти 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 байт .

Ах, я брав "Якщо можливо, ви можете припустити, що введення / вихід відповідатиме вашому рідному типу Integer". означає, що воно повинно бути цілим числом, якщо взяти його якQ .
РК.

0

J, 23 байт

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

Вводиться як рядок

Пояснення

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

0

Матлаб, 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

постійного струму, 37 байт

Це повна програма, читаючи введення та друкуючи вихід:

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

Він працює, розділяючи число на його цифри і множуючи середнє значення цифр на відповідне відмітку довжини (яке формується в 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.