Hasilkan Urutan Rummy

18

Tugas Anda adalah mengambil elemen input ndan output ndari Rummy Sequence, urutan yang saya buat (melihat OEIS tidak akan membantu Anda).

Definisi

Setiap elemen dari Rummy Sequence adalah seperangkat nilai-nilai yang benar atau salah. Mis [true, false]. : .

Langkah-langkah untuk menghasilkan anggota Rummy Sequence cukup sederhana:

  1. Mulailah dengan indeks pertama, [](ini elemen 0).
  2. Atur falsey paling kiri ke truey. Jika tidak ada kesalahan yang harus diubah, maka tambah panjang daftar dengan 1 dan atur semua anggota daftar baru ke falsey.
  3. Ulangi langkah 2 hingga mencapai elemen n.

Contoh

Mari kita definisikan fungsi kita sebagai rummy(int n)(hal-hal dalam {}adalah langkah yang diambil untuk mendapatkan jawabannya):

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

Aturan

  • Celah standar berlaku.
  • Harus bekerja untuk input 0 melalui batas numerik bahasa Anda.
  • Anda dapat menampilkan dengan cara apa pun yang Anda inginkan, asalkan jelas bahwa output adalah seperangkat kebenaran / kesalahan.

Hal sepele

Saya menyebutnya "Urutan Rummy" karena, mulai dari indeks 2, ia mendefinisikan set yang Anda butuhkan untuk berbaring di setiap putaran Progressive Rummy , di mana falsey adalah sebuah buku dan kebenaran adalah sebuah lari.

Uji Kasus

>>> 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]
Addison Crump
sumber
Ini seperti menghitung biner secara terbalik
ThreeFx
@ThreeFx Kecuali itu, saat menambahkan 1untuk 11, Anda mendapatkan 000bukan 100. ; P
Addison Crump
1
Bisakah jawaban kami diindeks satu?
Downgoat
Saya pikir Anda harus memasukkan beberapa kasus uji lagi, bahkan jika output secara implisit disebutkan dalam contoh. Revisi pertama saya gagal dengan kasus sudut 1 ...
Dennis
@ VTCAKAVSMoACE Itu akan membuatnya menjadi binary bijektif (yang kami juga memiliki tantangan untuk), tetapi ada lebih banyak perbedaan bahwa setiap angka selalu dalam bentuk 1*0*.
Martin Ender

Jawaban:

10

JavaScript ES6, 94 92 72 70 66 64 byte

Disimpan 6 byte berkat Neil!

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

Saya tidak berpikir ini bisa golf lagi. Setidaknya dengan persamaan.

Penjelasan

Mereka adalah dua persamaan utama ( ninput):

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

Ini akan memberikan ukuran total array output perlu. Dalam program saya saya menggunakan >>1bukannya (...)/2ini sama dengan bit pertama dalam biner memiliki nilai 2. Pergeseran itu akan menghasilkan difloor(.../2)


n-a*(a+1)/2

Ini adalah jumlah yang trueakan ada. aadalah hasil dari ekspresi sebelumnya.


Inilah yang dilakukan oleh sintaks:

[...Array(n)]

Kode ini menghasilkan array dengan kisaran [0, n)dalam jawaban ini nadalah persamaan pertama.


.map((_,l)=>l<n)ini akan berulang melalui rentang di atas, ladalah variabel yang berisi item saat ini dalam kisaran. Jika item kurang dari jumlah trues mereka (ditentukan oleh persamaan kedua), maka itu akan kembali true, yang lain false.

Downgoat
sumber
2
Gunakan >>1sebagai ganti /2|0. Gunakan (_,l)=>sebagai ganti .keys().
Neil
@Nil, terima kasih! Itu menghemat sedikit. Pada poin terakhir Anda, apakah maksud Anda menggunakan Array.from()?, mengisi, atau sesuatu yang lain?
Downgoat
1
Tidak, saya sedang memikirkan [...Array(a)].map((_,l)=>)yang saya percaya sedikit lebih pendek, tapi bagus untuk menghapus beberapa ()ketika beralih ke >>1, saya belum melihat itu!
Neil
Oh, ada juga a*-~a/2; Saya tidak tahu mengapa saya tidak memikirkannya sebelumnya.
Neil
6

Python, 51 byte

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

Output daftar 1 dan 0.

Tidak
sumber
5

Pyth, 8 byte

_@{y/RQy

Cobalah online: Demonstrasi atau Test Suite

Ini lambat secara eksponensial.

Penjelasan:

_@{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
Jakube
sumber
5

Jelly , 13 11 byte

Ḷṗ2SÞ⁸ị1,0x

Kode tidak berfungsi dalam versi terbaru Jelly sebelum tantangan diposting, tetapi berhasil dalam versi ini , yang ada sebelum tantangan.

Indeks berbasis 1. Cobalah online! (perlu beberapa detik) atau verifikasi beberapa input sekaligus .

Bagaimana itu bekerja

Ḷṗ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.
Dennis
sumber
4

05AB1E, 27 byte

8*>t<;ïÐ>*;¹s-ïD1s׊-0s×JSï

Akan melihat apakah saya dapat golf lagi dan menambahkan penjelasan di pagi hari.

Cobalah online

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

menciptakan tipe boolean saya sendiri, yang memungkinkan saya untuk menyimpan 7bytes

pengguna902383
sumber
Penggunaan enum itu cerdas. +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

Uji di Ideone .

Dennis
sumber
2

Python 2, 61 byte

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

Memecahkan untuk n = j · (j + 1) / 2 . Input diambil dari stdin.

Contoh Penggunaan

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

Demo .

primo
sumber