repdigitを取得するにはどうすればよいですか?


32

私が数時間前にこの挑戦を最初に考えたとき、私がどれだけ多くの担当者を持っていたかに敬意を表して:

ここに画像の説明を入力してください

1桁の繰り返しで構成されるこのような番号は、repdigitsと呼ばれます。Repdigitsは楽しいです!すべてのボディは、彼らが持っていた担当者の量がぞろ目であった場合、より幸せになる¹が、あなたは私がぞろ目に取得するための最速の方法を見つける手助けする必要があるので、私は、せっかちです。

ここにあなたの挑戦があります:

レピュテーションを表す正の整数が与えられた場合、repdigitに到達するために獲得する必要のある最小量の担当者を出力します。たとえば、この課題の執筆時点で、ユーザーMartin Enderの担当者は102,856人でした。最も近いrep-digitは111,111なので、彼は得る必要があります:repdigitになるには8255 rep。

人々が担当者を失うことを嫌うので、ネガティブでない変更のみを考慮します。これは、たとえば、1人の担当者を失うのではなく、12人の担当者がいる場合、解決策は10人の担当者を獲得することであることを意味します。111 repを持っている人はすでに repdigitにいるので、これにより「0」が有効な出力になります。

入力と出力は任意の合理的な形式であり、Stack Exchangeサイトで担当者を1人未満にすることはできないため、入力が1未満になることはないと想定できます。

注意すべき1つのコーナーケース:

ユーザーの担当者が10人未満の場合、すでに担当者がいるため、「0」も必要です。

テストIO:

#Input      #Ouput
8           0
100         11
113         109
87654321    1234567
42          2
20000       2222
11132       11090

標準的な抜け穴が適用され、バイト単位の最短ソリューションが勝ちます!


1
@Dennisなぜそうなのかわかりません。
DJMcMayhem

1
@Dennisどうしてノーと言うの?チャレンジでは常にIOの制限を避けようとしますが、多くの言語(私のような言語)は文字列と整数の入力を区別しないため、制限する理由はわかりません。
DJMcMayhem


6
@ColdGolfウィキペディアがいつかすぐに死ぬことを非常に疑いますが、さらに情報を追加しました。
DJMcMayhem

1
@brianhいいえ、オッズを偶数に変える最小の担当者ゲインは5です(質問への賛成票)。ただし、この課題のために、担当者を獲得するのに一定の金額しかないという事実を無視しています。したがって、1人の担当者を獲得する方法はありませんが、110与える必要1があります。
DJMcMayhem

回答:


9

ゼリー、6 バイト

DE$1#_

出力はシングルトン配列です。

オンラインでお試しください!または、ほとんどのテストケースを確認します。テストケース87654321は、TIOには遅すぎます。

使い方

DE$1#_  Main link. Argument: n

   1#   Call the link to the left with argument k = n, n + 1, n + 2, etc. until one
        match is found, then return the matching k.
  $       Combine the two links to the left into a monadic chain.
D           Convert k to base 10.
 E          Test if all decimal digits are equal.
     _  Subtract n from the result.

1
うわー...すべてASCII。これが最初です。すべてASCIIである他のJellyソリューションはありますか?ちょっと興味があるんだけど。
clismique

これその1つは簡単に見つかりました。他にもあるかもしれません。
デニス


14

Brachylog、9バイト

:.#++#==,

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

これは、制約演算を利用するため、かなり効率的です。

説明

:.            The list [Input, Output].
  #+          Both elements must be positive or zero.
    +         The sum of those two elements…
     #=       …must result in an integer where all digits are the same.
       =,     Assign a value that matches those constraints.

12
Brachylogが答えのように読むのが大好きです。次のように定義します:This is the answer you're looking for. Figure it out for me:)
DJMcMayhem

1
@DJMcMayhemそれは宣言型言語のクールな要素です!(ただし、必ずしも魔法のようなものではありません:p)
16

素晴らしい解決策!Brachylogは、プログラムの終了時に、残りのCLP(FD)変数の暗黙的なラベル付けを常に実行できると思います。これを取得するには、実行全体をでラップしcall_reside_vars/2、CLP(FD)変数を取得して、ラベルを付けます。例:call_residue_vars(Program, Vs0), include(fd_var, Vs0, Vs), label(Vs)。どう思いますか?
マット

1
@matありがとう!実行の最後に変数を出力したい状況は考えられないので、プログラムの最後に暗黙的なラベル付けを機能強化のリストに追加します。
16


10

パイソン2、41の 40バイト

def f(n):r=10**len(`n`)/9;print-n/r*-r-n

最短のアプローチではありませんが、非常に効率的です。Ideoneでテストします。

使い方

入力のための10**len(`n`)ラウンドn個の最も近いパワーまで10。その後、結果を9で除算します。これは、nと同じ桁数のrepdigit 1…1を返します。結果をrに保存します。たとえば、n = 87654321の場合、r = 11111111です。

望ましいrepdigitは、倍数またはrになります。どちらを決定するために、nrで天井除算します。Python 2の除算演算子の下限は、で/実現できます-n/r。これにより、負の符号を持つ正しい絶対値が得られます。たとえば、n = 87654321の場合、これは-8を返します。

最後に、計算された商に-rを乗算して、nの各桁に対して商を1回繰り返します。たとえば、n = 87654321の場合、これは88888888を返します。これは目的のrepdigitです。

最後に、必要な増分を計算するために、前の結果からnを引きます。n = 87654321の例では、必要に応じて1234567を返します。


1
別の41はlambda n:10**len(`n`)/9*-~int(`n*9`[0])-nです。それはほとんど機能しますlambda n:int(`n*9`[0]*len(`n`))-nが、桁が小さすぎるため、修正する良い方法が見当たりません。
-xnor

1
この式の背後にあるロジックを説明していただけますか?どのように私を困惑させますO(1)
shooqie

1
@shooqie回答を編集しました。
デニス

@デイブ:ええ、それは実際に面白いです。私は常に閉形式の公式== O(1)であると想定していましたが、理にかなっていると思います。
shooqie

素晴らしいアプローチ。Python 2の場合はバイト単位でわずかに長くなる場合がありますが、Java 7では40バイトを節約できます。:)(「仕組み」の部分にも感謝します。)
ケビンクルーイッセン

9

Python 2、37バイト

f=lambda n:1-len(set(`n`))and-~f(n+1)

Ideoneでテストします。このアプローチは、テストケース87654321には非効率的であることに注意してください。

使い方

場合nは既にぞろ目で、1-len(set(`n`))戻ります0の組の長さがNベース10の数字になります1。この場合、f0を返します

場合Nぞろ目ではない、f(n+1)再帰呼び出しFを次の可能な値とNfが再帰的に呼び出されるたびに、f-~の戻り値(repdigitが見つかった場合は0)を1ずつインクリメントするため、最終的な戻り値はfが呼び出された回数、つまりnをインクリメントする必要がある回数に等しくなりますrepdigitを取得します。


1
これらの事柄について、Lon longsを処理する必要があるかどうかは決してわかりません。
-xnor

4
なに、どうやって--...できない...なに?しばらくの間、52バイトの回答を誇りに思っていました...
DJMcMayhem

1
@xnor:Cのソリューションは、デフォルトで長整数型で動作する必要はありません。そのため、Pythonでも常に同じ方法が当てはまると仮定しました。
デニス

1
@DJMcMayhemは、数字の文字列表現から構築されたセットのサイズをチェックしてrepdigitを見つけるまで再帰的にカウントアップするように見えます。これ-~により、関数は呼び出し回数をカウントできます。
バリューインク

8

Perl 6、23バイト

{($_...{[==] .comb})-1}

入力番号を引数として受け取り、結果を返すラムダ。

説明:

  1. ...シーケンス演算子を使用して、repdigitに達するまで入力番号をインクリメントします(文字列表現を文字に分割し、それらがすべて等しいかどうかを確認してテストします)
  2. シーケンスの長さから1を引きます。

テストは交換可能/(.)$0*/
ジョーキング

7

Java 7、116 76バイト

int c(int i){int r=(int)Math.pow(10,(i+"").length())/9;return(-i/r-1)*-r-i;}

@Dennisの驚くべきアプローチを使用して、バイト数をなんと40バイト減らしました。

未ゴルフ&テストケース:

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

class Main{
  static int c(int i){
    int r = (int)Math.pow(10, (i+"").length()) / 9;
    return (-i / r - 1) * -r - i;
  }

  public static void main(String[] a){
    System.out.println(c(8));
    System.out.println(c(100));
    System.out.println(c(113));
    System.out.println(c(87654321));
    System.out.println(c(42));
    System.out.println(c(20000));
    System.out.println(c(11132));
  }
}

出力:

0
11
109
1234567
2
2222
11090

1
実際、0を印刷する代わりに8をフィードすると、「try it」は1を出力します。
SQB

@SQBああ、あなたは正しい。うーん、..私はきた私のIDEコンソールからコピー&ペースト私のポストで出力以来、奇妙なかわいいもの
ケビンCruijssen

最後から2 2222番目の出力を4番目の出力にする必要はあり12345678ませんか?
DanTheMan

@DanTheManああ、最後から2番目は実際にの2222代わりになり222ます。私はコードの間違いを修正しましたが、偶然にもここで古い出力を使用していました。現在修正されています。4番目については、そうではありません123467(OPの質問でもわかるように)。
ケビンCruijssen


4

Brain-Flak 690 358バイト

ここに私が行く

(({})[()])(()){{}(({}())){(({}))(<((()()()()()){}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}>)<>(<((()()()()()){}(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>)}{}<>{(([])<{{}({}[()]<>)<>([])}{}><>){({}[()]<({}<>)<>>)}{}<>}([]){{}{(<({}<>)<>>)}{}([])}{}<>(([][()()])<{{}{}([][()()])}{}>)}{}({}[{}])

オンラインで試す

説明

元の入力より1つ少ない入力の2番目のコピーを作成することから始めます。コピーを使用して、次のrepdigitを検索します。数値自体がrepdigitである場合、1を減算します

(({})[()])

1つプッシュして、次のループを満たします。(ゼロではなく、1つである必要はありません)

(())

このループは、スタックの最上位にrepdigitが現れるまで実行されます

{

がらくたをポップします。それらはループを駆動する「ブール」です。これは、ループをポップする必要がなくなったためです。

{}

1つ追加して、上部を複製します。コピーは数字に分解されます。

(({}()))

コピーはゼロではありませんが...

{

もう一度コピー

(({}))

Mod 10および他のスタックに移動

(<((()()()()()){}<>)>)<>{({}[()])<>(({}()[({})])){{}(<({}({}))>)}{}<>}{}<>({}<{}>)<>

10で除算(整数除算)

(<((()()()()()){}(<>))>)<>{({}[()])<>(({}()[({}<({}())>)])){{}(<({}({}<({}[()])>))>)}{}<>}{}<>{}{}({}<>)

}

コピーしたゼロをポップします

{}

これで数値を10桁に分解したので、すべての桁でスタックにスワップします。

<>

先頭の数字はゼロではありませんが

{

スタックの高さ(つまり、桁数)のコピーを取得します...

(([])<

スタック上のすべての数値から1を静かに減算します

{
{}
({}[()]<>)<>
([])
}
{}

ピックアップしたスタックの高さを下げます。(および他のスタックにスワップ)

><>)

スタックの高さを使用して、他のスタックに配置したすべての数字を適切なスタックに戻します。

{
({}[()]<({}<>)<>>)
}

スタックの高さであるゼロをポップします

{}

数字(または数字)を使用してスタックにスワップバックします

<>

終了ループ

}

これで、他のすべての数字から最上位の数字を引きました。すべての桁がゼロの場合、元の番号(入力ではなくチェックする番号)はrepdigitでした。[要出典]。したがって、非ゼロをチェックする必要があります。

スタックの高さはゼロではありませんが

([])
{
{}

数字がゼロでない場合、他のスタックに移動してゼロに置き換えます。

{
(<({}<>)<>>)
}

ポップします(現在はゼロです)

{}

終了ループ

([])
}
{}

他のスタックにスワップオーバー(duh ..)

<>

スタックの高さから2を引いたコピーを手に入れます

(([][()()])<

スタックの高さは2ではありません(オリジナルとアキュムレーター)

{
{}

トップをポップ

{}

しばらくして

([][()()])
}
{}

スタックの高さから2を引いたもののコピーを書き留めます。これは、最初の桁とは異なる桁数になります。つまり、ゼロの場合、repdigitです。

>)

このループが終了すると、repdigitが見つかりました

}

「ブール」をポップ

{}

repdigitからオリジナルを減算します

({}[{}])

真剣に、あなたはどうやってこれをしますか?私は「ああ、脳内でそれをやりたいのですが、それがrepdigitかどうかを判断する方法がわかりません」と考えていました。狂ってる!これらの答えのほとんどを生成するためにスクリプトを使用していますか?
DJMcMayhem

@DJMcMayhemいいえ、ただ練習します。説明が続きます。
小麦ウィザード

@DJMcMayhemごめん、たぶんわからない。112 + 110 = 222?
小麦ウィザード

すみません、あなたはまったく正しいです、私は何を言っているのかわかりません。最後のコメントは無視してください。
DJMcMayhem

3

Python 2、52バイト

a=b=input()
while len(set(str(a)))!=1:a+=1
print a-b

Python 2には、これを短くするいくつかのトリックがあります。たとえば、入力は数値であるため、intにキャストする必要はありません。(-5バイト)また、a-b(-1バイト)を括弧で囲む必要もありません。

このスクリプトを使用して、すべてのテストケースを検証します。

def f(i):
    a=b=i
    while len(set(str(a)))!=1:a+=1
    return a-b

inputs = [8, 100, 113, 87654321, 42, 20000, 11132]
outputs = [0, 11, 109, 1234567, 2, 2222, 11090]

for i in range(len(inputs)):
    print(f(inputs[i]) == outputs[i])

オンラインで試すこともできます!


3

GNU sed、223 + 1(rフラグ)= 224バイト

s/$/:0%/
:;y/:%/%:/
/^(.)\1*%/{s/.*%(.*):/\1/;q}
:f;s/9(@*:)/@\1/;tf
s/8(@*:)/9\1/;s/7(@*:)/8\1/
s/6(@*:)/7\1/;s/5(@*:)/6\1/
s/4(@*:)/5\1/;s/3(@*:)/4\1/
s/2(@*:)/3\1/;s/1(@*:)/2\1/
s/0(@*:)/1\1/;s/(^|%)(@*:)/\11\2/
y/@/0/;t

実行:

sed -rf repdigit.sed <<< "112"

出力:

110

これは純粋なsedソリューションです。算術は正規表現のみを使用してシミュレートされます。アルゴリズムは次のように機能します。

  1. パターンスペースの形式は ^current_reputation:needed_reputation%$
  2. メインループの各反復においてセパレータが切り替えられる:
    A)は、%:に増分を適用needed_reputationの
    B):%に増分を適用current_reputation
  3. 場合current_reputationは「ぞろ目」、であるneeded_reputationが印刷され、プログラムが終了

2

Java、 74 72バイト

int c(int i){int n=0;while(!(i+++"").matches("^(.)\\1*$"))n++;return n;}

他のJavaエントリが76バイトの場合、これは74 72、 4バイト短縮)。

とにかく、カウンターをインクリメントしながら、それがrepdigitになるまで入力をインクリメントします。カウンターを返します。

はい、それらは連続した3つのプラスです。2つは入力をインクリメントし、1つは空の文字列を連結して文字列にします。
いいえ、間にスペースがないと合法だとは思いませんでしたが、そこに行きます。それはタイプミスがあなたのためにすることです:1バイト短くなります。

whileの代わりにforループを使用すると、正確に同じバイト数がかかります。

int c(int i){int n=0;for(;!(i+++"").matches("^(.)\\1*$");n++);return n;}

編集:

以前のバージョンではmatches("^(\\d)\\1*$")repdigitをチェックする必要がありましたが、intを文字列に変換したばかりなので、a .to match を使用すれば十分です。


未ゴルフ&テストケース:

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

class Main{
  static int c(int i){
    int n=0;
    while(!(i++ + "").matches("^(.)\\1*$")) {
      n++;
    }
    return n;
  }

  public static void main(String[] a){
    System.out.println(c(8));
    System.out.println(c(100));
    System.out.println(c(113));
    System.out.println(c(87654321));
    System.out.println(c(42));
    System.out.println(c(20000));
    System.out.println(c(11132));
  }

}

出力:

0
11
109
1234567
2
2222
11090

whileループを使用できない方法でバイトを保存する方法を見つけることができるため、通常は常にforループを使用することをお勧めします。
ニール

@Neilさて、ここで方法を知っていれば、私は泣きそうになります。
SQB

バイトを節約できるとは提案していませんでしたが、forループが長くなるとは思わないのと同じ長さであることは目立たないことを指摘しようとしていました。
ニール

@ニールああ、大丈夫。
-SQB

2

R、102 98 91バイト

a=scan(,'');i=0;while(length(unique(strsplit(a,"")[[1]]))!=1){a=paste(strtoi(a)+1);i=i+1};i

アンゴルフド:

a=scan(,'') #Asks for input
i=0         #Initialize i to 0, surprisingly

while(length(unique(strsplit(a,"")[[1]]))!=1) 
    #Splits the input into its digits,  
    #compute the length of the vector created by the function `unique`, which gives all the digits once.
    #as long as the this length is different from one :
{
a=paste(strtoi(a)+1) #Increases by one the value of the input (while messing around with its format)
i=i+1                           #Increases by one the value of the counter
}

i #Outputs the counter

フォーマット(as.numericおよびas.character)をいじると、いくつかのバイトが追加されますが、Rは実際には柔軟性がありません!


2

Perl、40 + 1(-n)= 41バイト

/^(.)\1*$/&&say($v|0) or$_++&&++$v&&redo

0番号がすでにrepdigit である場合ではなく、何も印刷しない場合は、37バイトで十分です:

/^(.)\1*$/&&say$v or$_++&&++$v&&redo

-n(1バイト)-Eまたは-M5.010(無料)で実行します。

perl -nE '/^(.)\1*$/&&say($v|0) or$_++&&++$v&&redo'

説明:2つの主要部分がコードにあります/^(.)\1*$/&&say$v$_++&&++$v&&redo。最初のテスト$_は、repdigitです。はいの場合、元の番号に追加した番号を出力して、それを繰り返し桁($v)にします。いいえの場合は、との両方に1が$_あり$v、最初からやり直します。


1
perlの41バイト、文字列の長さで1桁目(または1桁より大きい場合は1桁目+1)を複製し、入力を減算します:perl -pe '@x=sort/./g;//;$_=(($x[-1]>$&)+$&)x+@x-$_'
Eric

2

JavaScript(ES6)、42バイト

f=(n,p=1)=>n<p?-~(n*9/p)*~-p/9-n:f(n,p*10)

説明:after pの次の累乗として再帰的に計算します。繰り返される数字はとして計算され、repunitは単にであり、そこから結果が続きます。10n1+floor(9n/p)(p-1)/9




1

実際には、15バイト

;D;WXu;$╔l1<WX-

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

説明:

;D;WXu;$╔l1<WX-
;                dupe
 D;              decrement, dupe
   WXu;$╔l1<W    while top of stack is truthy:
    X              discard
     u             increment
      ;            dupe
       $╔l1<       1 if len(str(TOS)) > 1 else 0 (check if the string representation of the TOS contains only one unique digit)
                 after the loop, the stack will be [1 repdigit input]
             X   discard
              -  subtract input from repdigit

1

クラゲ、20バイト

p
<
)\&&&~j<i
->N>u0

オンラインでお試しください! TIOは長いテストケースを処理できませんが、十分な時間とメモリがあれば、それらも機能するはずです。

説明

  • i入力であり、<デクリメントします。この値は左側の関数に送られます。
  • \> 右側の関数が真の値を与えるまで、値を(少なくとも1回)増分します。
  • テスト関数は、&4つの関数の構成(s)です。
  • 0~j 文字列に変換します。
  • u 重複する数字を削除します。
  • > 結果の文字列の先頭を削除します。
  • N論理否定です。1空の文字列と空でない文字列を提供し0ます。したがって、関数はrep-digitをテストし、の結果は\からカウントする次のrep-digit <iです。
  • )-関数入力から結果を減算し<iます。つまり、です。
  • この違いは1つずれているため、<減少させます。最後にp、結果を出力します。

1

PowerShell v2 +、66バイト

param($n)for($x=+"$($n[0])";($y="$x"*$n.length)-lt$n;$x++){}+$y-$n

PowerShellの通常はゴルフに適した非常に緩やかなキャストは、ここでの大きな失敗です。

入力$nを文字列として受け取り、forループに入ります。セットアップ手順では、最初の文字を抽出します$n[0]"$(...)"、intとしてキャストしてに+保存する前に、文字列に変換し直す必要があります$x。それ以外の場合、後の算術演算では文字コードのASCII値が使用されます。

条件は、から$n.length "$x"一時的に保存され$y、から構築された文字列がより小さいかどうかをチェックします$n。そうでない限り、インクリメント$x++し、次のループの条件を設定します。

たとえば、input 123$y場合、条件が最初にチェックされるときの値はになり111、これはより小さい$nため、ループが継続します。ループ本体には何もないため、ステップの増分が発生し$x++、条件が再度チェックされます。この時間$yはに等しく222、これはより大きい$nため、ループは終了します。入力が既にrepdigitである場合、条件は満たされません。その時点で$yはに等しいため$nです。

ループから出たら$y、整数+にキャストしてからを減算し$nます。その結果はパイプラインに残り、出力は暗黙的です。


1

PHP 5.6、59の 53 51 50バイト

保存された6 8は@manatworkのおかげでバイト。

while(count_chars($argv[1]+$b,3)[1])$b++;echo$b?:0

でテストする:

php test.php 11132

count_chars()2番目のパラメータとして3を持つ関数は、文字列内の異なる文字の文字列を返します。この文字列[1]の長さが1文字の場合(長さが1の場合はfalseを返します)、echo $b、そうでない場合はインクリメント$bしてループします。


1
のクールな使用count_chars()。$ modeパラメータとして3はどうですか?したがって、これがwhile条件になりますcount_chars($argv[1]+$b,3)[1]
マナトワーク

それは本当に賢い、アイデアのおかげです。私はもともとモード用の3を使用してみましたが、なしでそれを使用する方法を考えることができませんでしたcountか、strlenそれは同じ長さであることが判明したので。
サムスカンチ

1
ああ、$ bを初期化せずに:echo$b?:0;
manatwork

おお、私は空の三者のことを忘れました。いいね!
サムスカンチ

1

MATL、10バイト

q`QtVda}G-

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

これにより、すべての数字が等しくなるまで入力が増加し続けるため、時間がかかります。87654321オンラインコンパイラでの入力タイムアウトのテストケース。

q      % Take input implicitly. Subtract 1
`      % Do...while loop
  Q    %   Increment top of the stack
  tV   %   Duplicate and convert to string (i.e. digits of the number)
  d    %   Difference between consecutive digits
  a    %   True if any such difference is nonzero. This is the loop condition
}      % Finally (execute on loop exit)
  G-   %   Subtract input. This is the final result, to be (implicitly) displayed
       % End loop implicitly. If loop condition (top of the stack) is truthy: proceeds 
       % with next iteration. Else: executes the "finally" block and exits loop
       % Display implicitly

1

ルビー、42文字

->n{i=0;n.next!&&i+=1while n.squeeze[1];i}

文字列の入力が必要です。

サンプル実行:

irb(main):019:0> ->n{i=0;n.next!&&i+=1while n.squeeze[1];i}['87654321']
=> 1234567

ルビー、39文字

再帰呼び出し、より大きな結果で「SystemStackError:stack level too deep」に遭遇します。

r=->n,i=0{n.squeeze[1]?r[n.next,i+1]:i}

サンプル実行:

irb(main):001:0> r=->n,i=0{n.squeeze[1]?r[n.next,i+1]:i}
=> #<Proc:0x00000002367ca0@(irb):10 (lambda)>

irb(main):002:0> r['20000']
=> 2222

1

Matlab、65 64バイト

t=input('');i=0;while nnz(diff(+num2str(t+i)))
i=i+1;end
disp(i)

whileループのため、かなり遅いです...

説明

t=input('')  -- takes input
i=0          -- set counter to 0
while 
          num2str(t+i)   -- convert number to string 
         +               -- and then to array of corresponding ASCII codes
    diff(             )  -- produce vector of differences (all zeros for 'repdigit')
nnz(                   ) -- and count non-zero entries
i=i+1                    -- while not all digits are the same increase the counter
end          -- end while loop
disp(i)      -- print the counter

@Luis Mendoのおかげで1バイト節約できました。


本当に必要です+0か?diff文字を数字に自動的にキャストします
ルイスメンドー

私のバージョンでdiffは、追加しない場合、文字列をsymとして扱い、区別しようとします。
パジョン

次に、プラスを前方に移動し(単項演算子として)、ゼロを削除します
ルイスメンドー

1

Excel、85 79バイト

N入力の参照セルの名前であるため、セルを除く任意のセルに次の数式を入力します。

=IF(1*(REPT(LEFT(N),LEN(N)))<N,REPT(LEFT(N)+1,LEN(N))-N,REPT(LEFT(N),LEN(N))-N)

説明:

  • Nは入力であり、参照セルの名前であります
  • LEFT(N) 入力値の最初の桁を取得します。
  • LEN(N) 入力値の長さを返します。
  • REPT(LEFT(N),LEN(N))入力値の最初の桁をLEN(N)何回も繰り返し、1 を乗算してテキスト形式を数値形式に変換し、数値比較に使用できるようにします。
  • Microsoft ExcelのIF関数の構文は、IF (condition、[value_if_true]、[value_if_false])であるため、式全体が一目瞭然になります。

あなたは、省略することができますNum_charsLEFT4つのバイトをして保存しますLEFT(N)
Wernisch

6バイトにする
ヴェルニッシュ

@Wernischありがとう。編集済み。
アナスタシヤ-ロマノバ秀

あなたは強要で25のバイトを保存することができますIFに条件を10使用して--あなただけに自分自身を繰り返す必要はありませんので、+1=REPT(LEFT(N)+(--1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
i_saw_drones

実際には、この例では、あなたはあなただけではなく、使用することができ、明示的にそれを強要する必要はありません=REPT(LEFT(N)+(1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N、27のバイトを保存する52の合計を与えるために
i_saw_drones


0

Java、59バイト

int c(int i){return(i+"").matches("^(.)\\1*$")?0:c(i+1)+1;}

(Javaエントリのカウント方法はまだわかりませんが、最初のJavaエントリによって設定され標準に従っていますで、このエントリは17バイト短いため59バイトです)。

とにかく、repdigitがある場合は0を返し、そうでない場合は入力に1を追加し、それ自体を呼び出して結果に1を追加します。


未ゴルフ&テストケース:

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

class Main{
  static int c(int i) {
    return
      (i+"").matches("^(.)\\1*$")
      ? 0
      : c(i+1) + 1;
  }

  public static void main(String[] a){
    System.out.println(c(8));
    System.out.println(c(100));
    System.out.println(c(113));
    System.out.println(c(42));
    System.out.println(c(20000));
    System.out.println(c(19122));
    // Entry below will run out of memory
    System.out.println(c(19121));
  }
}

出力:

Runtime error   time: 0.09 memory: 321152 signal:-1
0
11
109
2
2222
3100

ご覧のとおり、最後のエントリは終了する前にメモリを使い果たします。(非常に適切な)StackOverflowErrorがスローjava.util.regex.Pattern.sequence(Pattern.java:2134)されますが、前のエントリで使用したものと同じであるため、正規表現自体に何の問題もないと確信しています。


0

C#、82バイト

using System.Linq;n=>{int i=n;while((i+"").Distinct().Count()!=1)++i;return i-n;};

0

C、84バイト

d,n,l,f;F(i){for(n=0;1;){l=i+n++;d=l%10;f=0;while(l/=10)f|=l%10-d;if(!f)return--n;}}

メインテスト:

int main() {
  printf("%d\n", F(8));
  printf("%d\n", F(100));
  printf("%d\n", F(113));
  printf("%d\n", F(87654321));
  printf("%d\n", F(47));
  printf("%d\n", F(20000));
  printf("%d\n", F(11132));
}

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