Tamsayıların Döndürülmüş Konumu


20

Meydan okuma:

Giriş:

Pozitif tamsayıların sıralı bir listesi.

Çıktı:

Hâlâ tam olarak aynı indekste olan tamsayıların miktarı, her tamsayıdaki rakamlar endeks miktarını sola doğru döndürdükten ve değiştirilen listeyi tekrar sıraladıktan sonra.

Örnek:

Girdi: [8,49,73,102,259,762,2782,3383,9217,37846,89487,7471788]
Çıktı (0 tabanlı dizinleme): 6
Çıktı (1 tabanlı dizinleme):5

Neden?

0 tabanlı indeksleme:

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 tabanlı indeksleme:

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

Zorluk kuralları:

  • Giriş listesinin yalnızca pozitif tamsayılar içereceği garanti edilir.
  • Giriş listesinin en düşükten en yükseğe doğru sıralanması garanti edilir.
  • Giriş listesinin en az iki öğe içermesi garanti edilir.
  • Yukarıda görebileceğiniz gibi, hem 0 tabanlı hem de 1 tabanlı dizine eklemeye izin verilir. Lütfen cevaplarınızda hangisini kullandığınızı belirtin, çünkü çıktılar buna göre değişebilir!
  • Döndürmeden 0sonraki öncüler yok sayılır; bu, yukarıdaki tamsayının döndürüldükten sonra 102hale geldiği 021ve daha sonra olduğu gibi ele alındığı yukarıdaki 1 tabanlı örnekle görülebilir 21.
  • Tamsayıların giriş listesinde benzersiz olduğu ve rotasyonlar tamamlandıktan sonra benzersiz kalacağı garanti edilir.
  • Giriş listesinin değerleriyle değil, yalnızca döndürülen tamsayıların konumlarının girdinin konumlarıyla ilişkili olarak baktığımızı unutmayın. Bununla ne demek istediğimi açıklığa kavuşturmak için: giriş listesi [1234,3412]ve 1 tabanlı indeksleme ile, liste [2341,1234]her bir tamsayıyı döndürdükten sonra dizin sayısıdır ve sonra sıralanır [1234,2341]. Hem orijinal giriş listesi hem de döndürülen liste 1234önde gelen konumda tamsayı içermesine rağmen , bunlar aynı değildir! Döndürülmüş 1234oldu 3412önce. Bu nedenle 0, iki tamsayı konumlarını değiştirdiği için, bu girdi listesi için 1 dizinli çıktıdır .
  • Giriş esnektir. Bir liste / akış / tamsayılar dizesi / dizeler / rakam dizileri vb. Olabilir. Girişleri tamsayı olarak almadıysanız lütfen ne kullandığınızı belirtin.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için olabildiğince kısa bir cevap bulmaya çalışın.
  • Varsayılan I / O kuralları ile cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için bir test içeren bir bağlantı ekleyin (örn. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test senaryoları:

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

Girişin rastgele listenin boyutu olduğu bu ungolfed 05AB1E programıyla daha rasgele test senaryoları oluşturmaktan (ya da ilham almaktan çekinmeyin ) (NOT: bu jeneratörün çıkışı " Tamsayıların benzersiz olduğu garanti edilir giriş listesi ve dönüşler tamamlandıktan sonra benzersiz kalması garanti edilir ", bu nedenle bunu kullanırken aklınızda bulundurun.)


Girdinin en az 2 unsuru olduğunu varsayabilir miyiz?
Robin Ryder

2
@RobinRyder Hmm, ilk düşüncem hayır olurdu, ama tek öğelerle herhangi bir test vakası olmadığından ve meydan okumaya fazla bir şey eklemediğinden, neden olmasın. Giriş listesinin en az 2 öğe içereceği garanti edilen bir kural ekleyeceğim.
Kevin Cruijssen

Girişi dizelerin bir listesi olarak kabul edebilir miyiz?
Cehaletin Somutlaştırılması

1
@Shaggy Faydalanacağını düşündüğüm cevapları bildirdim. Ondan da faydalanabilecek bir şey görürseniz, bunları da bildirmekten çekinmeyin.
Kevin Cruijssen

1
Örnekte çıktı, "Her bir tamsayıdaki rakamlar, dizin miktarını sola doğru döndürdükten ve diziyi tekrar sıraladıktan sonra, tam olarak aynı indekste olan tamsayıların miktarı " olmalıdır?
qwr

Yanıtlar:


11

R , 114107 bayt

Giuseppe sayesinde 5 bayt.

DigEmAll tarafından geride bırakıldı.

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

Çevrimiçi deneyin!

0 endeksli.

Ungolfed sürümü:

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
}

Döndürmek için btarafından bir tam sayı rakamlarını jpozisyonları, kodu daha sonra, rakamları birçok kez tekrar pozisyonlarda basamak alır j+1için j+b. Örneğin, 1024 kez döndürmek için, x( ile 5. ve 7. konumlar) işaretli değerleri saklayın :

102102102102
    xxx

böylece sonuç 021.



@Giuseppe Teşekkürler! Hatırlamam gerek seq(a=...). Biraz Mapsihir olmasını bekliyorum ama girişimlerim bayt sayımını en iyi şekilde değiştirmedi.
Robin Ryder

Mapfunctionısıtıcı plaka en az 9 bayt olduğu için biraz pahalı olabilir , ancak 0 endekslemeye geçerseniz 109 bayt
Giuseppe

1
İyi bulmak! Fark ile 107 için Aşağı seq(a=l)olabilir seq(l)sürece girdi en az 2 elemanlarını (Bu Tamam olup olmadığını sordu) olduğu gibi.
Robin Ryder


6

05AB1E , 9 bayt

ΣN._ï}-_O

Çevrimiçi deneyin!

0 tabanlı indeksleme kullanır.

Açıklama:

Σ    }       # 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 bayt

0 tabanlı

í¶UñÈséYn

Dene

í¶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

Jöle , 9 bayt

Dṙ"JḌỤ=JS

Çevrimiçi deneyin!

Bir tamsayı listesi alan ve 1 dizinleme kullanarak döndürme gerçekleştirildikten sonra yerinde kalan tam sayıların sayısını gösteren bir tamsayı döndüren monadik bağlantı.

açıklama

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 bayt

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

Çevrimiçi deneyin!

0 tabanlı indeksleme.

Önce her sayıyı döndürür ve ardından sonucu sonuçla karşılaştırır, ancak sıralar.


Kaydedilen:

  • -3 bayt, Outgolfer Erik sayesinde
  • -4 bayt, Kevin Cruijssen (ve kural değişikliği) sayesinde


@eriktheoutgolfer teşekkürler, unuttuğum bir lambda yapmaya çalışmakla çok meşguldüm input():)
TFeld

Bu yüzden önce tam bir program yapmaya çalışıyorum ...: D Cidden, ilk olarak tam bir program yapmaya çalışırsanız, lambda'ya dönüştürmeye değer olup olmadığını açıkça göreceksiniz. defHemen başlamayın (Python 3'ün aksine Python 2'de oldukça işe yaramazlar).
Outgolfer Erik

Giriş listesine şimdi dizeler olarak izin verdim, böylece etrafındaki mezar aksanlarını kaldırarak 4 bayt düşebilirsinizs .
Kevin Cruijssen

4

R , 90 88 85 bayt

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

Çevrimiçi deneyin!

Açıklamalı kaydedilmemiş kod:

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
}



2

Perl 5 -pa , 80 bayt

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

Çevrimiçi deneyin!

Girişi STDIN üzerinde boşlukla ayrılmış sayılar olarak alır; 1 tabanlı sonuç verir.


2

Pyth , 15 bayt

sqVSJ.ev.<`bkQJ

Çevrimiçi deneyin! 0 tabanlı indeksleme kullanır.

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 Şimdi dizeler listesine girdi olarak izin verdim, bu yüzden şimdi geçerli.
Kevin Cruijssen

@FryAmTheEggman Muhtemelen haklısın, atlayarak skod yazımının tamsayı sıralamasına karşı tam bir sıralama düşünmüyordum - kodun orijinal sürümü vaynı etkiye sahipti . Tekrar düzenleyeceğim
Sok

Ah, Kevin'in işaret ettiği gibi, backtick'i bırakabilir ve girdiyi bir bayt kaydetmek için dizelerin bir listesi olarak alabilirsiniz.
FryAmTheEggman

2

APL + WIN, 23, 21 19 bayt

Tam sayıları iç içe bir karakter vektörü olarak girerek 2 bayt kaydedildi

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

1 dizin oluşturuldu.

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.

Çevrimiçi deneyin! Dyalog Classic'in izniyle


Herhangi bir bayt kaydedip kaydetmeyeceğinden emin değilim, ancak girdiye şimdi bir dize listesi veya basamak listesi listesi olarak izin verdim.
Kevin Cruijssen

@KevinCruijssen Bunu işaret ettiğiniz için teşekkür ederiz. İç içe bir dizgi vektörü girmek 2 bayt kazandırır
Graham

2

JavaScript (Node.js) , 107 99 95 bayt

-8 bayt Yerine dizeleri kabul ettiğiniz için @Shaggy teşekkürler. Bundan 4 bayt daha golf. Bu sefer bellek hatasını tetiklemeyecek.

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

Çevrimiçi deneyin!

JavaScript (Node.js) , 111 107 bayt

-4 bayt Teşekkürler @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

Çevrimiçi deneyin!

JavaScript (node.js) , 113 111 bayt

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

Çevrimiçi deneyin!

0 endeksli. Çok büyük girişler için bellek hatasını tetikleyebilir.


2
99 bayt , girdi bir tamsayı dizisi dizisi olarak alınır.
Shaggy

@Shaggy Teşekkürler, ve şimdi 95 byte;)
Shieru Asakoto

2

Perl 6 , 50 bayt

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

Çevrimiçi deneyin!

0 tabanlı indeksleme. Ayrıca bir Rakudo böcek maruz .

açıklama

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

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

Çevrimiçi deneyin!

Sıfır tabanlı indeksleme.

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 bayt dizeler dizisi olarak girdi, thx @KevinCruijssen bunu işaret için.

Ben PHP çok iyi bilmiyorum, ama şimdi tamsayılar yerine dizelerin bir listesini izin, bu yüzden kaldırabilirsiniz düşünüyorum .='' ?
Kevin Cruijssen

@KevinCruijssen haklısın. Dizeler dizisi olarak alınması, dizgiyi zorunlu kılar. Buna göre güncelleme yapacağım.
640KB


2

T-SQL sorgusu, 99 bayt

Sql hiçbir döndürme yöntemi vardır, bu yüzden kendi sözdizimi uygulamak zorunda kaldı, bu bir sorgu olduğundan, döngü olmadan yapılması gerekiyordu.

0 tabanlı indeksleme.

Girdi olarak bir tablo değişkeni kullanma.

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

Çevrimiçi deneyin


1

Simge , 141 bayt

procedure f(l)
n:=0
b:=[]
t:=l[k:=1to*l]&m:=k%*t&t:=t[m+1:0]||t[1:m+1]&put(b,[+t,l[k]])&\x
l[i:=1to*l]=sortf(b,1)[i,2]&n+:=1&\x 
return n
end

Çevrimiçi deneyin!

1 tabanlı indeksleme


1

Perl 5 , 104 bayt

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

Çevrimiçi deneyin!

Perl'de 0 tabanlı indeksleme. Ungolfed ve yorum yaptı:

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

Ruby -ap , 77 bayt

1 endeksli. Spesifikasyonun bir kısmını kaçırdığım için geçici olarak daha önce silindi.

-pbir STDIN satırı okur $_ve sonunda çıktı verir. -asatırları boşluklara göre böler ve olarak kaydeder $F.

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

Çevrimiçi deneyin!


[...].join.to_ieval [...]*''
Doorknob

1
@ Ne yazık ki değil ... bir sayı önde bir sıfıra sahip döndürülürse eval, sayımlarımızı bozabilecek bir taban-8 numarası olarak yorumlayacağı kenar durumlar vardır ...
Value Ink

1

Wolfram Dili (Mathematica) , 65 bayt

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

Çevrimiçi deneyin!

1 tabanlı. Girdiyi, Mathematica'nın uzunluklarına göre listeler, sonra sözlükbilimsel olarak, yani orijinal sayılar gibi çalıştığı için çalışan basamak listelerinin bir listesi olarak alıyoruz.


1

Baş , 204201 bayt

Burada tek ilginç şey (muhtemelen) kullanımıdır eval. Algoritma ayrıca, sıralı bir liste oluşturması ve değiştirilen endeksi / dizinleri belirlemek için listeyi okuması nedeniyle tıknazdır.

1 tabanlı çözüm. Yararlı rotasyon algoritması için @RobinRyder'a teşekkürler.

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

Çevrimiçi deneyin!

Kevin'in yorumlarını takiben revize edilmiş kod; Çevrimiçi deneyin!


Bash'ı çok iyi tanımıyorum, ancak sanırım aradaki son boşluğu kaldırabilirsiniz ;}. Ayrıca, ilk döngünüzü olarak değiştirebilirsiniz for((i=0;++i<=$#;));.
Kevin Cruijssen

@KevinCruijssen - genellikle Bash ve arkadaşlarımın komut satırını ayrıştırmak için bu alana ihtiyacı olduğunu gördüm. Bu durumda doğru kaldırılabilir. Yeniden temel ve ön artış için güzel bir fikir. 202 bayt.
PJF

1

Scala , 200 160 bayt

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

Çevrimiçi deneyin!

0 endeksli. Girintiyi ve satırsonlarını çıkardıktan sonra 160 karakter. Bu 6 yazdırır:

println( f(Seq("8","49","73","102","259","762","2782","3383","9217","37846","89487","7471788")) )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.