โรงแรมไบนารีของ Hilbert


18

ในการท้าทายนี้คุณจะถูกขอให้ใช้งานฟังก์ชั่นใด ๆ (หรือโปรแกรมเต็มรูปแบบ) ที่ตอบสนองสองคุณสมบัติ คุณสมบัติเหล่านั้นคือ:

  • ฟังก์ชั่นของคุณจะต้องเป็นฟังก์ชั่นการฉีด (ย้อนกลับ) จากชื่อพหุนามที่มีค่าสัมประสิทธิ์จำนวนเต็มไม่เป็นลบถึงจำนวนเต็มไม่เป็นลบ ซึ่งหมายความว่าไม่มีอินพุตที่ไม่เท่ากันสองตัวที่สามารถแมปกับเอาต์พุตที่เท่ากัน

  • ฟังก์ชั่นของคุณจะต้องรักษาจำนวน "บนบิต" ทั้งหมดจากอินพุตไปยังเอาต์พุต นี่หมายความว่าถ้าคุณนับ 1 บิตของสัมประสิทธิ์ของพหุนามแต่ละผลรวมของพวกเขาควรจะเท่ากับจำนวน 1 บิตในการแทนเลขฐานสองของเอาต์พุต ตัวอย่างเช่น9อยู่1001ในไบนารีดังนั้นจึงมี 2 1บิต


IO

พหุนามจำนวนเต็มที่ไม่เป็นลบจะเหมือนกับรายการอนันต์ของจำนวนเต็มที่ไม่เป็นลบเช่นนั้นหลังจากจุดใดจุดหนึ่งจำนวนเต็มทั้งหมดจะเป็นศูนย์ ดังนั้นชื่อพหุนามอาจถูกแทนด้วยรายการอนันต์ (แม้ว่าอาจไม่เป็นที่พึงปรารถนา) หรือโดยรายการ จำกัด ด้วยค่าศูนย์โดยนัยหลังจากสิ้นสุดรายการ

ความแตกต่างที่สำคัญระหว่างชื่อพหุนามกับรายการ จำกัด คือการเพิ่มศูนย์ไปยังจุดสิ้นสุดของรายการจะเปลี่ยนรายการ:

รายการ

ในขณะที่การเพิ่มศูนย์ถึงจุดสิ้นสุดของพหุนามจะไม่เปลี่ยนค่าของมัน:

พหุนาม

ดังนั้นหากฟังก์ชั่นของคุณรับรายการ จำกัด ซึ่งแทนพหุนามเป็นอินพุตการเพิ่มศูนย์จะต้องไม่เปลี่ยนผลลัพธ์

เมื่อแสดงชื่อพหุนามเป็นรายการคุณอาจเป็นตัวแทนพวกนั้นด้วยรายการแรกหรือรายการสุดท้ายที่แทนคำคงที่ ตัวอย่างเช่นคุณอาจมีความเป็นไปได้อย่างใดอย่างหนึ่งต่อไปนี้:

ไปข้างหน้าหรือข้างหลัง

ในกรณีแรกการเพิ่มค่าศูนย์ที่ส่วนท้ายของรายการไม่ควรเปลี่ยนผลลัพธ์ ในกรณีที่สองให้เพิ่มศูนย์ลงในด้านหน้าของรายการไม่ควรเปลี่ยนผลลัพธ์

แน่นอนว่าถ้าภาษาของคุณรองรับพหุนามคุณอาจใช้เป็นอินพุต

เอาต์พุตควรเป็นเอาต์พุตจำนวนเต็มที่ไม่เป็นลบผ่านวิธีมาตรฐานใด ๆ


นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์น้อยกว่าจะดีกว่า


เป็น[]หรือ[0]การป้อนข้อมูลที่ถูกต้อง?
JungHwan Min

1
@JungHwanMin ใช่พวกเขาทั้งสองเป็นพหุนามศูนย์
ข้าวสาลีตัวช่วยสร้าง

ฉันรู้ว่าคุณหมายถึงการใส่ 1 เพื่อแยกศูนย์ แต่วิธีการบางอย่างอาจทำงานได้และดูเหมือนจะไม่ดี ...
l4m2

1
@ l4m2 ฉันขอโทษ แต่ฉันไม่เข้าใจความเห็นของคุณ เท่าที่คำถามของคุณเป็นศูนย์นำไปสู่อะไร พหุนาม, ค่าสัมประสิทธิ์? ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย "เลขศูนย์ไม่ได้เขียน" อย่างใดอย่างหนึ่ง
ข้าวสาลีตัวช่วยสร้าง

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 (Mathematica) , 36 20 ไบต์

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

ลองออนไลน์!

รับค่าพหุนาม f (x) เป็นอินพุต หาค่า y * f (y) โดยที่ y = 2 ^ (f (2)!) น่าเสียดายที่นี่หมายความว่าเอาต์พุตมีขนาดใหญ่มาก

การประเมิน y * f (y) จะรักษาจำนวน 1 บิตเมื่อใดก็ตามที่ y คือพลังของ 2 ที่มากกว่าสัมประสิทธิ์ใด ๆ ซึ่งเป็นจริงสำหรับค่าที่เลือกไว้ข้างต้น เราเลือก y = 2 ^ (f (2)!) เพื่อให้ผลลัพธ์การฉีด:

  • อินพุตที่ต่างกันสองค่าที่มีค่า y เท่ากันจะให้เอาต์พุตที่ต่างกันเพราะเราอ่านตัวเลขที่ต่างกันสองตัวในฐาน y
  • ถ้าเราแก้ไข k = f (2) ดังนั้น y, ค่าที่น้อยที่สุดของ y * f (y) จะเกิดขึ้นเมื่ออินพุทเป็นพหุนามคงที่เท่ากับ k และค่าที่มากที่สุดนั้นทำได้เมื่ออินพุทคือพหุนามให้ฐาน -2 การขยายตัวของ k ในกรณีแรก y * f (y) = 2 ^ (k!) * k และในกรณีที่สอง y * f (y) <2 ^ (k! * ceil (lg k)) ซึ่งน้อยกว่า มากกว่า 2 ^ ((k + 1)!) * (k + 1)
  • ดังนั้นสำหรับสองชื่อพหุนาม f และ g กับ f (2) <g (2) จำนวนเต็มที่เราได้รับจาก f จะน้อยกว่าจำนวนเต็มที่เราได้รับจาก g

5

ภาษา Wolfram (Mathematica) , 61 ไบต์

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

ลองออนไลน์!

เลขจำนวนเต็มบวกสองตัวสามารถจับคู่กับจำนวนเต็มบวกเดียวได้ อนุญาตa, bเป็นจำนวนเต็มบวกสองตัว จากนั้นa, b -> (2a - 1) 2^(b-1)คือ bijection จาก NxN ถึง N

ฟังก์ชั่นนี้จะค้นหาตำแหน่งของ1บิตทั้งหมดในอินพุต (จากตำแหน่ง 1s) และใช้ตัวแปรชุดเฉพาะของแผนที่ด้านบนกับแต่ละตำแหน่ง จากนั้นตัวเลขผลลัพธ์แต่ละรายการจะถูกยกกำลังสองและตัวเลขทั้งหมดจะถูกรวมเข้าด้วยกัน (ซึ่งก็โอเคเนื่องจากเราใช้แผนที่ 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

Python 2 , 118 117 114 103 100 ไบต์

100 ไบต์โดย Jonathan Frech:

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)

ลองออนไลน์!

-15 ไบต์ขอบคุณ Jonathan Frech

มันสร้างตัวเลขที่แรกประกอบด้วย "on bits" และจากนั้นการเป็นตัวแทน unary ของอาร์เรย์ตีความว่าเป็นจำนวน trinary

จำนวน trinary จะถูกสร้างขึ้นโดยการแปลงตัวเลขเป็นสตริงไบนารี ( 0bNNN) แล้วแทนที่ด้วยb2

1ฉันสามารถบันทึกได้ 14 ไบต์โดยแปลงเป็นเลขฐาน -12 แทน แต่ TIO มีหน่วยความจำไม่เพียงพอดังนั้นฉันจึงตัดสินใจใช้สิ่งนี้


@JonathanFrech ขอบคุณมาก :)
fergusq

1

05AB1E , 14 ไบต์

gÅpImPoIbS{2β*

ลองออนไลน์!

ให้ผลลัพธ์เช่นเดียวกับโซลูชัน Jelly ของ Dennis แต่เทคนิคนั้นแตกต่างกันเล็กน้อย

อย่างไร?

ลองป้อนข้อมูล [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

JavaScript 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.