乗算と除算


10

xを指定すると、元のすべての桁を保持したまま、xで乗算および除算できる、yより大きい最小の数値が検出されます。

  • 新しい番号は数字を失いません。
  • 新しい数字は数字を獲得しません。

例えば:

入力:x = 2、y = 250000

  • オリジナル:285714
    • 部門:142857
    • 乗算:571428

285714yより大きいため、これは当てはまります。次に、xで割ると142857になり、xを掛けると571428になります。どちらのテストでも、285714の元の数字はすべて存在し、余分な数字は追加されていません。


ルール

  • X2または3である必要があります。これより高いと計算に時間がかかりすぎるためです。
  • Yゼロより大きい整数である必要があります
  • 最短のコードが優先されます。

テストケース

これらはテストが最も速いため、私の最も一般的なテストケースです。

  • x = 2、y = 250000 = 285714
  • x = 2、y = 290000 = 2589714
  • x = 2、y = 3000000 = 20978514
  • x = 3、y = 31000000 = 31046895
  • x = 3、y = 290000000 = 301046895

明確化

  • 分割の種類は関係ありません。2.05、0.25、および5.20を入手できる場合はなんとかしてください。

幸運を祈ります!


4
Xは2と5の間の値でなければなりません。」-X> = 4の場合、Xを掛けた数は、Xで割った数よりも少なくとも16倍大きくなるため、桁数が多くなります
ngn

2
積は商のx ^ 2倍であり、両方とも同じ桁数でなければならないため、xは2または3以外にすることはできません。x = 1は簡単なケースです。IMO、私は間違っているかもしれませんが、y = x = 3の解はありません。
Jatin Sanghvi

2
除算は浮動小数点または整数除算ですか?
Erik the Outgolfer 2018

3
テストケースはすばらしい
スティーブン

3
浮動小数点の出力が考慮されるかどうかに応じて正解が変わる可能性があるため、明確化により実際に課題曖昧になるため、再開する投票を控えているのは私だけではないようです。@EriktheOutgolferの質問は、浮動小数点出力の許可についてではなく、切り捨て整数除算の使用が許可されているかどうかについて尋ねていたのではないかと思います。(そして、私のコメントが混乱に加わった場合は申し訳ありません。)
ØrjanJohansen '29

回答:


4

ハスク、14バイト

ḟ§¤=OoDd§¤+d*/

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

説明

ḟ§¤=O(Dd)§¤+d*/  -- example inputs: x=2  y=1
ḟ                -- find first value greater than y where the following is true (example on 285714)
 §               -- | fork
         §       -- | | fork
              /  -- | | | divide by x: 142857
                 -- | | and
             *   -- | | | multiply by y: 571428
                 -- | | then do the following with 142857 and 571428
                 -- | | | concatenate but first take
           +     -- | | | | digits: [1,4,2,8,5,7] [5,7,1,4,2,8]
          ¤ d    -- | | | : [1,4,2,8,5,7,5,7,1,4,2,8]
                 -- | and
       d         -- | | digits: [2,8,5,7,1,4]
      D          -- | | double: [2,8,5,7,1,4,2,8,5,7,1,4]
                 -- | then do the following with [2,8,5,7,1,4,2,8,5,7,1,4] and [1,4,2,8,5,7,5,7,1,4,2,8]
   =             -- | | are they equal
  ¤ O            -- | | | when sorted: [1,1,2,2,4,4,5,5,7,7,8,8] [1,1,2,2,4,4,5,5,7,7,8,8]
                 -- | : truthy
                 -- : 285714

yの値を調整してより近い開始点を取得しましたが、x = 3、y = 25000000の結果は正しくありませんでした
Emma-PerpetualJ

@PerpetualJ:結果がわかっている場合は、yを調整するだけで、このバージョンの方が少し高速になります(型チェックだけです)。
ბიმო

少し考えて調整し、最初のコメントを編集しました。
Emma-PerpetualJ

@PerpetualJ:修正しました:-どちらが間違っているかを推測しました。
ბიმო

1
@PerpetualJ:私はプログラムを書いた;)私は説明を追加しました、これで誰もが何が起こっているのか理解するはずです。
ბიმო

5

Brachylog v2、15バイト

t<.g,?kA/p.∧A×p

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

フォームに入力を受け取ります[x,y]

説明

t<.g,?kA/p.∧A×p
t                  Tail (extract y from the input)
 <                 Brute-force search for a number > y, such that:
  .                  it's the output to the user (called ".");
   g                 forming it into a list,
    ,?               appending both inputs (to form [.,x,y]),
      k              and removing the last (to form [.,x])
       A             gives a value called A, such that:
        /              first ÷ second element of {A}
         p             is a permutation of
          .            .
           ∧         and
            A×         first × second element of {A}
              p        is a permutation of {.}

解説

複数の値を複数回再利用する際のブラキログの弱点がここに現れます。このプログラムはほとんどすべての配管であり、アルゴリズムはほとんどありません。

そのため、yの値をハードコードするだけの方が便利に思えるかもしれません(この質問には、2が唯一の可能な値であると仮定したコメントがあります)。ただし、実際にはy = 3の解があります。つまり、残念ながら、配管はyの値も処理する必要があります。私が知っている最小のものは次のとおりです:

                         315789473684210526
315789473684210526 × 3 = 947368421052631578
315789473684210526 ÷ 3 = 105263157894736842

(この数値を見つけるために使用した手法は完全に一般的なものではないため、他の方法を使用してより小さなソリューションが存在する可能性があります。)

ただし、このプログラムでそれを確認することはほとんどありません。Brachylogのは、pあなたがOで検証を行う(できることを意味し、そのような入力と出力の両方が既に知られている場合などの特殊な例(のための最適化を持っていない、非常に一般的な方法で書かれているのnログnはむしろ、並べ替えを経由して)私が使用していると思われるブルートフォースアプローチのO(n!)よりも)。結果として、105263157894736842が315789473684210526の順列であることを確認するのに非常に長い時間がかかります(私は今、数分間実行し続けており、明確な進展はありません)。

(編集:私はその理由でBrachylogソースをチェックしpました。2つの既知の整数を使用する場合、使用されるアルゴリズムは、アルゴリズムとして、出力整数と等しいものを見つけるまで、問題の整数のすべての可能な置換を生成することがわかりますは「入力→桁、桁を並べ替える→桁外、桁外→出力」です。より効率的なアルゴリズムは、桁外と出力の関係を最初に設定して、順列内のバックトラッキングで使用可能な桁を考慮できるようにすることです。)


フォークを使用すると、コードを1バイト減らすことができます。オンラインでお試しください!
Kroppeb 2018

また、ドキュメントによると、2つの既知のリストが順列であるかどうかを確認しているようですO(n²)swi-prolog.org/pldoc/man?predicate=permutation/2
Kroppeb

@Kroppeb:問題は、引数として2つの既知の整数が与えられた場合でも、Brachylog が2つの既知のリストでp実行さpermutation/2れないことです。(1つの既知のリストを使用permutation/2して)最初の整数のすべての順列を生成し、それらを2番目の整数と比較します。
ais523 2018年



3

q、65バイト

{f:{asc 10 vs x};while[not((f y)~f y*x)&(f y*x)~f"i"$y%x;y+:1];y}

基数10で数値を分割し、それぞれを昇順に並べ替え、等しいかどうかを確認します。そうでない場合は、yをインクリメントして再度移動します


3

JavaScript(ES6)、76 73 69バイト

eval()@ShieruAsakotoの提案に従い、を使用して3バイトを節約

入力をとして受け取ります(x)(y)

x=>y=>eval("for(;(g=x=>r=[...x+''].sort())(y*x)+g(y/x)!=g(y)+r;)++y")

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

再帰バージョンは62バイトですが、必要な反復回数が多いため、ここではあまり適していません。

どうやって?

g

例:

g(285714) = [ '1', '2', '4', '5', '7', '8' ]

y×xy/xyg(y×x)g(y/x)g(y)

2つの配列を一緒に追加すると、それぞれが暗黙的にコンマ区切りの文字列に強制変換されます。最初の配列の最後の桁は、2番目の配列の最初の桁とコンマなしで直接連結されるため、この形式は明確になります。

例:

g(123) + g(456) = [ '1', '2', '3' ] + [ '4', '5', '6' ] = '1,2,34,5,6'

だが:

g(1234) + g(56) = [ '1', '2', '3', '4' ] + [ '5', '6' ] = '1,2,3,45,6'

コメントしました

x => y =>                   // given x and y
  eval(                     // evaluate as JS code:
    "for(;" +               //   loop:
      "(g = x =>" +         //     g = helper function taking x
        "r =" +             //       the result will be eventually saved in r
          "[...x + '']" +   //       coerce x to a string and split it
          ".sort() + ''" +  //       sort the digits and coerce them back to a string
      ")(y * x) +" +        //     compute g(y * x)
      "g(y / x) !=" +       //     concatenate it with g(y / x)
      "g(y) + r;" +         //     loop while it's not equal to g(y) concatenated with
    ")" +                   //     itself
    "++y"                   //   increment y after each iteration
  )                         // end of eval(); return y

66:x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):yyがソリューションthoから離れている場合、スタックオーバーフローが発生する可能性があります。
浅琴しげる2018

または75を使用するevalx=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
浅子しげる2018

@ShieruAsakoto eval()アイデアをありがとう。私の最初の試みは確かに再帰的でしたが、必要な反復の数が多かったため、あきらめました。
Arnauld

3

Haskell、76 74バイト

リンのコメントのおかげで2バイトが削られた

import Data.List
s=sort.show
x#y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0

1
同じバイトカウントのf場合f x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0、次のようになりますが、答えを演算子として定義するx!y=…と2バイトが節約されます。それから、答えは(!):)
Lynn

リスト内包表記の使用を考えていませんでした!提案をありがとう:D
umnikos 2018年

2

Japt、24バイト

いくつかのビールでかなりナイーブなソリューション。もっと良い方法があると確信しています。

@[X*UX/U]®ì nÃeeXì n}a°V

それを試してみてください


残念ながら、これはx = 3およびy = 25000の場合に誤った結果を生成します。
Emma-PerpetualJ

@PerpetualJ Assumingはの315789473684210526最初のソリューションですx=3。JavascriptまたはJapt 、倍精度に適合しないため、正しく計算できません
バブラー2018

@PerpetualJ、以前に修正しました。ただし、上記のバブラーが述べた理由により、このテストケースは決して完了しません。
シャギー2018

@Shaggyこれで正しい結果が生成され、バブラーが指摘した解決策は25000を超える最初の正しい結果ではありません。もし興味があれば、私のテストケースを見てください。+1
エマ-パーペチュアル


1

ゼリー 14  13 バイト

-1 Erik the Outgolferに感謝します( ``はmake_digitsを使用するため、D必要ありませんでした)
+2バグを修正します(Erik the Outgolferに1つ前の問題を指摘してくれてありがとう)

×;÷;⁸Ṣ€E
‘ç1#

結果を出力する完全なプログラム(ダイアディックリンクとして、長さ1のリストが生成されます)。

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

どうやって?

×;÷;⁸Ṣ€E - Link 1, checkValidity: n, x               e.g. n=285714,  x=2
×        -     multiply -> n×x                       571428
  ÷      -     divide -> n÷x                         142857
 ;       -     concatenate -> [n×x,n÷x]              [571428,142857]
    ⁸    -     chain's left argument = n             285714
   ;     -     concatenate -> [n×x,n÷x,n]            [571428,142857,285714]
     Ṣ€  -     sort €ach (implicitly make decimals)  [[1,2,4,5,7,8],[1,2,4,5,7,8],[1,2,4,5,7,8]]
        E    -     all equal?                        1

‘ç1# - Main link: y, x
‘    - increment -> y+1
   # - count up from n=y+1 finding the first...
  1  - ...1 match of:
 ç   -   the last link (1) as a dyad i.e. f(n, x)

除算が正確でない場合、Dソートの前に適用される暗黙の10進命令(と同等)は小数部を生成します。
例:1800÷3D-> [6,0,0]
while- 1801÷3D>[6.0,0.0,0.33333333333337123]


この答えが有効であるかどうかは本当にわかりません。チャレンジでは、結果が「yより大きい」である必要があります。これは、「厳密にYより大きい」と解釈します。また、必要ありませんD
Erik the Outgolfer 2018

ああ、いい場所>=は完全に見逃した!make_digitsが設定されているとは思いませんでした-ありがとう。ただし、後で修正して更新する必要があります...
Jonathan Allan

1

Mathematica、82 74バイト

x=Sort@*IntegerDigits;Do[If[x[i#]==x@Floor[i/#]==x@i,Break@i],{i,#2,∞}]&

tshのおかげで-8バイト

引数をとして取る関数[x,y]。効果的にブルートフォース検索チェックの数字のソートされたリストであればそのyy/xxy同じです。

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


Mathematicaに慣れていません。しかし、除算の小数部分を削除しても、答えが正しいことは証明できます。ans、ans / x、ans * xはすべて9で割り切れる必要があります。これにより、解が短くなる場合があります。
tsh 2018

@tshこれはで機能しますがx=3、で本当かどうかはわかりませんx=2
Ørjanヨハンセン

ØrjanJohansenレッツ@ v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n]u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]。そしてu-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])10^x-10^y=0 (mod 9)常に成り立つので。u-v=0 (mod 9)常に保持します。間違った答えがある場合w、それ以来w*x-w=0 (mod 9)、そして、w-floor(w/x)=0 (mod 9):私たちは持っていfloor(w/x)=0 (mod 9)ます。もしfloor(w/x)*x <> ww-floor(w/x)*x>=9しかし、という事実と、この競合w-floor(w/x)*x<xxは2または3であることができながら
TSH

@tshありがとう!この点を取得するにはあまりにも長い道のりを取って他人の利益のために、w=0 (mod 9)そこから次のw*x-w=0 (mod 9)ためx-13で割り切れない
Ørjanヨハンセン

IntegerQテストを除外した場合IntegerDigits、分数で実行しようとするといくつかのエラーが発生しますが、Mathematicaはそれを超えて正しい答えを生成します。最終的な答えが正しいとしても、計算中に含まれるエラーが許容されるかどうかはわかりません。
numbermaniac

0

APL(NARS)、490文字、980バイト

T←{v←⍴⍴⍵⋄v>2:7⋄v=2:6⋄(v=1)∧''≡0↑⍵:4⋄''≡0↑⍵:3⋄v=1:5⋄⍵≢+⍵:8⋄⍵=⌈⍵:2⋄1}
D←{x←{⍵≥1e40:,¯1⋄(40⍴10)⊤⍵}⍵⋄{r←(⍵≠0)⍳1⋄k←⍴⍵⋄r>k:,0⋄(r-1)↓⍵}x}
r←c f w;k;i;z;v;x;y;t;u;o ⍝   w  cxr
   r←¯1⋄→0×⍳(2≠T c)∨2≠T w⋄→0×⍳(c≤1)∨w<0⋄→0×⍳c>3
   r←⌊w÷c⋄→Q×⍳w≤c×r⋄r←r+c
Q: u←D r⋄x←1⊃u⋄y←c×x⋄t←c×y⋄o←↑⍴u⋄→0×⍳o>10⋄→A×⍳∼t>9
M:                     r←10*o⋄⍞←r⋄→Q
A: u←D r⋄→M×⍳x≠1⊃u⋄→B×⍳∼(t∊u)∧y∊u⋄z←r×c⋄v←D z⋄→C×⍳(⍳0)≡v∼⍦u
B: r←r+1⋄→A
C: k←z×c⋄⍞←'x'⋄→B×⍳(⍳0)≢v∼⍦D k
   ⎕←' '⋄r←z

テスト

  2 f¨250000 290000 3000000
xxxx 
1000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
10000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
285714 2589714 20978514 
 3 f¨ 31000000 290000000 
xxxxxxxxx 
100000000xxxxxxxxxxxxxxxxxxxxxxxxxx 
31046895 301046895 

私は問題をraが便利な数値であると考えたので、rがr * xがyに近い値で始まるように、r、r * x、r * x * xの3つの数値があります(xとyは入力メインポストと同じ文字を使用して問題の)。私は、rの最初の数字がrのdである場合、数字d * xおよびd * x * xも表示する必要があるという観察結果を使用しました。


0

05AB1E、16 バイト

[>©Ð²÷s²*)€{Ë®s#

オンラインでお試しください。(注:非常に非効率的なソリューションなので、結果に近い入力を使用してください。これはローカルでより大きな入力に対しても機能しますが、TIOでは60秒後にタイムアウトします。)

説明:

[                   # Start an infinite loop
 >                  #  Increase by 1 (in the first iteration the implicit input is used)
  ©                 #  Store it in the register (without popping)
   Ð                #  Triplicate it
    ²÷              #  Divide it by the second input
      s             #  Swap so the value is at the top of the stack again
       ²*           #  Multiply it by the second input
         )          #  Wrap all the entire stack (all three values) to a list
          €{        #  Sort the digits for each of those lists
             ®s     #  Push the value from the register onto the stack again
            Ë       #  If all three lists are equal:
               #    #   Stop the infinite loop
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.