러미 시퀀스 생성


18

당신의 임무는 내가 만든 시퀀스 인 Rummy Sequence 의 입력 n및 출력 요소 를 취하는 n것입니다 (OEIS를 보면 도움이되지 않습니다).

정의

Rummy Sequence의 각 요소는 진실 또는 거짓 값의 집합입니다. 예 : [true, false].

Rummy Sequence 멤버를 생성하는 단계는 매우 간단합니다.

  1. 첫 번째 색인으로 시작하십시오 [](요소 0).
  2. 가장 왼쪽의 거짓을 진실로 설정하십시오. 변경할 거짓이 없으면 목록의 길이를 1 씩 늘리고 새 목록의 모든 구성원을 거짓으로 설정하십시오.
  3. element에 도달 할 때까지 2 단계를 반복하십시오 n.

하자는 우리의 기능 정의 rummy(int n)(에 물건 {}대답에 도착하는데 걸리는 단계입니다) :

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

규칙

  • 표준 허점이 적용됩니다.
  • 언어의 상한을 통해 0을 입력해야합니다.
  • 출력이 진실 / 거짓의 집합이라는 것이 분명하다면, 당신은 당신이 원하는대로 출력 할 수 있습니다.

하찮은 일

인덱스 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얻습니다 . ; P000100
애디슨 크럼프

1
답변을 하나의 색인으로 만들 수 있습니까?
Downgoat

예제에 출력이 암시 적으로 언급되어 있더라도 몇 가지 테스트 사례를 더 포함해야한다고 생각합니다. 첫 번째 수정본이 코너 케이스 1과
Dennis

@VTCAKAVSMoACE 그것은 bijective 바이너리 (우리도 도전해야 할)를 만들지 만, 모든 숫자가 항상 형식이라는 점에서 더 큰 차이점이 있습니다 1*0*.
Martin Ender

답변:


10

자바 스크립트 ES6, 94 92 72 70 66 64 바이트

Neil 덕분에 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

이것이 true있을 금액입니다 . a이전 식의 결과입니다.


구문은 다음과 같습니다.

[...Array(n)]

이 코드 [0, n)는이 답변의 범위 가 있는 배열을 생성합니다 n.


.map((_,l)=>l<n)이것은 위의 범위를 반복하며 범위 l의 현재 항목을 포함하는 변수입니다. 항목이 true의 양보다 적 으면 (두 번째 방정식으로 결정), 그렇지 않으면를 반환 true합니다 false.


2
>>1대신에 사용하십시오 /2|0. (_,l)=>대신에 사용하십시오 .keys().
Neil

@ 닐 감사합니다! 그것은 상당히 절약되었습니다. 마지막으로, Array.from()?, 또는 다른 것을 사용 하시겠습니까?
Downgoat

1
아니요, 나는 [...Array(a)].map((_,l)=>)약간 짧다고 생각했지만으로 ()전환 할 때 s 일부를 제거하는 데 도움이된다고 생각 >>1했습니다.
Neil

아, 또한있다 a*-~a/2; 왜 내가 전에 그것을 생각하지 않았는지 모르겠다.
Neil

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

자바, 117110 바이트

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

파이썬 2, 69 63 바이트

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

Ideone에서 테스트하십시오 .


2

파이썬 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]

데모 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.