Генерация рамми последовательности


18

Ваша задача - взять nэлемент ввода и вывода nпоследовательности Рамми, последовательность, которую я сделал (просмотр OEIS вам не поможет).

Определение

Каждый элемент последовательности Рамми представляет собой набор истинных или ложных значений. Напр .: [true, false].

Шаги по созданию члена последовательности Рамми довольно просты:

  1. Начните с первого индекса [](это элемент 0).
  2. Установите самую левую ложь на правду. Если нет ложных значений, которые нужно изменить, увеличьте длину списка на 1 и установите для всех членов нового списка значение false.
  3. Повторите шаг 2 до достижения элемента n.

пример

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

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

правила

  • Применяются стандартные лазейки.
  • Должен работать для входов 0 через верхнюю числовую границу вашего языка.
  • Вы можете выводить любым способом, который считаете нужным, при условии, что ясно, что вывод представляет собой набор truey / falseys.

пустяки

Я называю это «Рамми Рамми», потому что, начиная с индекса 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
Эддисон Крамп

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().
Нил

@ Нейл спасибо! Это спасло совсем немного. По вашему последнему пункту, вы хотите использовать Array.from()? Заполнить или что-то еще?
Downgoat

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

О, там тоже есть a*-~a/2; Я не знаю, почему я не думал об этом раньше.
Нил

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

создал свой логический тип, который позволил мне сэкономить 7 байт


Это использование enum является умным. +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 . Ввод взят из стандартного ввода.

Образец использования

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