Поворотная позиция целых чисел

20

Вызов:

Входные данные:

Сортированный список натуральных чисел.

Выход:

Количество целых чисел, которые все еще имеют точно такой же индекс, после поворота цифр в каждом целом числе на количество индексов влево и повторной сортировки измененного списка.

Пример:

Входные данные: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Выходные данные (индексация на основе 0): 6
Выходные данные (индексация на основе 1):5

Почему?

Индексирование на основе 0:

After rotating each: [8,94,73,102,592,276,8227,3338,9217,63784,89487,7887471]
Sorted again:        [8,73,94,102,276,592,3338,8227,9217,63784,89487,7887471]

Input indices:        0  1  2   3   4   5    6    7    8     9    10      11
Original input-list: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Modified list:       [8,73,94,102,276,592,3338,8227,9217,63784,89487,7887471]
Modified indices:     0  2  1   3   5   4    7    6    8     9    10      11
Equal indices:        ^         ^                      ^     ^     ^       ^

So the output is: 6

Индексирование на основе 1:

After rotating each: [8,49,37,021,925,762,2278,3383,2179,37846,94878,8874717]
Sorted again:        [8,(0)21,37,49,762,925,2179,2278,3383,37846,94878,8874717]

Input indices:        1  2  3   4   5   6    7    8    9    10    11      12
Original input-list: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Modified list:       [8,21,37,49,762,925,2179,2278,3383,37846,94878,8874717]
Modified indices:     1  4  3  2   6   5    9    7    8    10    11      12
Equal indices:        ^     ^                               ^     ^       ^

So the output is: 5

Правила соревнований:

  • Входной список гарантированно содержит только положительные целые числа.
  • Входной список гарантированно сортируется по убыванию.
  • Входной список гарантированно содержит как минимум два элемента.
  • Как вы можете видеть выше, индексация на основе 0 и 1 допускается. Пожалуйста, укажите в своем ответе, какой из двух вы использовали, так как результаты могут отличаться соответственно!
  • Начальные 0s после поворота игнорируются, что видно из приведенного выше примера на основе 1, где целое число 102становится 021после поворота, а затем обрабатывается как 21.
  • Целые числа гарантированно уникальны во входном списке и гарантированно останутся уникальными после завершения поворотов.
  • Обратите внимание, что мы только смотрим на позиции повернутых целых чисел в корреляции с позициями ввода, а не со значениями списка ввода. Чтобы прояснить, что я имею в виду под этим: с помощью списка ввода [1234,3412]и индексации на основе 1, список становится [2341,1234]после поворота каждого целого числа его индексным числом раз, а затем, когда сортировка становится [1234,2341]. Хотя и исходный список ввода, и повернутый список содержат целое число 1234в верхней позиции, они не совпадают! Вращенный 1234был 3412раньше. Таким образом, 1-индексированный вывод для этого входного списка - 0два целых числа поменялись местами.
  • Ввод гибкий. Может быть списком / потоком / массивом целых чисел / строк / цифр-массивов и т. Д. Пожалуйста, укажите, что вы использовали, если вы не принимаете входные данные как целые числа.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

Тестовые случаи:

Input: [8, 49, 73, 102, 259, 762, 2782, 3383, 9217, 37846, 89487, 7471788]
0-based output: 6
1-based output: 5

Input: [1234, 3412]
0-based output: 2
1-based output: 0

Input: [2349, 2820, 17499, 21244, 29842, 31857, 46645, 56675, 61643, 61787]
0-based output: 3
1-based output: 0

Input: [4976, 11087, 18732, 22643, 52735]
0-based output: 2
1-based output: 3

Input: [4414, 5866, 7175, 8929, 14048, 16228, 16809, 19166, 24408, 25220, 29333, 44274, 47275, 47518, 53355]
0-based output: 4
1-based output: 4

Input: [11205, 16820, 63494]
0-based output: 1
1-based output: 3

Не стесняйтесь генерировать больше случайных тестовых случаев с (или черпать вдохновение) из этой незагладленной программы 05AB1E , где вход - это размер случайного списка (ПРИМЕЧАНИЕ: выходные данные этого генератора могут не соответствовать правилу « Целые числа гарантированно уникальны в входной список, и гарантированно останется уникальным после завершения поворотов ", так что имейте это в виду при его использовании.)

Кевин Круйссен
источник
Можем ли мы предположить, что вход имеет как минимум 2 элемента?
Робин Райдер
2
@RobinRyder Хмм, моя первая мысль была бы «нет», но, поскольку у меня нет тестовых случаев с отдельными предметами, и это не добавит много проблем, почему бы и нет. Я добавлю правило, что входной список гарантированно содержит как минимум 2 элемента.
Кевин Круйссен
Можем ли мы принять ввод как список строк?
Воплощение Неведения
1
@ Shaggy Я уведомил ответы, которые я думал, извлек бы выгоду из этого. Если вы видите что-то, что также может принести пользу, не стесняйтесь уведомлять их.
Кевин Круйссен
1
Из примера видно, что вывод должен быть следующим: «Количество целых чисел, которые все еще находятся с точно таким же индексом, после поворота цифр в каждом целом числе его индекса количество раз влево и повторной сортировки массива »?
qwr

Ответы:

11

R , 114 107 байт

-5 байт благодаря Джузеппе.

Отстала от digEmAll.

function(l){for(j in seq(l))l[j]=rep(l[j]%/%(e=10^(b=nchar(l[j]):1-1))%%10,j+1)[j+0:b]%*%e
sum(sort(l)==l)}

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

0 индексированные.

Безголовая версия:

function(l) {
  n = length(l)                         # size of input
  for (j in 1:n) {  
    b = nchar(l[j]) -1                  # number of digits in l[j] -1
    e = 10 ^ (b:0) 
    d = l[j] %/% e %% 10                # convert to vector of digits
    l[j] = rep(d, j + 1)[j + 0:b] %*% e # rotate digits and convert back to an integer
  }
  sum(sort(l) == l)                     # number of integers which are in the same position
}

Чтобы повернуть bцифры целого числа по jпозициям, код повторяет цифры много раз, а затем переводит цифры в позиции j+1в j+b. Например, чтобы повернуть 1024 раза, оставьте значения, отмеченные знаком x(позиции с 5 по 7):

102102102102
    xxx

так что результат есть 021.

Робин Райдер
источник
111 байт
Джузеппе
@ Giuseppe Спасибо! Мне нужно запомнить seq(a=...). Я ожидаю, что есть какое-то Mapволшебство, но мои попытки в лучшем случае оставили количество байтов неизменным.
Робин Райдер
Mapможет быть слишком дорого, так как functionшаблон не менее 9 байтов, но если вы переключитесь на 0-индексирование, мы можем сделать 109 байтов
Джузеппе
1
Хорошая находка! Вплоть до 107, понимая, что это seq(a=l)может быть seq(l)до тех пор, пока на входе есть как минимум 2 элемента (я спросил, все ли в порядке).
Робин Райдер
6

05AB1E , 9 байтов

ΣN._ï}-_O

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

Использует индексирование на основе 0.

Объяснение:

Σ    }       # sort the input by
 N._         # each number rotated its index to the left
    ï        # then cast to int (otherwise the sort is alphabetic)
      -      # subtract the input from the result
       _O    # then count the 0s
Grimmy
источник
6

Japt -x , 10 9 байт

0 на основе

í¶UñÈséYn

Попытайся

í¶UñÈséYn     :Implicit input of integer array U
í             :Interleave with
  Uñ          :U sorted by
    È         :Passing each integer at 0-based index Y through the following function
     s        :  Convert to string
      é       :  Rotate right by
       Yn     :    Y negated
 ¶            :Reduce each pair by testing for equality
              :Implicit output of sum of resulting array
мохнатый
источник
4

Желе , 9 байт

Dṙ"JḌỤ=JS

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

Монадическая ссылка, которая принимает список целых чисел и возвращает целое число, указывающее количество целых чисел, которые остаются на месте после выполнения поворота с использованием 1-индексации.

объяснение

D         | Convert to decimal digits
 ṙ"J      | Rotate left by index
    Ḍ     | Convert back to integer
     Ụ    | Index in sorted list
      =J  | Check if equal to index in original list
        S | Sum
Ник Кеннеди
источник
4

Python 2 , 104 100 97 93 байта

b=[int((s*-~i)[i:i+len(s)])for i,s in enumerate(input())]
print map(cmp,b,sorted(b)).count(0)

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

Индексирование на основе 0.

Сначала вращается каждое число, а затем сравнивается результат с результатом, но сортируется.


Добавлено:

  • -3 байта, благодаря Эрику Аутгольферу
  • -4 байта, благодаря Кевину Круйссену (и его смене правил)
TFeld
источник
@eriktheoutgolfer спасибо, я был слишком занят, пытаясь сделать лямбду, о которой я забыл input():)
TFeld
Вот почему я сначала пытаюсь сделать полную программу ...: D Серьезно, если вы сначала попробуете создать полную программу, вы будете ясно видеть, стоит ли преобразовывать ее в лямбду или нет. Не начинайте defсразу (они довольно бесполезны в Python 2, в отличие от Python 3).
Эрик Outgolfer
Теперь я разрешил входной список в виде строк, так что вы можете удалить 4 байта, удалив серьезные акценты, окружающиеs .
Кевин Круйссен
4

R , 90 88 85 байт

function(x)sum(rank(as.double(substr(strrep(x,L<-sum(x|1)),y<-1:L,y+nchar(x)-1)))==y)

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

  • 0-индексированное вращение
  • стратегия ротации, вдохновленная ответом @ RobinRyder
  • -5 байт благодаря @Giuseppe

Развернутый код с объяснением:

function(x){
    L=sum(x|1)                         # store the length of x

    R=strrep(x,L)                      # repeat each string of vector x L times

    S=substring(R,1:L,1:L+nchar(x)-1)) # for each string of R, extract a substring of the same 
                                       # length of the original number starting from index 1 
                                       # for the 1st element, index 2 for the 2nd and so on
                                       # (this basically rotates the strings )

    Y=as.double(S)                     # convert the strings to numbers

    sum(rank(Y)==1:L)                  # return the number of times the ranks of Y
                                       # match with their original positions
}
digEmAll
источник
3

J , 28 26 байт

-2 байта благодаря Ионе

1#.i.@#=[:/:#\".@|.&>":&.>

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

Гален Иванов
источник
1
Ницца. Похоже, вы можете проиграть "0( Попробуйте онлайн! ), Но кроме этого я не видел пути к гольфу дальше.
Иона
@ Иона Спасибо! Я не знаю, почему я не пытался без этого.
Гален Иванов
2

Stax , 11 10 байт

ìát'óJ♣á◄·

Запустите и отладьте его

Эта программа использует индексирование на основе 0 и принимает входные данные в виде массива строк. Я сохранил байт, воспользовавшись возможностью ввода новых данных.

рекурсивный
источник
2

Perl 5 -pa , 80 байт

map$d{$_.substr$_,0,$b%y///c,''}=$b++,@F;$\+=$d{$_}==$r++for sort{$a-$b}keys%d}{

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

Принимает ввод в виде разделенных пробелами чисел на STDIN; дает 1 основанный результат.

Xcali
источник
2

Pyth , 15 байт

sqVSJ.ev.<`bkQJ

Попробуйте онлайн! Использует индексирование на основе 0.

sqVSJ.ev.<`bkQJ   Implicit: Q=eval(input())
     .e      Q    Map elements of Q, as b and with index k, using:
          `b        Convert b to string
        .<  k       Rotate the above left k places
       v            Convert back to integer
    J             Store the above as J
   S              Sort the above
 qV           J   Vectorised equality check with the unsorted list
s                 Sum, implicit output
Sok
источник
@FryAmTheEggman Теперь я разрешил вводить список строк, так что теперь он действителен.
Кевин Круйссен
@FryAmTheEggman Вы, вероятно, правы, я не рассматривал лексографическую сортировку против целочисленной сортировки, если опустить s- оригинальная версия кода имела vтот же эффект. Я отредактирую это обратно
Сок
Ах, хорошо, как указывает Кевин, теперь вы можете сбросить обратную черточку и использовать входные данные в виде списка строк для сохранения байта.
FryAmTheEggman
2

APL + WIN, 23, 21 19 байт

2 байта сохраняются путем ввода целых чисел как вложенного вектора символов

+/i=⍋⍎¨(i←⍳⍴v)⌽¨v←⎕

1 проиндексировано.

v←⎕ prompt for input. 

(i←⍳⍴v)⌽¨ rotate each set of characters by input indices.

⍋⍎¨ convert characters to integers and get sorted indices.

+/i= sum where original and sorted indices are the same.

Попробуйте онлайн! Предоставлено Dyalog Classic

Грэхем
источник
Не уверен, сохранит ли он какие-либо байты, но теперь я разрешил ввод в виде списка строк или списка цифровых списков.
Кевин Круйссен
@KevinCruijssen Спасибо за указание на это. Ввод вложенного вектора строк сохраняет 2 байта
Грэм
2

JavaScript (Node.js) , 107 99 95 байт

-8 байт Спасибо @Shaggy за то, что он принял массив строк. Далее откатали 4 байта от этого. На этот раз не вызовет ошибку памяти.

a=>[...b=a.map(F=(x,i)=>i--?F(x.slice(1)+x[c=0],i):x)].sort((p,q)=>q-p).map(x=>c+=x==b.pop())|c

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

JavaScript (Node.js) , 111 107 байт

-4 байта Спасибо @ Арнаулд!

a=>[...b=a.map((x,i)=>"".padEnd(x+i,x+=c='').substr(i,x.length))].sort((p,q)=>q-p).map(x=>c-=x==b.pop())|-c

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

JavaScript (Node.js) , 113 111 байт

a=>[...b=a.map((x,i)=>"".padEnd(x+i,x).substr(i,`${x}`.length))].sort((p,q)=>p-q).map((x,i)=>x-b[i]||c++,c=0)|c

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

0 индексированные. Может вызвать ошибку памяти для очень больших записей.

Сиеру Асакото
источник
2
99 байтов , принимая входные данные как массив целочисленных строк.
лохматый
@ Shaggy Спасибо, и теперь это 95 байтов;)
Сиеру Асакото
2

Perl 6 , 50 байт

{sum ^$_ Z==sort {+[~] rotate .[$^i].comb,$i},^$_}

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

Индексирование на основе 0. Также выявлена ​​ошибка Rakudo .

объяснение

{                                                }  # Anonymous block
            sort                              ^$_   # Sort indices 0..n
                 {                          },  # by
                              .[$^i]            # element at index i
                                    .comb       # split into chars
                       rotate            ,$i    # rotated i times
                   [~]  # joined
                  +     # converted to number
     ^$_ Z==  # Pairwise equal to original indices 0..n
 sum   # Sum of equal indices
nwellnhof
источник
2

PHP ,159 141 134 130 байт

function($a){foreach($a as$x){for($j=$i;$j--;$x=substr($x,1).$x[0]);$b[$x]=$i++;}ksort($b);foreach($b as$z)$y+=++$j==$z;return$y;}

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

Индексирование на основе нуля.

Ungolfed:

function( $a ) { 
    // iterate through digits
    foreach( $a as $x ) {
        // rotate the digits the number of times based on their index
        for( $j = $i; $j--; ) {
            // move first digit to last digit
            $x = substr( $x, 1 ) . $x[0];
        }
        // the new number is used as key for sort, value is the original index
        $b[ $x ] = $i++;
    }
    // sort by the new numbers
    ksort( $b );
    // iterate sorted array
    foreach( $b as $z ) {
        // if new index matches original index, increment count ($y)
        if ( ++$j == $z ) {
            $y++;
        }
    }
    return $y;
}
  • -4 байта, принимающих входные данные в виде массива строк, спасибо @KevinCruijssen за указание на это.
640 КБ
источник
Я не очень хорошо знаю PHP, но теперь я разрешаю список строк вместо целых чисел, так что я думаю, что вы можете удалить .=''?
Кевин Круйссен
@KevinCruijssen вы правы. Принятие в качестве массива строк удалит это из необходимости. Я обновлю соответственно.
640KB
2

Запрос T-SQL, 99 байт

В Sql нет вращающегося метода, поэтому мне пришлось реализовать собственный синтаксис, поскольку это запрос, его нужно было выполнять без зацикливания.

Индексирование на основе 0.

Использование табличной переменной в качестве входных данных.

SELECT-sum(1/~(z*3))FROM(SELECT~i+rank()over(order by
substring(n+n,i%len(n)+1,len(n))*1)z FROM @)c

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

t-clausen.dk
источник
1

Perl 5 , 104 байта

sub f{my$i;grep/\d+$/&&$i++==$&,sort{$a<=>$b}map{my$n=shift;map$n=~s/(.)(.+)/$2$1/,1..$_;"$n.$_"}0..$#_}

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

Индексирование на основе 0 в Perl. Развернулся и прокомментировал:

sub f {
  my $i;                            #index counter
  grep /\d+$/ && $i++==$&,          #keep/return elems where $i matches original index stored as decimals
  sort { $a<=>$b }                  #sort rotated elems numerically (<=> is the numerical comparison op
  map {                             #loop through input
    my $n = shift;                  #shift(@_) got elem from input array @_
    map $n=~s/(.)(.+)/$2$1/, 1..$_; #rotate left times current index 
    "$n.$_"                         #use rotated number with original index number as decimals (to dont affect sort)
  }
  0..$#_
}
Кжетил С.
источник
1

Рубин -ap , 77 байт

1-индексироваться. Был временно удален, потому что я пропустил часть спецификации.

-pчитает строку STDIN и выводит $_в конце. -aразбивает эту строку на пробелы и сохраняет ее как $F.

i=0
$_=$F.zip($F.sort_by{|s|s.chars.rotate(i+=1).join.to_i}).count{|a,b|a==b}

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

Значение чернил
источник
Вы можете сохранить 2 байта, заменив [...].join.to_iнаeval [...]*''
Doorknob
1
@Doorknob, к сожалению, нет ... есть крайние случаи, когда, если число повернуто, чтобы иметь начальный ноль, evalбудет интерпретировать его как число с номером 8, что может испортить счет ...
Чернила стоимости
1

Wolfram Language (Mathematica) , 65 байт

o=Ordering
g=Count[o@MapIndexed[FromDigits@*RotateLeft,#]-o@#,0]&

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

1 на основе. Мы принимаем входные данные как список списков цифр, который работает, потому что Mathematica упорядочивает списки по длине, а затем лексикографически, то есть точно так же, как и исходные числа.

lirtosiast
источник
1

Баш , 204 201 байт

Единственная интересная вещь здесь (возможно), это использование eval . Алгоритм также неуклюж в том, что он создает отсортированный список, а затем читает его, чтобы определить измененные индексы / индексы.

1-решение Спасибо @RobinRyder за полезный алгоритм вращения.

for((i=1;i<$#+1;i++));do eval s=\${$i};for((j=0;j<i;j++));do eval s=${s}\${$i};done;eval n=\${s:$i:\${#$i}};echo $n $i;done|sort -nk1,1|{ i=1;c=0;while read d j;do((i==j))&&((c++));((i++));done;echo $c; }

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

Пересмотренный код после комментариев Кевина; Попробуйте онлайн!

PJF
источник
Я не слишком хорошо знаю Баша, но думаю, вы можете убрать последний пробел между ними ;}. Кроме того, вы можете изменить свой первый цикл на for((i=0;++i<=$#;));.
Кевин Круйссен
@KevinCruijssen - обычно я обнаружил, что Bash и друзьям нужно это место для разбора командной строки. В этом случае вы правы, это может быть удалено. Хорошая идея для повторной базы и предварительного увеличения. 202 байта.
PJF
1

Scala , 200 160 байт

def f(a:Seq[String])=
  a.zipWithIndex
   .map(x=>{val r=x._2%x._1.size;x._1.drop(r)+x._1.take(r)->x._2})
   .sortBy(_._1.toInt)
   .zipWithIndex
   .filter(x=>x._1._2==x._2)
   .size

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

0 индексированные. 160 символов после удаления отступов и новых строк. Это печатает 6:

println( f(Seq("8","49","73","102","259","762","2782","3383","9217","37846","89487","7471788")) )
Кжетил С.
источник