비트를 나누십시오!


17

우리는 x에 합한 2V(엑스) 의 고유 한 힘의 목록으로 정의 합니다. 예를 들어, V ( 35 ) = [ 32 , 2 , 1 ] 입니다.2엑스V(35)=[32,2,1]

일반적으로, 권력은 여기에서 최고에서 최저로 분류됩니다. 그러나 도전의 논리 나 예상 솔루션에는 영향을 미치지 않습니다.

직무

semiprime 주어지면 모든 결과 하위 목록의 합집합이 다음과 같이 정의 된 행렬 M 의 정확한 범위가되도록 V ( N )의 각 항 을이 항에 합산되는 다른 2 의 거듭 제곱 목록으로 바꿉니다 .V()2미디엄

미디엄나는,제이=V()나는×V()제이

여기서 의 주요 요소입니다 .

일부 예제에서는 이해하기가 훨씬 쉽습니다.

실시 예 # 1

를 들어 =21 , 우리는이 :

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

해제하려면 정확한 커버로 , 우리는 분할 수 에 과 에 동안 그대로 남겨진다. 가능한 결과는 다음과 같습니다.M 16 8 + 4 + 4 4 2 + 2 1V(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]
  • P=37V(P)=[32,4,1]
  • Q=23V(Q)=[16,4,2,1]
  • M=(512641612816464823241)

가능한 출력은 다음과 같습니다.

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

규칙

  • 인수 분해하는 것이 문제의 주요 부분이 아니므로 와 를 교대 로 입력으로 사용할 수 있습니다.NPQ
  • 몇 가지 가능한 솔루션이 존재하면 그 중 하나 또는 전부를 반환 할 수 있습니다.
  • 거듭 제곱의 지수를 교대로 반환 할 수 있습니다 (예 : 대신 ).[[3,2,2],[1,1],[0]][[8,4,4],[2,2],[1]]
  • 하위 목록의 순서는 중요하지 않으며 각 하위 목록의 용어 순서도 중요하지 않습니다.
  • 일부 세미 프라임 의 경우 이미 의 완벽한 커버 이기 때문에 어떤 용어도 나눌 필요가 없습니다 ( A235040 참조 ). 그러나 대해 과 같은 (단일) 목록의 목록을 반환해야합니다 .M [ [ 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 ] ]

N 대신 P와 Q를 취할 수 있습니까?
ngn

@ngn N을 고려하는 것이 도전의 주요 부분이 아니기 때문에 그렇습니다.
Arnauld

1
출력을 평평하게 반환 할 수 있습니까?
Outgolfer Erik

@EriktheOutgolfer ... 평탄화 된 출력은 입력의 파티션 일뿐입니다 (예 : 1 + 2 + 2 + 4 = 9). 나는 그것이 허용되어야한다고 생각하지 않는다
Mr. Xcoder

@EriktheOutgolfer 하위 목록의 마지막 용어가 다음 목록의 첫 번째 용어와 같을 수 있으므로이 방법으로 모호 할 수 있다고 생각하지 않습니다.
Arnauld

답변:


4

K (ngn / k) , 66 63 바이트

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

온라인으로 사용해보십시오!

N 대신 (P; Q) 허용

연산:

  • A를 V (P * Q)의 부분 합으로 계산

  • 각 V (P)에 각 V (Q)를 곱하고 내림차순으로 제품을 정렬하고 (R이라고 함) 부분 합 B를 계산합니다.

  • A에서 발생하는 B의 요소 위치를 찾으십시오. 그 위치 바로 뒤에 R을 자르십시오


3

젤리 , 24 바이트

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

[P, Q]질문에 설명 된 것처럼 하나의 가능한 목록 목록을 생성하는 두 개의 정수 목록을 허용하는 모나드 링크 .

온라인으로 사용해보십시오! (바닥 글은 목록을 실제로 표시하기 위해 문자열 표현을 인쇄합니다)

또는 테스트 슈트를 참조하십시오 (N 목록을 작성하고 문제의 결과와 같도록 재정렬 결과)

어떻게?

우리 는 해 를 찾기 위해 항상 의 요소 를 가장 낮은 것부터 욕심스럽게 슬라이스 할 수 있습니다 ( M에 1 이 있거나 M = [ [ 4 ] ] 일 때 입력이 4 였다 ).M1M4M=[[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

온라인으로 사용해보십시오!

Jo King 에서 1 바이트 ; Kevin Cruijssen 으로 인해 또 다른 1 바이트 .

입력으로 사용합니다 p,q. 욕심 많은 알고리즘을 추구합니다.


-k-1일 수 있습니다 ~k.
Jonathan Frech

i,j할당 할 수 있습니다 i,j=[i+1,i,0,j+1][j+1<len(v)::2]-1 바이트
조 왕

@ 조 왕 : 하하하! 그것은 꼬인 것입니다!
Chas Brown

while v[j]>-m가능while-m<v[j]
Kevin Cruijssen

@Kevin Cruijssen : 그렇습니다. 고마워!
Chas Brown

2

젤리 , 41 바이트

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

온라인으로 사용해보십시오!

ÇIP$Ƈ[P,Q]


문제가 아니라고 정확히 빠르지는 않습니까? :)
Arnauld

@Arnauld 그것은 단일 실행에서 대략 3 개의 정수 파티션 함수를 사용합니다 :) 물론 너무 빠르지 않습니다
Mr. Xcoder

이제 아웃 고프를 기다리고 있습니다. 나는
35/30

2

젤리 , 34 바이트

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

온라인으로 사용해보십시오!

입력 형식 : [P, Q](위의 TIO 링크는 테스트 케이스를 지원하기 위해 이것을 허용하지 않고 대신 단일 숫자를 허용합니다).

출력 형식 : 모든 솔루션 목록 (TIO를 통한 3D 목록의 그리드 표현으로 표시).

속도 : 거북이.



1

하스켈, 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
다음은 몇 가지 팁입니다. 이진 함수 대신 연산자를 정의하면 비용이 저렴하고 가드를 재정렬하고 패턴 일치를 통해 비용을 절약 하고 대신 (==)사용 하고 사용하지 않을 수 있습니다 . 또한 단축 할 수 있습니다. 이것으로 72 바이트를 절약 할 수 있습니다 : 온라인으로 사용해보십시오! 1>0Truewheren'
ბიმო

Btw. Haskell 팁 섹션을 확인하십시오 (없는 경우).
ბიმო

가드 상황을 다시 한 번 보았습니다. 13 바이트가 더 줄었습니다. 온라인으로보십시오!
ბიმო

@ OMᗺ, 감사합니다. 나는 haskell을 처음 사용하기 때문에 이것은 나를 마술처럼 보여줍니다
Евгений Новиков

걱정 마세요 :) 궁금한 점이 있으시면 Of Monads and Men 으로 문의하십시오 .
ბიმო
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.