四つんばいパズルだけではありません


11

この変形例では四つの四つんばいパズルあなたまで使用してはならないx x's場合は0から100までのすべての番号に到達するために(および他の数)と操作の定義された一連x = 4その後、あなたは4つまで使用することができます4sし、この質問は、古典的な4つの4となりパズル(ただし、4つを正確に4つ使用するのではなく、4つまで使用できます)。と仮定し1 < x <= 9ます。

このバージョンでは、次の演算子のみが許可されます。

  • 加算(+)、減算(-)、乗算(*)、除算(/)。これは実際の除算であることに注意してください5/2 = 2.5
  • 指数(例:4 ^ 4)。これは、通常手で書かれた場合、余分な記号を含まないためです。
  • を連結することにより、新しい整数を作成できますxs。たとえば、整数を作成できます4, 44, 444, 4444

演算子の評価の順序を制御するためだけに、括弧を使用して番号をグループ化することもできます。たとえば、のように括弧を連結と組み合わせることはできません(4/4)(4/4) = (1)(1) = 11

他の記号は使用できず、標準の操作順序が適用されます。

あなたのプログラムが与えられ、生成する必要がありますx定義された範囲内とnの間0100、それが存在する場合は、包括その入力のための正しいソリューションを。それ以外の場合、コードは何かを出力して、そのような解決策が存在しないことを示す必要があります。

許容範囲内xおよびn許容範囲内の入力値に対して、マシン上で提出を完了できる必要があります。これはコードゴルフであるため、最短のソリューションが優先されます。

この古い関連する質問は、より多くの演算子(および4のみ)を使用するため、0〜100のすべての数値が解けるため、この課題には当てはまりません。

入出力

コードは入力として2つの整数xn受け取り、人間が読める便利な形式でソリューション(またはソリューションがないことを示す)を出力する必要があります。入力は、4 6例えば、「数6を作り、4つの4Sまでの使用」を意味します。入力されたのであれば4 6出力は可能性があり(4+4)/4+4



2
括弧を連結と組み合わせることができますか?例 `(4/4)(4/4)=(1)(1)= 11?
デジタル外傷

1
括弧を追加する(括弧+連結を禁止することは)このかなり難しくありません
ドラコ連合

2
桁数の使用回数に対する累乗演算子と外側のループを追加しても、codegolf.stackexchange.com / q / 82884/194に
Peter Taylor

2
@PeterTaylor括弧はかなり大きな違いを生むようです。できれば再開することに投票します。
フェリパ

回答:


4

Python 3、265バイト

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

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

以下のために働く全ての数値参照エンジニアトーストによってリンク。

x=8tio まで実行さx=9れ、マシン上で数分かかります。


この関数gは、最大x数のを持つすべての組み合わせのセットを返しますxfそれからそれらをループし、数値に評価される最初のものを返しますn

それぞれに見つかった可能な値の数xは次のとおりです。

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

上記の数値はすべてから生成することができ(a+b)(a-b)(a+b)a*ba/b(a/b)、とa^b。 それ以上の数字を与えないa+ba-bください。

a^b また、巨大な番号が作成されるため、一度だけ使用されます(これは上記のリファレンスドキュメントでも確認されています)


解決策が見つかるとすぐに短絡する代替バージョン(ゴルフではなく):

x=7..9すべての数値を作成できるため、これははるかに高速です。

Pythonの3338の 289バイト

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

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


これはとてもいい答えです!私は、x XS(例えば、あなたが常に(までではなく)正確に使用していたと思った(4/4**(4-4))ため4)が、それはそうではありませんことが判明します。
アヌーシュ

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