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


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 елементи.
Kevin Cruijssen

Чи можемо ми прийняти введення як список рядків?
Втілення Невідомості

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.



@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

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


@eriktheoutgolfer дякую, я був надто зайнятий спробою зробити лямбда, про яку я забув input():)
TFeld

Тому я спершу намагаюся зробити повноцінну програму ...: D Серйозно, якщо ви спершу спробуєте зробити повну програму, то ви чітко побачите, чи варто перейти на лямбда чи ні. Не починайте defвідразу (в Python 2 вони дуже марні, всупереч Python 3).
Ерік Аутгольфер

Я дозволив список введення в якості рядків зараз, тож ви можете скинути 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
}

3

J , 28 26 байт

-2 байти завдяки Йона

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

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


1
Приємно. Схоже, ви можете втратити "0( спробуйте в Інтернеті! ), Окрім того, що я не бачив шляху до гольфу далі.
Йона

@Jonah Дякую! Я не знаю, чому я не пробував без цього.
Гален Іванов



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

@FryAmTheEggman Зараз я дозволив список рядків як вхідний, тому він дійсний зараз.
Кевін Круїссен

@FryAmTheEggman Ви, мабуть, праві, я не вважав лексографічне сортування проти сортування цілих чисел при опущенні s- оригінальна версія коду мала vтой самий ефект. Я відредагую її ще раз
Sok

Так, як зазначає Кевін, тепер ви можете скинути backtick і взяти вклад як список рядків, щоб зберегти байт.
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 байти Дякую @Arnauld!

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. Також виявили помилку Ракудо .

Пояснення

{                                                }  # 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

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;}

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

Індексація на основі нуля.

Безголівки:

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 байти, що приймають введення як масив рядків, thx до @KevinCruijssen для вказівки на це.

Я не знаю PHP занадто добре, але я дозволяю перелік рядків замість цілих чисел зараз, тому я думаю, ви можете видалити .=''?
Кевін Круїссен

@KevinCruijssen ви праві. Беручи до уваги масив рядків, це усуне необхідність. Я відповідно оновлю.
640 Кб


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

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



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, що може зіпсувати наш підрахунок ...
Value Ink

1

Мова Вольфрама (Mathematica) , 65 байт

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

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

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


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; }

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

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


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