ツー・ゼロ・ワン・ファイブ・パズル


13

バックグラウンド

このパズルは、フォーフォーズパズルのバリエーションです(それ自体が過去の質問のトピックです)。そのパズルのように、目的は、4桁と特定の数学演算子のみを使用して、異なる整数の数式を見つけることです。ただし、この場合、許可される数字は2、0、1、および5だけです。それぞれがソリューションに正確に1回、正しい順序で表示される必要があります。驚くほど多くの整数がこの方法で表現できます。ソルバーは、奇妙に楽しいので、最初に手で解決することをお勧めします。

ルール

定数は、1桁または複数の数字から作成できます。

  • 整数:たとえば、2、0、15など。
  • 10進数:例.2、.01、1.5など
  • 繰り返しの小数:.2〜(= 0.222 ...)、. 15〜(= 0.1555 ...)、20.15 ~~(= 20.1515 ...)

次の単項演算が許可されています。

  • 単項否定:-x
  • 平方根:sqrt(x)
  • 整数階乗:x!

次のバイナリ操作が許可されています。

  • 標準算術演算子:x + y、xy、x * yおよびx / y
  • 任意のべき乗:x ^ y
  • 任意のルート:rt [x](y)(= xのyのルート)

仕事

プログラムは、できるだけ多くの0〜100の整数の式を出力し、生成した式の数を出力する必要があります。

  • ソリューションは、n = [expr]の形式で順番に印刷する必要があります。
  • 式では、2、0、1、5のすべての数字をその順序で1つずつ使用する必要があります。
  • 式は、上記の表記法を使用して印刷する必要があります。不要な括弧は許可されますが、空白のように必須ではありません。演算子の優先順位は、単項否定、階乗、べき乗、乗算/除算、加算/減算です。
  • プログラムは、すべての数値の解を返す必要はありません。したがって、単に0を出力するプログラムは有効です。ただし、以下のスコアリングセクションを参照してください。
  • プログラムは、最新のコンピューターで15分未満で実行する必要があります。

プログラムまたは関数を作成できます。式はSTDOUT(または最も近い代替)に出力する必要があります。式の数は、STDOUTに出力するか、整数として返すことができます。標準コードのゴルフ制限が適用されます。

出力例

0=2*0*1*5
10=20*1*.5
42=((2+0!)!+1)!/5!
100=20*1*5
4

得点

更新@orlpはスコアリングシステムの欠陥に気付きました。これをどのように修正すべきか、または修正すべきかどうかについては、http://meta.codegolf.stackexchange.com/questions/5106/way-of-salvaging-two-zero-one-five-puzzle-challengeを参照してください

ソリューションは、最初に生成する式の数によってスコア付けされ、次にバイト単位のコード長によってスコア付けされます。したがって、80の結果を生成する1000バイトのプログラムは、79のみを生成する100バイトのプログラムに勝ります(ただし、後者は欠落した結果を含めるように簡単に拡張できます)。

やる気を起こさせるターゲットが必要な場合は、表現できる式の数の下限を以下に示します。私はエントリーを提出する予定はありませんので、少ない資金で勝つことができるかもしれません!

少なくとも85(101のうち)ですが、それより高い場合もあります。

スコアボード

追加のインセンティブとして、スコアの進行の概要を以下に示します。最高得点を獲得するたびに、テーブルのトップに自分を追加してください(または他の人に聞いてください)。

  • 0式、1バイト(Pyth):0のみを出力する実装

.20は許可される定数ですか?
ルーク

1
@Luke:はい、それは表現力を増加させないので、それはまた、(+ 0.2)のように表すことができるけれども
ウリグランタ

1
@orlp先行ゼロとゼロより大きい小数部は、表現力を追加しないことに注意してください。たとえば、015 = 0 + 15および1.5 = 1 + .5。
ウリグランタ

1
@ mbomb007それはあまりにも複雑です。ここに私が書いた簡単な説明があります:gist.github.com/orlp/e92b3b7d26ad9b11378e
orlp

2
@UriZarfaty次に、99の異なる有用な定数セットがあります。gist.github.com
orlp

回答:


9

85、最大2400バイト

これはコードゴルフチャレンジです。これまでの努力はすべて役に立たないので、これを投稿します。

  0 = ((2*0)^15)
  1 = ((2^0)^15)
  2 = (2-(0^15))
  3 = (20*.15)
  4 = (20*(1/5))
  5 = (20-15)
  6 = ((.20+1)*5)
  7 = ((20*.1)+5)
  8 = (2*((0-1)+5))
  9 = ((.20/.1~)*5)
 10 = (20/(1/.5))
 11 = ((((2-0)+1))!+5)
 12 = (20*(.1+.5))
 13 = ((-(2)-0)+15)
 14 = (20-(1+5))
 15 = ((2*0)+15)
 16 = ((2^0)+15)
 17 = ((2-0)+15)
 18 = (20-(1/.5))
 19 = (20-(1^5))
 20 = (20^(1^5))
 21 = (20+(1^5))
 22 = (20+(1/.5))
 23 = (((2-0)/.1~)+5)
 24 = ((20-1)+5)
 25 = ((20^1)+5)
 26 = ((20+1)+5)
 27 = (rt[.2](((0)!+1))-5)
 28 = (2*(-((0)!)+15))
 29 = ((((2+(0)!)+1))!+5)
 30 = ((2-0)*15)
 31 = (20+sqrt((1+(5)!)))
 32 = ((20*.1)^5)
 33 = ((.2^-((0)!))/.15~~)
 34 = (2+(((0)!+1)^5))
 35 = (20+15)
 36 = (20*(1/.5~))
 37 = (rt[.2](((0)!+1))+5)
 38 = ((20-1)/.5)
 39 = (-((2^0))+(sqrt(.1~)*(5)!))
 40 = (20*(1/.5))
 41 = (((.2~^-((0)!))/.1~)+.5)
 42 = ((20+1)/.5)
 43 = (-(2)+(((0)!/.1~)*5))
 44 = (20+((-(1)+5))!)
 45 = (20/(1-.5~))
 46 = ((.2+((0)!/.1~))*5)
 47 = (2+(((0)!/.1~)*5))
 48 = (2*(((0-1)+5))!)
 49 = ((((2+(0)!))!/.1~)-5)
 50 = (((2^0)/.1)*5)
 51 = ((.2+((0)!/.1))*5)
 52 = (2+(((0)!/.1)*5))
 54 = (((2+(0)!)/.1)/.5~)
 55 = ((2+((0)!/.1~))*5)
 56 = (((.2-(0)!)+sqrt(.1~))*-((5)!))
 58 = (-(2)+sqrt((((((0)!/sqrt(.1~)))!)!*5)))
 59 = ((((2+(0)!))!/.1~)+5)
 60 = (20/(.1~^.5))
 62 = (2*(-((0)!)+sqrt(rt[-(.1)](.5))))
 64 = ((2-0)^(1+5))
 65 = ((20/sqrt(.1~))+5)
 66 = ((-(((2+(0)!))!)/.1~)+(5)!)
 67 = (((((2+(0)!))!)!*.1)-5)
 69 = ((2^(((0)!/sqrt(.1~)))!)+5)
 70 = (((.2^-((0)!))/-(.1))+(5)!)
 72 = ((2+(0)!)*((-(1)+5))!)
 75 = ((.2^-((0)!))*15)
 76 = (rt[(-(2)^-((0)!))](.1~)-5)
 77 = (((((2+(0)!))!)!*.1)+5)
 78 = (2*(-((0)!)+(sqrt(.1~)*(5)!)))
 80 = (-(20)*(1-5))
 81 = (201-(5)!)
 82 = (2*((0)!+(sqrt(.1~)*(5)!)))
 84 = (((.2-(0)!)+.1)*-((5)!))
 85 = (((((2+(0)!))!)!*.1~)+5)
 86 = (rt[(-(2)^-((0)!))](.1~)+5)
 88 = (rt[.2]((-((0)!)-1))+(5)!)
 90 = ((20/.1~)*.5)
 93 = (((2+(0)!)/-(.1~))+(5)!)
 95 = ((20-1)*5)
 96 = ((.20-1)*-((5)!))
 98 = (-(20)*(.1-5))
 99 = ((-(20)-1)+(5)!)
100 = (20/(1/5))
85

ここからは、圧縮の課題に過ぎません。たぶん私は後で競争するでしょう、多分私はそうしないでしょう。私にとっての楽しみのほとんどは、ほとんどの式を見つけるという挑戦でした。

ソルバーの作成に苦労している人へのヒント-ランタイムは問題になりません。確認する式が多すぎる場合、希望のない解決策や重複を捨てるには、より良いヒューリスティックが必要です。上記を生成するために作成したコードは、Pythonで約5秒で実行されます。


rt [.1](-。5)は、-0.5の0.1のルートではなく、-0.5の0.1のルートです。
ウリグランタ

また、勝者は圧縮されたテキスト出力である可能性が高いと疑い始めています。その:-(避けるために、より良い方法を考えているはず
ウリグランタ

@UriZarfatyああ、それをコードで修正して再実行します。1秒待ってください。
orlp

私は、出力がプログラムのサイズと比較してどれだけ大きいかを著しく過大評価していました。狭い範囲の文字と余分な括弧を考えると、ソリューションは実際にはかなりうまく圧縮されると推測しています。
ウリグランタ

1
@ mbomb007私はそれをクリーンアップしようとはしませんでした。現在の状態のコードは壊れていると思います-gist.github.com/orlp/878da16b5b7c650ebd09のコメントを外してみてください。
orlp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.