単位正方形のタイリング


8

バックグラウンド

用語を拡張およびキャンセルすることにより、次のアイデンティティを簡単に示すことができます。

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

ただし、すべての1 / n×1 /(n + 1)の四角形が単位正方形をタイリングできるかどうかは、未解決の問題です。

タスク

プログラムは、任意の便利な方法で正の整数Nを入力として受け取り、1からNまでのすべての1 / n x 1 /(n + 1)の開いた長方形を1からNまでの単位正方形にパックします。 。

長方形ごとに、次の整数を順番に生成する必要があります。

  • 水平エッジが垂直エッジよりも長い場合は1、それ以外の場合は0
  • 左下隅のx座標の分子と分母
  • 左下隅のy座標の分子と分母

単位の正方形をとし(0, 1) x (0, 1)、x値は左から右に、y値は下から上にあることに注意してください。

最終的に予期される出力は、任意の便利な形式(たとえば、stdoutに出力されるか、関数から返されるリストとして)で、各長方形のこれらの整数をnの昇順で連結したものです。

入力と出力の例

入力:

3

出力:

0 0 1 0 1 1 1 2 0 1 1 1 2 1 3

これは次のように解析されます。

0 (0/1, 0/1)  1 (1/2, 0/1)  1 (1/2, 1/3)

得点

これはコードゴルフの挑戦なので、バイト数が最も少ない答えが勝ちます。ただし、アルゴリズムもかなり効率的でなければなりません。N<=100合計で約10分で実行できるはずです。

ソリューションは、すべてに対して有効なソリューションを提供する必要N<=100がありますが、最短でなくても、証明可能な完全なアルゴリズムも歓迎します。


これは未解決の問題であると考えて、アルゴリズムの動作が保証されなければならない$ N $の最大値に上限はありますか?
グレッグマーティン

@GregMartinは、1から20までのNに対してプログラムを正常に実行する必要があります。アルゴリズムが推測に成功または反証できることが証明できる場合は、ブラウニーがポイントします。
user1502040 2017年

N≤20の場合、出力はハードコード化できます...それを許可するのはあなたの意図ですか?少なくともN = 1,000,000,000を許可する単純な公開アルゴリズムがあります...
グレッグマーティン

OK、私は20から100にしきい値を変更
user1502040

ああ、善。私はまだ無限大の合計を学んでいないので、これはまったく理解できません。
Matthew Roh

回答:


2

Haskell、263 262バイト

import Data.Ratio;f m=let{(#)n z|n>m=[[]]|True=[a:y|(a,j)<-[((o,x,y),[c|c<-(u&w,h-v,x,g):(w-u,h&v,a,y):z,c/=b])|b@(w,h,x,y)<-z,(o,u,v)<-[(o,1%(n+1-o),1%(n+o))|o<-[0,1]],(a,g)<-[(x+u,y+v)|u<=w,v<=h],let(&)p q|w>h=p|True=q],y<-(n+1)#j]}in(1#[(1%1,1%1,0%1,0%1)])!!0

これは、Paulhus 1997、An Algorithm for Packing Squaresdoi:10.1006 / jcta.1997.2836で説明されているアルゴリズムに従います。理論的に検証されていない場合は経験的に行われるこの論文の重要な所見は、ボックスに長方形を配置した後に残った領域が2つのサブボックスに分割され、それらの充填は独立していると見なされることです。

次の四角形に収まる最小の幅のサブボックスを見つけるのではなく、コードはすべての可能なサブボックスにわたって検索を実行します。実際には、これはn <100の場合、それほど遅くはありません。

出力は、小数マーカーが%まだ含まれているタプルとしてのエントリのリストの形式です。フォーマットされた出力の整数は望ましい順序ですが、厳密に言えば、整数のリストのみを生成するために、いくつかの後処理が必要になります。

サンプルの実行:

*Main> f 5 (0,0 % 1,0 % 1),(0,1 % 2,0 % 1),(0,1 % 2,1 % 2),(0,3 % 4,1 % 2),(1,1 % 2,5 % 6)

編集:の後の誤ったスペースを削除しましたlet

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