整数の回転位置


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

チャレンジルール:

  • 入力リストには、正の整数のみが含まれることが保証されています。
  • 入力リストは、最低から最高へのソートが保証されています。
  • 入力リストには、少なくとも2つの項目が含まれることが保証されています。
  • 上記からわかるように、0ベースと1ベースの両方のインデックスが許可されています。出力はそれに応じて異なる可能性があるため、使用した2つのうちどちらを使用したか答えてください。
  • 0回転後の先頭のsは無視されます。これは、整数102021回転後になり、その後として扱われる上記の1ベースの例で見ることができます21
  • 整数は入力リスト内で一意であることが保証されており、ローテーションの完了後も一意であることが保証されています。
  • 入力リストの値ではなく、入力の位置と相関して回転した整数の位置のみを見ることに注意してください。これが意味することを明確にするために、入力リスト[1234,3412]と1ベースのインデックス付けでは、リストは[2341,1234]各整数をインデックスの回数だけ回転した後になり、ソートされるとになり[1234,2341]ます。元の入力リストと回転リストの両方に1234先頭位置に整数が含まれていますが、それらは同じではありません!回転12343412前でした。したがって0、2つの整数の位置が入れ替わっているため、このinput-listの1インデックス付き出力はです。
  • 入力は柔軟です。リスト/ストリーム/整数の配列/文字列/数字配列などを指定できます。入力を整数として受け取らない場合は、使用したものを指定してください。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、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うーん、私の最初の考えはノーだろうが、私は単一のアイテムでテストケースを持っておらず、それがチャレンジに多くを追加しないので、なぜだろう。input-listには少なくとも2つの項目が含まれることが保証されるというルールを追加します。
ケビンクルーッセン

入力を文字列のリストとして受け入れることはできますか?
無知の

1
@Shaggy恩恵を受けると思った答えを通知しました。恩恵を受ける可能性のあるものを見つけた場合は、お気軽にお知らせください。
ケビンクルーッセン

1
例から、出力は「各整数の数字をそのインデックス量だけ左に回転し、配列を再度ソートした後、正確に同じインデックスにある整数の量」であるはずです。
qwr

回答:


11

R114107バイト

ジュゼッペのおかげで-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です。



@ジュゼッペありがとう!覚えておく必要がありますseq(a=...)。私はいくつかあります期待してMap実行するための魔法は、私の試みは、最高の状態でそのままバイト数を残しました。
ロビンライダー

Mapfunctionボイラープレートが少なくとも9バイトであるため、少し高すぎるかもしれませんが、0インデックスに切り替えると、109バイト
ジュゼッペ

1
良い発見!入力が少なくとも2つの要素を持つ限り、それseq(a=l)を実現することで107までseq(l)(これで問題ないかどうかを尋ねました)。
ロビンライダー



6

Japt -x10 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

パイソン2104の 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バイト、Erik the Outgolferのおかげ
  • -4バイト、Kevin Cruijssen(および彼のルール変更)のおかげ


@eriktheoutgolferありがとう、私はラムダを作ろうとして忙しかったので、忘れていましたinput():)
TFeld

だから、最初に完全なプログラムを作成しようとします...:D真剣に、最初に完全なプログラムを作成しようとすると、ラムダに変換する価値があるかどうかがはっきりとわかります。defすぐに始めないでください(Python 2とは対照的に、Python 3とは対照的です)。
エリック・ザ・アウトゴルファー


4

R90 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の答えに触発された回転戦略
  • @Giuseppeのおかげで-5バイト

説明付きの展開されていないコード:

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

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は同じ効果がありました。私はそれを編集し直します
ソク

ああ、ケビンが指摘しているように、バックティックを削除して、入力を文字列のリストとして取得して、バイトを保存することができます。
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バイト節約されます
Graham

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

PHP159 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バイトは文字列の配列として入力を受け取り、それを指摘するために@KevinCruijssenにthxします。

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

オンラインで試す



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..$#_}

オンラインでお試しください!

Perlの0ベースのインデックス。非ゴルフとコメント:

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インデックス付き。仕様の一部を見逃したため、一時削除されました。

-pSTDINの行を読み取り$_、最後に出力します。-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_ieval [...]*''
ドアノブ

1
残念ながら@Doorknobない...数は、先行ゼロを持つように回転させると、エッジケースがあるevalベース-8数、当社がカウントアップ混乱でし...としてそれを解釈する
バリューインク


1

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

オンラインでお試しください!

Kevinのコメントに続く修正されたコード。 オンラインでお試しください!


Bashについてはあまりよく知りませんが、の間の最後のスペースを削除できると思います;}。また、最初のループをに変更できますfor((i=0;++i<=$#;));
ケビンクルーッセン

@KevinCruijssen-通常、私はBashと友人がコマンドラインを解析するためにそのスペースを必要とすることを発見しました。この機会にあなたは正しいです、それは削除されるかもしれません。リベースしてプリインクリメントするのは良いアイデアです。202バイト。
PJF

1

Scala200 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")) )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.