힐버트 이진 호텔


18

이 과제에서는 두 가지 속성을 충족하는 모든 기능 (또는 전체 프로그램)을 구현해야합니다. 이러한 속성은 다음과 같습니다.

  • 함수는 음이 아닌 정수 계수를 갖는 다항식에서 음이 아닌 정수까지의 주입 (가역) 함수 여야합니다. 이것은 두 개의 불평등 한 입력이 동일한 출력에 매핑 될 수 없음을 의미합니다.

  • 함수는 입력에서 출력까지 총 "온 비트"수를 유지해야합니다. 즉, 다항식의 각 계수에서 1 비트를 계산할 경우 그 합은 출력의 이진 표현에서 1 비트의 수와 같아야합니다. 예를 들어, 91001이 2 가지도록 이진 1비트.


IO

음이 아닌 정수 다항식은 음수가 아닌 정수의 무한 목록과 동일하므로 특정 지점 이후에 모든 정수가 0이됩니다. 따라서, 다항식은 무한리스트 (이것은 아마도 바람직하지는 않지만) 또는리스트의 종료 후 내재 된 0을 갖는 유한리스트로 표현 될 수 있습니다.

다항식과 유한리스트의 주요 차이점은리스트 끝에 0을 추가하면리스트가 변경된다는 것입니다.

기울기

다항식 끝에 0을 추가해도 값이 변경되지 않습니다.

다항식

따라서 함수가 다항식을 입력으로 나타내는 유한 목록을 입력하는 경우 0을 추가하면 결과가 변경되지 않아야합니다.

다항식을 목록으로 표시 할 때 상수 항을 나타내는 첫 번째 또는 마지막 항목으로 다항식을 나타낼 수 있습니다. 예를 들어 다음 가능성 중 하나를 가질 수 있습니다.

앞으로 또는 뒤로

첫 번째 경우, 목록 끝에 0을 추가하면 결과가 변경되지 않아야합니다. 두 번째 경우 목록 앞에 0을 추가 하면 결과가 변경되지 않습니다.

물론 당신의 언어가 다항식을 지원한다면 그것들을 입력으로 받아 들일 수 있습니다.

출력은 표준 방법을 통한 음이 아닌 정수 출력이어야합니다.


이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.


인가 []또는 [0]유효한 입력?
JungHwan Min

1
@JungHwanMin 네, 둘 다 제로 다항식입니다.
밀 마법사

나는 당신이 0을 분할하려면 1을 넣어 의미 알고 있지만 몇 가지 방법이 작동하지 보일 수 있습니다 좋은 ...
l4m2

1
@ l4m2 죄송하지만 귀하의 의견 중 하나를 이해하지 못합니다. 귀하의 질문이 진행되는 한, 무엇에 대해 0을 선도합니까? 다항식, 계수? "0으로 작성되지 않음"의 의미를 잘 모르겠습니다.
밀 마법사

1
이미지가 정말로 필요합니까 (즉, 리치 텍스트를 사용하여 표현할 수 없음) ??? 이미지를 볼 수없는 사람들은 당신의 도전을 완전히 볼 수 없기 때문입니다.
Mindwin

답변:


6

젤리 , 8 바이트

BFṢḄæ«ÆẸ

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

왼쪽 역, 5 바이트

Bċ0ÆE

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

작동 원리

BFṢḄæ«ÆẸ  Main link. Argument: A (array)

B         Binary; convert each integer in A to base 2.
 F        Flatten; concatenate the resulting binary arrays.
  Ṣ       Sort the resulting bit array.
   Ḅ      Convert from base 2 to integer, yielding an integer x with as much set
          bits as there are set bits in A.
      ÆẸ  Unexponents; convert A = [a1, a2, ...] to y = (p1**a1 + p2**a2 + ...),
          where pn is the n-th prime number.
          By the fundamental theorem of arithmetic, the resulting integer is unique
          for each array A without trailing zeroes.
    æ«    Bitshift left; compute x * 2**y.

6

Wolfram Language (Mathematica) , 36 20 바이트

x#/.x->2^(#/.x->2)!&

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

다항식 f (x)를 입력으로 사용합니다. y * f (y)를 평가합니다. 여기서 y = 2 ^ (f (2)!)입니다. 유감스럽게도, 이것은 출력이 꽤 커짐을 의미합니다.

y * f (y)를 평가하면 y가 어떤 계수보다 2의 거듭 제곱 일 때마다 1 비트 수를 유지하므로 위에서 선택한 값에 해당됩니다. 결과를 주입하기 위해 y = 2 ^ (f (2)!)를 선택합니다.

  • 동일한 y 값을 가진 두 개의 다른 입력은 기본 y에서 두 개의 다른 숫자를 읽으므로 다른 출력을 제공합니다.
  • k = f (2)를 고정하여 y를 고정하면 입력이 k와 같은 상수 다항식 일 때 y * f (y)의 가장 작은 값이 달성되고 입력이 기본을 제공하는 다항식 일 때 가장 큰 값이 달성됩니다 k의 -2 확장. 첫 번째 경우 y * f (y) = 2 ^ (k!) * k이고 두 번째 경우 y * f (y) <2 ^ (k! * ceil (lg k))입니다. 2 ^ ((k + 1)!) * (k + 1)보다 큽니다.
  • 결과적으로 f (2) <g (2)의 두 다항식 f와 g에 대해 f에서 얻는 정수는 g에서 얻는 정수보다 작습니다.

5

Wolfram Language (Mathematica) , 61 바이트

Tr[2^((2#2-1)2^#)&@@@Position[Reverse/@#~IntegerDigits~2,1]]&

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

두 개의 양의 정수는 단일 양의 정수에 매핑 될 수 있습니다. 하자 a, b두 개의 양의 정수합니다. 그런 다음 a, b -> (2a - 1) 2^(b-1)NxN에서 N으로의 bijection입니다.

이 함수는 1입력에서 모든 비트 의 위치를 ​​찾고 (1 위치에서) 위의 맵의 주입 전용 변형을 각 위치에 적용합니다. 그런 다음 각 결과 숫자가 2의 거듭 제곱으로 증가하고 모든 숫자가 합산됩니다 (인젝 티브 NxN-> N 맵을 적용 했으므로 괜찮습니다).

예를 들면 다음과 같습니다.

{1, 2, 3}
{{1}, {1, 0}, {1, 1}}             (* Convert to binary *)
{{1}, {0, 1}, {1, 1}}             (* Reverse each *)
{{1, 1}, {2, 2}, {3, 1}, {3, 2}}  (* Position of 1s *)
{2, 12, 8, 24}                    (* Inject to N *)
{4, 4096, 256, 16777216}          (* Raise to the power of 2 *)
16781572                          (* Add *)

역함수 (124 바이트)

##+#&~Fold~#&@*Reverse/@Normal@SparseArray[{Log2[j=#~BitAnd~-#],(#/j+1)/2}->1&@@@(Reverse[#~IntegerDigits~2]~Position~1-1)]&

다음은 주 입성을 테스트하기위한 역함수입니다.

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


5

파이썬 (2) , 118 (117) 114 103 100 바이트

Jonathan Frech의 100 바이트 :

a=input()
while a[0]<1:a.pop(0)
y="".join("2"+bin(v)[2:]for v in a)
print~-2**y.count("1")<<int(y,3)

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

골프 가능성이있는 103 바이트 1

a=input()
while a[0]<1:a.pop(0)
x="".join(map(bin,a))
print~-(1<<x.count("1"))<<int(x.replace(*"b2"),3)

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

Jonathan Frech 덕분에 -15 바이트

먼저 "온 비트"를 포함하는 숫자를 만든 다음 삼항 숫자로 해석되는 배열의 단항 표현을 만듭니다.

삼진수는 숫자를 이진 문자열 ( 0bNNN) 로 변환 한 다음로 대체 b하여 2만듭니다.

1 대신 12 바이트로 변환하여 14 바이트를 절약 할 수 있었지만 TIO에는 메모리가 부족하여 이것을 사용하기로 결정했습니다.



1

05AB1E , 14 바이트

gÅpImPoIbS{2β*

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

Dennis 'Jelly 솔루션과 동일한 결과를 얻지 만 기술은 약간 다릅니다.

어떻게?

입력을 해보자 [1, 2, 3]:

gÅpImPoIbS{2β* | Full program.
               | STACK: [[1, 2, 3]]
               |
g              | Push the length.
               | STACK: [3]
 Åp            | Generate the first N primes.
               | STACK: [[2, 3, 5]]
   Im          | Push the input, and apply pairwise exponentiation.
               | STACK: [2, 9, 125]
     P         | Push the product.
               | STACK: 2250
      o        | Push 2 ** N.
               | STACK: 2 ** 2250 (way too large)
       Ib      | Push the input and convert to binary.
               | STACK: [2 ** 2250, ['1', '10', '11']].
         S{    | Sort all the characters.
               | STACK: [2 ** 2250, ['0', '1', '1', '1', '1']]
           2β  | Convert from binary.
               | STACK: [2 ** 2250, 15]
             * | Multiplication.
               | STACK: [2 ** 2250 * 15]
               | Implicitly print the top of the stack (2 ** 2250 * 15).


0

자바 스크립트 6, 96 83 바이트

x=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/0|2/g,'')+'0'.repeat(t)

이진 표현식을 출력합니다

([1,2]) => 3*2^21210(Decimal)
([0,1,2]) => 3*2^21210
([1,2,0]) => 3*2^2121020
([1,2,3,4]) => 31*2^212102112100(Threotically)

제로 제로를 나타내는 빈 문자열로 이어질 것
l4m2

replace(/0|2/g,0)작동하지만 디코딩이 더 어려워
l4m2

확실하지 않습니다 x=>(t=x.map(k=>(x[0]+=k)&&2+k.toString(2)).join``).replace(/2/g,'0'.repeat(t)). 괜찮아 보이지만 증명할 수 없음
l4m2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.