数字を見つけて出力を計算する


22

目的

入力リスト所与6の別個の桁、3つの数字を見つけabそしてcその結果a × b = cと、a2桁の数字を有するb1桁を有し、c3桁を有します。より視覚的な方法では、プログラムはこれらの6桁をこの画像のボックスに配置する必要があります。

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

複数のソリューションが存在する場合、それらのいずれかを出力できます。

入力

6桁の数字。あなたはあなたの言語のために合理的な方法でそれらを取ることができます。

出力

3つの数字abそしてc。出力形式は、3つの数字が分離されていて、常に同じ順序で印刷されている限り(ただし必ずしも順序どおりに印刷されない限り)、比較的自由a, b, cです。

テストケース

1, 2, 3, 4, 5, 6 -> 54,3,162  
2, 3, 4, 5, 6, 7 -> 57,6,342 or 52,7,364

得点

バイト単位の最短コードが優先されます。


1
@Dadaのチャレンジを見たとき、それが最初に思いついたものです...投稿する前に、サンドボックスに入れてフィードバックを得てください:
Stewie Griffin

1
入力は結果として解決されることが保証されていますか?
AdmBorkBork

1
(私の意見では)明確にするために、あなたの挑戦の言葉遣いをかなり編集しました。チャレンジの目標を変更しなかったことを確認してください。
致命的

1
また、チャレンジにはもっと明確なタイトルが必要だと思いますが、私は今アイデアを失っています。
Fatalize

1
0,1,2,3,4,5結果の入力は13,4,052; 解決策なし。または任意の動作は大丈夫ですか?
ジョナサンアラン

回答:


8

Brachylog(2)、10バイト

p~c₃o.k×~t

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

妥当な長さの時間で実行するには遅すぎます(Brachylogインタープリターは、非常に遅い制約ソルバーを使用して、空の文字列、4桁の数値、負の数値などの乗算に長い時間を費やします)。TIOリンクは、3桁のみの入力を使用します(このプログラムは、任意の桁数の入力を処理できます)。これは、入力が必要なすべての数字を含む数値である関数です(例234567)-入力に重複が0ないため、先頭にゼロを避けるために最後にいつでも置くことができます-出力は注文[b, a, c](例[6, 57, 342])。

説明

p~c₃o.k×~t
p           Permute the digits of the input
 ~c₃        Split them into three groups
    o       Sort the three groups
     .      to produce the output, which must have the following property:
      k     all but the last group
       ×    when multiplied together
        ~t  produces the last group

それでは、グループの要件は2桁、1桁、3桁でしたか?入力に6桁があり、グループは並べ替えられた順序になっていることがわかります。したがって、可能なサイズは[1、1、4]、[1、2、3]、または[2、2、2]のみです。最初のケースは不可能です(9×9は81であるため、2つの1桁の数字を掛けて4桁の数字を生成することはできません)、最後のケース(2つの2桁の数字を掛けて10×10でも100を生成するため、2桁の数値を生成します。したがって、戻り値[b, a, c]は、その順序で1、2、および3桁の長さである必要があります。したがって、要求どおり、a2桁、b1桁、およびc3桁です。


2
まあ...私は降伏
32分に致命的

8

JavaScript(ES6)、90 88バイト

入力を6桁の配列として受け取ります。可能な解決策(など'54*3==162')を説明する文字列を返すか、解決策がない場合(のみ)に 'too much recursion'エラーで終了します。

f=(a,k=1)=>eval(s='01*2==345'.replace(/\d/g,n=>a[n],a.sort(_=>(k=k*2%3779)&2)))?s:f(a,k)

使い方

これは決定論的なアルゴリズムです。

素数P=2Q=3779は、ソートコールバック(k = k * P % Q) & 2が入力配列の720の可能な順列をすべて生成することが保証されるように選択されました。より正確には、すべての順列は2798ソート後にカバーされます。これは、すべてのブラウザーの再帰制限内に収まるはずです。

01*2==345配列内の対応するエントリに数字をマッピングすることにより、式に各置換を注入します。

この式を評価し、それが真になるまで再帰呼び出しを行います。

テスト


出力形式がまだ有効であると仮定して、バイトの保存に-代わりに==(および逆に?:)を使用します。
ニール

1
@Neil実際、私はツェッペリンに同じ提案をしました。おそらくもっとゴルフをするべきでしょうが、私は現在の出力形式が好きであることを認めなければなりません。
アーナウド

3379を見つけるためにブルートフォースをしましたか、それとも数学的な推論を使用しましたか?もしそうなら、それを見つけるあなたの方法を提供できますか?:)
Yytsi

@TuukkaXここで本当に素晴らしいものはありません。私はそれをブルートフォースしました。私の基準は、1)PとQの可能な限り少ない桁数、2)可能な限り少ない反復です。
アーナルド

6

Brachylog、17バイト

p~c[Ċ,I,Ṫ]cᵐ.k×~t

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

説明

p                   Try a permutation of the Input
 ~c[Ċ,I,Ṫ]          Deconcatenate it; the result must be a list of the form [[_,_],_,[_,_,_]]
          cᵐ.       Output is the list of integers you get when mapping concatenate on the
                      previous list
             k×~t   The first two ints of the Output, when multiplied, result in the third
                      int of the Output

3

05AB1E15 13バイト

Emignaのおかげで2バイト節約できました

œJvy3L£Â`*Qi,

CP-1252エンコードを使用します。オンラインでお試しください!

説明:

œ                 # Get all permutations of the input
 J                # Join them to get the numbers
  vy              # For each element in the list..
    3L            #   Push the list [1, 2, 3]
      £           #   Pops a and pushes [a[0:1], a[1:3], a[3:6]]
       Â`         #   Bifurcate and flatten
         *        #   Multiply the top two elements in the stack
          Qi      #   If equal to the third element..
            ,     #     Print the array

順序は仕様に従っている必要がなかったため、213Sと置き換えることができます。3L2,1,3
エミグナ

£累積的にベクトル化されることを知っておくと良いでしょう...それが正しい方法である場合。
魔法のタコUr

3

Bash + coreutils、70

for((b=1;b;));{
a=`shuf -ze $@`
b=${a:0:2}*${a:2:1}-${a:3:3}
}
echo $b

すべての順列を生成する特に簡単な方法はありません。代わりに、順列をランダムに生成し、適切な順列が見つかるまで計算します。

出力は次の形式です。A*B-Cつまり、正しい順列がある場合にゼロと評価される式です。

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



2

Python 2、105バイト

lambda s:[(x[0],x[1:3],x[3:])for x in permutations(s)if eval('%s*%s%s==%s%s%s'%x)]
from itertools import*

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

より柔軟な出力を備えた88バイトのソリューション

lambda s:[x for x in permutations(s)if eval('%s*%s%s==%s%s%s'%x)]
from itertools import*

オンラインでお試しください!
出力は[6]、[57]、[342]の代わりに['6'、 '5'、 '7'、 '3'、 '4'、 '2']になります


2
あなたは、あなたを入れていなかったimport...トップで揺れる頭を
mbomb007

TIO¯\ _(ツ)_ /¯上@ mbomb007お奨め作品
ロッド

あなたは私が実際にf=ヘッダーに入れたのを見た最初の人です。たいしたことじゃない。
mbomb007

2

PHP、110バイト

それはそこに着くでしょう...最終的に...

<?$v=$argv;unset($v[0]);do shuffle($v)&[$a,$b,$c,$d,$e,$f]=$v;while("$a$b"*$c!="$d$e$f");echo"$a$b $c $d$e$f";

ゴルフをしていない:

<?
$v=$argv;
unset($v[0]);
do
  shuffle($v);
  [$a,$b,$c,$d,$e,$f]=$v;
while("$a$b"*$c!="$d$e$f");
echo"$a$b $c $d$e$f";

2

PHP、77バイト

for(;;)eval(strtr('0.*1-"428"||die("0.,1,428");',1/7,str_shuffle($argv[1])));

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


1

ES6(Javascript)、 8582、79バイト

数字(文字列)の配列を受け入れ、3要素の配列を返します[A,B,C]=> C=A*B

ゴルフ

R=(w,[a,b,c,d,e,f]=w)=>f*(d+=e)^(a+=b+c)?R(w.sort(_=>Math.random()-.5)):[a,d,f]

編集:

  • 再利用してさらに3バイト節約 da==(@ Arnauldに感謝!)
  • 構造化割り当てを使用して3バイトを保存しました

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

R=(w,[a,b,c,d,e,f]=w)=>f*(d+=e)^(a+=b+c)?R(w.sort(_=>Math.random()-.5)):[a,d,f];

function generate(A) {
   console.log(R([...A]));
}
<input type="text" id="A" value="123456"/><button onclick="generate(A.value)">GENERATE</button>


ランダムソートが実際にすべての順列をカバーすることを保証できますか?
ニール

@Neil、厳密な形式的証明を探しているなら、私はあなたにそれを提供することはできないと思いますが、経験的には置換のかなり均一な分布をもたらします。
ツェッペリン

1

ピップ、18バイト

17バイトのコード、-Sフラグの場合は+1 。

$/_=1FI_^@3,5MPMa

コマンドライン引数を介して数字列として入力を受け取ります。出力はc、b、aの順です。オンラインでお試しください!

複数のコードが存在する場合、このコードはすべてのソリューションを出力します。1つだけを出力する必要がある場合ソリューション、3バイトを追加して、プログラムをにラップし(...0)ます。

説明

                   a is 1st cmdline arg (implicit)
              PMa  Compute all permutations of a
             M     To each, map this function:
          3,5       Range(3,5)--contains values 3 and 4
       _^@          Split the function argument at those indices
                    This transforms a string like 342657 into a list [342; 6; 57]
     FI            Now filter the list of split permutations on this function:
$/_                 Fold on division: takes 1st element and divides it by the rest
   =1               Compare the quotient with 1
                    This keeps only the permutations where the first number is the product
                    of the other two
                   Autoprint the list (implicit), with each sublist on a separate line
                   and space-separated (-S flag)

1

ルビー、60バイト

->x{x.permutation{|a|(eval a="%d%d*%d==%d%d%d"%a)&&puts(a)}}

すべてのソリューションを「a * b == c」として出力します

例:

->x{x.permutation{|a|(eval a="%d%d*%d==%d%d%d"%a)&&puts(a)}}[[1,2,3,4,5,6]]
54*3==162

->x{x.permutation{|a|(eval a="%d%d*%d==%d%d%d"%a)&&puts(a)}}[[2,3,4,5,6,7]]
52*7==364
57*6==342

1

バッチ、305バイト

@echo off
set/pd=
for /l %%i in (0,1,719)do set n=%%i&call:c
exit/b
:c
set t=%d%
set s=
for /l %%j in (6,-1,1)do set/ap=n%%%%j,n/=%%j&call:l
set s=%s:~0,2%*%s:~2,1%-%s:~3%
set/an=%s%
if %n%==0 echo %s%
exit/b
:l
call set u=%%t:~%p%%%
call set s=%%s%%%%u:~,1%%
call set t=%%t:~,%p%%%%%u:~1%%

STDINの入力を文字列として[1-9]{6}受け取り、すべてのソリューションをdd*d-ddd形式で出力します。Batchは文字列操作があまり得意ではないため、720の順列の生成は少し厄介です。

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