ダブを一緒に入手する


24

4chanでは、人気のゲームが入手できます。サイト上のすべての投稿には、連続した投稿IDが付与されます。あなたはそれらに影響を与えたり決定したりすることはできないので、人々は自分の投稿番号(少なくとも一部)、通常は最初の数桁を推測しようとします。ゲームの別のバージョンはダブと呼ばれ、目標は数字の最後に数字を繰り返すことです(つまり、1234555)。

あなたの仕事は、あなたがそれを受け入れたいなら、入力として投稿IDを取り(標準整数、2 ^ 32以下と仮定できます)、最後に何桁の繰り返しがあるかを返すプログラムを書くことです。

ルール

  • 標準的な抜け穴は許可されません
  • プログラムは、それを実行するために外部のカウントされていないコード/引数が必要ない限り、実際に機能するものであれば、関数、完全なプログラム、REPLコマンドでありえます。
  • 入力は、STDIN、関数の引数、コマンドラインの引数、ファイルなど、あなたに合ったものから得ることができます。

テストケース

Input: 14892093
Output: 1

Input: 12344444
Output: 5

Input: 112311
Output: 2

Input: 888888
Output: 6

Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1

1
入力を文字列として受け取ることはできますか?
デッドポッサム

6
@DeadPossum STDIN、コマンドライン引数、またはファイル(これらはすべて許容される入力メソッドです)から入力を読み取った場合でも文字列を取得するため、これは許可されていると仮定します。
マーティンエンダー

1
入力が0より大きいと仮定できますか?
マーティンエンダー

1
@MartinEnderはい
sagiksp

2
ダブゲームに賛成票を投じてください!チェック!
ゾンビチャウダー

回答:


19

Mathematica、29バイト

算術解法はどうですか?

IntegerExponent[9#+#~Mod~10]&

これがMathematicaの単純なアプローチに勝ることを非常に嬉しく思います。

説明

コード自体は9 * n + n%10を計算し、入力を除算する最大の10の累乗を見つけます。つまり、末尾のゼロをカウントします。nk個の繰り返し数字で終わる場合、9 * n + n%10にk個の後続ゼロがあることを示す必要があります。

Rep-digitsは、9999910 5 -1)のような数値を9で除算し、繰り返し桁を掛けることで数学的に最も簡単に表現できます。我々は、書くことができるように、N = M * 10 K + D *(10 K -1)/ 9M≢D(MOD 10) 、ことを保証するために、nがで終わっていないよりよりK繰り返さ桁。d = n%10であることに注意してください。

それを式9 * n + n%10にプラグインしましょう。我々は、取得9 * M * 10 K + D *(10 K -1)+ D。最後のdはキャンセルされるため、次のようになります:9 * m * 10 k + d * 10 k =(9 * m + d)* 10 k。しかし、9≡-1(mod 10)、したがって9 * m + d≡d-m(mod 10)です。しかし、m≢d(mod 10)であり、したがってd-m≢0 (mod 10)であると断言しました。

つまり、9 * m + d10で割り切れないことを示したため、9 * n + n%10 =(9 * m + d)* 10 kを除算する10のべき乗はkであり、末尾の繰り返し数字の数。

ボーナスとして、このソリューションは、入力用に正しい結果を出力します0


1
このようなサイトでMathJaxがサポートされていればいいと思います。太字の式は、タイプセット式ほど優れていません。ただし、指数の上付き文字を書くのに時間がかかったことは素晴らしいことです。
wizzwizz4

1
@ wizzwizz4以前はコードの書式設定を使用していましたが、太字(通常Dennisが使用する)はそれよりも少し読みやすいことがわかりました。しかし、MathJaxほど素晴らしいものではないことに同意しました。
マーティンエンダー

13

網膜、9バイト

&`(.)\1*$

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

重複する一致の数をカウントし(.)\1*$ます。一致する一致は、同じ文字のサフィックスに一致する正規表現です。


2
これはミームでなければなりません:あなたとあなたの正規表現
クリストファー

私はこれらの修飾子のすべてを学ぶ必要があります-私はちょうど行ったでしょう(.)(?=\1*$)
ニール

1
@DownChristopher彼は文字通り正規表現ベースの言語を作成しました。これはミームマテリアルcを超えています:
ロッド

1
@Neil慰めの場合、私の最初の試みは(?=(.)\1*$)(だから基本的にあなたと同じです)でした。
マーティンエンダー

1
はい、そうです、ありがとう!
ニール

9

Brachylog、4バイト

ẹḅtl

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

説明

ẹ       Elements: split to a list of digits
 ḅ      Blocks: group consecutive equal digits into lists
  t     Tail: take the last list
   l    Length: Output is the length of that last list

整数に直接取り組んだ場合(そして、なぜそうするように実装しなかったのかわからない)、これは必要ないので3バイトだけです。


9

パイソン247の 41バイト

lambda s:len(`s`)-len(`s`.rstrip(`s%10`))

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

36バイト-より柔軟な入力用

lambda s:len(s)-len(s.rstrip(s[-1]))

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


ワオ。ビルトインをもっと注意深く学ぶ必要があります。+1
デッドポッサム

2
@DeadPossum dir(object)は私たちの友人ですc:
ロッド

ところで、文字列を入力として使用することはできません。「入力のメソッドが自動的に文字列を返す場合、確かですが、入力が文字列として提供されることを想定することはできません。」:C
デッドポッサム

1
@DeadPossum著者はそれについて考えを変えたと思います。コメントは削除されたようです。
ブライアンマッカットン

8

Javascript(ES6)、55 52 32 30バイト

a=>a.match`(.)\\1*$`[0].length
  • 保存された19は、正規表現を置き換えることにより、@MartinEnderのおかげでバイト
  • タグ付きテンプレートリテラルを使用した@ user81655のおかげで2バイト節約

正規表現を使用して、最後の数字の最後のグループと一致させる

注:最初の投稿。発言することをheしないでください。

f=a=>a.match`(.)\\1*$`[0].length


console.log(f("14892093"));//1
console.log(f("12344444"));//5
console.log(f("112311"));//2
console.log(f("888888"));//6
console.log(f("135866667 "));//1

PPCGへようこそ!あなたは後方参照を使用しての代わりに、手動で繰り返し文字で充填することによってバイトを大幅に節約することができます/(.)\1*$/
マーティン・エンダー

また、名前のない関数は完全に問題ないので(たとえば、再帰呼び出しに名前が必要でない限り)、に2バイトを保存できますf=
マーティンエンダー

よくやった!これは確かにレビューに合格しますが、これはゴルフにかけることができます
クリストファー

@MartinEnderありがとう!私はまだゴルフの方法を学ぶ必要があります
Weedoze

@DownChristopherありがとう!次回はもっと良くしようとします
Weedoze


7

PHP、47 45 40バイト

while($argn[-++$i]==$argn[-1]);echo$i-1;

で実行 echo <n> | php -nR '<code>

ループは私の最初の答えよりもまだ小さいようです。最後に等しい文字を数えるだけです。これは、負の文字列オフセットを使用します PHP 7.1の

-5バイトTitusによる。ありがとう!


古い答え:

<?=strlen($a=$argv[1])-strlen(chop($a,$a[-1]));

右端の文字に一致するすべての文字を右側から削除し、長さの差を計算します。


-Rそして、$argn5つのバイトを救うことができます。
タイタス





6

C(gcc)32 29バイト

f(x){x=x%100%11?1:-~f(x/10);}

これは私のPython回答の移植版です

これはgccで機能しますが、returnステートメントの欠如は未定義の動作です。

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


どうしてポインタを渡さず、その場所の値を変更するのか、あるいは単に値を返すのか、私は混乱しています。これは、ローカルコピーを変更するだけで、機能が使用できなくなるように見えますが、TIOでは機能します。また、sizeof(int)ではなくフッターのnに1を追加すると、intの全幅ではなく、1バイト前方に移動しませんか?明らかに、ここで学ぶことができるいくつかのトリックがあり、おそらく私は自分の答えで最初のものを使用することができます。
ビジャン

2
すべてreturnのステートメントは、EAXで戻り値を記憶しているん。gccでは、変数に割り当てると、同じことが起こります。ポインター演算に関しては、intポインターに1を追加すると、次のバイトではなく、次のintに移動します。
デニス

(intを使用している場合)戻りたほうが良い場合はありますか?最悪の場合、新しいintを作成して割り当てるように思われます。
ビジャン

@Bijan Cコンパイラは、直接メモリアクセスを問題のプリミティブのアトムのサイズに常に合わせます。ただし、標準に含まれているかどうかは覚えていませんが、
cat


5

C#63 62バイト


ゴルフ

i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}

非ゴルフ

i => {
    int a = i.Length - 1,
        b = a;

    while( a-- > 0 && i[ a ] == i[ b ] );

    return b - a;
}

読みやすい

i => {
    int a = i.Length - 1, // Store the length of the input
        b = a ;           // Get the position of the last char

    // Cycle through the string from the right to the left
    //   while the current char is equal to the last char
    while( a-- > 0 && i[ a ] == i[ b ] );

    // Return the difference between the last position
    //   and the last occurrence of the same char
    return b - a;
}

完全なコード

using System;

namespace Namespace {
   class Program {
      static void Main( String[] args ) {
         Func<String, Int32> f = i => {
            int a = i.Length - 1, b = a;
            while( a-- > 0 && i[ a ] == i[ b ] );
            return b - a;
         };

         List<String>
            testCases = new List<String>() {
               "14892093",
               "12344444",
               "112311",
               "888888",
               "135866667"
            };

         foreach( String testCase in testCases ) {
            Console.WriteLine( $" Input: {testCase}\nOutput: {f( testCase )}\n" );
         }

         Console.ReadLine();
      }
   }
}

リリース

  • v1.1 -- Kevinのコメントに- 1 byte 感謝します。
  • v1.0の -  63 bytes-初期ソリューション。

ノート

追加するものはありません


+1ただし、1バイトずつゴルフできます。このように:i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
ケビンクルーッセン


4

MATL6 5バイト

@Luisのおかげで1バイト節約

&Y'O)

MATL Online試しください

説明

        % Implicitly grab input as a string
&Y'     % Perform run-length encoding on the string but keep only the second output
        % Which is the number of successive times an element appeared
O)      % Grab the last element from this array
        % Implicitly display

私は忘れていた&にそれをしたY'引用符で囲まれた文字列として入力を取ることはありませ:-Dなぜとを取り除きますかj
ルイスメンドー

@LuisMendo入力が「整数」であるとチャレンジが明示的に言っていたので、それができるかどうかわかりませんでした
-Suever

私は、Martinのコメントと、それを許可するデフォルトのルールからそう思っていました。しかし、よくわからない
ルイスメンドー

@LuisMendoああ、彼のコメントはありませんでした。更新します!
-Suever

4

Cubix、24 19バイト

)uO)ABq-!wpUp)W.@;;

注意

  • 入力の最後に同じ文字がいくつあるかを実際に数えるので、これは本当に大きな整数と本当に長い文字列に対しても機能します(最後の同じ文字の量がJavaScriptの最大精度よりも小さい場合( 10進数で約15桁)。
  • 入力は入力フィールドに入り、出力は出力フィールドに出力されます

ここで試してみてください

説明

まず、キューブを展開しましょう

    ) u
    O )
A B q - ! w p U
p ) W . @ ; ; .
    . .
    . .

実行のステップは、3つのフェーズに分割できます。

  1. 入力を解析する
  2. 文字を比較する
  3. 印刷結果

フェーズ1:入力

実行された最初の2つの文字があるABAすべての入力を読み取り、文字コードとしてスタックにプッシュします。これは逆に行われ、最初の文字がスタックの一番上になり、最後の文字がほぼ一番下になることに注意してください。一番下に、-1EOF)が配置されます。これは、文字列の末尾にある連続した文字の量のカウンターとして使用されます。スタックの一番上に最後の2文字を含める必要があるため、ループに入る前にスタックを逆にします。スタックの上部は次のようになります..., C[n-1], C[n], -1

キューブ上のIPの場所は、その場所であり、E右を向いています。まだ実行されていないすべての命令は、ノーオペレーション(フルストップ)に置き換えられました。

    . .
    . .
A B E . . . . .
. . . . . . . .
    . .
    . .

フェーズ2:文字の比較

スタックはです..., C[a-1], C[a], counter。ここcounterで、チェックする2つの文字(C[a]およびC[a-1])が等しい場合に増分するカウンターです。IPは最初にSキャラクターでこのループに入り、右に移動します。E文字は、IP(右向き)してしまう位置であるC[a]C[a-1]差し引くことを意味同じ値、持っていないC[a]からC[a-1]得られない0命令は、以下その場合に、!(あるスキップされますw)。

    . .
    . .
. S q - ! w E .
p ) W . . ; ; .
    . .
    . .

完全なループ中に実行される命令は次のとおりです。

q-!;;p) # Explanation
q       # Push counter to the bottom of the stack
        #     Stack (counter, ..., C[a-1], C[a])
 -      # Subtract C[a] from C[a-1], which is 0 if both are equal
        #     Stack (counter, ..., C[a-1], C[a], C[a-1]-C[a])
  !     # Leave the loop if C[a-1]-C[a] does not equal 0
   ;;   # Remove result of subtraction and C[a] from stack
        #     Stack (counter, ..., C[a-1])
     p  # Move the bottom of the stack to the top
        #     Stack (..., C[a-1], counter)
      ) # Increment the counter
        #     Stack (..., C[a-1], counter + 1)

そして、ループします。

フェーズ3:結果の印刷

ループを早期に終了したため、スタックは次のようになりますcounter, ..., C[a-1]-C[a]。これは、カウンターを印刷するのは簡単ですが、我々は我々がでカウントを開始したので、我々はもう一度、ループの最後の繰り返しでそれを行う、としなかったため、いったんカウンタをインクリメントしなければならない-1代わりに0。キューブのパスは、から始まりS、右を指すこのようになります。IPによって実行される2つのno-opは、IPの方向を指す矢印に置き換えられます。

    ) u
    O )
. B . . . S p U
. ) . . @ . . .
    > >
    . .

命令は次の順序で実行されます。B)最後の命令はスタックを変更しますが、プログラムを終了しようとしているため、プログラムには影響を与えず、スタックを使用しないことに注意してください。

p))OB)@ # Explanation
p       # Pull the counter to the top
        #     Stack: (..., counter)
 ))     # Add two
        #     Stack: (..., counter + 2)
   O    # Output as number
    B)  # Reverse the stack and increment the top
      @ # End the program

アレア・イクタ


3

バッチ、91バイト

@set s=-%1
@set n=1
:l
@if %s:~-2,1%==%s:~-1% set s=%s:~,-1%&set/an+=1&goto l
@echo %n%

これ-により、テストが文字列の先頭から実行されなくなります。


3

JavaScript(ES6)、34バイト

f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)

正規表現ソリューションよりも短くありません。

数字を右から左に評価し、別の数字に遭遇したときに停止する再帰関数。結果は、反復回数です。pundefined最初の反復にあり、n%10-p戻り値NaN(偽)を意味します。その後p、前の数字とに等しくなりn%10ます。現在の数字(n%10)と前の数字(p)が異なる場合、ループは終了します。


3

ロダ、12バイト

{count|tail}

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

これは、入力文字列の各文字がストリームにプッシュされることを期待する匿名関数です(これは最近のメタ質問の精神で有効だと思います)。

これは、2つの組み込みコマンドを使用しますcountと、tail

  1. count ストリームから値を読み取り、連続する要素の数をストリームにプッシュします。
  2. tail ストリームの最後の値を返します。

3

T-SQL、238 214バイト

declare @ varchar(max) = '' declare @i int=0, @e int=0, @n int=right(@,1), @m int while (@i<=len(@)) begin set @m=(substring(@,len(@)-@i,1)) if (@n=@m) set @e=@e+1 else if (@i=0) set @e=1 set @i=@i+1 end select @e

または:

declare @ varchar(max) = '12345678999999'
declare 
    @i int = 0,
    @e int = 0,
    @n int = right(@,1),
    @m int

while (@i <= len(@))
begin
    set @m = (substring(@,len(@)-@i,1))
    if (@n = @m) set @e = @e + 1
    else
    if (@i) = 0 set @e = 1
    set @i = @i + 1
end
select @e


2

Powershell、41バイト

for($n="$args";$n[-1]-eq$n[-++$a]){};$a-1

文字が文字列の最後の文字と一致しなくなるまで単純なループを逆方向にループし、その文字のインデックス-1を返します。

-3 @AdmBorkBorkに感謝-しばらくの代わりにforループを使用します。


2

Mathematica、33 30バイト

3バイトを節約してくれたGreg Martinに感謝します。

Tr[1^Last@Split@Characters@#]&

入力を文字列として受け取ります。

10進数字(文字の形式)を取得し、それらを同一の要素の実行に分割し、最後の実行を取得し、ベクトルの合計を取る標準の手法で長さを計算し1^listます。


Characters代わりにIntegerDigits
グレッグマーティン

@GregMartinあ、そうだね。ありがとう。
マーティンエンダー

あなたはまだこの質問に対して他の抜け目のないMathematicaゴルファーを負かしいません;)
グレッグマーティン

@GregMartinなんて残念だ。:)
マーティンエンダー


2

JavaScript(ES6)、39 38 37 27バイト

f=n=>n%100%11?1:1+f(n/10|0)

正規表現ベースのソリューションよりも短くないかもしれませんが、私は完全に算術に基づいたソリューションを書くことに抵抗できませんでした。この手法はn % 100 % 11、結果がゼロ以外になるまで繰り返し10で除算し、繰り返しをカウントすることです。これが機能するのは、最後の2桁が同じ場合n % 100 % 11はになるため0です。


ああ、あなたは私の前に終わりました笑!ゴルフ後に収束する可能性が高いため、別の回答を投稿するかどうかはf=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
わかりませんが、

@ user81655それは素晴らしいことです。気軽に投稿してください。私は完全に変身せずに私のものに収束することはないと思います、そしてもちろん今はあなたの発生しないことを見ました
;


2

R、35バイト

rle(rev(charToRaw(scan(,''))))$l[1]

簡単な説明

                  scan(,'')         # get input as a string
        charToRaw(         )        # convert to a vector of raws (splits the string)
    rev(                    )       # reverse the vector
rle(                         )$l[1] # the first length from run length encoding

2

Befunge-98、19バイト

01g3j@.$~:01p-!j$1+

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

スタックのみを使用できた場合、これを短くすることができます。

使い方:

01g3j@.$~:01p-!j$1+
01g                 ; Get the stored value (default: 32)                 ;
   3j               ; Skip to the ~                                      ;
        ~           ; Get the next character of input                    ;
         :01p       ; Overwrite the stored value with the new char       ;
             -!     ; Compare the old value and the new                  ;
               j$   ; Skip the $ when equal, else pop the counter        ;
                 1+ ; Increment the counter                              ;

; When the input runs out, ~ reflects the IP and we run: ;
   @.$
     $              ; Pop the extraneous value (the stored value) ;
   @.               ; Print the number and exit                   ;

2

Python 3- 50 44バイト

完全なプログラム(Python 3ではinput()、入力に関係なく文字列を返します):

g=input();print(len(g)-len(g.rstrip(g[-1]))) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.