ビットを分割します!


17

は、合計がxになる2のべき乗のリストとして定義します。例えば、V 35 = [ 32 2 1 ]V(x)2xV(35)=[32,2,1]

慣例により、ここではパワーが最高から最低の順にソートされます。ただし、チャレンジのロジックや予想されるソリューションには影響しません。

仕事

半素数 与えられた場合、V N )の各項を、この項を合計する別の2のべき乗のリストで置き換えます。結果として生じるすべてのサブリストの和集合は、次のように定義される行列Mの正確なカバーですNV(N)2M

Mi,j=V(P)i×V(Q)j

ここで、QNの素因数です。PQN

これはいくつかの例で理解するのがはるかに簡単です。

例1

、我々は持っています:N=21

  • V(N)=[16,4,1]
  • 及び V P = [ 4 2 1 ]P=7V(P)=[4,2,1]
  • 及び V Q = [ 2 1 ]Q=3V(Q)=[2,1]
  • M=(842421)

オンにの正確なカバーにM、我々は分割することができる16の中に8 + 4 + 4及び42 + 2ながら、1は変更されません。したがって、可能な出力は次のとおりです。V(N)M168+4+442+21

[[8,4,4],[2,2],[1]]

別の有効な出力は次のとおりです。

[[8,4,2,2],[4],[1]]

例2

、我々は持っています:N=851

  • V(N)=[512,256,64,16,2,1]
  • 及び V P = [ 32 4 1 ]P=37V(P)=[32,4,1]
  • V Q = [ 16 4 2 1 ]Q=23V(Q)=[16,4,2,1]
  • M=(512641612816464823241)

可能な出力は次のとおりです。

[[512],[128,64,64],[32,16,16],[8,4,4],[2],[1]]

ルール

  • 因数分解はチャレンジの主要部分ではないため、PQを交互に入力として使用できます。NPQ
  • 複数の可能な解決策が存在する場合、それらのうちの1つだけを返すか、すべてを返すことができます。
  • [[3,2,2],[1,1],[0]][[8,4,4],[2,2],[1]]
  • サブリストの順序は関係なく、各サブリスト内の用語の順序も関係ありません。
  • V(N)M[[8],[4],[2],[1]]N=15
  • これはです!

テストケース

 Input | Possible output
-------+-----------------------------------------------------------------------------
 9     | [ [ 4, 2, 2 ], [ 1 ] ]
 15    | [ [ 8 ], [ 4 ], [ 2 ], [ 1 ] ]
 21    | [ [ 8, 4, 4 ], [ 2, 2 ], [ 1 ] ]
 51    | [ [ 32 ], [ 16 ], [ 2 ], [ 1 ] ]
 129   | [ [ 64, 32, 16, 8, 4, 2, 2 ], [ 1 ] ]
 159   | [ [ 64, 32, 32 ], [ 16 ], [ 8 ], [ 4 ], [ 2 ], [ 1 ] ]
 161   | [ [ 64, 32, 16, 16 ], [ 8, 8, 4, 4, 4, 2, 2 ], [ 1 ] ]
 201   | [ [ 128 ], [ 64 ], [ 4, 2, 2 ], [ 1 ] ]
 403   | [ [ 128, 64, 64 ], [ 32, 32, 16, 16, 16, 8, 8 ], [ 8, 4, 4 ], [ 2 ], [ 1 ] ]
 851   | [ [ 512 ], [ 128, 64, 64 ], [ 32, 16, 16 ], [ 8, 4, 4 ], [ 2 ], [ 1 ] ]
 2307  | [ [ 1024, 512, 512 ], [ 256 ], [ 2 ], [ 1 ] ]

Nの代わりにPとQを使用できますか?
ngn

@ngnはい、と言うつもりです。なぜなら、Nの因数分解はチャレンジの主要部分ではないからです。
アーナウルド

1
出力をフラット化して返すことができますか?
エリックアウトゴルファー

@EriktheOutgolfer ...平坦化された出力は、入力の単なるパーティションです(たとえば、1 + 2 + 2 + 4 = 9)。私はそれが許されるべきではないと思う
氏Xcoder

@EriktheOutgolfer私は、サブリストの最後の用語が次の用語の最初の用語と同じかもしれないので、このように明確になるとは思わない。
アーナルド

回答:


4

K(ngn / k)66 63バイト

{(&1,-1_~^(+\*|a)?+\b)_b:b@>b:,/*/:/2#a:{|*/'(&|2\x)#'2}'x,*/x}

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

Nの代わりに(P; Q)を受け入れます

アルゴリズム:

  • V(P * Q)の部分和としてAを計算する

  • 各V(P)と各V(Q)を乗算し、製品を降順でソートし(Rと呼びましょう)、それらの部分和Bを計算します

  • Aにも出現するBの要素の位置を見つけます。それらの位置の直後にRをカットします


3

ゼリー、24 バイト

BṚT’2*
Ç€×þ/FṢŒṖ§⁼Ç}ɗƇPḢ

[P, Q]質問で説明されているリストの1つの可能なリストを生成する2つの整数のリストを受け入れる単項リンク。

オンラインでお試しください!(フッターは文字列表現を印刷して、リストを実際に表示します)

または参照のテストスイート(Nのリストを取り、質問のもののようになり、結果を並べ替え)

どうやって?

M1M4M=[[4]]

注:コードはリスト内のすべての(1つ!)そのようなソリューションを収集し、ヘッド(のみ)の結果を取得します。つまり、パーティションはすべての可能な順序ではないため、最終ヘッドが必要です。

BṚT’2* - Link 1, powers of 2 that sum to N: integer, N    e.g. 105
B      - binary                                                [1,1,0,1,0,0,1]
 Ṛ     - reverse                                               [1,0,0,1,0,1,1]
  T    - truthy indices                                        [1,4,6,7]
   ’   - decrement                                             [0,3,5,6]
    2  - literal two                                           2
     * - exponentiate                                          [1,8,32,64]

Ç€×þ/FṢŒṖ§⁼Ç}ɗƇPḢ - Main Link: list of two integers, [P,Q]
Ç€                - call last Link (1) as a monad for €ach
    /             - reduce with:
   þ              -   table with:
  ×               -     multiplication
     F            - flatten
      Ṣ           - sort
       ŒṖ         - all partitions
              Ƈ   - filter keep if:
             ɗ    -   last three links as a dyad:
         §        -     sum each
            }     -     use right...
               P  -       ...value: product (i.e. P×Q)
           Ç      -       ...do: call last Link (1) as a monad
          ⁼       -     equal? (non-vectorising so "all equal?")
                Ḣ - head

3

パイソン2261の 233 232 231バイト

g=lambda n,r=[],i=1:n and g(n/2,[i]*(n&1)+r,i*2)or r
def f(p,q):
 V=[[v]for v in g(p*q)];i=j=0
 for m in sorted(-a*b for a in g(p)for b in g(q)):
	v=V[i]
	while-m<v[j]:v[j:j+1]=[v[j]/2]*2
	i,j=[i+1,i,0,j+1][j+1<len(v)::2]
 return V

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

ジョーキングから1バイト。Kevin Cruijssenによる別の1バイト。

入力として受け取りますp,q。貪欲なアルゴリズムを追求します。


-k-1することができます~k
ジョナサンフレッチ

i,j割り当てが可能i,j=[i+1,i,0,j+1][j+1<len(v)::2]に-1バイト
ジョー・キング

@ジョーキング:ハハハ!それはねじれています!
チャスブラウン

while v[j]>-mすることができますwhile-m<v[j]
ケビンCruijssen

@Kevin Cruijssen:はい、確かに。THX!
チャスブラウン

2

ゼリー、41バイト

Œṗl2ĊƑ$Ƈ
PÇIP$ƇṪÇ€Œpµ³ÇIP$ƇṪƊ€ŒpZPṢ⁼FṢ$µƇ

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

ÇIP$Ƈ[P,Q]


それが問題だというわけではありませんが、正確に速いわけではありませんか?:)
アーナルド

それはそれはあまりにも速くないもちろん、単一の実行:)でおよそ3整数のパーティション関数を使用しています@Arnauld
氏Xcoder

今アウトゴルフされるのを待っています。私はそれがサブ30分の35で可能だと思うが、私ははるかに短い何もすることができるでしょうとは思わない
氏Xcoder

2

ゼリー、34バイト

BṚT’2*
PÇŒṗæḟ2⁼ƊƇ€ŒpẎṢ⁼Ṣ}ʋƇÇ€×þ/ẎƊ

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

入力形式:([P, Q]上記のTIOリンクはこれを受け入れませんが、テストケースを支援するために、代わりに1つの数字を受け入れます)。

出力形式:すべてのソリューションのリスト(TIO上の3Dリストのグリッド表現として表示)。

スピード:カメ。



1

Haskell、281195バイト

import Data.List
r=reverse.sort
n#0=[]
n#x=[id,(n:)]!!mod x 2$(n*2)#div x 2
m!0=[]
m!x=m!!0:tail m!(x-m!!0)
m%[]=[]
m%n=m!head n:drop(length$m!head n)m%tail n
p&q=r[x*y|x<-1#p,y<-1#q]%r(1#(p*q))

1
ここではいくつかのヒントがあります:代わりに、バイナリの関数の定義の演算子があなたを救うことができるガードとパターンマッチングを再配置、安価で(==)、使用1>0の代わりにTrueして使用しないでくださいwhere。またn'、短縮することもできます。これにより、72バイトを節約できます。オンラインで試してください!
ბიმო

ところで 必要がない場合は、Haskellのヒントセクションをご覧ください。
21:22に

私は再びガード状況を見て、さらに13バイトオフ:オンラインで試してみてください!
ბიმო

@OMᗺ、ありがとう。手品のように私のためにこのルックスので、私は、Haskellのに新たなんだ
ЕвгенийНовиков

心配ありません:)質問がある場合は、お気軽にOf Monads and Menでお尋ねください。
ბიმო
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.