Gizli Numaralar


14

Gizli Numaralar

Izin vermek xrastgele bir temel bir tamsayı, öyle ki Donun bir dizi basamak. xBir Confidant sayısı, eğer herkes için naralarında 1ve uzunluğu D:

D[n+1] = D[n] + D[n-1] + ... + D[1] + n

Örneğin, 349taban 10'daki sayıyı ele alalım . Bu sayı için endeksleri etiketlersek, aşağıdakilere sahibiz.

Index    Digit
-----    -----
1        3
2        4
3        9

İlk rakamdan başlayarak 1 + 3 = 4, bir sonraki rakamı veren var. Sonra ikinci hane ile, bir 3 + 4 + 2 = 9sonraki haneyi yine verir. Dolayısıyla, bu sayı bir sırdaş sayıdır.


1 ve 62 arasında bir tabana sahip bir tamsayı verildiğinde, o taban için tüm Gizli Numaraları hesaplayın ve yeni satırlarla ayırarak bunların bir listesini çıkarın. Belirli bir üs için sınırlı miktarda Sırdaş Sayısı olduğunu varsayabilirsiniz.

9'dan büyük basamaklar için alfa karakterleri A-Zve Zalfa karakterleri kullanmaktan büyük basamaklar için a-z. Ötesinde rakamlar için endişelenmenize gerek kalmayacak z.

Herhangi bir sırayla üretilmeleri gerekmez.


Örnek Giriş:

16

Örnek Çıktı:

0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F

Bu kod golf, bu yüzden en kısa kod kazanır. İyi şanslar!

(Biçimlendirmeye yardımcı olduğu ve birkaç sorunu işaret ettiği için Zach'e teşekkürler.)


Üzgünüm, Zach ile aramda soru biraz kafa karışıklığı var. Her şey şu anda biçimlendirilmelidir.
bir

Yararlı bir gözlem: bir sırdaş sayısında, her basamak bir artı bir önceki basamağın iki katıdır, ikinci basamak bunun yerine bir artı ilk basamaktır.
xnor


1
Örnekte, neden CDlistede yok? İkinci rakamın ilk rakamdan bir fazla olduğu diğer tüm kombinasyonlar listelendiğinden, neden CDuygun olmadığını anlamıyorum .
Reto Koradi

Bu bir kazaydı: P Sabit, işaret ettiğiniz için teşekkürler.
bir

Yanıtlar:


2

Pyth, 38 bayt

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ

Çevrimiçi deneyin: Gösteri

Açıklama:

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ  implicit: Q = input base
0                                       print 0
                       m            SQ  map each d of [1, 2, ..., Q] to:
                        .u       Q]d      start with N=[d], apply v Q times
                          +N+lNsN           add (len(N) + sum(N)) to N
                                          gives all intermediate results
                      s                 join to one list of candidates
                 f<eTQ                  filter those, where every digit < Q
  ms@L+s`MT+rG1Gd                       convert numbers to letters 0-9A-Za-z
 j                                      print each on separate line

9

Python 2, 104 bayt

n=input()
for i in range(n):
 s=''
 while i<n:s+=chr(48+i+(i>9)*7+i/36*6);print s;i+=n**0**i+i*(s>s[:1])

Bu, aşağıdaki gözlemi kullanır: bir sırdaş sayısında, ikinci basamak için olmak dışında , basamağı itakip eder. Olası tüm ilk basamakları deneyerek ve çok büyüyene kadar daha fazla basamak ekleyerek, tüm sırdaş sayıları üretebiliriz.2*i+1i+1

Biz numarasını karşılık gelen karakteri hesaplamak iolarak chr(48+i+(i>9)*7+i/36*6)aralıkları için numara, büyük harfle ya da büyük harf aralığı içine kaydırır, 0-9, 10-35, 36-61.

Daha sonra, artırmak iyoluyla i+=i+1iki ayarlamaları ile. Bunu i+=1ilk basamaktan sonra yapmak için karakterden daha fazlasına sahip olmak ikoşullu ekliyoruz . Ayrıca, 0 ile başlayan sayıların yazdırılmasını ve aynı zamanda izin verilmesini önlememiz gerekir . Bunu yapmak için, bir sonraki döngüde koşulu ekleyerek başarısız olmasına neden olan bir kesmek yapıyoruz . Bu , hangi sağ ilişkilendirme , eşit veya ile değiştirilerek yapılır .s10i=0i<nn1n**0**in**(0**i)n**(i==0)n if i==0 else 1


Vay canına, dang. Python 3 ile karşılaştırıldığında boyutun neredeyse yarısı! Hmm. Bazı hilelerinizi kullanırsam kaç bayt tasarruf edebileceğimi merak ediyorum ...
El'endia Starman

4

Python 3, 201200 bayt

n=int(input())
X=[[i]for i in range(1,n)]
for x in X:
 y=sum(x)+len(x)
 if y<n:X.append(x+[y])
X=[[0]]+X
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))

açıklama

Buradaki temel öngörü, bir sıra x(örneğin, [1,2,5]) verildiğinde , sıradaki sonraki terimi alabileceğinizdir sum(x)+len(x), bu da 11bu durumda ( B) verir . Bunun daha küçük olup olmadığını kontrol edin nve varsa genişletilmiş sekansı bu tür sekansların listesine ekleyin (tüm tek basamaklarla ekilir).

[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)]

Dizi öğelerini karakterlerle bu şekilde eşlerim. Bunlar ''.joinbirlikte düzenlenir ve daha sonra yeni satırlarla ayrılmış şekilde yazdırılır.


Son satırınızı olarak değiştirerek bir bayt kaydedebilirsiniz print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X)). Ayrıca, şu anda 201 bayt; 200 değil.
Zach Gates

@ZachGates: Bunu düşündüm, ama köşeli parantezleri dışarıda bırakabileceğimin farkında değildim. Teşekkürler!
El'endia Starman

4

GS2, 44 bayt

26 c8 2f 08 4d 08 40 64 45 2e 30 42 67 40 24 d0
75 d3 20 e1 35 09 cb 20 23 78 22 09 34 30 e0 32
08 86 84 30 85 30 92 58 09 34 10

Sayıları farklı bir sırayla üretir, ancak sorun açıklaması belirtilmez, bu yüzden gidiyorum! 16 girişi için çıktı.

1
12
125
125B
2
23
237
237F
3
34
349
4
45
45B
5
56
56D
6
67
67F
7
78
8
89
9
9A
A
AB
B
BC
C
CD
D
DE
E
EF
F
0

Baytlar için anımsatıcı eşdeğerleri şunlardır:

read-num dec save-a
range1
{
    itemize
    {
        dup 
        sum
        over length
        add

        swap right-cons

        dup last push-a le

            push-d eval
        block2 when
    }
    save-d eval
    init inits tail
} map

+ ' fold 

{
    ascii-digits
    uppercase-alphabet catenate
    lowercase-alphabet catenate
    select 
    show-line
} map

0

Ah adamım, bu harika. Ben GS2 öğrenmeye çalışıyordum ama onunla çok zor bir zaman geçiriyorum: P
Bir Spaghetto

3

CJam, 46 42 40 bayt

ri:R,{Q{+_A,s'[,_el^+f=oNo__,+:+_R<}g&}*

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

ri:R            e# Read an integer from STDIN and save it in R.
,               e# Push [0 ... R-1].
{               e# Fold; For each element but the first:
                e#   Push the element.
  Q             e#   Push an empty array (accumulator for base-R digits).
  {             e#   Do:
    +           e#     Concatenate the integer and the array on the stack.
    _           e#     Push a copy of the result.
    A,s'[,_el^+ e#     Push "0...0A...Za...z".
                e#     See: http://codegolf.stackexchange.com/a/54348
    f=          e#     Replace each base-R digit with the corresponding character.
    oNo         e#     Print the resulting string and a linefeed.
    _           e#     Push another copy of the accumulator.
    _,+         e#     Append its length to it.
    :+          e#     Add all digits (including the length).
    _R<         e#     Push a copy of the result and compare it with R.
  }g            e#   If the sum is less than R, it is a valid base-R digit,
                e#   the comparison pushes 1, and the loop is repeated.
  &             e#   Intersect the accumulator with an integer that is greater
                e#   or equal to R. This pushes an empty array.
}*              e#

Sonunda 0 ve birkaç boş diziler yığın üzerinde kalır, böylece yorumlayıcı yazdırılır 0.


1

gawk, 111 bayt

{for(n=$0;n>c=++i;)for(j=0;n>$++j=c+=j;print"")for(c=k=0;k++<j;c+=$k)printf"%c",$k+($k>9?$k>35?61:55:48)}$0="0"

Her başlangıç basamağının 1için base-1bir sonraki basamak hesaplar ve bu taban daha düşük ise yine bir sırdaş numarası vardır. Yazdırma sırasında bir sonraki basamağın hesaplanması. Sonunda yazdırır 0.

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.