K 5の次の数


8

チャレンジ:

プログラムは2つの整数nk入力として受け取り、n少なくともk数字の出現を含む(ただし等しくない)より大きい最小の整数を出力します5

あなたは想定できる1 ≤ k ≤ 151 ≤ n < 10**15

これは課題です。プログラムは、すべてのテストケースでTIOで実行し、合計10秒以内に完了する必要があります。

一般的なルール:

  • これはなので、バイト単位の最も短い答えが優先されます。
    コードゴルフ言語が非コードゴルフ言語で回答を投稿することを思いとどまらせないでください。どのプログラミング言語について、できるだけ短い答えを考えてください。

  • デフォルトのI / Oルールを使用した回答には標準のルールが適用されるため、STDIN / STDOUT、関数/メソッドを適切なパラメーターで使用し、戻り値の型の完全なプログラムを使用できます。あなたの電話。関数パラメーターはどちらの順序でも使用できますが、回答で指定してください。

  • デフォルトの抜け穴は禁止されています。
  • コードのテストを含むリンク(つまりTIO)を追加する必要があります。
  • 回答ヘッダーには、スコアがバイト単位で表示されますが、TIOのすべてのテストケースに要した合計時間も表示されます。
  • 言語がTIOにない場合、コードはマシン上で10秒よりはるかに短い時間で終了するはずなので、適切なコンピュータで十分に高速であると確信できます。
  • 回答の説明を追加することを強くお勧めします。

テストケース:

(n, k) ->  output
(53, 2) -> 55
(55, 1) -> 56
(65, 1) -> 75
(99, 1) -> 105
(555, 3) -> 1555
(557, 1) -> 558
(5559, 3) -> 5565
(6339757858743, 5) -> 6339757859555
(99999999999999, 15) -> 555555555555555

プログラム例:

このプログラムは正しいです。


1
TIOでのタイミングは完全に信頼できるわけではないことに注意してください。ただし、最速のコードには不十分ですが、おそらく限られた時間で十分です。
Laikoni

私は正しい答えだ(n, k) = (45, 1)50思いますか?答えのいくつかはこれを間違っています。
ニール、

回答:


5

R +ストリンガー、85 84 76バイト、TIOで.062s

f=function(n,k,m=2+stringr::str_count(n+1,"5")-k)`if`(m<2,f(n+.1^m*2,k),n+1)

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

-1バイトはRobert S.に、
-8バイトはGiuseppeに感謝します。

単純な再帰的な解決策は、答えが見つかるまで1ずつインクリメントすることですが、これは時間制限を満たしません。時間制限を満たすために、この関数は、pが5欠落している場合、2 * 10 ^(p-2)を増分できるという事実を利用しています。

p = 1の場合、増分は0.2になることに注意してください。これは問題ありません。5つのステップの後で整数に戻り、その間に発生した10進数には余分な5がないためです。代わりに、5 * 10 ^(p-2)または1ずつインクリメントすることになります。 * 10 ^(p-2)の場合、たとえば、25ではなくf(24、1)= 24.5が見つかります。


2
if関数バリアントを使用して1バイトを節約します
ロバートS.

@RobertS。ありがとう。その亜種については知りませんでした。それについてもっと読むことができる場所はありますか?
ロビンライダー


1
また、あまり活発ではないRゴルファーのチャットで質問することもできますが、何もしないよりはましです:-)
Giuseppe

2
76バイト -何をしているのか本当にわからないaので、削除して大丈夫のようです。
ジュゼッペ

3

Jelly、37バイトTIOで0.113秒

»DL‘Ɗ}©5xḌ_DḌÐƤ;®ŻṬ€UḌ¤+⁹D=5S>ʋƇ⁸’¤ḟṂ

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

これは

  1. 入力の最大桁数に1とを加えkた数値を計算し、その数の5で数値を作成する
  2. その数から入力を引く
  3. その数のすべてのサフィックスを生成する
  4. また、1から入力より大きい次の1までの10の累乗すべてを生成します。
  5. 3と4の各数値を入力に追加します
  6. 5が少なすぎる回答を削除します
  7. 回答から入力を除外します
  8. そして最小値を返します

@KevinCruijssen申し訳ありませんが、多くのファイブ
ニックケネディ

1
うーん。失敗するようです[557,1](結果はの558代わりに560); 説明のテストケースが間違っているようだ、以来[557,2]になる必要があります558代わりに。
Kevin Cruijssen

3
@KevinCruijssen私はこれについて尋ねました:それは正確にはkではなく少なくともk 5sです。
Nick Kennedy

ああ、それは正しいです。:)
Kevin Cruijssen

2

05AB1E33 32 バイト

sg>‚à©5s×α.s0š®Ý°0šâO+IKʒ§5¢¹@}ß

@NickKennedyのジェリーの回答における驚くべきアプローチのポートので、必ず賛成票を投じてください!

kn

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

sg>                # Get the length+1 of the second (implicit) input-integer
   ‚à              # Pair it with the first input-integer, and leave the maximum
     ©             # Store this maximum in the register (without popping)
      5s×          # Create an integer (actually, create a string..) with that many 5s
         α         # Take the absolute difference with the second (implicit) input
          .s       # Get the prefixes of that number
            0ª     # Prepended with an additional 0
    ®              # Get the maximum from the register again
     Ý             # Create a list in the range [0, max]
      °            # Raise 10 to the power of each integer
       0ª          # And also prepend an additional 0 to this list
              â    # Then create each possible pair of these two lists
               O   # Sum each pair
                +  # Add the second input to each sum
IK                 # Then remove the second input from this list (if present)
  ʒ                # And filter this list by:
   §               #  Cast the number to a string (bug, shouldn't be necessary)
    5¢             #  Count the amount of 5s in the string
      ¹@           #  And check if this count is larger than or equal to the first input
                 # After the filter: only leave the lowest number
                   # (which is output implicitly as result)

2

Stax、17 バイト(TIOで合計6.861秒)

≈ª╞¥é£ôñτ←╝α┴╢JLd

実行してデバッグする

このプログラムはknスペースで区切られた標準入力を受け取ります。StaxにはTIOで複数のテストケースを実行する便利な方法がないため、各入力を個別に実行して時間を合計しました。時間の99%はインタープリタープロセスの起動にあります。staxlang.xyzでJavaScriptインタープリターを使用すると、すべてのテストケースが50ミリ秒で実行されます。

オンラインで試してみての最後のテストケース

手順

  1. インクリメント入力
  2. 十分な5s がある場合は、終了して印刷します
  3. t=数値の末尾5のsの数
  4. 追加 10 ** t
  5. 後藤2

2

Pythonの270 68バイト(TIOに0.025秒)

l=lambda n,k:'5'*k*(10**~-k>n)or-~n*(`n+1`.count('5')>=k)or l(n+1,k)

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

これは少しストレッチかもしれません。それはすべてのケースで正しく、テストケースではごくわずかな時間で終了しますが、他のいくつかのケースでは妥当な時間で終了しません。ただし、技術的には要件を満たしています。

要するに、5の最小値kがより大きい場合はn、それが明らかに正しい解であるため、その数を使用します。そうでない場合は、標準の再帰的アプローチを使用します。


私は常にゴルフのルールベンディングに感謝しています。
再帰的

1

Perl 5、44 -plバイト

$k=<>;$_++;s/.*?(?=5*$)/1+$&/e while$k>y/5//

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

末尾の5を付けずに数が何であるかを見つけます。その部分を1ずつ増やします。十分な数の5が含まれるまで続行します。すべてのテストケースを実行するには、TIOで約.012秒かかります。


1

Pythonの3144の 98 86 75バイト

f=lambda N,k,d=1:k>str(-~N).count("5")and f(N+-(-~N//d+5)%10*d,k,d*10)or-~N

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

O(k)

アルゴリズムは、新しい数字の10進数表現が目的の数になるまで、各桁(最下位の桁から開始)を最も近い値5に切り上げます。

元のアプローチでは中止可能(ここではD = iter(range(k))とlist(D)を使用)リスト内包表記を使用していましたが、@ ASCIIのみではコードゴルフに勝つことができないと確信しています。私は再帰が嫌いですが、アルゴリズムが再帰の深さを最小限に抑えるように記述されている場合、将来のコンパイラー/インタープリターは、whileループとして再実装するのに十分賢くなります。






1
それ(-(-~n//l+5))%10が理由です
ASCIIのみ

0

Python 3、59バイト

再帰的なソリューション。再帰の深さは問題です(数値が大きい場合は変更する必要があります)が、それは正しいです。

lambda x,k:eval(("f(x+1,k)","x+1")[str(x+1).count("5")==k])

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


4
再帰の深さが十分に高い場合、これは時間制限を満たしていますか?妥当なマシンで最後のテストケースが10秒以内に完了するとは思えません。
Nick Kennedy


0

Java 8、69バイト、最後のテストケースでTIOで60秒以上、約1.5秒。

(n,k)->{for(;(++n+"").chars().filter(i->i==53).count()<k;);return n;}


誰もが最後のテストケースに合格する方法について何かアイデアがありますか?



0

網膜、63バイト

.+$
*
^.+
$.(*__
/((5)|.)+¶(?<-2>_)+$/^+`^.*?(?=5*¶)
$.(*__
1G`

オンラインでお試しください!かかるnk別の行に、リンクを適切な形式にテストスイートを変換するヘッダを含みます。説明:

.+$
*

k単項に変換します。

^.+
$.(*__

インクリメントn*その右引数(ここでは最初の反復する_文字)(としてここにいる、試合デフォルト)その左引数で指定した回数。その結果、その長さの文字列になります。$()示唆される)第2と連結していること_.、得られた長さが取られるようにします。(実際には、Retina 1はそれよりも賢く、そもそも基礎となる長さの計算を実行するだけです。)

/((5)|.)+¶(?<-2>_)+$/

の単項表現のに一致するのに十分な5が見つかるかどうかをテストします。このテストはゴルフで行われ、最初の後に追加されて3倍速くなり、の代わりに使用した場合はさらに速くなります。n_k^/[^5].

^+`

テストに合格するまで...

^.*?(?=5*¶)
$.(*__

...増加しますnが、末尾5のsを除外します。

1G`

を削除しkます。


0

クラム、30バイト、TIOで約0.2秒

=Q+r1=qC5R1?<qQ[=qrw<n#:q5QqiQ

この JS へのトランスパイル(もちろん、タイミングのために追加された完全なテストスイート)。ここinputsで、は入力の配列です(n最初、k2番目)。

アプローチしてくれた@ArBoに感謝

説明

=Q+r1=qC5R1?<qQ[=qrw<n#:q5QqiQ - Implicit Q = first input
=Q+r1                          - Q = next input (1st input) + 1
     =qC5R1                    - q = 2nd input 5s (eg 555 for k=3)
           ?<qQ[               - if q < Q...
                =qr            -   q = next input (2nd input)
                   w           -   while...
                     n         -     length of...
                      #:q5Q    -       Q.filter(q=>q==5)
                    <          -     is less than...
                           q   -       q
                            iQ -     Increment Q
                               - Implicit output of Q

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