保護者番号


14

保護者番号

ましょうxように、任意の塩基の整数でありD、その数字のアレイです。xのすべてnの範囲1と長さの場合、Confidant NumberですD

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

たとえば、349基数10の数値を考えます。この数値のインデックスにラベルを付けると、次のようになります。

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

最初の数字から始めて、次の数字1 + 3 = 4を生成するがあります。次に、2番目の数字で3 + 4 + 2 = 9、次の数字が得られます。したがって、この番号は腹心番号です。


1から62までの基数を持つ整数が与えられた場合、その基数のすべてのConfidant Numberを計算し、改行で区切られたそれらのリストを出力します。与えられたベースには、限られた数の親展番号があると仮定できます。

9を超える数字の場合は英字を使用し、9を超えるA-Z数字のZ場合は英字を使用しますa-z。を超える桁数を心配する必要はありませんz

特定の順序で出力する必要はありません。


サンプル入力:

16

サンプル出力:

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

これはコードゴルフなので、最短のコードが勝ちます。幸運を!

(フォーマットを手伝ってくれて、いくつかの問題を指摘してくれたZachに感謝します。)


申し訳ありませんが、質問について私とザックの間で少し混乱しています。すべてを今すぐフォーマットする必要があります。
spaghetto

役に立つ観察:腹心の番号では、各桁は前の桁の1プラス2倍ですが、2番目の桁は1プラス1桁です。
xnor


1
例では、なぜCDリストにないのですか?2番目の数字が最初の数字よりも1つ多い他のすべての組み合わせがリストされているので、なぜCD資格がないのかわかりません。
レトコラディ

それは偶然だった:P修正、指摘してくれてありがとう。
spaghetto

回答:


2

Pyth、38バイト

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

オンラインで試す:デモンストレーション

説明:

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バイト

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

これは、次の観察結果を使用します。腹心の番号では、数字のi後にが続きますが、2番目の数字2*i+1i+1代わりになります。すべての可能な最初の数字を試して、数字が大きくなりすぎるまで追加することで、すべての腹心の数字を生成できます。

私たちは、番号に対応する文字計算するiようchr(48+i+(i>9)*7+i/36*6)な間隔の番号、大文字、または大文字の範囲にそれをシフトし、0-9, 10-35, 36-61

次に、2つの調整でiビアを増やしi+=i+1ます。代わりi+=1に最初の数字の後にこれを作成するには、chars を超えることをi条件に追加します。また、0で始まる数字が出力されないようにすると同時に、を許可する必要があります。これを行うために、次のループに条件を追加して失敗させるハックを行います。これは、交換することによって行われているとしている右の仲間、等しい、または。s10i=0i<nn1n**0**in**(0**i)n**(i==0)n if i==0 else 1


わあ Python 3に比べてほぼ半分のサイズです!うーん。私は...私はあなたのトリックのいくつかを使用している場合、私は保存することができますどのように多くのバイトだろう
El'endiaスターマン

4

Python 3、201 200バイト

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

説明

ここで重要な洞察は、シーケンス与えられたということであるx(のような、言う、[1,2,5])、あなたが順番に次の用語を取得することができますsum(x)+len(x)与える、11(この場合B)。これが未満であるかどうかを確認しn、未満の場合は、すべてのそのようなシーケンスのリストに拡張シーケンスを追加します(すべて1桁のシード)。

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

これが、シーケンス項目をキャラクターにマッピングする方法です。これらは''.join一緒に編集され、印刷され、改行で区切られます。


最後の行をに変更すると、1バイト節約できますprint('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))。また、現在は201バイトです。ない200
ザック・ゲイツ

@ZachGates:私はそれについて考えましたが、括弧を省くことができることに気づきませんでした。ありがとう!
エレンディアスターマン

4

GS2、44バイト

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

番号は異なる順序で生成されますが、問題の説明には明記されていないので、私はそれを目指しています!16の入力の出力は次のとおりです。

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

バイトに相当するニーモニックは次のとおりです。

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

ああ、これはすごい。私はGS2を学ぶためにしようとしてきたが、私はそれを本当のラフな時間を過ごしてきた:P
spaghetto

3

CJam、46 42 40バイト

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

CJamインタプリタでオンラインで試してください。

使い方

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#

最後に0といくつかの空の配列がスタックに残されるため、インタープリターはを出力し0ます。


1

gawk、111バイト

{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"

以下からのすべての開始桁用1base-1、それは次の桁数を計算し、これらがベースよりも低くしている間、我々はまだ親友番号を持っています。印刷中に次の桁を計算します。最後に印刷し0ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.