Створіть послідовність рум


18

Ваше завдання - взяти вхідний nі вихідний елемент nпослідовності Rummy, послідовність, яку я створив (дивлячись на OEIS, вам не допоможе).

Визначення

Кожен елемент послідовності «Руммі» - це сукупність значень правди чи фальси. Напр [true, false].:

Крок до створення учасника послідовності «Руммі» досить простий:

  1. Почніть з першого індексу, [](це елемент 0).
  2. Встановіть крайній лівий фальс на трибуну. Якщо немає помилок, які потрібно змінити, то збільште довжину списку на 1 і встановіть усіх учасників нового списку на фальси.
  3. Повторіть крок 2 до досягнення елемента n.

Приклад

Давайте визначимо нашу функцію як rummy(int n)(деталь {}- це крок, щоб дійти до відповіді):

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

Правила

  • Застосовуються стандартні лазівки.
  • Потрібно працювати для введення 0 через верхню числову межу вашої мови.
  • Ви можете виводити будь-яким способом, який вважаєте за потрібне, за умови, що зрозуміло, що результат є сукупністю правди / помилок.

Дрібниці

Я називаю це "послідовністю" Руммі ", тому що, починаючи з індексу 2, він визначає набори, які вам потрібно було б скласти в кожному раунді" Прогресивної румі ", де фальси - це книга, а триут - це біг.

Випробування

>>> 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
Чи може наша відповідь бути одноіндексованою?
Пуховик

Я думаю, ви повинні включити ще кілька тестових випадків, навіть якщо результати неявно згадуються у прикладі. Моя перша ревізія зламалася з кутовим випадком 1 ...
Денніс

@VTCAKAVSMoACE Це зробило б це бієктивне бінарне (для чого ми також маємо виклик), але є більше відмінностей у тому, що кожне число завжди має форму 1*0*.
Мартін Ендер

Відповіді:


10

JavaScript ES6, 94 92 72 70 66 64 байт

Збережено 6 байт завдяки Нілу!

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

Це сума trues, яка буде. aє результатом попереднього виразу.


Ось що робить синтаксис:

[...Array(n)]

Цей код генерує масив з діапазоном [0, n)у цій відповіді n- це перше рівняння.


.map((_,l)=>l<n)це буде проходити цикл через вищезазначений діапазон, lце змінна, що містить поточний елемент у діапазоні. Якщо предмет менший від кількості прав (вони визначаються другим рівнянням), він повернеться true, інакше false.


2
Використовуйте >>1замість /2|0. Використовуйте (_,l)=>замість .keys().
Ніл

@Neil дякую! Це врятувало зовсім небагато. Під своїм останнім пунктом ви маєте на увазі використовувати Array.from()?, Заповнити чи щось інше?
Пуховик

1
Ні, я думав, [...Array(a)].map((_,l)=>)що, на мою думку, трохи коротший, але гарний улов на видалення частини ()s при переході до цього >>1я не помітив!
Ніл

О, є також a*-~a/2; Я не знаю, чому я не думав про це раніше.
Ніл

6

Пітон, 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;}

створив власний булівський тип, який дозволив мені зберегти 7 байт


Та використання енту є розумним. +1
Аддісон Кримп


2

Python 2, 61 байт

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

Розв’язується для n = j · (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]

Demo .


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.