Розділіть шматочки!


17

Ми визначаємо як перелік відмінних потужностей 2, які дорівнюють x . Наприклад, V ( 35 ) = [ 32 , 2 , 1V(x)2x .V(35)=[32,2,1]

За умовами повноваження тут сортуються від найвищої до найнижчої. Але це не впливає на логіку виклику, ні на очікувані рішення.

Завдання

З огляду на напівпримір , замініть кожен додаток у V ( N ) іншим переліком потужностей 2, які дорівнюють цьому терміну, таким чином, що об'єднання всіх підсумків, що виникають, є точним покриттям матриці M, визначеної як:NV(N)2M

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

де і Q є основними факторами NPQN .

Це набагато простіше зрозуміти на деяких прикладах.

Приклад №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 і 4 на 2 + 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]
  • Q=23 and V(Q)=[16,4,2,1]
  • M=(512641612816464823241)

A possible output is:

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

Rules

  • Because factorizing N is not the main part of the challenge, you may alternately take P and Q as input.
  • When several possible solutions exist, you may either return just one of them or all of them.
  • Ви можете по черзі повертати експоненти потужностей (наприклад, замість [ [ 8 , 4 , 4 ] , [ 2 , 2 ] , [ 1 ][[3,2,2],[1,1],[0]] ).[[8,4,4],[2,2],[1]]
  • Порядок підсписів не має значення, а також порядок термінів у кожному підсписку.
  • Для деяких напівперіодів вам не доведеться розділяти жоден термін, оскільки вже є ідеальною обкладинкою M (див. A235040 ). Але вам все одно потрібно повернути список (одиночні) списки, такі як [ [ 8 ] , [ 4 ] , [ 2 ] , [ 1 ] ] для N = 15V(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 ] ]

can we take P and Q instead of N?
ngn

@ngn I'm going to say yes, because factorizing N is not the main part of the challenge.
Arnauld

1
May we return the output flattened?
Erik the Outgolfer

@EriktheOutgolfer ... The output flattened is just a partition of the input (1+2+2+4=9, for example). I don't think it should be allowed
Mr. Xcoder

@EriktheOutgolfer I don't think it could be unambiguous this way, as the last term of a sub-list may be the same as the first term of the next one.
Arnauld

Відповіді:


4

K (ngn/k), 66 63 bytes

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

Try it online!

accepts (P;Q) instead of N

algorithm:

  • compute A as the partial sums of V(P*Q)

  • multiply each V(P) with each V(Q), sort the products in descending order (let's call that R), and compute their partial sums B

  • find the positions of those elements in B that also occur in A; cut R right after those positions


3

Желе , 24 байти

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

Монадична посилання, що приймає список з двох цілих чисел, [P, Q]що дає один можливий список списків, як описано в питанні.

Спробуйте в Інтернеті! (footer prints a string representation to show the list as it really is)

Або подивіться набір тестів (взявши список N та упорядкувавши результати, щоб вони були такими, як у запитанні)

Як?

Ми завжди можемо нарізати елементи М знизу вгору, жадібно (або є 1 в М або у нас був внесок 4, коли М=[[4]]) для того, щоб знайти рішення.

Примітка: код збирає всі (одне!) Подібні рішення у списку, а потім отримує головний (лише) результат - тобто остаточний заголовок необхідний, оскільки розділи не в усіх можливих порядках.

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

Пітон 2 , 261 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 байт від Джо Кінга ; і ще 1 байт завдяки Кевіну Крейсейну .

Приймає як вхід p,q. Створює жадібний алгоритм.


-k-1може бути ~k.
Джонатан Фрех

i,jПризначення може бути i,j=[i+1,i,0,j+1][j+1<len(v)::2]для -1 байт
Jo King

@Jo King: Хахаха! Це скручено!
Час Браун

while v[j]>-mможнаwhile-m<v[j]
Кевін Круїйсен

@Kevin Cruijssen: Так, справді. Дякую!
Час Браун

2

Желе , 41 байт

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

Спробуйте в Інтернеті!

Напевно, він повинен бути набагато коротшим (деякі частини відчувають себе дуже повторюваними; особливо ÇIP$Ƈ, але я не знаю, як у нього грати в гольф). Пояснення, щоб прийти після подальшого гольфу. Повертає всі можливі рішення у випадку наявності декількох і приймає введення як[П,Q].


Не те, що це проблема, але це не зовсім швидко, чи не так? :)
Арнольд

@Arnauld Він використовує приблизно 3 цілочисельні функції розділу в один цикл :) Звичайно, це не надто швидко
містер Xcoder

Тепер чекаю, що переможеш. Я думаю, що це можливо в під-35/30, але я не думаю, що мені вдасться зробити щось набагато коротше
містер Xcoder

2

Желе , 34 байти

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

Спробуйте в Інтернеті!

Формат введення: [P, Q](посилання TIO, наведене вище, не приймає це, а замість нього одне число, щоб допомогти з тестовими випадками).

Формат виводу: Список усіх рішень (показаний у вигляді сітки 3D-списку в TIO).

Швидкість: Черепаха.



1

Haskell, 281 195 байт

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 байти: Спробуйте це в Інтернеті!
ბიმო

Btw. ви повинні ознайомитись із розділом порад Haskell, якщо у вас немає.
ბიმო

Я знову переглянув ситуацію з охороною, ще 13 байт: Спробуйте в Інтернеті!
ბიმო

@ OMᗺ, дякую. Я новачок у haskell, тому це виглядає на мене як на магічні трюки
Евгений Новиков

Не хвилюйтесь :) Якщо у вас виникнуть запитання, сміливо запитайте в « Monads and Men» .
ბიმო
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.