Tạo chuỗi Rummy


18

Nhiệm vụ của bạn là lấy một nyếu tố đầu vào và đầu ra ncủa Rummy Sequence, một chuỗi mà tôi đã thực hiện (tìm kiếm trên OEIS sẽ không giúp bạn).

Định nghĩa

Mỗi yếu tố của Rummy Sequence là một tập hợp các giá trị trung thực hoặc falsey. Ex .: [true, false].

Các bước để tạo thành viên của Rummy Sequence khá đơn giản:

  1. Bắt đầu với chỉ mục đầu tiên, [](đây là phần tử 0).
  2. Đặt falsey ngoài cùng bên trái để trung thực. Nếu không có sai để thay đổi, thì hãy tăng độ dài của danh sách lên 1 và đặt tất cả các thành viên của danh sách mới thành falsey.
  3. Lặp lại bước 2 cho đến khi đạt được yếu tố n.

Thí dụ

Hãy xác định chức năng của chúng tôi là rummy(int n)(nội dung {}là một bước cần thực hiện để có câu trả lời):

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

Quy tắc

  • Tiêu chuẩn áp dụng.
  • Phải làm việc cho đầu vào 0 thông qua giới hạn số trên của ngôn ngữ của bạn.
  • Bạn có thể xuất ra theo bất kỳ cách nào bạn thấy phù hợp, với điều kiện rõ ràng rằng đầu ra là một tập hợp các sự thật / sai.

Câu đố

Tôi gọi đây là "Rummy Sequence" bởi vì, bắt đầu từ chỉ số 2, nó xác định các bộ bạn sẽ cần nằm trong mỗi vòng của Rummy lũy tiến , trong đó falsey là một cuốn sách và sự thật là một cuộc chạy.

Các trường hợp thử nghiệm

>>> 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]

Điều này giống như đếm nhị phân ngược lại
ThreeFx

@ThreeFx Ngoại trừ điều đó, khi thêm 1vào 11, bạn nhận được 000thay vì 100. ; P
Addison Crump

1
Câu trả lời của chúng tôi có thể được lập chỉ mục một không?
Hạ cấp

Tôi nghĩ bạn nên bao gồm một vài trường hợp thử nghiệm nữa, ngay cả khi các kết quả đầu ra được đề cập ngầm trong ví dụ. Bản sửa đổi đầu tiên của tôi đã bị hỏng với trường hợp góc 1 ...
Dennis

@VTCAKAVSMoACE Điều đó sẽ làm cho nó trở thành nhị phân giả định (mà chúng tôi cũng có một thách thức), nhưng có nhiều sự khác biệt hơn ở chỗ mọi số luôn luôn có dạng 1*0*.
Martin Ender

Câu trả lời:


10

JavaScript ES6, 94 92 72 70 66 64 byte

Đã lưu 6 byte nhờ Neil!

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

Tôi không nghĩ rằng điều này có thể được chơi golf nhiều hơn. Ít nhất là với các phương trình.

Giải trình

Chúng là hai phương trình chính ( nlà đầu vào):

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

Điều này sẽ cho tổng kích thước mà mảng đầu ra sẽ cần phải có. Trong chương trình của tôi, tôi đã sử dụng >>1thay vì (...)/2các bit này giống như bit đầu tiên trong nhị phân có giá trị là 2. Chuyển đổi nó sẽ dẫn đếnfloor(.../2)


n-a*(a+1)/2

Đây là số lượng trues sẽ có. alà kết quả của biểu thức trước.


Đây là những gì cú pháp làm:

[...Array(n)]

Mã này tạo ra một mảng với phạm vi [0, n)trong câu trả lời nnày là phương trình đầu tiên.


.map((_,l)=>l<n)Điều này sẽ lặp qua phạm vi trên, llà biến chứa mục hiện tại trong phạm vi. Nếu tài liệu là ít hơn số tiền trues họ (xác định bởi phương trình thứ hai), sau đó nó sẽ trở lại true, nếu không false.


2
Sử dụng >>1thay vì /2|0. Sử dụng (_,l)=>thay vì .keys().
Neil

@ Xin cảm ơn! Điều đó đã tiết kiệm được một chút. Đến điểm cuối cùng của bạn, bạn có nghĩa là sử dụng Array.from()?, Điền, hoặc cái gì khác?
Hạ cấp

1
Không, tôi đã nghĩ về [...Array(a)].map((_,l)=>)điều mà tôi tin là ngắn hơn một chút, nhưng rất tốt trong việc loại bỏ một số ()s khi chuyển sang >>1, tôi đã không phát hiện ra điều đó!
Neil

Ồ, cũng có a*-~a/2; Tôi không biết tại sao tôi không nghĩ về nó trước đây.
Neil

6

Python, 51 byte

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

Xuất ra danh sách 1 và 0.


5

Bình thường, 8 byte

_@{y/RQy

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Điều này là chậm theo cấp số nhân.

Giải trình:

_@{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

Thạch , 13 11 byte

Ḷṗ2SÞ⁸ị1,0x

Mã không hoạt động trong phiên bản mới nhất của Jelly trước khi thử thách được đăng, nhưng nó đã hoạt động trong phiên bản này , trước thử thách.

Các chỉ số dựa trên 1. Hãy thử trực tuyến! (mất vài giây) hoặc xác minh nhiều đầu vào cùng một lúc .

Làm thế nào nó hoạt động

Ḷṗ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 byte

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;}

đã tạo kiểu boolean của riêng tôi, cho phép tôi tiết kiệm 7byte


Việc sử dụng enum là thông minh. +1
Addison Crump

2

Python 2, 69 63 byte

a=b=0
exec'a,b=[a-1,b+1,0][a<1:][:2];'*input()
print[1]*b+[0]*a

Kiểm tra nó trên Ideone .


2

Python 2, 61 byte

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

Giải quyết cho n = j · (j + 1) / 2 . Đầu vào được lấy từ stdin.

Sử dụng mẫu

$ 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]

Bản demo .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.