Okey Sırasını Oluştur


18

Göreviniz , yaptığım bir dizi olan Rummy Sekansının bir giriş nve çıkış elemanını almaktır n(OEIS'e bakmak size yardımcı olmaz).

Tanım

Okey Sırasının her elemanı bir dizi doğruluk veya falsey değeridir. Ör .: [true, false].

Okey Sırasının bir üyesini üretme adımları oldukça basittir:

  1. İlk indeksle başlayın, [](bu 0 elementidir).
  2. En soldaki sahneyi gerçeğe ayarlayın. Değiştirilecek falsey yoksa, listenin uzunluğunu 1 artırın ve yeni listenin tüm üyelerini falsey olarak ayarlayın.
  3. Elemana ulaşana kadar 2. adımı tekrarlayın n.

Misal

Diyelim olarak işlev tanımlamak rummy(int n)(içinde malzeme {}cevap almak için atılan bir adımdır):

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

kurallar

  • Standart boşluklar geçerlidir.
  • Dilinizin üst sayısal sınırı üzerinden 0 girişleri için çalışmalıdır.
  • Çıktının bir dizi doğruluk / falsey olduğu açık olduğu sürece, uygun gördüğünüz herhangi bir şekilde çıktı alabilirsiniz.

önemsiz şeyler

Buna "Okey Dizisi" diyorum, çünkü indeks 2'den başlayarak, falsey bir kitap ve doğruluk bir koşudur, Progressive Rummy'nin her turunda uzanmanız gereken setleri tanımlar .

Test Durumları

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

Bu tersine ikili sayma gibi
ThreeFx

Eklerken dışında @ThreeFx, 1için 11, almak 000yerine 100. ; P
Addison Crump

1
Cevabımız tek endeksli olabilir mi?
Downgoat

Örnekte çıktılar açıkça belirtilmiş olsa bile birkaç test örneği daha eklemeniz gerektiğini düşünüyorum. İlk revizyonum köşe davası 1 ile kırıldı ...
Dennis

@VTCAKAVSMoACE Bu iki yönlü bir ikili (bu da bizim için bir meydan okuma var) yapacak, ama her sayının her zaman formda olması daha fazla farklılık var 1*0*.
Martin Ender

Yanıtlar:


10

JavaScript ES6, 94 92 72 70 66 64 bayt

Neil sayesinde 6 bayt kurtardı!

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

Bunun daha fazla golf yapılabileceğini sanmıyorum. En azından denklemlerle.

açıklama

Bunlar iki ana denklemdir ( ngirdi):

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

Bu, çıkış dizisinin olması gereken toplam boyutu verecektir. Benim programımda bunların >>1yerine kullandığım (...)/2ikili dosyadaki ilk bitin değeri 2 ile aynıdır.floor(.../2)


n-a*(a+1)/2

Bu trueolacak s miktarı . aönceki ifadenin sonucudur.


Sözdiziminin yaptığı budur:

[...Array(n)]

Bu kod [0, n), bu cevaptaki aralık ile bir dizi oluşturur nilk denklemdir.


.map((_,l)=>l<n)bu yukarıdaki aralıkta dönecektir l, aralıktaki geçerli öğeyi içeren değişkendir. Öğe az onlar (ikinci denklem ile belirlenir) olan doğruları miktarından daha uzunsa, o zaman dönecektir truebaşka, false.


2
Yerine >>1kullanın /2|0. Yerine (_,l)=>kullanın .keys().
Neil

@Neil teşekkürler! Bu biraz tasarruf etti. Son noktanıza göre Array.from(), doldurmak veya başka bir şey mi kullanmak istiyorsunuz ?
Downgoat

1
Hayır, [...Array(a)].map((_,l)=>)hangisinin biraz daha kısa olduğuna inandığımı düşünüyordum, ancak ()geçiş yaparken bazılarını silmede iyi yakaladım >>1, bunu fark etmemiştim!
Neil

Ah, ayrıca a*-~a/2; Neden daha önce düşünmediğimi bilmiyorum.
Neil

6

Python, 51 bayt

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

1'lerin ve 0'ların listesini çıkarır.


5

Pyth, 8 bayt

_@{y/RQy

Çevrimiçi deneyin: Gösteri veya Test Paketi

Bu katlanarak yavaş.

Açıklama:

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

Jöle , 13 11 bayt

Ḷṗ2SÞ⁸ị1,0x

Kod, sorun gönderilmeden önce Jelly'in en son sürümünde çalışmaz, ancak bu sürümünde , bu zorluğun önüne geçer.

Endeksler 1 tabanlıdır. Çevrimiçi deneyin! (birkaç saniye sürer) veya aynı anda birden fazla girişi doğrulayın .

Nasıl çalışır

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

05AB1E, 27 bayt

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

Ben biraz daha golf ve sabah bir açıklama eklemek olmadığını göreceksiniz.

Çevrimiçi deneyin


4

Java, 117110 bayt

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 bayt kaydetmeme izin veren kendi boolean türümü oluşturdum


Enumun kullanımı zekidir. +1
Addison Crump

2

Python 2, 69 63 bayt

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

Ideone üzerinde test edin .


2

Python 2, 61 bayt

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

N = j · (j + 1) / 2 için çözer . Giriş stdin'den alınır.

Örnek Kullanımı

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.