整数、アセンブル!


30

あなたの仕事は、1toからN(入力として与えられた)整数を(入力としても与えられた)幅Wと高さの長方形に組み立てることHです。個々の番号は90度の倍数で回転できますが、長方形内では連続したブロックとして表示される必要があります。つまり、数字の1つを複数の数字に分割して、数字を個別に長方形に配置することはできません。また、角の周りに数字の3桁を曲げることもできません。それぞれの数字は、壁を構築するレンガと考えることができます。

以下に例を示します。入力がであるとし(N, W, H) = (12, 5, 3)ます。1つの可能な解決策は次のとおりです。

18627
21901
53114

わかりやすくするために、このグリッドの2つのコピーを示します。1桁の数字が非表示になっているものと、2桁の数字が非表示になっているものです。

1####    #8627
2##01    #19##
##11#    53##4

長方形を独自の方法で再び分解できない場合は問題ありません。たとえば、上記の例では、12も次のように配置できます。

#####    18627
21#01    ##9##
##11#    53##4

ルール

これNは正でありW*H、整数から1までの整数の桁数と一致Nし、指定された数値への長方形のタイルが存在すると仮定できます。私は現在、これが常に可能であるかどうかの証拠を持っていませんが、もしあなたがそうするならば、私はそれに興味があります。

出力は、単一の改行で区切られた文字列または文字列のリスト(各行に1つ)、または1桁の整数のリストのリスト(各セルに1つ)のいずれかです。

提出の結果は確定的である必要があり、合理的なデスクトップマシンで1分以内にすべてのテストケースを処理できる必要があります。

プログラムまたは関数を記述し、入力を受け取り、出力を提供する当社の標準的な方法のいずれかを使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

最初のものを除いて、これらのどれもユニークではありません。各テストケースのN W H後に、可能な出力が続きます。長方形が狭すぎて大きな数字を水平に書き込むことができない場合に、答えが機能することを確認してください。

1 1 1
1

6 6 1
536142

6 2 3
16
25
34

10 1 11
1
0
8
9
2
6
7
3
1
5
4

11 13 1
1234567891011

27 9 5
213112117
192422581
144136119
082512671
205263272

183 21 21
183116214112099785736
182516114011998775635
181116013911897765534
180415913811796755433
179115813711695745332
178315713611594735231
177115613511493725130
176215513411392715029
175115413311291704928
174115313211190694827
173115213111089684726
172015113010988674625
171915012910887664524
170814912810786654423
169714812710685644322
168614712610584634221
167514612510483624120
166414512410382614019
165314412310281603918
164214312210180593817
163114212110079583716

200 41 12
81711132917193661114105533118936111184136
50592924448815915414562967609909953662491
89529721161671582389717813151113658811817
41418184511110119010183423720433017331118
35171183614003547461181197275184300111711
41874381132041861871718311415915921116264
11914245014112711011594492626831219331845
17125112629222085166344707736090956375181
94507611291431121128817413566319161275711
11011540021119913511011169939551729880780
92725141607727665632702567369893534277304
78118311405621148296417218591118562161856

8
これが常に可能であるという証拠はありますか?
16

@Fatalize良い質問です。与えられたすべての入力が可能であると仮定できますが、いずれかの方法での証拠が興味深いでしょう。
マーティンエンダー

@Fatalize:少なくともinputのささいなケースでは(10, 1, 1)、それは不可能です(1からNMUSTのすべての数字が構築に使用されると仮定)。その制約が保持されている場合、それを可能にするには、単位の長方形の面積が少なくとも桁数でなければなりません1..N。その制約が緩和されれば、すべての場合に可能です(ただし、チャレンジはそれほど面白くありません:P)
セバスチャンレナートウィッツ

2
@SebastianLenartowicz:長方形の面積が[1、N]の数字の合計と一致するという部分を見逃したと思います。N == 10の場合、幅と高さは1と11でなければなりません。幅または高さが1の場合、この問題は常に解決可能です。
Yay295

1
@MartinEnder逆のチャレンジも興味深い可能性があります:入力としての数字の長方形(そして最終的Nには、プログラムは幅と高さからそれを計算できます)、プログラムは長方形がこのチャレンジに対する有効な答えであるかどうかをチェックする必要があります...
ダダ

回答:


3

Pyth、35バイト

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY

mbomb007のクレジット。私は彼のアルゴリズムを使用しました。もともと私はスティーブン・Hを助けたかっただけでしたが、それから私は本当に短いバージョンを見たかったです。

受け取りN最初の行に、そしてW,H二行目:オンラインそれを試してみてください。デモンストレーションを

Pythの実装に厄介なバグを発見しました.[(実装して以来、私自身の責任です)。明日修正しなきゃ。その結果、+ 3バイトになりました。

説明:

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY
                                  Y   start with the empty list []
                                      I'll perform all operations on this list. 
                                      Sometimes it is called G, sometimes N. 
                                vz    read the second line and evaluate it: [W, H]
                              _B      bifurcate it with reverse: [[W, H], [H, W]]
 u                                    for each pair H in ^:
                    .TG                  transpose G
                   +   mkeH              append H[1] empty strings
                  <        eH            use only the first H[1] strings
                                         lets call this result N
  u                          )           modify N, until it doesn't change anymore:
   m                        N               map each d in N to:
     WghHl+dQ                                  if H[0] >= len(d+Q):
    +        d  Q                                 d + Q
              ~t                                  and decrement Q by 1
             d                                 else:
                                                  d
j                                     at the end print every row on a separate line

7

Python 2、210 200バイト

編集:今すぐ動作!

上から下、左から右へ、最大の数字から塗りつぶします。次に、転置して再度実行します。次に、転置して印刷します。移調が機能するためにはスペースを埋めなければなりませんでした。ラインがまだ完全な長さではないからです。

ネストされたexec作業を行うのに問題がありました(実行しますexec'exec"..."*w\n;...'*2。誰かがそれを理解できるなら、私に知らせてください。

n,w,h=input()
s=[""]*h
for x in 1,2:
    exec"for i in range(h):l=len(s[i]+`n`)<=w;s[i]+=`n`*l;n-=l\n"*w;s=[r.replace(" ","")for r in map(lambda x:`x`[2::5],zip(*[r.ljust(w)for r in s]))];w,h=h,w
print s

オンラインで試す -変更された関数を使用して、複数のテストケースをより簡単に実行できるようにします(使用できませんでしたexec)。他のバージョンのコメントを外し、stdinを変更して実行を確認します。

少ないゴルフ:

def f(n,w,h):
    s=[""]*h
    for x in 1,2:
        for j in[0]*w:
            for i in range(h):
                l=len(s[i]+`n`)<=w
                s[i]+=`n`*l
                n-=l
        s=[r.ljust(w)for r in s]
        s=map(lambda x:`x`[2::5],zip(*s))
        s=[r.replace(' ','')for r in s]
        w,h=h,w
    print"\n".join(s)

これは現在すべてのケースで機能する可能性が非常に高いですが、(非公式の)証拠はまだありがたいです。;)
マーティン・エンダー

@MartinEnder証拠はおそらく私を超えています。数値の長さがさらに異なる場合、テストケースは非常に大きくなります。これはおそらく、常に解決策があるかどうかの証明と関係があるか、同じだろう。
mbomb007

6

JavaScriptの、284 259 245 241 240 223 209 205バイト

// Golfed
let f = (N,W,H)=>eval('a=Array(H).fill("");while(N)g:{s=""+N--;d=s[L="length"];for(i in a)if(a[i][L]+d<=W){a[i]+=s;break g}for(p=0;d;++p){l=a[p][L];for(k=p+d;k>p;)l=a[--k][L]-l?W:l;while(l<W&&d)a[p+--d]+=s[d]}}a');

// Ungolfed
(N,W,H) => {
    a = Array(H).fill(""); // Create `H` empty rows.

    while (N) g : {
        s = "" + N--; // Convert the number to a string.
        d = s[L="length"]; // Count the digits in the number.

        // Loop through the rows trying to fit the number in horizontally.
        for (i in a) {
            if (a[i][L] + d <= W) { // If it fits.
                a[i] += s; // Append the number to the row.
                break g; // This is what a goto statement looks like in JavaScript.
            }
        }

        // Loop through the rows trying to fit the number in vertically.
        for (p = 0; d; ++p) {
            l = a[p][L]; // Get the length of the row.

            // Find `d` adjacent rows of the same length.
            for (k = p + d; k > p; ) {
                // If `a[--k][L] == l`, continue.
                // Else set `l` to `W` so the next loop doesn't run.
                l = a[--k][L] - l ? W : l;
            }

            // Put the characters in position.
            while (l < W && d)
                a[p+--d] += s[d];
        }
    }

    return a;
}

let test_data = [[1,1,1],
                 [6,6,1],
                 [6,2,3],
                 [10,1,11],
                 [10,11,1],
                 [11,13,1],
                 [27,9,5],
                 [183,21,21],
                 [184,2,222],
                 [200,41,12],
                 [1003,83,35]];

for (let test of test_data)
    console.log(f(test[0],test[1],test[2]));


1
2つの数値が異なるかどうかをテストする-代わりに使用して、1バイトを節約します!=
ニール

2

Pyth、79 50 48バイト

バグを解決するまで競合しない(たとえば、[6,6,1]は[6,1,6]と同じを返します)。Pythを使用するのは初めてなので、おそらく多くの機能が欠けています。

Jakubeのおかげで、29バイトを節約し、私のコードを実際に機能させました!

repr()呼び出しが不要であることを認識して、さらに2バイトを節約しました。

基本的にはmbomb007のPython 2の回答の翻訳にすぎません。

AEJmkHFb2VHVGIgGl+@JNQ XNJ~tQ)))=.[.TJkGA,HG)jJ

の形式で入力を受け取ります
n
w,h


2
回答は、有効なソリューションになるまで削除する必要があります。
mbomb007

ほとんどのコードは正しいと思います。私が見る唯一のエラーは、転置中に起こります。mbomb007は、残りの列をスペースで慎重に埋めることによって転置し、スペースを圧縮して削除します。この保証人。行列の転置後のw長さがあること。=.TZ長さを知らないため、それを保証することはできませんw
ジャクベ

実際には、主なエラーはである!>+@ZN`zKはずです!>+@ZN`zJ。その後、すべての小さなテストケースが機能します。ただし、(上記で説明したように)転置が失敗するテストケースを作成できます。これが機能する=.[.TZkKには、の代わりに(空の文字列で不足している列を埋める)ようなものが必要です=.TZ
ジャクベ

そして、Pythと混同しないようにしてください。コードには、同じ値(Kおよびなど@Q1)を指す2つの多重変数があります。どの変数がどの値であるかを追跡するのは非常に困難でした。そして、コードをコピーするだけではありません。複雑にしないでおく。ブールトリック=Y...はPythonにとって良いアイデアかもしれませんが、単純なI(if)の方がはるかに読みやすく(そして短く)なります。
ジャクベ

ここでmbomb007のコードを使用して、本当にシンプルなソリューションです:リンクそれは取りますn(この方法は、我々は、余分な変数に値を割り当てる必要はありません、我々は単純に使用できる最初の行にQ)。そして、wそしてh、すぐに割り当てられます二行目、上GHAE
ジャクベ

1

スタックス、27 バイト

é!L↑?∞S░♠╔)¥¼/ÿµ◄÷│♦╫Δò6√√╣

実行してデバッグする

forの1行で入力を受け取ります{N} {H} {W}

このプログラムは、指定されたサイズのスペースのグリッドから始まります。N..の各数値に対して1、適切なサイズのスペースの文字列からフォーマットされた数値への単一の文字列置換を試みます。置換を実行できない場合は、転置されたグリッドで再試行します。

z)A+*   create "grid" of spaces and newlines of specified size
,Rr     create range [n ... 1]
F       for each number execute the indented section; it will fit the value into the grid
  $%z(  make a string out of spaces the same length as the number; e.g. 245 => "   "
  Y     store the space string in register Y; this will be used as a search substring
  [#    count the number of occurrences of y in the grid; the grid is still on the stack
  X     store the count in register X; this will be used as a condition
  G     jump to routine at closing curly brace
  y_$|e replace the first instance of y (the spaces) with the current number
  xG    push x; then jump to routine at closing curly brace
        end program
}       called routine jump target
C       pop top of stack; if it's truthy terminate routine
|jM|J   split on newlines; transpose; join with newlines

これを実行する

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