สร้างลำดับเลขจำนวนเต็มสากล


22

คำนิยาม

ลองเรียกลำดับเลขจำนวนเต็ม (อนันต์) ที่เป็นสากลถ้ามันมีลำดับเลขจำนวนเต็มทุกอันเป็นลำดับที่ต่อเนื่องกัน

ในคำอื่น ๆ ลำดับจำนวนเต็ม(ก1เป็น2 , ... )เป็นสากลและถ้าหากในแต่ละลำดับจำนวนเต็ม จำกัด(ข1 , ... , ขn )มีการชดเชยkดังกล่าวว่า(กk + 1 ... เป็นk + n ) = (ข1 , ... , ขn )

ยกตัวอย่างเช่นลำดับของจำนวนเฉพาะที่เป็นค่าบวกนั้นไม่ได้อยู่ในกลุ่มเดียวกันด้วยเหตุผลดังต่อไปนี้

  • ไม่มีจำนวนเต็มลบ1หรือตัวเลขประกอบใด ๆ

  • แม้ว่ามันจะมี3ก็ไม่ได้มี subsequence ที่ต่อเนื่องกัน(3, 3, 3)

  • แม้ว่ามันจะมี2และ5ก็ไม่ได้มี subsequence ที่ต่อเนื่องกัน(2, 5)

  • แม้ว่ามันจะมีต่อเนื่องกัน subsequence (7, 11, 13)ก็ไม่ได้มี subsequence ที่ต่อเนื่องกัน(13, 11, 7)

งาน

เลือกลำดับเลขจำนวนเต็มสากลใด ๆ( 1 , 2 , ... )และนำไปใช้ในภาษาโปรแกรมที่คุณเลือกโดยปฏิบัติตามกฎต่อไปนี้

  • คุณสามารถส่งโปรแกรมเต็มหรือฟังก์ชั่น

  • คุณมีสามตัวเลือกสำหรับ I / O:

    1. ไม่รับอินพุตและพิมพ์หรือส่งคืนลำดับทั้งหมด

    2. ใช้ดัชนีnเป็น input และพิมพ์หรือกลับn

    3. ใช้ดัชนีnเป็น input และพิมพ์หรือผลตอบแทน(ก1 , ... เป็นn )

  • สำหรับตัวเลือก I / O 2และ3คุณอาจใช้การจัดทำดัชนีแบบ0หากคุณต้องการ

  • การส่งของคุณจะต้องกำหนดไว้ล่วงหน้า: หากทำงานหลายครั้งด้วยอินพุตเดียวกันจะต้องสร้างเอาต์พุตเดียวกัน

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

ใช้กฎมาตรฐานของอาจรหัสที่สั้นที่สุดในไบต์ชนะ!


หลักฐานของคุณอาจไม่ขึ้นอยู่กับการคาดเดาที่ไม่ได้รับการพิสูจน์ ฉันคิดว่ามันส่อให้เห็น: p
Erik the Outgolfer

และวิธีที่คุณจะบันทึกรายการตัวเลขในจำนวน?
RosLuP

คำตอบ:


13

Husk , 5 ไบต์

สิ่งนี้พิมพ์รายการที่ไม่มีที่สิ้นสุด

ΣṖ…ݱ

ลองออนไลน์! หรือพบว่าดัชนีแรกของลำดับของคุณ (ใช้หน่วยความจำมากสำหรับลำดับส่วนใหญ่)

คำอธิบาย:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

ในแกลบทำหน้าที่อย่างดีสำหรับรายการที่ไม่มีที่สิ้นสุด คุณสามารถดูพฤติกรรมของมันได้ที่นี่


คุณอาจต้องการรายละเอียดเกี่ยวกับวิธีการQทำงาน (ฉันคิดว่าฉันได้รับมา แต่ฉันไม่แน่ใจ)
Dennis

@Dennis ปรากฎว่าฉันต้องการไม่ใช่Q
H.PWiz

9

Python 2 , 49 46 43 ไบต์

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)ผลตอบแทนที่ได้nเท่านั้น ใช้ตัวเลขที่เล็กที่สุดของในฐานเพื่อแยกหนึ่งในตัวเลขที่สูงกว่าnd

ลองออนไลน์! สคริปต์นี้ (ความเอื้อเฟื้อโดยเดนนิส) ใช้ลำดับที่แน่นอนและให้nลำดับที่เริ่มต้น

คำอธิบาย

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

ตัวอย่างเช่นสำหรับnในช่วง3141592650การ3141592659, d=10และหลักสุดท้ายของnเลือกหนึ่งในตัวเลขอื่น ๆ จากนั้นเราเพิ่ม-d/2เพื่อรับค่าลบ

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

ทางเลือกแบบสแตนด์อโลน 43 ไบต์เช่นกัน:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

คุณสามารถใช้แทนlen(`n`) len(str(n))
เดนนิส

ขอบคุณ @Dennis ฉันสามารถเพิ่มคำอธิบายเพิ่มเติมได้ถ้าใครต้องการมัน
japh

ฉันเขียนฟังก์ชั่นที่ให้ลำดับ จำกัด พบการชดเชยในลำดับของคุณ ลองออนไลน์!
Dennis

นี่มันเจ๋งมาก
ประวัติศาสตร์ 24

ดี มีเพียงสิ่งเดียวเท่านั้นที่มันจะพังทลายจากn=2**63-1การเป็นตัวแทนได้รับการLต่อท้าย ( str(n)จะอยู่ที่สามไบต์ถ้าจำเป็น)
Jonathan Allan

5

Brachylog 2, 11 ไบต์

≜~×-₂ᵐ~ȧᵐ≜∋

ลองออนไลน์!

ฉันลองอัลกอริทึมโดยใช้พาร์ทิชันเสริมในรายการ แต่ก็ไม่ได้สั้นกว่านี้ นี่คือเครื่องกำเนิดไฟฟ้าที่สร้างกระแสจำนวนเต็มเป็นจำนวนอนันต์ ลิงก์ TIO มีส่วนหัวเพื่อพิมพ์หนึ่งหมื่นรายการแรก

คำอธิบาย

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

จากนั้นสร้างตัวประกอบที่เป็นไปได้ทั้งหมดของจำนวนเต็มปฏิบัติตามคำสั่งที่แตกต่างกันและใช้เฉพาะค่าตั้งแต่ 2 ขึ้นไป (ดังนั้นจึงมีจำนวน จำกัด เท่านั้น) โปรดทราบว่าอนุญาตให้ใช้หมายเลขประกอบได้ในการแยกตัวประกอบไม่ใช่เฉพาะช่วงเวลาเท่านั้น ซึ่งหมายความว่าลำดับที่เป็นไปได้ทั้งหมดของจำนวนเต็ม≥ 2 จะถูกสร้างโดยขั้นตอนนี้ในบางจุดในการดำเนินการของฟังก์ชั่น (เช่นลำดับที่จำเป็นต้องมีผลิตภัณฑ์บางอย่างและผลิตภัณฑ์นั้นจะถูกสร้างขึ้นในบางจุดโดยเริ่มต้น)

จากนั้นเราจำเป็นต้องแมปชุดของลำดับเหล่านั้นไปยังชุดของลำดับเลขจำนวนเต็มทั้งหมดซึ่งจะทำในสองขั้นตอน: ลบ 2 ( -₂) จากแต่ละองค์ประกอบ ( ) ให้เรากำหนดลำดับของจำนวนเต็มไม่ใช่เชิงลบทั้งหมดแล้วการบวกหรือลบ ( คือ "ค่าที่มีค่าสัมบูรณ์") แต่ละองค์ประกอบ () เห็นได้ชัดว่าขั้นตอนหลังเป็น nondeterministic ดังนั้น Brachylog จึงถือเป็นเครื่องกำเนิดไฟฟ้าสร้างรายการที่เป็นไปได้ทั้งหมดที่มีองค์ประกอบเป็นบวกหรือลบองค์ประกอบที่สอดคล้องกันของรายการอินพุต ซึ่งหมายความว่าตอนนี้เรามีเครื่องกำเนิดไฟฟ้าสำหรับลำดับเลขจำนวนเต็มที่เป็นไปได้ทั้งหมดและมันสร้างตามลำดับที่หมายถึงพวกมันทั้งหมดถูกสร้างขึ้น (โดยเฉพาะลำดับที่คุณได้รับถ้าคุณใช้ค่าสัมบูรณ์ของแต่ละองค์ประกอบบวก 2 องค์ประกอบแล้วสั่งซื้อโดยผลิตภัณฑ์ขององค์ประกอบที่เกิดขึ้น)

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

ผลลัพธ์สุดท้าย: แต่ละลำดับเลขจำนวนเต็มที่เป็นไปได้จะถูกสร้างขึ้นและส่งออกทีละองค์ประกอบและต่อกันทั้งหมดเข้าด้วยกันเป็นลำดับสากลเดียว


ais523 …นั่นคือคุณ!
ลดขนาด

หากไม่ใช่พวกเขามันเป็นเรื่องบังเอิญเมื่อพิจารณาโพสต์จากบัญชีที่ถูกลบจะแสดงหมายเลขบัญชีเดียวกัน
เต็มเปามนุษย์


4

Python 2 , 100 99 ไบต์

  • บันทึกหนึ่งไบต์ต้องขอบคุณovs ; วนซ้ำในitertoolsตัวเพื่อวนซ้ำแบบไม่มีกำหนด
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

ลองออนไลน์!

ไปเรื่อย ๆ พิมพ์พีชคณิตทั้งหมดของn-times ซ้ำช่วงจำนวนเต็มสำหรับจำนวนเต็มไม่เป็นลบทั้งหมด[-n; n) คุณสามารถค้นหาออฟเซ็ตแรกสำหรับการเรียงลำดับใด ๆ โดยใช้เวอร์ชันที่แก้ไขนี้n
k


while~0:. Heh heh ...
Chas Brown

99 bytesใช้itertools.count
ovs

@ovs ขอบคุณ; ไม่ทราบว่าในตัว
Jonathan Frech

2

Perl 6 , 91 ไบต์

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

ลองออนไลน์!

วิธีนี้ใช้วิธีการที่คล้ายกับคำตอบอื่น ๆ มันใช้ผลิตภัณฑ์คาร์ทีเซียนในการพิมพ์องค์ประกอบของ(-1,0,1)จากนั้นทุกคู่สั่งขององค์ประกอบ(-2,-1,0,1,2)จากนั้นทั้งหมดสั่งซื้อสามองค์ประกอบใน(-3,-2,-1,0,1,2,3)ฯลฯ

ฉันใหม่กับ Perl ดังนั้นอาจมีการตีกอล์ฟที่มากขึ้น

รุ่นที่อ่านเพิ่มเติมได้:

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.