สร้าง Rummy Sequence


18

งานของคุณคือการรับอินพุตnและเอาท์พุตnของ Rummy Sequence ซึ่งเป็นลำดับที่ฉันทำ (การดู OEIS จะไม่ช่วยคุณ)

คำนิยาม

องค์ประกอบของลำดับรัมมี่แต่ละชุดของค่าความจริงหรือเท็จ อดีต[true, false].:

ขั้นตอนในการสร้างสมาชิกของลำดับรัมมี่นั้นค่อนข้างง่าย:

  1. เริ่มด้วยดัชนีแรก[](นี่คือองค์ประกอบ 0)
  2. ตั้งค่าความเท็จสุดซ้ายเป็นความจริง หากไม่มีการปลอมแปลงให้เปลี่ยนเพิ่มความยาวของรายการเป็น 1 และตั้งค่าสมาชิกทั้งหมดของรายการใหม่เป็นเท็จ
  3. ทำซ้ำขั้นตอนที่ 2 nจนกระทั่งถึงองค์ประกอบ

ตัวอย่าง

เรามากำหนดฟังก์ชั่นของเราเป็นrummy(int n)(สิ่งที่อยู่ใน{}ขั้นตอนเพื่อให้ได้คำตอบ):

>>> rummy(5)
{[]}
{[false]}
{[true]}
{[false, false]}
{[true, false]}
[true, true]

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • ต้องใช้งานได้กับอินพุต 0 ผ่านขอบเขตตัวเลขด้านบนของภาษาของคุณ
  • คุณอาจส่งออกในทางที่คุณเห็นว่าเหมาะสมใด ๆ โดยมีเงื่อนไขว่าเป็นที่ชัดเจนว่าการส่งออกเป็นชุดของความจริง / falseys

เรื่องไม่สำคัญ

ฉันเรียกสิ่งนี้ว่า "ลำดับรัมมี่" เพราะเริ่มที่ดัชนี 2 มันจะกำหนดชุดที่คุณจะต้องวางลงในแต่ละรอบของProgressive Rummyที่ซึ่งความเท็จเป็นหนังสือและความจริงก็คือการวิ่ง

กรณีทดสอบ

>>> rummy(0)
[]

>>> rummy(1)
[false]

>>> rummy(6)
[false, false, false]

>>> rummy(20)
[true, true, true, true, true]

>>> rummy(1000)
[true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

นี่มันเหมือนกับการนับเลขฐานสองในทางตรงกันข้าม
ThreeFx

@ThreeFx ยกเว้นว่าเมื่อมีการเพิ่ม1เพื่อ11คุณจะได้รับแทน000 100; P
Addison Crump

1
คำตอบของเราสามารถเป็นหนึ่งดัชนี?
Downgoat

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

@VTCAKAVSMoACE นั่นจะทำให้เป็นไบนาติคไบนารี่ (ซึ่งเรามีความท้าทายด้วย) แต่ก็มีความแตกต่างกันมากขึ้นในการที่ทุก ๆ หมายเลขนั้นจะอยู่ในรูปแบบ1*0*เสมอ
Martin Ender

คำตอบ:


10

JavaScript ES6, 94 92 72 70 66 64 ไบต์

บันทึก 6 ไบต์ขอบคุณ Neil!

n=>[...Array(a=Math.sqrt(8*n+1)-1>>1)].map((_,l)=>l<n-a*(a+1)/2)

ฉันไม่คิดว่าสิ่งนี้จะสามารถเล่นกอล์ฟได้มากกว่านี้ อย่างน้อยด้วยสมการ

คำอธิบาย

มันเป็นสองสมการหลัก ( nคืออินพุต):

(Math.sqrt(8*n+1)-1)/2

นี่จะให้ขนาดทั้งหมดที่อาร์เรย์เอาต์พุตจะต้องมี ในโปรแกรมของฉันฉันใช้>>1แทน(...)/2สิ่งเหล่านี้เหมือนกับบิตแรกในไบนารีที่มีค่าเป็น 2 การเลื่อนมันจะทำให้เกิดfloor(.../2)


n-a*(a+1)/2

นี่คือจำนวนของtrueจะมี aคือผลลัพธ์ของนิพจน์ก่อนหน้า


นี่คือสิ่งที่ไวยากรณ์ทำ:

[...Array(n)]

รหัสนี้สร้างอาร์เรย์ที่มีช่วง[0, n)ในคำตอบนี้nคือสมการแรก


.map((_,l)=>l<n)สิ่งนี้จะวนรอบช่วงข้างต้นlเป็นตัวแปรที่มีรายการปัจจุบันในช่วง หากรายการน้อยกว่ามูลค่า trues ที่พวกเขากำลัง (กำหนดโดยสมการที่สอง) จากนั้นก็จะกลับอื่นtruefalse


2
ใช้แทน>>1 /2|0ใช้แทน(_,l)=> .keys()
Neil

@Neil ขอบคุณ! ที่บันทึกไว้ค่อนข้างน้อย เมื่อถึงจุดสุดท้ายคุณหมายถึงใช้Array.from()เติมหรืออย่างอื่น
Downgoat

1
ไม่ฉันคิดว่า[...Array(a)].map((_,l)=>)ฉันเชื่อว่าสั้นกว่านี้เล็กน้อย แต่ก็ดีที่จะลบบางรายการ()เมื่อเปลี่ยนไป>>1ฉันไม่เห็นเลย!
Neil

โอ้ยังมีa*-~a/2; ฉันไม่รู้ว่าทำไมฉันไม่เคยคิดมาก่อน
Neil

6

Python ขนาด 51 ไบต์

f=lambda n,i=0:n>i and f(n+~i,i+1)or[1]*n+[0]*(i-n)

แสดงรายการของ 1 และ 0


5

Pyth, 8 ไบต์

_@{y/RQy

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

นี่คือการชี้แจงช้า

คำอธิบาย:

_@{y/RQyQQ    implicit Qs at the end, (Q = input)
       yQ     2*Q
    /RQ       divide each number in [0, 1, ..., 2*Q-1] by Q
              this results in a list of Q zeros and Q ones
   y          take all subsets
  {           remove duplicates
 @       Q    take the Qth element
_             print it reversed

5

เยลลี่ , 13 11 ไบต์

Ḷṗ2SÞ⁸ị1,0x

รหัสไม่สามารถใช้งานได้ในเวอร์ชั่นล่าสุดของ Jelly ก่อนที่จะโพสต์ความท้าทาย แต่มันทำงานได้ในเวอร์ชันนี้ซึ่งมาก่อนการท้าทาย

ดัชนีอิง 1 ลองออนไลน์! (ใช้เวลาสองสามวินาที) หรือตรวจสอบหลายอินพุตพร้อมกัน

มันทำงานอย่างไร

Ḷṗ2SÞ⁸ị1,0x  Main link. Argument: n (integer)

Ḷ            Unlength; yield [0, ..., n - 1].
 ṗ2          Take the second Cartesian power, i.e., generate the array of all
             pairs of elements of [0, ..., n - 1].
   SÞ        Sort the pairs by their sum. The sort is stable, so ties are broken
             by lexicographical order.
     ⁸ị      Retrieve the pair at index n.
       1,0x  Map [a, b] to a copies of 1 and b copies of 0.


4

Java, 117 110 ไบต์

enum B{T,F};B[]r(int n){int i=0,c=0,j=0;while(n>=i)i+=++c;B[]a=new B[c-1];for(;j<n-i+c;)a[j++]=B.T;return a;}

สร้างประเภทบูลีนของฉันเองซึ่งอนุญาตให้ฉันบันทึก 7bytes


การใช้ enum นั้นฉลาด +1
Addison Crump


2

Python 2, 61 ไบต์

j=(2*input()+.25)**.5-.5
print[i/j<j%1for i in range(int(j))]

แก้สำหรับn = J · (ญ + 1) / 2 อินพุตถูกนำมาจาก stdin

ตัวอย่างการใช้งาน

$ echo 20 | python rummy-seq.py
[True, True, True, True, True]

$ echo 50 | python rummy-seq.py
[True, True, True, True, True, False, False, False, False]

การสาธิต


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.