Среднее вращение


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.

правила

  • Если применимо, вы можете предположить, что ввод / вывод будет соответствовать целочисленному типу вашего языка.
  • Вход и выход могут быть заданы любым удобным способом .
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Можем ли мы принять ввод как список цифр?
Деннис

3
@ Денис Конечно, все в порядке. Иди сохрани несколько байтов. : p
AdmBorkBork

3
У вас есть пример, где дедупликация фактически меняет вывод? В вашем примере 445445 каждые 3 уникальных поворота происходят дважды, поэтому их выход не меняет выход.
Кальдо

@ Kaldo Нет, я не смог (вручную) придумать его, но это не значит, что его не существует, поэтому я оставил правила дедупликации на месте.
AdmBorkBork

13
@Kaldo Позвольте d быть числом цифр n и k наименьшее положительное целое число такое, что вращение n k цифр влево воспроизводит n . Возьмем q и 0 ≤ r <k так , что d = qk + r . Поворот п обе г и Qk Цифры слева должен уступить п , поэтому г = 0 . Это означает, что каждое уникальное вращение происходит q раз, поэтому для вычисления среднего значения дедупликация вращений не требуется.
Деннис

Ответы:


11

Python 3 , 38 36 байт

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

Принимает цифры как отдельные аргументы. Спасибо @Rod за предложение Python 3, сэкономив 2 байта.

Попробуйте онлайн!


Дополнительный байт можно сохранить, переключившись обратно на Python 2 и приняв массив с плавающей точкой.
Деннис

Вам не нужно принимать цифры в качестве отдельных аргументов, обычный старый список прекрасно работает
Asone Tuhid

9

APL (Дьялог) , 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 ответы, которые умножают среднее значение на цифру повторения, делают по сути одно и то же
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 , создав порт ответа Python 3 @Dennis .
-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. И если бы я бросил всю вещь или просто .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 аааааа умное использование утилизации!
Джузеппе

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

2

05AB1E , 9 байтов

vÀD}\OIg/

Попробуйте онлайн!


vс нет y, интересно.
Волшебная Урна Осьминога

gFÀD})¨Osg/был где я думал.
Волшебная Урна Осьминога

Вы уже знаете, как использовать .æ = pop a compute permutations by function, usage: .æ<FUNC>}команду? Я тоже не знаю, но это кажется подходящим для этого.
Волшебная Урна Осьминога

@MagicOctopusUrn v без y - самое короткое решение, которое я мог найти, чтобы выполнить вращение 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

Perl 6 , 15 байт

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

Попробуйте онлайн!

Среднее значение - это среднее значение цифры, применяемое к каждой десятичной позиции, поэтому среднее число раз, равное 111 ...., 1 x $_создает строку из 1 с, которая приводится к строкам путем умножения.

Принимает список цифр в качестве ввода. Последовательность потребует .cache перед суммой, а для ввода числа или строки потребуется .comb.



1

JavaScript (Node.js) , 43 байта

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

Попробуйте онлайн!

Можем ли мы принять ввод как список цифр? - Деннис ♦ 7 минут назад

@ Денис Конечно, все в порядке. Иди сохрани несколько байтов. : p - AdmBorkBork 3 минуты назад


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-only Подождите, у вас нет исполняемых файлов в /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в начало с другими вашими переменными.
Захари

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работы?
Захари

Вы все еще можете двигаться 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. Если вы сделаете это и сделаете ввод / вывод в виде списков цифр, вы можете уменьшить его до 8 байтов .

Ах, я взял «Если применимо, вы можете предположить, что ввод / вывод будет соответствовать типу Integer вашего языка». означать, что это должно быть целое число, если принять в качестве Q.
RK.

0

J, 23 байта

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

Принимает ввод в виде строки

объяснение

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


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.